aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Client/MXP/ClientStack/MXPClientView.cs1743
-rw-r--r--OpenSim/Client/MXP/MXPModule.cs131
-rw-r--r--OpenSim/Client/MXP/MXPUtil.cs42
-rw-r--r--OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs561
-rw-r--r--OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs1237
-rw-r--r--OpenSim/Client/VWoHTTP/VWoHTTPModule.cs133
-rw-r--r--OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs6
-rw-r--r--OpenSim/Data/MSSQL/MSSQLMigration.cs3
-rw-r--r--OpenSim/Data/MSSQL/MSSQLSimulationData.cs25
-rw-r--r--OpenSim/Data/MSSQL/Resources/AuthStore.migrations8
-rw-r--r--OpenSim/Data/MSSQL/Resources/Avatar.migrations25
-rw-r--r--OpenSim/Data/MSSQL/Resources/FriendsStore.migrations4
-rw-r--r--OpenSim/Data/MSSQL/Resources/GridStore.migrations13
-rw-r--r--OpenSim/Data/MSSQL/Resources/InventoryStore.migrations9
-rw-r--r--OpenSim/Data/MSSQL/Resources/Presence.migrations17
-rw-r--r--OpenSim/Data/MSSQL/Resources/RegionStore.migrations119
-rw-r--r--OpenSim/Data/MSSQL/Resources/UserAccount.migrations2
-rw-r--r--OpenSim/Framework/AgentCircuitData.cs69
-rw-r--r--OpenSim/Framework/ChildAgentDataUpdate.cs57
-rw-r--r--OpenSim/Framework/ClientInfo.cs3
-rw-r--r--OpenSim/Framework/PriorityQueue.cs105
-rw-r--r--OpenSim/Framework/Tests/MundaneFrameworkTests.cs2
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs31
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs75
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs4
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs80
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs66
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs58
-rw-r--r--OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs9
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs13
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs73
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs5
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs6
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/Prioritizer.cs48
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs26
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs232
-rw-r--r--OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs121
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs3
-rw-r--r--OpenSim/Server/Handlers/Simulation/AgentHandlers.cs9
-rw-r--r--OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs19
-rw-r--r--OpenSim/Services/HypergridService/GatekeeperService.cs39
-rw-r--r--OpenSim/Services/Interfaces/ISimulationService.cs2
-rw-r--r--OpenSim/Services/LLLoginService/LLLoginService.cs40
46 files changed, 936 insertions, 4357 deletions
diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
deleted file mode 100644
index eebb7eb..0000000
--- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
+++ /dev/null
@@ -1,1743 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Net;
31using System.Reflection;
32using System.Text;
33using log4net;
34using MXP;
35using MXP.Messages;
36using OpenMetaverse;
37using OpenMetaverse.Packets;
38using OpenSim.Framework;
39using OpenSim.Framework.Client;
40using Packet=OpenMetaverse.Packets.Packet;
41using MXP.Extentions.OpenMetaverseFragments.Proto;
42using MXP.Util;
43using MXP.Fragments;
44using MXP.Common.Proto;
45using OpenSim.Region.Framework.Scenes;
46
47namespace OpenSim.Client.MXP.ClientStack
48{
49 public class MXPClientView : IClientAPI, IClientCore
50 {
51 internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 #region Constants
54 private Vector3 FORWARD = new Vector3(1, 0, 0);
55 private Vector3 BACKWARD = new Vector3(-1, 0, 0);
56 private Vector3 LEFT = new Vector3(0, 1, 0);
57 private Vector3 RIGHT = new Vector3(0, -1, 0);
58 private Vector3 UP = new Vector3(0, 0, 1);
59 private Vector3 DOWN = new Vector3(0, 0, -1);
60 #endregion
61
62 #region Fields
63 private readonly Session m_session;
64 private readonly UUID m_sessionID;
65 private readonly UUID m_userID;
66 private readonly IScene m_scene;
67 private readonly string m_firstName;
68 private readonly string m_lastName;
69// private int m_objectsToSynchronize = 0;
70// private int m_objectsSynchronized = -1;
71
72 private Vector3 m_startPosition=new Vector3(128f, 128f, 128f);
73 #endregion
74
75 #region Properties
76
77 public Session Session
78 {
79 get { return m_session; }
80 }
81
82 public Vector3 StartPos
83 {
84 get { return m_startPosition; }
85 set { m_startPosition = value; }
86 }
87
88 public UUID AgentId
89 {
90 get { return m_userID; }
91 }
92
93 public UUID SessionId
94 {
95 get { return m_sessionID; }
96 }
97
98 public UUID SecureSessionId
99 {
100 get { return m_sessionID; }
101 }
102
103 public UUID ActiveGroupId
104 {
105 get { return UUID.Zero; }
106 }
107
108 public string ActiveGroupName
109 {
110 get { return ""; }
111 }
112
113 public ulong ActiveGroupPowers
114 {
115 get { return 0; }
116 }
117
118 public ulong GetGroupPowers(UUID groupID)
119 {
120 return 0;
121 }
122
123 public bool IsGroupMember(UUID GroupID)
124 {
125 return false;
126 }
127
128 public string FirstName
129 {
130 get { return m_firstName; }
131 }
132
133 public string LastName
134 {
135 get { return m_lastName; }
136 }
137
138 public IScene Scene
139 {
140 get { return m_scene; }
141 }
142
143 public int NextAnimationSequenceNumber
144 {
145 get { return 0; }
146 }
147
148 public string Name
149 {
150 get { return FirstName; }
151 }
152
153 public bool IsActive
154 {
155 get { return Session.SessionState == SessionState.Connected; }
156 set
157 {
158 if (!value)
159 Stop();
160 }
161 }
162
163 public bool IsLoggingOut
164 {
165 get { return false ; }
166 set { }
167 }
168
169 #endregion
170
171 #region Constructors
172 public MXPClientView(Session mxpSession, UUID mxpSessionID, UUID userID, IScene mxpHostBubble, string mxpFirstName, string mxpLastName)
173 {
174 this.m_session = mxpSession;
175 this.m_userID = userID;
176 this.m_firstName = mxpFirstName;
177 this.m_lastName = mxpLastName;
178 this.m_scene = mxpHostBubble;
179 this.m_sessionID = mxpSessionID;
180 }
181 #endregion
182
183 #region MXP Incoming Message Processing
184
185 public void MXPPRocessMessage(Message message)
186 {
187 if (message.GetType() == typeof(ModifyRequestMessage))
188 {
189 MXPProcessModifyRequest((ModifyRequestMessage)message);
190 }
191 else
192 {
193 m_log.Warn("[MXP ClientStack] Received messaged unhandled: " + message);
194 }
195 }
196
197 private void MXPProcessModifyRequest(ModifyRequestMessage modifyRequest)
198 {
199 ObjectFragment objectFragment=modifyRequest.ObjectFragment;
200 if (objectFragment.ObjectId == m_userID.Guid)
201 {
202 OmAvatarExt avatarExt = modifyRequest.GetExtension<OmAvatarExt>();
203
204 AgentUpdateArgs agentUpdate = new AgentUpdateArgs();
205 agentUpdate.AgentID = new UUID(objectFragment.ObjectId);
206 agentUpdate.SessionID = m_sessionID;
207 agentUpdate.State = (byte)avatarExt.State;
208
209 Quaternion avatarOrientation = FromOmQuaternion(objectFragment.Orientation);
210 if (avatarOrientation.X == 0 && avatarOrientation.Y == 0 && avatarOrientation.Z == 0 && avatarOrientation.W == 0)
211 {
212 avatarOrientation = Quaternion.Identity;
213 }
214 Vector3 avatarLocation=FromOmVector(objectFragment.Location);
215
216 if (avatarExt.MovementDirection != null)
217 {
218 Vector3 direction = FromOmVector(avatarExt.MovementDirection);
219
220 direction = direction * Quaternion.Inverse(avatarOrientation);
221
222 if ((direction - FORWARD).Length() < 0.5)
223 {
224 agentUpdate.ControlFlags += (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
225 }
226 if ((direction - BACKWARD).Length() < 0.5)
227 {
228 agentUpdate.ControlFlags += (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
229 }
230 if ((direction - LEFT).Length() < 0.5)
231 {
232 agentUpdate.ControlFlags += (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
233 }
234 if ((direction - RIGHT).Length() < 0.5)
235 {
236 agentUpdate.ControlFlags += (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
237 }
238 if ((direction - UP).Length() < 0.5)
239 {
240 agentUpdate.ControlFlags += (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
241 }
242 if ((direction - DOWN).Length() < 0.5)
243 {
244 agentUpdate.ControlFlags += (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
245 }
246
247 }
248 if (avatarExt.TargetOrientation != null)
249 {
250 agentUpdate.BodyRotation = FromOmQuaternion(avatarExt.TargetOrientation);
251 }
252 else
253 {
254 agentUpdate.BodyRotation = FromOmQuaternion(objectFragment.Orientation);
255 }
256
257 if (avatarExt.Body != null)
258 {
259 foreach (OmBipedBoneOrientation boneOrientation in avatarExt.Body.BipedBoneOrientations)
260 {
261 if (boneOrientation.Bone == OmBipedBones.Head)
262 {
263 agentUpdate.HeadRotation = FromOmQuaternion(boneOrientation.Orientation);
264 }
265 }
266 }
267 else
268 {
269 agentUpdate.HeadRotation = Quaternion.Identity;
270 }
271
272 if (avatarExt.Camera != null)
273 {
274 Quaternion cameraOrientation = FromOmQuaternion(avatarExt.Camera.Orientation);
275 agentUpdate.CameraCenter = FromOmVector(avatarExt.Camera.Location);
276 agentUpdate.CameraAtAxis = FORWARD * cameraOrientation;
277 agentUpdate.CameraLeftAxis = LEFT * cameraOrientation;
278 agentUpdate.CameraUpAxis = UP * cameraOrientation;
279 }
280 else
281 {
282 agentUpdate.CameraCenter = avatarLocation;
283 agentUpdate.CameraAtAxis = FORWARD * avatarOrientation;
284 agentUpdate.CameraLeftAxis = LEFT * avatarOrientation;
285 agentUpdate.CameraUpAxis = UP * avatarOrientation;
286 }
287
288 OnAgentUpdate(this, agentUpdate);
289
290 ModifyResponseMessage modifyResponse = new ModifyResponseMessage();
291 modifyResponse.FailureCode = MxpResponseCodes.SUCCESS;
292 modifyResponse.RequestMessageId = modifyRequest.MessageId;
293 m_session.Send(modifyResponse);
294 }
295 else
296 {
297 ModifyResponseMessage modifyResponse = new ModifyResponseMessage();
298 modifyResponse.FailureCode = MxpResponseCodes.UNAUTHORIZED_OPERATION;
299 modifyResponse.RequestMessageId = modifyRequest.MessageId;
300 m_session.Send(modifyResponse);
301 }
302 }
303
304 #endregion
305
306 #region MXP Outgoing Message Processing
307
308// private void MXPSendPrimitive(uint localID, UUID ownerID, Vector3 acc, Vector3 rvel, PrimitiveBaseShape primShape, Vector3 pos, UUID objectID, Vector3 vel, Quaternion rotation, uint flags, string text, byte[] textColor, uint parentID, byte[] particleSystem, byte clickAction, byte material, byte[] textureanim)
309// {
310// String typeName = ToOmType(primShape.PCode);
311// m_log.Info("[MXP ClientStack] Transmitting Primitive" + typeName);
312//
313// PerceptionEventMessage pe = new PerceptionEventMessage();
314// pe.ObjectFragment.ObjectId = objectID.Guid;
315//
316// pe.ObjectFragment.ParentObjectId = Guid.Empty;
317//
318// // Resolving parent UUID.
319// OpenSim.Region.Framework.Scenes.Scene scene = (OpenSim.Region.Framework.Scenes.Scene)Scene;
320// if (scene.Entities.ContainsKey(parentID))
321// {
322// pe.ObjectFragment.ParentObjectId = scene.Entities[parentID].UUID.Guid;
323// }
324//
325// pe.ObjectFragment.ObjectIndex = localID;
326// pe.ObjectFragment.ObjectName = typeName + " Object";
327// pe.ObjectFragment.OwnerId = ownerID.Guid;
328// pe.ObjectFragment.TypeId = Guid.Empty;
329// pe.ObjectFragment.TypeName = typeName;
330// pe.ObjectFragment.Acceleration = ToOmVector(acc);
331// pe.ObjectFragment.AngularAcceleration=new MsdQuaternion4f();
332// pe.ObjectFragment.AngularVelocity = ToOmQuaternion(rvel);
333// pe.ObjectFragment.BoundingSphereRadius = primShape.Scale.Length();
334//
335// pe.ObjectFragment.Location = ToOmVector(pos);
336//
337// pe.ObjectFragment.Mass = 1.0f;
338// pe.ObjectFragment.Orientation = ToOmQuaternion(rotation);
339// pe.ObjectFragment.Velocity =ToOmVector(vel);
340//
341// OmSlPrimitiveExt ext = new OmSlPrimitiveExt();
342//
343// if (!((primShape.PCode == (byte)PCode.NewTree) || (primShape.PCode == (byte)PCode.Tree) || (primShape.PCode == (byte)PCode.Grass)))
344// {
345//
346// ext.PathBegin = primShape.PathBegin;
347// ext.PathEnd = primShape.PathEnd;
348// ext.PathScaleX = primShape.PathScaleX;
349// ext.PathScaleY = primShape.PathScaleY;
350// ext.PathShearX = primShape.PathShearX;
351// ext.PathShearY = primShape.PathShearY;
352// ext.PathSkew = primShape.PathSkew;
353// ext.ProfileBegin = primShape.ProfileBegin;
354// ext.ProfileEnd = primShape.ProfileEnd;
355// ext.PathCurve = primShape.PathCurve;
356// ext.ProfileCurve = primShape.ProfileCurve;
357// ext.ProfileHollow = primShape.ProfileHollow;
358// ext.PathRadiusOffset = primShape.PathRadiusOffset;
359// ext.PathRevolutions = primShape.PathRevolutions;
360// ext.PathTaperX = primShape.PathTaperX;
361// ext.PathTaperY = primShape.PathTaperY;
362// ext.PathTwist = primShape.PathTwist;
363// ext.PathTwistBegin = primShape.PathTwistBegin;
364//
365//
366// }
367//
368// ext.UpdateFlags = flags;
369// ext.ExtraParams = primShape.ExtraParams;
370// ext.State = primShape.State;
371// ext.TextureEntry = primShape.TextureEntry;
372// ext.TextureAnim = textureanim;
373// ext.Scale = ToOmVector(primShape.Scale);
374// ext.Text = text;
375// ext.TextColor = ToOmColor(textColor);
376// ext.PSBlock = particleSystem;
377// ext.ClickAction = clickAction;
378// ext.Material = material;
379//
380// pe.SetExtension<OmSlPrimitiveExt>(ext);
381//
382// Session.Send(pe);
383//
384// if (m_objectsSynchronized != -1)
385// {
386// m_objectsSynchronized++;
387//
388// if (m_objectsToSynchronize >= m_objectsSynchronized)
389// {
390// SynchronizationEndEventMessage synchronizationEndEventMessage = new SynchronizationEndEventMessage();
391// Session.Send(synchronizationEndEventMessage);
392// m_objectsSynchronized = -1;
393// }
394// }
395// }
396
397 public void MXPSendAvatarData(string participantName, UUID ownerID, UUID parentId, UUID avatarID, uint avatarLocalID, Vector3 position, Quaternion rotation)
398 {
399 m_log.Info("[MXP ClientStack] Transmitting Avatar Data " + participantName);
400
401 PerceptionEventMessage pe = new PerceptionEventMessage();
402
403 pe.ObjectFragment.ObjectId = avatarID.Guid;
404 pe.ObjectFragment.ParentObjectId = parentId.Guid;
405 pe.ObjectFragment.ObjectIndex = avatarLocalID;
406 pe.ObjectFragment.ObjectName = participantName;
407 pe.ObjectFragment.OwnerId = ownerID.Guid;
408 pe.ObjectFragment.TypeId = Guid.Empty;
409 pe.ObjectFragment.TypeName = "Avatar";
410 pe.ObjectFragment.Acceleration = new MsdVector3f();
411 pe.ObjectFragment.AngularAcceleration = new MsdQuaternion4f();
412 pe.ObjectFragment.AngularVelocity = new MsdQuaternion4f();
413
414 pe.ObjectFragment.BoundingSphereRadius = 1.0f; // TODO Fill in appropriate value
415
416 pe.ObjectFragment.Location = ToOmVector(position);
417
418 pe.ObjectFragment.Mass = 1.0f; // TODO Fill in appropriate value
419 pe.ObjectFragment.Orientation = ToOmQuaternion(rotation);
420 pe.ObjectFragment.Velocity = new MsdVector3f();
421
422 Session.Send(pe);
423 }
424
425 public void MXPSendTerrain(float[] map)
426 {
427 m_log.Info("[MXP ClientStack] Transmitting terrain for " + m_scene.RegionInfo.RegionName);
428
429 PerceptionEventMessage pe = new PerceptionEventMessage();
430
431 // Hacking terrain object uuid to zero and index to hashcode of regionuuid
432 pe.ObjectFragment.ObjectId = m_scene.RegionInfo.RegionSettings.RegionUUID.Guid;
433 pe.ObjectFragment.ObjectIndex = (uint)(m_scene.RegionInfo.RegionSettings.RegionUUID.GetHashCode() + ((long)int.MaxValue) / 2);
434 pe.ObjectFragment.ParentObjectId = UUID.Zero.Guid;
435 pe.ObjectFragment.ObjectName = "Terrain of " + m_scene.RegionInfo.RegionName;
436 pe.ObjectFragment.OwnerId = m_scene.RegionInfo.EstateSettings.EstateOwner.Guid;
437 pe.ObjectFragment.TypeId = Guid.Empty;
438 pe.ObjectFragment.TypeName = "Terrain";
439 pe.ObjectFragment.Acceleration = new MsdVector3f();
440 pe.ObjectFragment.AngularAcceleration = new MsdQuaternion4f();
441 pe.ObjectFragment.AngularVelocity = new MsdQuaternion4f();
442 pe.ObjectFragment.BoundingSphereRadius = 128f;
443
444 pe.ObjectFragment.Location = new MsdVector3f();
445
446 pe.ObjectFragment.Mass = 1.0f;
447 pe.ObjectFragment.Orientation = new MsdQuaternion4f();
448 pe.ObjectFragment.Velocity = new MsdVector3f();
449
450 OmBitmapTerrainExt terrainExt = new OmBitmapTerrainExt();
451 terrainExt.Width = 256;
452 terrainExt.Height = 256;
453 terrainExt.WaterLevel = (float) m_scene.RegionInfo.RegionSettings.WaterHeight;
454 terrainExt.Offset = 0;
455 terrainExt.Scale = 10;
456 terrainExt.HeightMap = CompressUtil.CompressHeightMap(map, 0, 10);
457
458 pe.SetExtension<OmBitmapTerrainExt>(terrainExt);
459
460 Session.Send(pe);
461 }
462
463 public void MXPSendSynchronizationBegin(int objectCount)
464 {
465// m_objectsToSynchronize = objectCount;
466// m_objectsSynchronized = 0;
467 SynchronizationBeginEventMessage synchronizationBeginEventMessage = new SynchronizationBeginEventMessage();
468 synchronizationBeginEventMessage.ObjectCount = (uint)objectCount;
469 Session.Send(synchronizationBeginEventMessage);
470 }
471
472 #endregion
473
474 #region MXP Conversions
475
476 private MsdVector3f ToOmVector(Vector3 value)
477 {
478 MsdVector3f encodedValue = new MsdVector3f();
479 encodedValue.X = value.X;
480 encodedValue.Y = value.Y;
481 encodedValue.Z = value.Z;
482 return encodedValue;
483 }
484
485 private MsdQuaternion4f ToOmQuaternion(Vector3 value)
486 {
487 Quaternion quaternion=Quaternion.CreateFromEulers(value);
488 MsdQuaternion4f encodedValue = new MsdQuaternion4f();
489 encodedValue.X = quaternion.X;
490 encodedValue.Y = quaternion.Y;
491 encodedValue.Z = quaternion.Z;
492 encodedValue.W = quaternion.W;
493 return encodedValue;
494 }
495
496 private MsdQuaternion4f ToOmQuaternion(Quaternion value)
497 {
498 MsdQuaternion4f encodedValue = new MsdQuaternion4f();
499 encodedValue.X = value.X;
500 encodedValue.Y = value.Y;
501 encodedValue.Z = value.Z;
502 encodedValue.W = value.W;
503 return encodedValue;
504 }
505
506 private Vector3 FromOmVector(MsdVector3f vector)
507 {
508 return new Vector3(vector.X, vector.Y, vector.Z);
509 }
510
511// private Vector3 FromOmVector(float[] vector)
512// {
513// return new Vector3(vector[0], vector[1], vector[2]);
514// }
515
516 private Quaternion FromOmQuaternion(MsdQuaternion4f quaternion)
517 {
518 return new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
519 }
520
521// private Quaternion FromOmQuaternion(float[] quaternion)
522// {
523// return new Quaternion(quaternion[0], quaternion[1], quaternion[2], quaternion[3]);
524// }
525
526 private MsdColor4f ToOmColor(byte[] value)
527 {
528 MsdColor4f encodedValue = new MsdColor4f();
529 encodedValue.R = value[0];
530 encodedValue.G = value[1];
531 encodedValue.B = value[2];
532 encodedValue.A = value[3];
533 return encodedValue;
534 }
535
536 private string ToOmType(byte value)
537 {
538 if (value == (byte)PCodeEnum.Avatar)
539 {
540 return "Avatar";
541 }
542 if (value == (byte)PCodeEnum.Grass)
543 {
544 return "Grass";
545 }
546 if (value == (byte)PCodeEnum.NewTree)
547 {
548 return "NewTree";
549 }
550 if (value == (byte)PCodeEnum.ParticleSystem)
551 {
552 return "ParticleSystem";
553 }
554 if (value == (byte)PCodeEnum.Primitive)
555 {
556 return "Primitive";
557 }
558 if (value == (byte)PCodeEnum.Tree)
559 {
560 return "Tree";
561 }
562 throw new Exception("Unsupported PCode value: " + value);
563 }
564
565 #endregion
566
567 #region OpenSim Event Handlers
568
569 #pragma warning disable 67
570 public event GenericMessage OnGenericMessage;
571 public event ImprovedInstantMessage OnInstantMessage;
572 public event ChatMessage OnChatFromClient;
573 public event TextureRequest OnRequestTexture;
574 public event RezObject OnRezObject;
575 public event ModifyTerrain OnModifyTerrain;
576 public event BakeTerrain OnBakeTerrain;
577 public event EstateChangeInfo OnEstateChangeInfo;
578 public event SetAppearance OnSetAppearance;
579 public event AvatarNowWearing OnAvatarNowWearing;
580 public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
581 public event RezMultipleAttachmentsFromInv OnRezMultipleAttachmentsFromInv;
582 public event UUIDNameRequest OnDetachAttachmentIntoInv;
583 public event ObjectAttach OnObjectAttach;
584 public event ObjectDeselect OnObjectDetach;
585 public event ObjectDrop OnObjectDrop;
586 public event StartAnim OnStartAnim;
587 public event StopAnim OnStopAnim;
588 public event LinkObjects OnLinkObjects;
589 public event DelinkObjects OnDelinkObjects;
590 public event RequestMapBlocks OnRequestMapBlocks;
591 public event RequestMapName OnMapNameRequest;
592 public event TeleportLocationRequest OnTeleportLocationRequest;
593 public event DisconnectUser OnDisconnectUser;
594 public event RequestAvatarProperties OnRequestAvatarProperties;
595 public event SetAlwaysRun OnSetAlwaysRun;
596 public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy;
597 public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
598 public event DeRezObject OnDeRezObject;
599 public event Action<IClientAPI> OnRegionHandShakeReply;
600 public event GenericCall1 OnRequestWearables;
601 public event GenericCall1 OnCompleteMovementToRegion;
602 public event UpdateAgent OnPreAgentUpdate;
603 public event UpdateAgent OnAgentUpdate;
604 public event AgentRequestSit OnAgentRequestSit;
605 public event AgentSit OnAgentSit;
606 public event AvatarPickerRequest OnAvatarPickerRequest;
607 public event Action<IClientAPI> OnRequestAvatarsData;
608 public event AddNewPrim OnAddPrim;
609 public event FetchInventory OnAgentDataUpdateRequest;
610 public event TeleportLocationRequest OnSetStartLocationRequest;
611 public event RequestGodlikePowers OnRequestGodlikePowers;
612 public event GodKickUser OnGodKickUser;
613 public event ObjectDuplicate OnObjectDuplicate;
614 public event ObjectDuplicateOnRay OnObjectDuplicateOnRay;
615 public event GrabObject OnGrabObject;
616 public event DeGrabObject OnDeGrabObject;
617 public event MoveObject OnGrabUpdate;
618 public event SpinStart OnSpinStart;
619 public event SpinObject OnSpinUpdate;
620 public event SpinStop OnSpinStop;
621 public event UpdateShape OnUpdatePrimShape;
622 public event ObjectExtraParams OnUpdateExtraParams;
623 public event ObjectRequest OnObjectRequest;
624 public event ObjectSelect OnObjectSelect;
625 public event ObjectDeselect OnObjectDeselect;
626 public event GenericCall7 OnObjectDescription;
627 public event GenericCall7 OnObjectName;
628 public event GenericCall7 OnObjectClickAction;
629 public event GenericCall7 OnObjectMaterial;
630 public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
631 public event UpdatePrimFlags OnUpdatePrimFlags;
632 public event UpdatePrimTexture OnUpdatePrimTexture;
633 public event UpdateVector OnUpdatePrimGroupPosition;
634 public event UpdateVector OnUpdatePrimSinglePosition;
635 public event UpdatePrimRotation OnUpdatePrimGroupRotation;
636 public event UpdatePrimSingleRotationPosition OnUpdatePrimSingleRotationPosition;
637 public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
638 public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
639 public event UpdateVector OnUpdatePrimScale;
640 public event UpdateVector OnUpdatePrimGroupScale;
641 public event StatusChange OnChildAgentStatus;
642 public event GenericCall2 OnStopMovement;
643 public event Action<UUID> OnRemoveAvatar;
644 public event ObjectPermissions OnObjectPermissions;
645 public event CreateNewInventoryItem OnCreateNewInventoryItem;
646 public event LinkInventoryItem OnLinkInventoryItem;
647 public event CreateInventoryFolder OnCreateNewInventoryFolder;
648 public event UpdateInventoryFolder OnUpdateInventoryFolder;
649 public event MoveInventoryFolder OnMoveInventoryFolder;
650 public event FetchInventoryDescendents OnFetchInventoryDescendents;
651 public event PurgeInventoryDescendents OnPurgeInventoryDescendents;
652 public event FetchInventory OnFetchInventory;
653 public event RequestTaskInventory OnRequestTaskInventory;
654 public event UpdateInventoryItem OnUpdateInventoryItem;
655 public event CopyInventoryItem OnCopyInventoryItem;
656 public event MoveInventoryItem OnMoveInventoryItem;
657 public event RemoveInventoryFolder OnRemoveInventoryFolder;
658 public event RemoveInventoryItem OnRemoveInventoryItem;
659 public event UDPAssetUploadRequest OnAssetUploadRequest;
660 public event XferReceive OnXferReceive;
661 public event RequestXfer OnRequestXfer;
662 public event ConfirmXfer OnConfirmXfer;
663 public event AbortXfer OnAbortXfer;
664 public event RezScript OnRezScript;
665 public event UpdateTaskInventory OnUpdateTaskInventory;
666 public event MoveTaskInventory OnMoveTaskItem;
667 public event RemoveTaskInventory OnRemoveTaskItem;
668 public event RequestAsset OnRequestAsset;
669 public event UUIDNameRequest OnNameFromUUIDRequest;
670 public event ParcelAccessListRequest OnParcelAccessListRequest;
671 public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest;
672 public event ParcelPropertiesRequest OnParcelPropertiesRequest;
673 public event ParcelDivideRequest OnParcelDivideRequest;
674 public event ParcelJoinRequest OnParcelJoinRequest;
675 public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
676 public event ParcelSelectObjects OnParcelSelectObjects;
677 public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest;
678 public event ParcelAbandonRequest OnParcelAbandonRequest;
679 public event ParcelGodForceOwner OnParcelGodForceOwner;
680 public event ParcelReclaim OnParcelReclaim;
681 public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest;
682 public event ParcelDeedToGroup OnParcelDeedToGroup;
683 public event RegionInfoRequest OnRegionInfoRequest;
684 public event EstateCovenantRequest OnEstateCovenantRequest;
685 public event FriendActionDelegate OnApproveFriendRequest;
686 public event FriendActionDelegate OnDenyFriendRequest;
687 public event FriendshipTermination OnTerminateFriendship;
688 public event GrantUserFriendRights OnGrantUserRights;
689 public event MoneyTransferRequest OnMoneyTransferRequest;
690 public event EconomyDataRequest OnEconomyDataRequest;
691 public event MoneyBalanceRequest OnMoneyBalanceRequest;
692 public event UpdateAvatarProperties OnUpdateAvatarProperties;
693 public event ParcelBuy OnParcelBuy;
694 public event RequestPayPrice OnRequestPayPrice;
695 public event ObjectSaleInfo OnObjectSaleInfo;
696 public event ObjectBuy OnObjectBuy;
697 public event BuyObjectInventory OnBuyObjectInventory;
698 public event RequestTerrain OnRequestTerrain;
699 public event RequestTerrain OnUploadTerrain;
700 public event ObjectIncludeInSearch OnObjectIncludeInSearch;
701 public event UUIDNameRequest OnTeleportHomeRequest;
702 public event ScriptAnswer OnScriptAnswer;
703 public event AgentSit OnUndo;
704 public event AgentSit OnRedo;
705 public event LandUndo OnLandUndo;
706 public event ForceReleaseControls OnForceReleaseControls;
707 public event GodLandStatRequest OnLandStatRequest;
708 public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
709 public event SetEstateFlagsRequest OnSetEstateFlagsRequest;
710 public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture;
711 public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture;
712 public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights;
713 public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest;
714 public event SetRegionTerrainSettings OnSetRegionTerrainSettings;
715 public event EstateRestartSimRequest OnEstateRestartSimRequest;
716 public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest;
717 public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest;
718 public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest;
719 public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest;
720 public event EstateDebugRegionRequest OnEstateDebugRegionRequest;
721 public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest;
722 public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest;
723 public event UUIDNameRequest OnUUIDGroupNameRequest;
724 public event RegionHandleRequest OnRegionHandleRequest;
725 public event ParcelInfoRequest OnParcelInfoRequest;
726 public event RequestObjectPropertiesFamily OnObjectGroupRequest;
727 public event ScriptReset OnScriptReset;
728 public event GetScriptRunning OnGetScriptRunning;
729 public event SetScriptRunning OnSetScriptRunning;
730 public event UpdateVector OnAutoPilotGo;
731 public event TerrainUnacked OnUnackedTerrain;
732 public event ActivateGesture OnActivateGesture;
733 public event DeactivateGesture OnDeactivateGesture;
734 public event ObjectOwner OnObjectOwner;
735 public event DirPlacesQuery OnDirPlacesQuery;
736 public event DirFindQuery OnDirFindQuery;
737 public event DirLandQuery OnDirLandQuery;
738 public event DirPopularQuery OnDirPopularQuery;
739 public event DirClassifiedQuery OnDirClassifiedQuery;
740 public event EventInfoRequest OnEventInfoRequest;
741 public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
742 public event MapItemRequest OnMapItemRequest;
743 public event OfferCallingCard OnOfferCallingCard;
744 public event AcceptCallingCard OnAcceptCallingCard;
745 public event DeclineCallingCard OnDeclineCallingCard;
746 public event SoundTrigger OnSoundTrigger;
747 public event StartLure OnStartLure;
748 public event TeleportLureRequest OnTeleportLureRequest;
749 public event NetworkStats OnNetworkStatsUpdate;
750 public event ClassifiedInfoRequest OnClassifiedInfoRequest;
751 public event ClassifiedInfoUpdate OnClassifiedInfoUpdate;
752 public event ClassifiedDelete OnClassifiedDelete;
753 public event ClassifiedGodDelete OnClassifiedGodDelete;
754 public event EventNotificationAddRequest OnEventNotificationAddRequest;
755 public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest;
756 public event EventGodDelete OnEventGodDelete;
757 public event ParcelDwellRequest OnParcelDwellRequest;
758 public event UserInfoRequest OnUserInfoRequest;
759 public event UpdateUserInfo OnUpdateUserInfo;
760 public event ViewerEffectEventHandler OnViewerEffect;
761 public event Action<IClientAPI> OnLogout;
762 public event Action<IClientAPI> OnConnectionClosed;
763 public event RetrieveInstantMessages OnRetrieveInstantMessages;
764 public event PickDelete OnPickDelete;
765 public event PickGodDelete OnPickGodDelete;
766 public event PickInfoUpdate OnPickInfoUpdate;
767 public event AvatarNotesUpdate OnAvatarNotesUpdate;
768 public event MuteListRequest OnMuteListRequest;
769 public event AvatarInterestUpdate OnAvatarInterestUpdate;
770 public event FindAgentUpdate OnFindAgent;
771 public event TrackAgentUpdate OnTrackAgent;
772 public event NewUserReport OnUserReport;
773 public event SaveStateHandler OnSaveState;
774 public event GroupAccountSummaryRequest OnGroupAccountSummaryRequest;
775 public event GroupAccountDetailsRequest OnGroupAccountDetailsRequest;
776 public event GroupAccountTransactionsRequest OnGroupAccountTransactionsRequest;
777 public event FreezeUserUpdate OnParcelFreezeUser;
778 public event EjectUserUpdate OnParcelEjectUser;
779 public event ParcelBuyPass OnParcelBuyPass;
780 public event ParcelGodMark OnParcelGodMark;
781 public event GroupActiveProposalsRequest OnGroupActiveProposalsRequest;
782 public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest;
783 public event SimWideDeletesDelegate OnSimWideDeletes;
784 public event SendPostcard OnSendPostcard;
785 public event MuteListEntryUpdate OnUpdateMuteListEntry;
786 public event MuteListEntryRemove OnRemoveMuteListEntry;
787 public event GodlikeMessage onGodlikeMessage;
788 public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
789
790 public event PlacesQuery OnPlacesQuery;
791
792 #pragma warning restore 67
793
794 #endregion
795
796 #region OpenSim ClientView Public Methods
797 // Do we need this?
798 public bool SendLogoutPacketWhenClosing
799 {
800 set { }
801 }
802
803 public uint CircuitCode
804 {
805 get { return m_sessionID.CRC(); }
806 }
807
808 public IPEndPoint RemoteEndPoint
809 {
810 get { return Session.RemoteEndPoint; }
811 }
812
813 public void SetDebugPacketLevel(int newDebug)
814 {
815 //m_debugLevel = newDebug;
816 }
817
818 public void InPacket(object NewPack)
819 {
820 //throw new System.NotImplementedException();
821 }
822
823 public void ProcessInPacket(Packet NewPack)
824 {
825 //throw new System.NotImplementedException();
826 }
827
828 public void OnClean()
829 {
830 if (OnLogout != null)
831 OnLogout(this);
832
833 if (OnConnectionClosed != null)
834 OnConnectionClosed(this);
835 }
836
837 public void Close()
838 {
839 Close(true);
840 }
841
842 public void Close(bool sendStop)
843 {
844 m_log.Info("[MXP ClientStack] Close Called");
845
846 // Tell the client to go
847 if (sendStop == true)
848 {
849 SendLogoutPacket();
850 }
851
852 // Let MXPPacketServer clean it up
853 if (Session.SessionState != SessionState.Disconnected)
854 {
855 Session.SetStateDisconnected();
856 }
857
858 }
859
860 public void Kick(string message)
861 {
862 Close();
863 }
864
865 public void Start()
866 {
867 Scene.AddNewClient(this);
868
869 // Mimicking LLClientView which gets always set appearance from client.
870 OpenSim.Region.Framework.Scenes.Scene scene=(OpenSim.Region.Framework.Scenes.Scene)Scene;
871 AvatarAppearance appearance;
872 scene.GetAvatarAppearance(this,out appearance);
873 OnSetAppearance(this, appearance.Texture, (byte[])appearance.VisualParams.Clone());
874 }
875
876 public void Stop()
877 {
878 // Nor this
879 }
880
881 public void SendWearables(AvatarWearable[] wearables, int serial)
882 {
883 // Need to translate to MXP somehow
884 }
885
886 public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
887 {
888 // Need to translate to MXP somehow
889 }
890
891 public void SendStartPingCheck(byte seq)
892 {
893 // Need to translate to MXP somehow
894 }
895
896 public void SendKillObject(ulong regionHandle, List<uint> localIDs)
897 {
898 foreach (uint localID in localIDs)
899 SendKillObject(regionHandle, localID);
900 }
901
902 private void SendKillObject(ulong regionHandle, uint localID)
903 {
904 DisappearanceEventMessage de = new DisappearanceEventMessage();
905 de.ObjectIndex = localID;
906
907 Session.Send(de);
908 }
909
910 public void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
911 {
912 // Need to translate to MXP somehow
913 }
914
915 public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args)
916 {
917 m_log.Info("[MXP ClientStack] Completing Handshake to Region");
918
919 if (OnRegionHandShakeReply != null)
920 {
921 OnRegionHandShakeReply(this);
922 }
923
924 if (OnCompleteMovementToRegion != null)
925 {
926 OnCompleteMovementToRegion(this);
927 }
928
929 // Need to translate to MXP somehow
930 }
931
932 public void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName, UUID fromAgentID, byte source, byte audible)
933 {
934 ActionEventMessage chatActionEvent = new ActionEventMessage();
935 chatActionEvent.ActionFragment.ActionName = "Chat";
936 chatActionEvent.ActionFragment.SourceObjectId = fromAgentID.Guid;
937 chatActionEvent.ActionFragment.ObservationRadius = 180.0f;
938 chatActionEvent.ActionFragment.ExtensionDialect = "TEXT";
939 chatActionEvent.SetPayloadData(Util.UTF8.GetBytes(message));
940
941 Session.Send(chatActionEvent);
942 }
943
944 public void SendInstantMessage(GridInstantMessage im)
945 {
946 // Need to translate to MXP somehow
947 }
948
949 public void SendGenericMessage(string method, List<string> message)
950 {
951 }
952
953 public void SendGenericMessage(string method, List<byte[]> message)
954 {
955 // Need to translate to MXP somehow
956 }
957
958 public void SendLayerData(float[] map)
959 {
960 MXPSendTerrain(map);
961 }
962
963 public void SendLayerData(int px, int py, float[] map)
964 {
965 }
966
967 public void SendWindData(Vector2[] windSpeeds)
968 {
969 // Need to translate to MXP somehow
970 }
971
972 public void SendCloudData(float[] cloudCover)
973 {
974 // Need to translate to MXP somehow
975 }
976
977 public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
978 {
979 //throw new System.NotImplementedException();
980 }
981
982 public void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint)
983 {
984 //throw new System.NotImplementedException();
985 }
986
987 public AgentCircuitData RequestClientInfo()
988 {
989 AgentCircuitData clientinfo = new AgentCircuitData();
990 clientinfo.AgentID = AgentId;
991 clientinfo.Appearance = new AvatarAppearance();
992 clientinfo.BaseFolder = UUID.Zero;
993 clientinfo.CapsPath = "";
994 clientinfo.child = false;
995 clientinfo.ChildrenCapSeeds = new Dictionary<ulong, string>();
996 clientinfo.circuitcode = CircuitCode;
997 clientinfo.firstname = FirstName;
998 clientinfo.InventoryFolder = UUID.Zero;
999 clientinfo.lastname = LastName;
1000 clientinfo.SecureSessionID = SecureSessionId;
1001 clientinfo.SessionID = SessionId;
1002 clientinfo.startpos = StartPos;
1003
1004 return clientinfo;
1005 }
1006
1007 public void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint newRegionExternalEndPoint, string capsURL)
1008 {
1009 // TODO: We'll want to get this one working.
1010 // Need to translate to MXP somehow
1011 }
1012
1013 public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
1014 {
1015 // Need to translate to MXP somehow
1016 }
1017
1018 public void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags)
1019 {
1020 //throw new System.NotImplementedException();
1021 }
1022
1023 public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, uint locationID, uint flags, string capsURL)
1024 {
1025 // Need to translate to MXP somehow
1026 }
1027
1028 public void SendTeleportFailed(string reason)
1029 {
1030 // Need to translate to MXP somehow
1031 }
1032
1033 public void SendTeleportStart(uint flags)
1034 {
1035 // Need to translate to MXP somehow
1036 }
1037
1038 public void SendTeleportProgress(uint flags, string message)
1039 {
1040 }
1041
1042 public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance)
1043 {
1044 // Need to translate to MXP somehow
1045 }
1046
1047 public void SendPayPrice(UUID objectID, int[] payPrice)
1048 {
1049 // Need to translate to MXP somehow
1050 }
1051
1052 public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
1053 {
1054 // Minimap function, not used.
1055 }
1056
1057 public void SetChildAgentThrottle(byte[] throttle)
1058 {
1059 // Need to translate to MXP somehow
1060 }
1061
1062 public void SendAvatarDataImmediate(ISceneEntity avatar)
1063 {
1064 //ScenePresence presence=((Scene)this.Scene).GetScenePresence(avatarID);
1065 ScenePresence presence = (ScenePresence)avatar;
1066 UUID ownerID = presence.UUID;
1067 MXPSendAvatarData(presence.Firstname + " " + presence.Lastname, ownerID, UUID.Zero, presence.UUID, presence.LocalId, presence.AbsolutePosition, presence.Rotation);
1068 }
1069
1070 public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags)
1071 {
1072 //MovementEventMessage me = new MovementEventMessage();
1073 //me.ObjectIndex = data.LocalID;
1074 //me.Location = ToOmVector(data.Position);
1075 //me.Orientation = ToOmQuaternion(data.Rotation);
1076
1077 //MXPSendPrimitive(data.localID, data.ownerID, data.acc, data.rvel, data.primShape, data.pos, data.objectID, data.vel,
1078 // data.rotation, (uint)data.flags, data.text, data.color, data.parentID, data.particleSystem, data.clickAction,
1079 // data.material, data.textureanim);
1080
1081 //Session.Send(me);
1082
1083 throw new System.NotImplementedException();
1084 }
1085
1086 public void ReprioritizeUpdates()
1087 {
1088 }
1089
1090 public void FlushPrimUpdates()
1091 {
1092 }
1093
1094 public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items, List<InventoryFolderBase> folders, int version, bool fetchFolders, bool fetchItems)
1095 {
1096 // Need to translate to MXP somehow
1097 }
1098
1099 public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item)
1100 {
1101 // Need to translate to MXP somehow
1102 }
1103
1104 public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId)
1105 {
1106 // Need to translate to MXP somehow
1107 }
1108
1109 public void SendRemoveInventoryItem(UUID itemID)
1110 {
1111 // Need to translate to MXP somehow
1112 }
1113
1114 public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
1115 {
1116 // Need to translate to MXP somehow
1117 }
1118
1119 public void SendTaskInventory(UUID taskID, short serial, byte[] fileName)
1120 {
1121 // Need to translate to MXP somehow
1122 }
1123
1124 public void SendBulkUpdateInventory(InventoryNodeBase node)
1125 {
1126 // Need to translate to MXP somehow
1127 }
1128
1129 public void SendXferPacket(ulong xferID, uint packet, byte[] data)
1130 {
1131 // SL Specific, Ignore. (Remove from IClient)
1132 }
1133
1134 public void SendAbortXferPacket(ulong xferID)
1135 {
1136
1137 }
1138
1139
1140 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
1141 {
1142 // SL Specific, Ignore. (Remove from IClient)
1143 }
1144
1145 public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
1146 {
1147 // Need to translate to MXP somehow
1148 }
1149
1150 public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
1151 {
1152 // Need to translate to MXP somehow
1153 // TODO: This may need doing - involves displaying the users avatar name
1154 }
1155
1156 public void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID)
1157 {
1158 // Need to translate to MXP somehow
1159 }
1160
1161 public void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, byte flags)
1162 {
1163 // Need to translate to MXP somehow
1164 }
1165
1166 public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain)
1167 {
1168 // Need to translate to MXP somehow
1169 }
1170
1171 public void SendAttachedSoundGainChange(UUID objectID, float gain)
1172 {
1173 // Need to translate to MXP somehow
1174 }
1175
1176 public void SendNameReply(UUID profileId, string firstname, string lastname)
1177 {
1178 // SL Specific
1179 }
1180
1181 public void SendAlertMessage(string message)
1182 {
1183 SendChatMessage(message, 0, Vector3.Zero, "System", UUID.Zero, 0, 0);
1184 }
1185
1186 public void SendAgentAlertMessage(string message, bool modal)
1187 {
1188 SendChatMessage(message, 0, Vector3.Zero, "System" + (modal ? " Notice" : ""), UUID.Zero, 0, 0);
1189 }
1190
1191 public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message, string url)
1192 {
1193 // TODO: Probably can do this better
1194 SendChatMessage("Please visit: " + url, 0, Vector3.Zero, objectname, UUID.Zero, 0, 0);
1195 }
1196
1197 public void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
1198 {
1199 // TODO: Probably can do this better
1200 SendChatMessage("Dialog: " + msg, 0, Vector3.Zero, objectname, UUID.Zero, 0, 0);
1201 }
1202
1203 public bool AddMoney(int debit)
1204 {
1205 SendChatMessage("You were paid: " + debit, 0, Vector3.Zero, "System", UUID.Zero, 0, 0);
1206 return true;
1207 }
1208
1209 public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
1210 {
1211 // Need to translate to MXP somehow
1212 // Send a light object?
1213 }
1214
1215 public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
1216 {
1217 // Need to translate to MXP somehow
1218 }
1219
1220 public void SendViewerTime(int phase)
1221 {
1222 // Need to translate to MXP somehow
1223 }
1224
1225 public UUID GetDefaultAnimation(string name)
1226 {
1227 return UUID.Zero;
1228 }
1229
1230 public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, byte[] charterMember, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID)
1231 {
1232 // Need to translate to MXP somehow
1233 }
1234
1235 public void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question)
1236 {
1237 // Need to translate to MXP somehow
1238 }
1239
1240 public void SendHealth(float health)
1241 {
1242 // Need to translate to MXP somehow
1243 }
1244
1245 public void SendEstateList(UUID invoice, int code, UUID[] Data, uint estateID)
1246 {
1247 // Need to translate to MXP somehow
1248 }
1249
1250 public void SendBannedUserList(UUID invoice, EstateBan[] banlist, uint estateID)
1251 {
1252 // Need to translate to MXP somehow
1253 }
1254
1255 public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
1256 {
1257 // Need to translate to MXP somehow
1258 }
1259
1260 public void SendEstateCovenantInformation(UUID covenant)
1261 {
1262 // Need to translate to MXP somehow
1263 }
1264
1265 public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner)
1266 {
1267 // Need to translate to MXP somehow
1268 }
1269
1270 public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
1271 {
1272 // Need to translate to MXP somehow
1273 }
1274
1275 public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
1276 {
1277 // Need to translate to MXP somehow
1278 }
1279
1280 public void SendForceClientSelectObjects(List<uint> objectIDs)
1281 {
1282 // Need to translate to MXP somehow
1283 }
1284
1285 public void SendLandObjectOwners(LandData land, List<UUID> groups, Dictionary<UUID, int> ownersAndCount)
1286 {
1287 // Need to translate to MXP somehow
1288 }
1289
1290 public void SendCameraConstraint(Vector4 ConstraintPlane)
1291 {
1292
1293 }
1294
1295 public void SendLandParcelOverlay(byte[] data, int sequence_id)
1296 {
1297 // Need to translate to MXP somehow
1298 }
1299
1300 public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time)
1301 {
1302 // Need to translate to MXP somehow
1303 }
1304
1305 public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID, byte autoScale, string mediaType, string mediaDesc, int mediaWidth, int mediaHeight, byte mediaLoop)
1306 {
1307 // Need to translate to MXP somehow
1308 }
1309
1310 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
1311 {
1312 // Need to translate to MXP somehow
1313 }
1314
1315 public void SendConfirmXfer(ulong xferID, uint PacketID)
1316 {
1317 // Need to translate to MXP somehow
1318 }
1319
1320 public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName)
1321 {
1322 // Need to translate to MXP somehow
1323 }
1324
1325 public void SendInitiateDownload(string simFileName, string clientFileName)
1326 {
1327 // Need to translate to MXP somehow
1328 }
1329
1330 public void SendImageFirstPart(ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
1331 {
1332 // Need to translate to MXP somehow
1333 }
1334
1335 public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
1336 {
1337 // Need to translate to MXP somehow
1338 }
1339
1340 public void SendImageNotFound(UUID imageid)
1341 {
1342 // Need to translate to MXP somehow
1343 }
1344
1345 public void SendShutdownConnectionNotice()
1346 {
1347 // Need to translate to MXP somehow
1348 }
1349
1350 public void SendSimStats(SimStats stats)
1351 {
1352 // Need to translate to MXP somehow
1353 }
1354
1355 public void SendObjectPropertiesFamilyData(ISceneEntity Entity, uint RequestFlags)
1356 {
1357 //throw new System.NotImplementedException();
1358 }
1359
1360 public void SendObjectPropertiesReply(ISceneEntity entity)
1361 {
1362 //throw new System.NotImplementedException();
1363 }
1364
1365 public void SendAgentOffline(UUID[] agentIDs)
1366 {
1367 // Need to translate to MXP somehow (Friends List)
1368 }
1369
1370 public void SendAgentOnline(UUID[] agentIDs)
1371 {
1372 // Need to translate to MXP somehow (Friends List)
1373 }
1374
1375 public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot, Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
1376 {
1377 // Need to translate to MXP somehow
1378 }
1379
1380 public void SendAdminResponse(UUID Token, uint AdminLevel)
1381 {
1382 // Need to translate to MXP somehow
1383 }
1384
1385 public void SendGroupMembership(GroupMembershipData[] GroupMembership)
1386 {
1387 // Need to translate to MXP somehow
1388 }
1389
1390 public void SendGroupNameReply(UUID groupLLUID, string GroupName)
1391 {
1392 // Need to translate to MXP somehow
1393 }
1394
1395 public void SendJoinGroupReply(UUID groupID, bool success)
1396 {
1397 // Need to translate to MXP somehow
1398 }
1399
1400 public void SendEjectGroupMemberReply(UUID agentID, UUID groupID, bool success)
1401 {
1402 // Need to translate to MXP somehow
1403 }
1404
1405 public void SendLeaveGroupReply(UUID groupID, bool success)
1406 {
1407 // Need to translate to MXP somehow
1408 }
1409
1410 public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
1411 {
1412 // Need to translate to MXP somehow
1413 }
1414
1415 public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running)
1416 {
1417 // Need to translate to MXP somehow
1418 }
1419
1420 public void SendAsset(AssetRequestToClient req)
1421 {
1422 // Need to translate to MXP somehow
1423 }
1424
1425 public void SendTexture(AssetBase TextureAsset)
1426 {
1427 // Need to translate to MXP somehow
1428 }
1429
1430 public byte[] GetThrottlesPacked(float multiplier)
1431 {
1432 // LL Specific, get out of IClientAPI
1433
1434 const int singlefloat = 4;
1435 float tResend = multiplier;
1436 float tLand = multiplier;
1437 float tWind = multiplier;
1438 float tCloud = multiplier;
1439 float tTask = multiplier;
1440 float tTexture = multiplier;
1441 float tAsset = multiplier;
1442
1443 byte[] throttles = new byte[singlefloat * 7];
1444 int i = 0;
1445 Buffer.BlockCopy(BitConverter.GetBytes(tResend), 0, throttles, singlefloat * i, singlefloat);
1446 i++;
1447 Buffer.BlockCopy(BitConverter.GetBytes(tLand), 0, throttles, singlefloat * i, singlefloat);
1448 i++;
1449 Buffer.BlockCopy(BitConverter.GetBytes(tWind), 0, throttles, singlefloat * i, singlefloat);
1450 i++;
1451 Buffer.BlockCopy(BitConverter.GetBytes(tCloud), 0, throttles, singlefloat * i, singlefloat);
1452 i++;
1453 Buffer.BlockCopy(BitConverter.GetBytes(tTask), 0, throttles, singlefloat * i, singlefloat);
1454 i++;
1455 Buffer.BlockCopy(BitConverter.GetBytes(tTexture), 0, throttles, singlefloat * i, singlefloat);
1456 i++;
1457 Buffer.BlockCopy(BitConverter.GetBytes(tAsset), 0, throttles, singlefloat * i, singlefloat);
1458
1459 return throttles;
1460 }
1461
1462 public void SendBlueBoxMessage(UUID FromAvatarID, string FromAvatarName, string Message)
1463 {
1464 SendChatMessage(Message, 0, Vector3.Zero, FromAvatarName, UUID.Zero, 0, 0);
1465 }
1466
1467 public void SendLogoutPacket()
1468 {
1469 LeaveRequestMessage lrm = new LeaveRequestMessage();
1470 Session.Send(lrm);
1471 }
1472
1473 public EndPoint GetClientEP()
1474 {
1475 return null;
1476 }
1477
1478 public ClientInfo GetClientInfo()
1479 {
1480 return null;
1481 //throw new System.NotImplementedException();
1482 }
1483
1484 public void SetClientInfo(ClientInfo info)
1485 {
1486 //throw new System.NotImplementedException();
1487 }
1488
1489 public void SetClientOption(string option, string value)
1490 {
1491 // Need to translate to MXP somehow
1492 }
1493
1494 public string GetClientOption(string option)
1495 {
1496 // Need to translate to MXP somehow
1497 return "";
1498 }
1499
1500 public void Terminate()
1501 {
1502 Close();
1503 }
1504
1505 public void SendSetFollowCamProperties(UUID objectID, SortedDictionary<int, float> parameters)
1506 {
1507 // Need to translate to MXP somehow
1508 }
1509
1510 public void SendClearFollowCamProperties(UUID objectID)
1511 {
1512 // Need to translate to MXP somehow
1513 }
1514
1515 public void SendRegionHandle(UUID regoinID, ulong handle)
1516 {
1517 // Need to translate to MXP somehow
1518 }
1519
1520 public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y)
1521 {
1522 // Need to translate to MXP somehow
1523 }
1524
1525 public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt)
1526 {
1527 // Need to translate to MXP somehow
1528 }
1529
1530 public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data)
1531 {
1532 // Need to translate to MXP somehow
1533 }
1534
1535 public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
1536 {
1537 // Need to translate to MXP somehow
1538 }
1539
1540 public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data)
1541 {
1542 // Need to translate to MXP somehow
1543 }
1544
1545 public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
1546 {
1547 // Need to translate to MXP somehow
1548 }
1549
1550 public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data)
1551 {
1552 // Need to translate to MXP somehow
1553 }
1554
1555 public void SendDirLandReply(UUID queryID, DirLandReplyData[] data)
1556 {
1557 // Need to translate to MXP somehow
1558 }
1559
1560 public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data)
1561 {
1562 // Need to translate to MXP somehow
1563 }
1564
1565 public void SendEventInfoReply(EventData info)
1566 {
1567 // Need to translate to MXP somehow
1568 }
1569
1570 public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags)
1571 {
1572 // Need to translate to MXP somehow
1573 }
1574
1575 public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
1576 {
1577 // Need to translate to MXP somehow
1578 }
1579
1580 public void SendOfferCallingCard(UUID srcID, UUID transactionID)
1581 {
1582 // Need to translate to MXP somehow
1583 }
1584
1585 public void SendAcceptCallingCard(UUID transactionID)
1586 {
1587 // Need to translate to MXP somehow
1588 }
1589
1590 public void SendDeclineCallingCard(UUID transactionID)
1591 {
1592 // Need to translate to MXP somehow
1593 }
1594
1595 public void SendTerminateFriend(UUID exFriendID)
1596 {
1597 // Need to translate to MXP somehow
1598 }
1599
1600 public void SendAvatarClassifiedReply(UUID targetID, UUID[] classifiedID, string[] name)
1601 {
1602 // Need to translate to MXP somehow
1603 }
1604
1605 public void SendClassifiedInfoReply(UUID classifiedID, UUID creatorID, uint creationDate, uint expirationDate, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, string simName, Vector3 globalPos, string parcelName, byte classifiedFlags, int price)
1606 {
1607 // Need to translate to MXP somehow
1608 }
1609
1610 public void SendAgentDropGroup(UUID groupID)
1611 {
1612 // Need to translate to MXP somehow
1613 }
1614
1615 public void SendAvatarNotesReply(UUID targetID, string text)
1616 {
1617 // Need to translate to MXP somehow
1618 }
1619
1620 public void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks)
1621 {
1622 // Need to translate to MXP somehow
1623 }
1624
1625 public void SendAvatarClassifiedReply(UUID targetID, Dictionary<UUID, string> classifieds)
1626 {
1627 // Need to translate to MXP somehow
1628 }
1629
1630 public void SendParcelDwellReply(int localID, UUID parcelID, float dwell)
1631 {
1632 // Need to translate to MXP somehow
1633 }
1634
1635 public void SendUserInfoReply(bool imViaEmail, bool visible, string email)
1636 {
1637 // Need to translate to MXP somehow
1638 }
1639
1640 public void KillEndDone()
1641 {
1642 Stop();
1643 }
1644
1645 public bool AddGenericPacketHandler(string MethodName, GenericMessage handler)
1646 {
1647 // Need to translate to MXP somehow
1648 return true;
1649 }
1650
1651 #endregion
1652
1653 #region IClientCore
1654
1655 public bool TryGet<T>(out T iface)
1656 {
1657 iface = default(T);
1658 return false;
1659 }
1660
1661 public T Get<T>()
1662 {
1663 return default(T);
1664 }
1665
1666 public void Disconnect(string reason)
1667 {
1668 Kick(reason);
1669 Close();
1670 }
1671
1672 public void Disconnect()
1673 {
1674 Close();
1675 }
1676
1677 #endregion
1678
1679 public void SendCreateGroupReply(UUID groupID, bool success, string message)
1680 {
1681 }
1682
1683 public void RefreshGroupMembership()
1684 {
1685 }
1686
1687 public void SendUseCachedMuteList()
1688 {
1689 }
1690
1691 public void SendMuteListUpdate(string filename)
1692 {
1693 }
1694
1695 public void SendPickInfoReply(UUID pickID,UUID creatorID, bool topPick, UUID parcelID, string name, string desc, UUID snapshotID, string user, string originalName, string simName, Vector3 posGlobal, int sortOrder, bool enabled)
1696 {
1697 }
1698
1699 public void SendRebakeAvatarTextures(UUID textureID)
1700 {
1701 }
1702
1703 public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
1704 {
1705 }
1706
1707 public void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt)
1708 {
1709 }
1710
1711 public void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier)
1712 {
1713 }
1714
1715 public void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID,int amt)
1716 {
1717 }
1718
1719 public void SendGroupVoteHistory(UUID groupID, UUID transactionID, GroupVoteHistory[] Votes)
1720 {
1721 }
1722
1723 public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals)
1724 {
1725 }
1726
1727 public void SendChangeUserRights(UUID agentID, UUID friendID, int rights)
1728 {
1729 }
1730
1731 public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId)
1732 {
1733 }
1734
1735 public void StopFlying(ISceneEntity presence)
1736 {
1737 }
1738
1739 public void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data)
1740 {
1741 }
1742 }
1743}
diff --git a/OpenSim/Client/MXP/MXPModule.cs b/OpenSim/Client/MXP/MXPModule.cs
deleted file mode 100644
index 0b442cc..0000000
--- a/OpenSim/Client/MXP/MXPModule.cs
+++ /dev/null
@@ -1,131 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using System.Timers;
33using log4net;
34using MXP;
35using Nini.Config;
36using OpenMetaverse;
37using OpenSim.Client.MXP.PacketHandler;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40
41namespace OpenSim.Client.MXP
42{
43
44 /**
45 * MXP Client Module which adds MXP support to client / region communication.
46 */
47 public class MXPModule : IRegionModule
48 {
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50
51 private MXPPacketServer m_server;
52
53 private IConfigSource m_config;
54 private int m_port = 1253;
55 private Timer m_ticker;
56
57 private readonly Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>();
58 private bool m_shutdown;
59
60 public void Initialise(Scene scene, IConfigSource source)
61 {
62 if (!m_scenes.ContainsKey(scene.RegionInfo.RegionID))
63 m_scenes.Add(scene.RegionInfo.RegionID, scene);
64
65 m_config = source;
66 }
67
68 public void PostInitialise()
69 {
70 if (m_config.Configs["MXP"] != null)
71 {
72 IConfig con = m_config.Configs["MXP"];
73
74 if (!con.GetBoolean("Enabled", false))
75 return;
76
77 m_port = con.GetInt("Port", m_port);
78
79 m_server = new MXPPacketServer(m_port, m_scenes,m_config.Configs["StandAlone"].GetBoolean("accounts_authenticate",true));
80
81 m_ticker = new Timer(100);
82 m_ticker.AutoReset = false;
83 m_ticker.Elapsed += ticker_Elapsed;
84
85 lock (m_ticker)
86 m_ticker.Start();
87
88 m_log.Info("[MXP ClientStack] MXP Enabled and Listening");
89 }
90 }
91
92 void ticker_Elapsed(object sender, ElapsedEventArgs e)
93 {
94 try
95 {
96 m_server.Process();
97 }
98 catch (Exception ex)
99 {
100 m_log.Error("[MXP ClientStack]: Unhandled exception in process loop: " + ex.ToString() + " :" + ex.StackTrace.ToString());
101 }
102
103 if (!m_shutdown)
104 {
105 lock (m_ticker)
106 m_ticker.Start();
107 }
108 }
109
110 public void Close()
111 {
112 m_shutdown = true;
113 if (m_ticker != null)
114 {
115 lock (m_ticker)
116 m_ticker.Stop();
117 }
118 }
119
120 public string Name
121 {
122 get { return "MXP ClientStack Module"; }
123 }
124
125 public bool IsSharedModule
126 {
127 get { return true; }
128 }
129
130 }
131}
diff --git a/OpenSim/Client/MXP/MXPUtil.cs b/OpenSim/Client/MXP/MXPUtil.cs
deleted file mode 100644
index 3387145..0000000
--- a/OpenSim/Client/MXP/MXPUtil.cs
+++ /dev/null
@@ -1,42 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Text;
31using OpenMetaverse;
32
33namespace OpenSim.Client.MXP
34{
35 public static class MXPUtil
36 {
37 public static string GenerateMXPURL(string server, int port, UUID bubbleID, Vector3 location)
38 {
39 return string.Format("mxp://{0}:{1}/{2}/{3}", server, port, bubbleID.Guid, location);
40 }
41 }
42}
diff --git a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs b/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs
deleted file mode 100644
index dcecb8b..0000000
--- a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs
+++ /dev/null
@@ -1,561 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/* This file borrows heavily from MXPServer.cs - the reference MXPServer
29 * See http://www.bubblecloud.org for a copy of the original file and
30 * implementation details. */
31
32using System;
33using System.Collections.Generic;
34using System.Reflection;
35using System.Threading;
36using log4net;
37using MXP;
38using MXP.Messages;
39using OpenMetaverse;
40using OpenSim.Client.MXP.ClientStack;
41using OpenSim.Framework;
42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Framework.Communications;
44using OpenSim.Services.Interfaces;
45using System.Security.Cryptography;
46
47namespace OpenSim.Client.MXP.PacketHandler
48{
49 public class MXPPacketServer
50 {
51 internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 #region Fields
54
55 private readonly List<MXPClientView> m_clients = new List<MXPClientView>();
56 private readonly Dictionary<UUID, Scene> m_scenes;
57 private readonly Transmitter m_transmitter;
58
59// private readonly Thread m_clientThread;
60
61 private readonly IList<Session> m_sessions = new List<Session>();
62 private readonly IList<Session> m_sessionsToClient = new List<Session>();
63 private readonly IList<MXPClientView> m_sessionsToRemove = new List<MXPClientView>();
64
65 private readonly int m_port;
66// private readonly bool m_accountsAuthenticate;
67
68 private readonly String m_programName;
69 private readonly byte m_programMajorVersion;
70 private readonly byte m_programMinorVersion;
71
72 #endregion
73
74 #region Constructors
75
76 public MXPPacketServer(int port, Dictionary<UUID, Scene> scenes, bool accountsAuthenticate)
77 {
78 m_port = port;
79// m_accountsAuthenticate = accountsAuthenticate;
80
81 m_scenes = scenes;
82
83 m_programMinorVersion = 63;
84 m_programMajorVersion = 0;
85 m_programName = "OpenSimulator";
86
87 m_transmitter = new Transmitter(port);
88
89 StartListener();
90 }
91
92 public void StartListener()
93 {
94 m_log.Info("[MXP ClientStack] Transmitter starting on UDP server port: " + m_port);
95 m_transmitter.Startup();
96 m_log.Info("[MXP ClientStack] Transmitter started. MXP version: "+MxpConstants.ProtocolMajorVersion+"."+MxpConstants.ProtocolMinorVersion+" Source Revision: "+MxpConstants.ProtocolSourceRevision);
97 }
98
99 #endregion
100
101 #region Properties
102
103 /// <summary>
104 /// Number of sessions pending. (Process() accepts pending sessions).
105 /// </summary>
106 public int PendingSessionCount
107 {
108 get
109 {
110 return m_transmitter.PendingSessionCount;
111 }
112 }
113 /// <summary>
114 /// Number of connected sessions.
115 /// </summary>
116 public int SessionCount
117 {
118 get
119 {
120 return m_sessions.Count;
121 }
122 }
123 /// <summary>
124 /// Property reflecting whether client transmitter threads are alive.
125 /// </summary>
126 public bool IsTransmitterAlive
127 {
128 get
129 {
130 return m_transmitter != null && m_transmitter.IsAlive;
131 }
132 }
133 /// <summary>
134 /// Number of packets sent.
135 /// </summary>
136 public ulong PacketsSent
137 {
138 get
139 {
140 return m_transmitter != null ? m_transmitter.PacketsSent : 0;
141 }
142 }
143 /// <summary>
144 /// Number of packets received.
145 /// </summary>
146 public ulong PacketsReceived
147 {
148 get
149 {
150 return m_transmitter != null ? m_transmitter.PacketsReceived : 0;
151 }
152 }
153 /// <summary>
154 /// Bytes client has received so far.
155 /// </summary>
156 public ulong BytesReceived
157 {
158 get
159 {
160 return m_transmitter != null ? m_transmitter.BytesReceived : 0;
161 }
162 }
163 /// <summary>
164 /// Bytes client has sent so far.
165 /// </summary>
166 public ulong BytesSent
167 {
168 get
169 {
170 return m_transmitter != null ? m_transmitter.BytesSent : 0;
171 }
172 }
173 /// <summary>
174 /// Number of bytes received (bytes per second) during past second.
175 /// </summary>
176 public double ReceiveRate
177 {
178 get
179 {
180 return m_transmitter != null ? m_transmitter.ReceiveRate : 0;
181 }
182 }
183 /// <summary>
184 /// Number of bytes sent (bytes per second) during past second.
185 /// </summary>
186 public double SendRate
187 {
188 get
189 {
190 return m_transmitter != null ? m_transmitter.SendRate : 0;
191 }
192 }
193
194 #endregion
195
196 #region Session Management
197
198 public void Disconnect(Session session)
199 {
200 if (session.IsConnected)
201 {
202 Message message = MessageFactory.Current.ReserveMessage(typeof(LeaveRequestMessage));
203 session.Send(message);
204 MessageFactory.Current.ReleaseMessage(message);
205 }
206 else
207 {
208 throw new Exception("Not connected.");
209 }
210 }
211
212 #endregion
213
214 #region Processing
215
216 public void Process()
217 {
218 ProcessMessages();
219 Clean();
220 }
221
222 public void Clean()
223 {
224 foreach (MXPClientView clientView in m_clients)
225 {
226 if (clientView.Session.SessionState == SessionState.Disconnected)
227 {
228 m_sessionsToRemove.Add(clientView);
229 }
230 }
231
232 foreach (MXPClientView clientView in m_sessionsToRemove)
233 {
234 clientView.Scene.RemoveClient(clientView.AgentId);
235 clientView.OnClean();
236 m_clients.Remove(clientView);
237 m_sessions.Remove(clientView.Session);
238 }
239
240 m_sessionsToRemove.Clear();
241 }
242
243 public void ProcessMessages()
244 {
245 if (m_transmitter.PendingSessionCount > 0)
246 {
247 Session tmp = m_transmitter.AcceptPendingSession();
248 m_sessions.Add(tmp);
249 m_sessionsToClient.Add(tmp);
250
251 }
252
253 List<Session> tmpRemove = new List<Session>();
254
255 foreach (Session session in m_sessionsToClient)
256 {
257 while (session.AvailableMessages > 0)
258 {
259 Message message = session.Receive();
260
261 if (message.GetType() == typeof (JoinRequestMessage))
262 {
263
264 JoinRequestMessage joinRequestMessage = (JoinRequestMessage) message;
265
266 m_log.Info("[MXP ClientStack]: Session join request: " + session.SessionId + " (" +
267 (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
268 session.RemoteEndPoint.Port + ")");
269
270 try
271 {
272
273 if (joinRequestMessage.BubbleId == Guid.Empty)
274 {
275 foreach (Scene scene in m_scenes.Values)
276 {
277 if (scene.RegionInfo.RegionName == joinRequestMessage.BubbleName)
278 {
279 m_log.Info("[MXP ClientStack]: Resolved region by name: " + joinRequestMessage.BubbleName + " (" + scene.RegionInfo.RegionID + ")");
280 joinRequestMessage.BubbleId = scene.RegionInfo.RegionID.Guid;
281 }
282 }
283 }
284
285 if (joinRequestMessage.BubbleId == Guid.Empty)
286 {
287 m_log.Warn("[MXP ClientStack]: Failed to resolve region by name: " + joinRequestMessage.BubbleName);
288 }
289
290 UUID sceneId = new UUID(joinRequestMessage.BubbleId);
291
292 bool regionExists = true;
293 if (!m_scenes.ContainsKey(sceneId))
294 {
295 m_log.Info("[MXP ClientStack]: No such region: " + sceneId);
296 regionExists = false;
297 }
298
299 UUID userId = UUID.Zero;
300 UserAccount account = null;
301 bool authorized = regionExists ? AuthoriseUser(joinRequestMessage.ParticipantName,
302 joinRequestMessage.ParticipantPassphrase,
303 new UUID(joinRequestMessage.BubbleId), out account)
304 : false;
305
306 if (authorized)
307 {
308 Scene scene = m_scenes[sceneId];
309 UUID mxpSessionID = UUID.Random();
310
311 string reason;
312
313 m_log.Debug("[MXP ClientStack]: Session join request success: " + session.SessionId + " (" +
314 (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
315 session.RemoteEndPoint.Port + ")");
316
317 m_log.Debug("[MXP ClientStack]: Attaching UserAgent to UserProfile...");
318 UUID secureSession = UUID.Zero;
319 AttachUserAgentToUserProfile(account, session, mxpSessionID, sceneId, out secureSession);
320 m_log.Debug("[MXP ClientStack]: Attached UserAgent to UserProfile.");
321 m_log.Debug("[MXP ClientStack]: Preparing Scene to Connection...");
322 if (!PrepareSceneForConnection(mxpSessionID, secureSession, sceneId, account, out reason))
323 {
324 m_log.DebugFormat("[MXP ClientStack]: Scene refused connection: {0}", reason);
325 DeclineConnection(session, joinRequestMessage);
326 tmpRemove.Add(session);
327 continue;
328 }
329 m_log.Debug("[MXP ClientStack]: Prepared Scene to Connection.");
330 m_log.Debug("[MXP ClientStack]: Accepting connection...");
331 AcceptConnection(session, joinRequestMessage, mxpSessionID, userId);
332 m_log.Info("[MXP ClientStack]: Accepted connection.");
333
334 m_log.Debug("[MXP ClientStack]: Creating ClientView....");
335 MXPClientView client = new MXPClientView(session, mxpSessionID, userId, scene, account.FirstName, account.LastName);
336 m_clients.Add(client);
337 m_log.Debug("[MXP ClientStack]: Created ClientView.");
338
339 client.MXPSendSynchronizationBegin(m_scenes[new UUID(joinRequestMessage.BubbleId)].SceneContents.GetTotalObjectsCount());
340
341 m_log.Debug("[MXP ClientStack]: Starting ClientView...");
342 try
343 {
344 client.Start();
345 m_log.Debug("[MXP ClientStack]: Started ClientView.");
346 }
347 catch (Exception e)
348 {
349 m_log.Error(e);
350 }
351
352 m_log.Debug("[MXP ClientStack]: Connected");
353 }
354 else
355 {
356 m_log.Info("[MXP ClientStack]: Session join request failure: " + session.SessionId + " (" +
357 (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
358 session.RemoteEndPoint.Port + ")");
359
360 DeclineConnection(session, joinRequestMessage);
361 }
362 }
363 catch (Exception e)
364 {
365 m_log.Error("[MXP ClientStack]: Session join request failure: " + session.SessionId + " (" +
366 (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
367 session.RemoteEndPoint.Port + "): "+e.ToString()+" :"+e.StackTrace.ToString());
368 }
369 tmpRemove.Add(session);
370 }
371 }
372 }
373
374 foreach (Session session in tmpRemove)
375 {
376 m_sessionsToClient.Remove(session);
377 }
378
379 foreach (MXPClientView clientView in m_clients)
380 {
381 int messagesProcessedCount = 0;
382 Session session = clientView.Session;
383
384 while (session.AvailableMessages > 0)
385 {
386 Message message = session.Receive();
387
388 if (message.GetType() == typeof(LeaveRequestMessage))
389 {
390 LeaveResponseMessage leaveResponseMessage = (LeaveResponseMessage)MessageFactory.Current.ReserveMessage(
391 typeof(LeaveResponseMessage));
392
393 m_log.Debug("[MXP ClientStack]: Session leave request: " + session.SessionId + " (" + (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + session.RemoteEndPoint.Port + ")");
394
395 leaveResponseMessage.RequestMessageId = message.MessageId;
396 leaveResponseMessage.FailureCode = 0;
397 session.Send(leaveResponseMessage);
398
399 if (session.SessionState != SessionState.Disconnected)
400 {
401 session.SetStateDisconnected();
402 }
403
404 m_log.Debug("[MXP ClientStack]: Removing Client from Scene");
405 //clientView.Scene.RemoveClient(clientView.AgentId);
406 }
407 if (message.GetType() == typeof(LeaveResponseMessage))
408 {
409 LeaveResponseMessage leaveResponseMessage = (LeaveResponseMessage)message;
410
411 m_log.Debug("[MXP ClientStack]: Session leave response: " + session.SessionId + " (" + (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + session.RemoteEndPoint.Port + ")");
412
413 if (leaveResponseMessage.FailureCode == 0)
414 {
415 session.SetStateDisconnected();
416 }
417
418 m_log.Debug("[MXP ClientStack]: Removing Client from Scene");
419 //clientView.Scene.RemoveClient(clientView.AgentId);
420 }
421 else
422 {
423 clientView.MXPPRocessMessage(message);
424 }
425
426 MessageFactory.Current.ReleaseMessage(message);
427 messagesProcessedCount++;
428 if (messagesProcessedCount > 1000)
429 {
430 break;
431 }
432 }
433 }
434 }
435
436 private void AcceptConnection(Session session, JoinRequestMessage joinRequestMessage, UUID mxpSessionID, UUID userId)
437 {
438 JoinResponseMessage joinResponseMessage = (JoinResponseMessage)MessageFactory.Current.ReserveMessage(
439 typeof(JoinResponseMessage));
440
441 joinResponseMessage.RequestMessageId = joinRequestMessage.MessageId;
442 joinResponseMessage.FailureCode = MxpResponseCodes.SUCCESS;
443
444 joinResponseMessage.BubbleId = joinRequestMessage.BubbleId;
445 joinResponseMessage.ParticipantId = userId.Guid;
446 joinResponseMessage.AvatarId = userId.Guid;
447 joinResponseMessage.BubbleAssetCacheUrl = "http://" +
448 NetworkUtil.GetHostFor(session.RemoteEndPoint.Address,
449 m_scenes[
450 new UUID(joinRequestMessage.BubbleId)].
451 RegionInfo.
452 ExternalHostName) + ":" +
453 m_scenes[new UUID(joinRequestMessage.BubbleId)].RegionInfo.
454 HttpPort + "/assets/";
455
456 joinResponseMessage.BubbleName = m_scenes[new UUID(joinRequestMessage.BubbleId)].RegionInfo.RegionName;
457
458 joinResponseMessage.BubbleRange = 128;
459 joinResponseMessage.BubblePerceptionRange = 128 + 256;
460 joinResponseMessage.BubbleRealTime = 0;
461 joinResponseMessage.ProgramName = m_programName;
462 joinResponseMessage.ProgramMajorVersion = m_programMajorVersion;
463 joinResponseMessage.ProgramMinorVersion = m_programMinorVersion;
464 joinResponseMessage.ProtocolMajorVersion = MxpConstants.ProtocolMajorVersion;
465 joinResponseMessage.ProtocolMinorVersion = MxpConstants.ProtocolMinorVersion;
466 joinResponseMessage.ProtocolSourceRevision = MxpConstants.ProtocolSourceRevision;
467
468 session.Send(joinResponseMessage);
469
470 session.SetStateConnected();
471 }
472
473 private void DeclineConnection(Session session, Message joinRequestMessage)
474 {
475 JoinResponseMessage joinResponseMessage = (JoinResponseMessage)MessageFactory.Current.ReserveMessage(typeof(JoinResponseMessage));
476
477 joinResponseMessage.RequestMessageId = joinRequestMessage.MessageId;
478 joinResponseMessage.FailureCode = MxpResponseCodes.UNAUTHORIZED_OPERATION;
479
480 joinResponseMessage.ProgramName = m_programName;
481 joinResponseMessage.ProgramMajorVersion = m_programMajorVersion;
482 joinResponseMessage.ProgramMinorVersion = m_programMinorVersion;
483 joinResponseMessage.ProtocolMajorVersion = MxpConstants.ProtocolMajorVersion;
484 joinResponseMessage.ProtocolMinorVersion = MxpConstants.ProtocolMinorVersion;
485 joinResponseMessage.ProtocolSourceRevision = MxpConstants.ProtocolSourceRevision;
486
487 session.Send(joinResponseMessage);
488
489 session.SetStateDisconnected();
490 }
491
492 public bool AuthoriseUser(string participantName, string password, UUID sceneId, out UserAccount account)
493 {
494 string firstName = "";
495 string lastName = "";
496 account = null;
497
498 string[] nameParts = participantName.Split(' ');
499 if (nameParts.Length != 2)
500 {
501 m_log.Error("[MXP ClientStack]: Login failed as user name is not formed of first and last name separated by space: " + participantName);
502 return false;
503 }
504 firstName = nameParts[0];
505 lastName = nameParts[1];
506
507 account = m_scenes[sceneId].UserAccountService.GetUserAccount(m_scenes[sceneId].RegionInfo.ScopeID, firstName, lastName);
508 if (account != null)
509 return (m_scenes[sceneId].AuthenticationService.Authenticate(account.PrincipalID, password, 1) != string.Empty);
510
511 return false;
512 }
513
514 private void AttachUserAgentToUserProfile(UserAccount account, Session session, UUID sessionId, UUID sceneId, out UUID secureSessionId)
515 {
516 secureSessionId = UUID.Random();
517 Scene scene = m_scenes[sceneId];
518 scene.PresenceService.LoginAgent(account.PrincipalID.ToString(), sessionId, secureSessionId);
519 }
520
521 private bool PrepareSceneForConnection(UUID sessionId, UUID secureSessionId, UUID sceneId, UserAccount account, out string reason)
522 {
523 Scene scene = m_scenes[sceneId];
524
525 AgentCircuitData agent = new AgentCircuitData();
526 agent.AgentID = account.PrincipalID;
527 agent.firstname = account.FirstName;
528 agent.lastname = account.LastName;
529 agent.SessionID = sessionId;
530 agent.SecureSessionID = secureSessionId;
531 agent.circuitcode = sessionId.CRC();
532 agent.BaseFolder = UUID.Zero;
533 agent.InventoryFolder = UUID.Zero;
534 agent.startpos = new Vector3(0, 0, 0); // TODO Fill in region start position
535 agent.CapsPath = "http://localhost/";
536 agent.Appearance = scene.AvatarService.GetAppearance(account.PrincipalID);
537
538 if (agent.Appearance == null)
539 {
540 m_log.WarnFormat("[INTER]: Appearance not found for {0} {1}. Creating default.", agent.firstname, agent.lastname);
541 agent.Appearance = new AvatarAppearance();
542 }
543
544 return scene.NewUserConnection(agent, 0, out reason);
545 }
546
547 public void PrintDebugInformation()
548 {
549 m_log.Info("[MXP ClientStack]: Statistics report");
550 m_log.Info("Pending Sessions: " + PendingSessionCount);
551 m_log.Info("Sessions: " + SessionCount + " (Clients: " + m_clients.Count + " )");
552 m_log.Info("Transmitter Alive?: " + IsTransmitterAlive);
553 m_log.Info("Packets Sent/Received: " + PacketsSent + " / " + PacketsReceived);
554 m_log.Info("Bytes Sent/Received: " + BytesSent + " / " + BytesReceived);
555 m_log.Info("Send/Receive Rate (bps): " + SendRate + " / " + ReceiveRate);
556 }
557
558 #endregion
559
560 }
561}
diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
deleted file mode 100644
index 67a79c3..0000000
--- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
+++ /dev/null
@@ -1,1237 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Drawing;
31using System.Drawing.Imaging;
32using System.IO;
33using System.Net;
34using System.Text;
35using OpenMetaverse;
36using OpenMetaverse.Imaging;
37using OpenMetaverse.Packets;
38using OpenSim.Framework;
39using OpenSim.Framework.Servers;
40using OpenSim.Framework.Servers.HttpServer;
41using OpenSim.Region.Framework.Scenes;
42
43namespace OpenSim.Client.VWoHTTP.ClientStack
44{
45 class VWHClientView : IClientAPI
46 {
47 private Scene m_scene;
48
49
50 public bool ProcessInMsg(OSHttpRequest req, OSHttpResponse resp)
51 {
52 // 0 1 2 3
53 // http://simulator.com:9000/vwohttp/sessionid/methodname/param
54 string[] urlparts = req.Url.AbsolutePath.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
55
56 UUID sessionID;
57 // Check for session
58 if (!UUID.TryParse(urlparts[1], out sessionID))
59 return false;
60 // Check we match session
61 if (sessionID != SessionId)
62 return false;
63
64 string method = urlparts[2];
65
66 string param = String.Empty;
67 if (urlparts.Length > 3)
68 param = urlparts[3];
69
70 bool found;
71
72 switch (method.ToLower())
73 {
74 case "textures":
75 found = ProcessTextureRequest(param, resp);
76 break;
77 default:
78 found = false;
79 break;
80 }
81
82 return found;
83 }
84
85 private bool ProcessTextureRequest(string param, OSHttpResponse resp)
86 {
87 UUID assetID;
88 if (!UUID.TryParse(param, out assetID))
89 return false;
90
91 AssetBase asset = m_scene.AssetService.Get(assetID.ToString());
92
93 if (asset == null)
94 return false;
95
96 ManagedImage tmp;
97 Image imgData;
98 byte[] jpegdata;
99
100 OpenJPEG.DecodeToImage(asset.Data, out tmp, out imgData);
101
102 using (MemoryStream ms = new MemoryStream())
103 {
104 imgData.Save(ms, ImageFormat.Jpeg);
105 jpegdata = ms.GetBuffer();
106 }
107
108 resp.ContentType = "image/jpeg";
109 resp.ContentLength = jpegdata.Length;
110 resp.StatusCode = 200;
111 resp.Body.Write(jpegdata, 0, jpegdata.Length);
112
113 return true;
114 }
115
116 public VWHClientView(UUID sessionID, UUID agentID, string agentName, Scene scene)
117 {
118 m_scene = scene;
119 }
120
121 #region Implementation of IClientAPI
122
123 public Vector3 StartPos
124 {
125 get { throw new System.NotImplementedException(); }
126 set { throw new System.NotImplementedException(); }
127 }
128
129 public UUID AgentId
130 {
131 get { throw new System.NotImplementedException(); }
132 }
133
134 public UUID SessionId
135 {
136 get { throw new System.NotImplementedException(); }
137 }
138
139 public UUID SecureSessionId
140 {
141 get { throw new System.NotImplementedException(); }
142 }
143
144 public UUID ActiveGroupId
145 {
146 get { throw new System.NotImplementedException(); }
147 }
148
149 public string ActiveGroupName
150 {
151 get { throw new System.NotImplementedException(); }
152 }
153
154 public ulong ActiveGroupPowers
155 {
156 get { throw new System.NotImplementedException(); }
157 }
158
159 public ulong GetGroupPowers(UUID groupID)
160 {
161 throw new System.NotImplementedException();
162 }
163
164 public bool IsGroupMember(UUID GroupID)
165 {
166 throw new System.NotImplementedException();
167 }
168
169 public string FirstName
170 {
171 get { throw new System.NotImplementedException(); }
172 }
173
174 public string LastName
175 {
176 get { throw new System.NotImplementedException(); }
177 }
178
179 public IScene Scene
180 {
181 get { throw new System.NotImplementedException(); }
182 }
183
184 public int NextAnimationSequenceNumber
185 {
186 get { throw new System.NotImplementedException(); }
187 }
188
189 public string Name
190 {
191 get { throw new System.NotImplementedException(); }
192 }
193
194 public bool IsActive
195 {
196 get { throw new System.NotImplementedException(); }
197 set { throw new System.NotImplementedException(); }
198 }
199 public bool IsLoggingOut
200 {
201 get { throw new System.NotImplementedException(); }
202 set { throw new System.NotImplementedException(); }
203 }
204 public bool SendLogoutPacketWhenClosing
205 {
206 set { throw new System.NotImplementedException(); }
207 }
208
209 public uint CircuitCode
210 {
211 get { throw new System.NotImplementedException(); }
212 }
213
214 public IPEndPoint RemoteEndPoint
215 {
216 get { throw new System.NotImplementedException(); }
217 }
218
219 public event GenericMessage OnGenericMessage = delegate { };
220 public event ImprovedInstantMessage OnInstantMessage = delegate { };
221 public event ChatMessage OnChatFromClient = delegate { };
222 public event TextureRequest OnRequestTexture = delegate { };
223 public event RezObject OnRezObject = delegate { };
224 public event ModifyTerrain OnModifyTerrain = delegate { };
225 public event BakeTerrain OnBakeTerrain = delegate { };
226 public event EstateChangeInfo OnEstateChangeInfo = delegate { };
227 public event SetAppearance OnSetAppearance = delegate { };
228 public event AvatarNowWearing OnAvatarNowWearing = delegate { };
229 public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv = delegate { return new UUID(); };
230 public event RezMultipleAttachmentsFromInv OnRezMultipleAttachmentsFromInv = delegate { };
231 public event UUIDNameRequest OnDetachAttachmentIntoInv = delegate { };
232 public event ObjectAttach OnObjectAttach = delegate { };
233 public event ObjectDeselect OnObjectDetach = delegate { };
234 public event ObjectDrop OnObjectDrop = delegate { };
235 public event StartAnim OnStartAnim = delegate { };
236 public event StopAnim OnStopAnim = delegate { };
237 public event LinkObjects OnLinkObjects = delegate { };
238 public event DelinkObjects OnDelinkObjects = delegate { };
239 public event RequestMapBlocks OnRequestMapBlocks = delegate { };
240 public event RequestMapName OnMapNameRequest = delegate { };
241 public event TeleportLocationRequest OnTeleportLocationRequest = delegate { };
242 public event DisconnectUser OnDisconnectUser = delegate { };
243 public event RequestAvatarProperties OnRequestAvatarProperties = delegate { };
244 public event SetAlwaysRun OnSetAlwaysRun = delegate { };
245 public event TeleportLandmarkRequest OnTeleportLandmarkRequest = delegate { };
246 public event DeRezObject OnDeRezObject = delegate { };
247 public event Action<IClientAPI> OnRegionHandShakeReply = delegate { };
248 public event GenericCall1 OnRequestWearables = delegate { };
249 public event GenericCall1 OnCompleteMovementToRegion = delegate { };
250 public event UpdateAgent OnPreAgentUpdate;
251 public event UpdateAgent OnAgentUpdate = delegate { };
252 public event AgentRequestSit OnAgentRequestSit = delegate { };
253 public event AgentSit OnAgentSit = delegate { };
254 public event AvatarPickerRequest OnAvatarPickerRequest = delegate { };
255 public event Action<IClientAPI> OnRequestAvatarsData = delegate { };
256 public event AddNewPrim OnAddPrim = delegate { };
257 public event FetchInventory OnAgentDataUpdateRequest = delegate { };
258 public event TeleportLocationRequest OnSetStartLocationRequest = delegate { };
259 public event RequestGodlikePowers OnRequestGodlikePowers = delegate { };
260 public event GodKickUser OnGodKickUser = delegate { };
261 public event ObjectDuplicate OnObjectDuplicate = delegate { };
262 public event ObjectDuplicateOnRay OnObjectDuplicateOnRay = delegate { };
263 public event GrabObject OnGrabObject = delegate { };
264 public event DeGrabObject OnDeGrabObject = delegate { };
265 public event MoveObject OnGrabUpdate = delegate { };
266 public event SpinStart OnSpinStart = delegate { };
267 public event SpinObject OnSpinUpdate = delegate { };
268 public event SpinStop OnSpinStop = delegate { };
269 public event UpdateShape OnUpdatePrimShape = delegate { };
270 public event ObjectExtraParams OnUpdateExtraParams = delegate { };
271 public event ObjectRequest OnObjectRequest = delegate { };
272 public event ObjectSelect OnObjectSelect = delegate { };
273 public event ObjectDeselect OnObjectDeselect = delegate { };
274 public event GenericCall7 OnObjectDescription = delegate { };
275 public event GenericCall7 OnObjectName = delegate { };
276 public event GenericCall7 OnObjectClickAction = delegate { };
277 public event GenericCall7 OnObjectMaterial = delegate { };
278 public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily = delegate { };
279 public event UpdatePrimFlags OnUpdatePrimFlags = delegate { };
280 public event UpdatePrimTexture OnUpdatePrimTexture = delegate { };
281 public event UpdateVector OnUpdatePrimGroupPosition = delegate { };
282 public event UpdateVector OnUpdatePrimSinglePosition = delegate { };
283 public event UpdatePrimRotation OnUpdatePrimGroupRotation = delegate { };
284 public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation = delegate { };
285 public event UpdatePrimSingleRotationPosition OnUpdatePrimSingleRotationPosition = delegate { };
286 public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation = delegate { };
287 public event UpdateVector OnUpdatePrimScale = delegate { };
288 public event UpdateVector OnUpdatePrimGroupScale = delegate { };
289 public event StatusChange OnChildAgentStatus = delegate { };
290 public event GenericCall2 OnStopMovement = delegate { };
291 public event Action<UUID> OnRemoveAvatar = delegate { };
292 public event ObjectPermissions OnObjectPermissions = delegate { };
293 public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy = delegate { };
294 public event CreateNewInventoryItem OnCreateNewInventoryItem = delegate { };
295 public event LinkInventoryItem OnLinkInventoryItem = delegate { };
296 public event CreateInventoryFolder OnCreateNewInventoryFolder = delegate { };
297 public event UpdateInventoryFolder OnUpdateInventoryFolder = delegate { };
298 public event MoveInventoryFolder OnMoveInventoryFolder = delegate { };
299 public event FetchInventoryDescendents OnFetchInventoryDescendents = delegate { };
300 public event PurgeInventoryDescendents OnPurgeInventoryDescendents = delegate { };
301 public event FetchInventory OnFetchInventory = delegate { };
302 public event RequestTaskInventory OnRequestTaskInventory = delegate { };
303 public event UpdateInventoryItem OnUpdateInventoryItem = delegate { };
304 public event CopyInventoryItem OnCopyInventoryItem = delegate { };
305 public event MoveInventoryItem OnMoveInventoryItem = delegate { };
306 public event RemoveInventoryFolder OnRemoveInventoryFolder = delegate { };
307 public event RemoveInventoryItem OnRemoveInventoryItem = delegate { };
308 public event UDPAssetUploadRequest OnAssetUploadRequest = delegate { };
309 public event XferReceive OnXferReceive = delegate { };
310 public event RequestXfer OnRequestXfer = delegate { };
311 public event ConfirmXfer OnConfirmXfer = delegate { };
312 public event AbortXfer OnAbortXfer = delegate { };
313 public event RezScript OnRezScript = delegate { };
314 public event UpdateTaskInventory OnUpdateTaskInventory = delegate { };
315 public event MoveTaskInventory OnMoveTaskItem = delegate { };
316 public event RemoveTaskInventory OnRemoveTaskItem = delegate { };
317 public event RequestAsset OnRequestAsset = delegate { };
318 public event UUIDNameRequest OnNameFromUUIDRequest = delegate { };
319 public event ParcelAccessListRequest OnParcelAccessListRequest = delegate { };
320 public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest = delegate { };
321 public event ParcelPropertiesRequest OnParcelPropertiesRequest = delegate { };
322 public event ParcelDivideRequest OnParcelDivideRequest = delegate { };
323 public event ParcelJoinRequest OnParcelJoinRequest = delegate { };
324 public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest = delegate { };
325 public event ParcelSelectObjects OnParcelSelectObjects = delegate { };
326 public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest = delegate { };
327 public event ParcelAbandonRequest OnParcelAbandonRequest = delegate { };
328 public event ParcelGodForceOwner OnParcelGodForceOwner = delegate { };
329 public event ParcelReclaim OnParcelReclaim = delegate { };
330 public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest = delegate { };
331 public event ParcelDeedToGroup OnParcelDeedToGroup = delegate { };
332 public event RegionInfoRequest OnRegionInfoRequest = delegate { };
333 public event EstateCovenantRequest OnEstateCovenantRequest = delegate { };
334 public event FriendActionDelegate OnApproveFriendRequest = delegate { };
335 public event FriendActionDelegate OnDenyFriendRequest = delegate { };
336 public event FriendshipTermination OnTerminateFriendship = delegate { };
337 public event GrantUserFriendRights OnGrantUserRights = delegate { };
338 public event MoneyTransferRequest OnMoneyTransferRequest = delegate { };
339 public event EconomyDataRequest OnEconomyDataRequest = delegate { };
340 public event MoneyBalanceRequest OnMoneyBalanceRequest = delegate { };
341 public event UpdateAvatarProperties OnUpdateAvatarProperties = delegate { };
342 public event ParcelBuy OnParcelBuy = delegate { };
343 public event RequestPayPrice OnRequestPayPrice = delegate { };
344 public event ObjectSaleInfo OnObjectSaleInfo = delegate { };
345 public event ObjectBuy OnObjectBuy = delegate { };
346 public event BuyObjectInventory OnBuyObjectInventory = delegate { };
347 public event RequestTerrain OnRequestTerrain = delegate { };
348 public event RequestTerrain OnUploadTerrain = delegate { };
349 public event ObjectIncludeInSearch OnObjectIncludeInSearch = delegate { };
350 public event UUIDNameRequest OnTeleportHomeRequest = delegate { };
351 public event ScriptAnswer OnScriptAnswer = delegate { };
352 public event AgentSit OnUndo = delegate { };
353 public event AgentSit OnRedo = delegate { };
354 public event LandUndo OnLandUndo = delegate { };
355 public event ForceReleaseControls OnForceReleaseControls = delegate { };
356 public event GodLandStatRequest OnLandStatRequest = delegate { };
357 public event DetailedEstateDataRequest OnDetailedEstateDataRequest = delegate { };
358 public event SetEstateFlagsRequest OnSetEstateFlagsRequest = delegate { };
359 public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture = delegate { };
360 public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture = delegate { };
361 public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights = delegate { };
362 public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest = delegate { };
363 public event SetRegionTerrainSettings OnSetRegionTerrainSettings = delegate { };
364 public event EstateRestartSimRequest OnEstateRestartSimRequest = delegate { };
365 public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest = delegate { };
366 public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest = delegate { };
367 public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest = delegate { };
368 public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest = delegate { };
369 public event EstateDebugRegionRequest OnEstateDebugRegionRequest = delegate { };
370 public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest = delegate { };
371 public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest = delegate { };
372 public event UUIDNameRequest OnUUIDGroupNameRequest = delegate { };
373 public event RegionHandleRequest OnRegionHandleRequest = delegate { };
374 public event ParcelInfoRequest OnParcelInfoRequest = delegate { };
375 public event RequestObjectPropertiesFamily OnObjectGroupRequest = delegate { };
376 public event ScriptReset OnScriptReset = delegate { };
377 public event GetScriptRunning OnGetScriptRunning = delegate { };
378 public event SetScriptRunning OnSetScriptRunning = delegate { };
379 public event UpdateVector OnAutoPilotGo = delegate { };
380 public event TerrainUnacked OnUnackedTerrain = delegate { };
381 public event ActivateGesture OnActivateGesture = delegate { };
382 public event DeactivateGesture OnDeactivateGesture = delegate { };
383 public event ObjectOwner OnObjectOwner = delegate { };
384 public event DirPlacesQuery OnDirPlacesQuery = delegate { };
385 public event DirFindQuery OnDirFindQuery = delegate { };
386 public event DirLandQuery OnDirLandQuery = delegate { };
387 public event DirPopularQuery OnDirPopularQuery = delegate { };
388 public event DirClassifiedQuery OnDirClassifiedQuery = delegate { };
389 public event EventInfoRequest OnEventInfoRequest = delegate { };
390 public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime = delegate { };
391 public event MapItemRequest OnMapItemRequest = delegate { };
392 public event OfferCallingCard OnOfferCallingCard = delegate { };
393 public event AcceptCallingCard OnAcceptCallingCard = delegate { };
394 public event DeclineCallingCard OnDeclineCallingCard = delegate { };
395 public event SoundTrigger OnSoundTrigger = delegate { };
396 public event StartLure OnStartLure = delegate { };
397 public event TeleportLureRequest OnTeleportLureRequest = delegate { };
398 public event NetworkStats OnNetworkStatsUpdate = delegate { };
399 public event ClassifiedInfoRequest OnClassifiedInfoRequest = delegate { };
400 public event ClassifiedInfoUpdate OnClassifiedInfoUpdate = delegate { };
401 public event ClassifiedDelete OnClassifiedDelete = delegate { };
402 public event ClassifiedGodDelete OnClassifiedGodDelete = delegate { };
403 public event EventNotificationAddRequest OnEventNotificationAddRequest = delegate { };
404 public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest = delegate { };
405 public event EventGodDelete OnEventGodDelete = delegate { };
406 public event ParcelDwellRequest OnParcelDwellRequest = delegate { };
407 public event UserInfoRequest OnUserInfoRequest = delegate { };
408 public event UpdateUserInfo OnUpdateUserInfo = delegate { };
409 public event RetrieveInstantMessages OnRetrieveInstantMessages = delegate { };
410 public event PickDelete OnPickDelete = delegate { };
411 public event PickGodDelete OnPickGodDelete = delegate { };
412 public event PickInfoUpdate OnPickInfoUpdate = delegate { };
413 public event AvatarNotesUpdate OnAvatarNotesUpdate = delegate { };
414 public event MuteListRequest OnMuteListRequest = delegate { };
415 public event AvatarInterestUpdate OnAvatarInterestUpdate = delegate { };
416 public event PlacesQuery OnPlacesQuery = delegate { };
417 public event FindAgentUpdate OnFindAgent = delegate { };
418 public event TrackAgentUpdate OnTrackAgent = delegate { };
419 public event NewUserReport OnUserReport = delegate { };
420 public event SaveStateHandler OnSaveState = delegate { };
421 public event GroupAccountSummaryRequest OnGroupAccountSummaryRequest = delegate { };
422 public event GroupAccountDetailsRequest OnGroupAccountDetailsRequest = delegate { };
423 public event GroupAccountTransactionsRequest OnGroupAccountTransactionsRequest = delegate { };
424 public event FreezeUserUpdate OnParcelFreezeUser = delegate { };
425 public event EjectUserUpdate OnParcelEjectUser = delegate { };
426 public event ParcelBuyPass OnParcelBuyPass = delegate { };
427 public event ParcelGodMark OnParcelGodMark = delegate { };
428 public event GroupActiveProposalsRequest OnGroupActiveProposalsRequest = delegate { };
429 public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest = delegate { };
430 public event SimWideDeletesDelegate OnSimWideDeletes = delegate { };
431 public event SendPostcard OnSendPostcard = delegate { };
432 public event MuteListEntryUpdate OnUpdateMuteListEntry = delegate { };
433 public event MuteListEntryRemove OnRemoveMuteListEntry = delegate { };
434 public event GodlikeMessage onGodlikeMessage = delegate { };
435 public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate = delegate { };
436
437
438
439 public void SetDebugPacketLevel(int newDebug)
440 {
441 throw new System.NotImplementedException();
442 }
443
444 public void InPacket(object NewPack)
445 {
446 throw new System.NotImplementedException();
447 }
448
449 public void ProcessInPacket(Packet NewPack)
450 {
451 throw new System.NotImplementedException();
452 }
453
454 public void Close()
455 {
456 Close(true);
457 }
458
459 public void Close(bool sendStop)
460 {
461 throw new System.NotImplementedException();
462 }
463
464 public void Kick(string message)
465 {
466 throw new System.NotImplementedException();
467 }
468
469 public void Start()
470 {
471 throw new System.NotImplementedException();
472 }
473
474 public void Stop()
475 {
476 throw new System.NotImplementedException();
477 }
478
479 public void SendWearables(AvatarWearable[] wearables, int serial)
480 {
481 throw new System.NotImplementedException();
482 }
483
484 public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
485 {
486 throw new System.NotImplementedException();
487 }
488
489 public void SendStartPingCheck(byte seq)
490 {
491 throw new System.NotImplementedException();
492 }
493
494 public void SendKillObject(ulong regionHandle, List<uint> localID)
495 {
496 throw new System.NotImplementedException();
497 }
498
499 public void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
500 {
501 throw new System.NotImplementedException();
502 }
503
504 public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args)
505 {
506 throw new System.NotImplementedException();
507 }
508
509 public void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName, UUID fromAgentID, byte source, byte audible)
510 {
511 throw new System.NotImplementedException();
512 }
513
514 public void SendInstantMessage(GridInstantMessage im)
515 {
516 throw new System.NotImplementedException();
517 }
518
519 public void SendGenericMessage(string method, List<string> message)
520 {
521 }
522
523 public void SendGenericMessage(string method, List<byte[]> message)
524 {
525 throw new System.NotImplementedException();
526 }
527
528 public void SendLayerData(float[] map)
529 {
530 throw new System.NotImplementedException();
531 }
532
533 public void SendLayerData(int px, int py, float[] map)
534 {
535 throw new System.NotImplementedException();
536 }
537
538 public void SendWindData(Vector2[] windSpeeds)
539 {
540 throw new System.NotImplementedException();
541 }
542
543 public void SendCloudData(float[] cloudCover)
544 {
545 throw new System.NotImplementedException();
546 }
547
548 public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
549 {
550 throw new System.NotImplementedException();
551 }
552
553 public void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint)
554 {
555 throw new System.NotImplementedException();
556 }
557
558 public AgentCircuitData RequestClientInfo()
559 {
560 throw new System.NotImplementedException();
561 }
562
563 public void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint newRegionExternalEndPoint, string capsURL)
564 {
565 throw new System.NotImplementedException();
566 }
567
568 public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
569 {
570 throw new System.NotImplementedException();
571 }
572
573 public void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags)
574 {
575 throw new System.NotImplementedException();
576 }
577
578 public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, uint locationID, uint flags, string capsURL)
579 {
580 throw new System.NotImplementedException();
581 }
582
583 public void SendTeleportFailed(string reason)
584 {
585 throw new System.NotImplementedException();
586 }
587
588 public void SendTeleportStart(uint flags)
589 {
590 throw new System.NotImplementedException();
591 }
592
593 public void SendTeleportProgress(uint flags, string message)
594 {
595 throw new System.NotImplementedException();
596 }
597
598 public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance)
599 {
600 throw new System.NotImplementedException();
601 }
602
603 public void SendPayPrice(UUID objectID, int[] payPrice)
604 {
605 throw new System.NotImplementedException();
606 }
607
608 public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
609 {
610 throw new System.NotImplementedException();
611 }
612
613 public void SetChildAgentThrottle(byte[] throttle)
614 {
615 throw new System.NotImplementedException();
616 }
617
618 public void SendAvatarDataImmediate(ISceneEntity avatar)
619 {
620 throw new System.NotImplementedException();
621 }
622
623 public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags)
624 {
625 throw new System.NotImplementedException();
626 }
627
628 public void ReprioritizeUpdates()
629 {
630 throw new System.NotImplementedException();
631 }
632
633 public void FlushPrimUpdates()
634 {
635 throw new System.NotImplementedException();
636 }
637
638 public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items, List<InventoryFolderBase> folders, int version, bool fetchFolders, bool fetchItems)
639 {
640 throw new System.NotImplementedException();
641 }
642
643 public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item)
644 {
645 throw new System.NotImplementedException();
646 }
647
648 public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId)
649 {
650 throw new System.NotImplementedException();
651 }
652
653 public void SendRemoveInventoryItem(UUID itemID)
654 {
655 throw new System.NotImplementedException();
656 }
657
658 public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
659 {
660 throw new System.NotImplementedException();
661 }
662
663 public void SendTaskInventory(UUID taskID, short serial, byte[] fileName)
664 {
665 throw new System.NotImplementedException();
666 }
667
668 public void SendBulkUpdateInventory(InventoryNodeBase node)
669 {
670 throw new System.NotImplementedException();
671 }
672
673 public void SendXferPacket(ulong xferID, uint packet, byte[] data)
674 {
675 throw new System.NotImplementedException();
676 }
677
678 public virtual void SendAbortXferPacket(ulong xferID)
679 {
680 throw new System.NotImplementedException();
681 }
682
683 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
684 {
685 throw new System.NotImplementedException();
686 }
687
688 public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
689 {
690 throw new System.NotImplementedException();
691 }
692
693 public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
694 {
695 throw new System.NotImplementedException();
696 }
697
698 public void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID)
699 {
700 throw new System.NotImplementedException();
701 }
702
703 public void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, byte flags)
704 {
705 throw new System.NotImplementedException();
706 }
707
708 public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain)
709 {
710 throw new System.NotImplementedException();
711 }
712
713 public void SendAttachedSoundGainChange(UUID objectID, float gain)
714 {
715 throw new System.NotImplementedException();
716 }
717
718 public void SendNameReply(UUID profileId, string firstname, string lastname)
719 {
720 throw new System.NotImplementedException();
721 }
722
723 public void SendAlertMessage(string message)
724 {
725 throw new System.NotImplementedException();
726 }
727
728 public void SendAgentAlertMessage(string message, bool modal)
729 {
730 throw new System.NotImplementedException();
731 }
732
733 public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message, string url)
734 {
735 throw new System.NotImplementedException();
736 }
737
738 public void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
739 {
740 throw new System.NotImplementedException();
741 }
742
743 public bool AddMoney(int debit)
744 {
745 throw new System.NotImplementedException();
746 }
747
748 public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
749 {
750 throw new System.NotImplementedException();
751 }
752
753 public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
754 {
755 throw new System.NotImplementedException();
756 }
757
758 public void SendViewerTime(int phase)
759 {
760 throw new System.NotImplementedException();
761 }
762
763 public UUID GetDefaultAnimation(string name)
764 {
765 throw new System.NotImplementedException();
766 }
767
768 public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, byte[] charterMember, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID)
769 {
770 throw new System.NotImplementedException();
771 }
772
773 public void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question)
774 {
775 throw new System.NotImplementedException();
776 }
777
778 public void SendHealth(float health)
779 {
780 throw new System.NotImplementedException();
781 }
782
783 public void SendEstateList(UUID invoice, int code, UUID[] Data, uint estateID)
784 {
785 throw new System.NotImplementedException();
786 }
787
788 public void SendBannedUserList(UUID invoice, EstateBan[] banlist, uint estateID)
789 {
790 throw new System.NotImplementedException();
791 }
792
793 public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
794 {
795 throw new System.NotImplementedException();
796 }
797
798 public void SendEstateCovenantInformation(UUID covenant)
799 {
800 throw new System.NotImplementedException();
801 }
802
803 public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner)
804 {
805 throw new System.NotImplementedException();
806 }
807
808 public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
809 {
810 throw new System.NotImplementedException();
811 }
812
813 public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
814 {
815 throw new System.NotImplementedException();
816 }
817
818 public void SendForceClientSelectObjects(List<uint> objectIDs)
819 {
820 throw new System.NotImplementedException();
821 }
822
823 public void SendCameraConstraint(Vector4 ConstraintPlane)
824 {
825
826 }
827
828 public void SendLandObjectOwners(LandData land, List<UUID> groups, Dictionary<UUID, int> ownersAndCount)
829 {
830 throw new System.NotImplementedException();
831 }
832
833 public void SendLandParcelOverlay(byte[] data, int sequence_id)
834 {
835 throw new System.NotImplementedException();
836 }
837
838 public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time)
839 {
840 throw new System.NotImplementedException();
841 }
842
843 public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID, byte autoScale, string mediaType, string mediaDesc, int mediaWidth, int mediaHeight, byte mediaLoop)
844 {
845 throw new System.NotImplementedException();
846 }
847
848 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
849 {
850 throw new System.NotImplementedException();
851 }
852
853 public void SendConfirmXfer(ulong xferID, uint PacketID)
854 {
855 throw new System.NotImplementedException();
856 }
857
858 public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName)
859 {
860 throw new System.NotImplementedException();
861 }
862
863 public void SendInitiateDownload(string simFileName, string clientFileName)
864 {
865 throw new System.NotImplementedException();
866 }
867
868 public void SendImageFirstPart(ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
869 {
870 throw new System.NotImplementedException();
871 }
872
873 public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
874 {
875 throw new System.NotImplementedException();
876 }
877
878 public void SendImageNotFound(UUID imageid)
879 {
880 throw new System.NotImplementedException();
881 }
882
883 public void SendShutdownConnectionNotice()
884 {
885 throw new System.NotImplementedException();
886 }
887
888 public void SendSimStats(SimStats stats)
889 {
890 throw new System.NotImplementedException();
891 }
892
893 public void SendObjectPropertiesFamilyData(ISceneEntity Entity, uint RequestFlags)
894 {
895 throw new System.NotImplementedException();
896 }
897
898 public void SendObjectPropertiesReply(ISceneEntity entity)
899 {
900 throw new System.NotImplementedException();
901 }
902
903 public void SendAgentOffline(UUID[] agentIDs)
904 {
905 throw new System.NotImplementedException();
906 }
907
908 public void SendAgentOnline(UUID[] agentIDs)
909 {
910 throw new System.NotImplementedException();
911 }
912
913 public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot, Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
914 {
915 throw new System.NotImplementedException();
916 }
917
918 public void SendAdminResponse(UUID Token, uint AdminLevel)
919 {
920 throw new System.NotImplementedException();
921 }
922
923 public void SendGroupMembership(GroupMembershipData[] GroupMembership)
924 {
925 throw new System.NotImplementedException();
926 }
927
928 public void SendGroupNameReply(UUID groupLLUID, string GroupName)
929 {
930 throw new System.NotImplementedException();
931 }
932
933 public void SendJoinGroupReply(UUID groupID, bool success)
934 {
935 throw new System.NotImplementedException();
936 }
937
938 public void SendEjectGroupMemberReply(UUID agentID, UUID groupID, bool success)
939 {
940 throw new System.NotImplementedException();
941 }
942
943 public void SendLeaveGroupReply(UUID groupID, bool success)
944 {
945 throw new System.NotImplementedException();
946 }
947
948 public void SendCreateGroupReply(UUID groupID, bool success, string message)
949 {
950 throw new System.NotImplementedException();
951 }
952
953 public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
954 {
955 throw new System.NotImplementedException();
956 }
957
958 public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running)
959 {
960 throw new System.NotImplementedException();
961 }
962
963 public void SendAsset(AssetRequestToClient req)
964 {
965 throw new System.NotImplementedException();
966 }
967
968 public void SendTexture(AssetBase TextureAsset)
969 {
970 throw new System.NotImplementedException();
971 }
972
973 public byte[] GetThrottlesPacked(float multiplier)
974 {
975 throw new System.NotImplementedException();
976 }
977
978 public event ViewerEffectEventHandler OnViewerEffect;
979 public event Action<IClientAPI> OnLogout;
980 public event Action<IClientAPI> OnConnectionClosed;
981 public void SendBlueBoxMessage(UUID FromAvatarID, string FromAvatarName, string Message)
982 {
983 throw new System.NotImplementedException();
984 }
985
986 public void SendLogoutPacket()
987 {
988 throw new System.NotImplementedException();
989 }
990
991 public EndPoint GetClientEP()
992 {
993 return null;
994 }
995
996 public ClientInfo GetClientInfo()
997 {
998 throw new System.NotImplementedException();
999 }
1000
1001 public void SetClientInfo(ClientInfo info)
1002 {
1003 throw new System.NotImplementedException();
1004 }
1005
1006 public void SetClientOption(string option, string value)
1007 {
1008 throw new System.NotImplementedException();
1009 }
1010
1011 public string GetClientOption(string option)
1012 {
1013 throw new System.NotImplementedException();
1014 }
1015
1016 public void Terminate()
1017 {
1018 throw new System.NotImplementedException();
1019 }
1020
1021 public void SendSetFollowCamProperties(UUID objectID, SortedDictionary<int, float> parameters)
1022 {
1023 throw new System.NotImplementedException();
1024 }
1025
1026 public void SendClearFollowCamProperties(UUID objectID)
1027 {
1028 throw new System.NotImplementedException();
1029 }
1030
1031 public void SendRegionHandle(UUID regoinID, ulong handle)
1032 {
1033 throw new System.NotImplementedException();
1034 }
1035
1036 public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y)
1037 {
1038 throw new System.NotImplementedException();
1039 }
1040
1041 public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt)
1042 {
1043 throw new System.NotImplementedException();
1044 }
1045
1046 public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data)
1047 {
1048 throw new System.NotImplementedException();
1049 }
1050
1051 public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
1052 {
1053 throw new System.NotImplementedException();
1054 }
1055
1056 public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data)
1057 {
1058 throw new System.NotImplementedException();
1059 }
1060
1061 public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
1062 {
1063 throw new System.NotImplementedException();
1064 }
1065
1066 public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data)
1067 {
1068 throw new System.NotImplementedException();
1069 }
1070
1071 public void SendDirLandReply(UUID queryID, DirLandReplyData[] data)
1072 {
1073 throw new System.NotImplementedException();
1074 }
1075
1076 public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data)
1077 {
1078 throw new System.NotImplementedException();
1079 }
1080
1081 public void SendEventInfoReply(EventData info)
1082 {
1083 throw new System.NotImplementedException();
1084 }
1085
1086 public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags)
1087 {
1088 throw new System.NotImplementedException();
1089 }
1090
1091 public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
1092 {
1093 throw new System.NotImplementedException();
1094 }
1095
1096 public void SendOfferCallingCard(UUID srcID, UUID transactionID)
1097 {
1098 throw new System.NotImplementedException();
1099 }
1100
1101 public void SendAcceptCallingCard(UUID transactionID)
1102 {
1103 throw new System.NotImplementedException();
1104 }
1105
1106 public void SendDeclineCallingCard(UUID transactionID)
1107 {
1108 throw new System.NotImplementedException();
1109 }
1110
1111 public void SendTerminateFriend(UUID exFriendID)
1112 {
1113 throw new System.NotImplementedException();
1114 }
1115
1116 public void SendAvatarClassifiedReply(UUID targetID, UUID[] classifiedID, string[] name)
1117 {
1118 throw new System.NotImplementedException();
1119 }
1120
1121 public void SendClassifiedInfoReply(UUID classifiedID, UUID creatorID, uint creationDate, uint expirationDate, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, string simName, Vector3 globalPos, string parcelName, byte classifiedFlags, int price)
1122 {
1123 throw new System.NotImplementedException();
1124 }
1125
1126 public void SendAgentDropGroup(UUID groupID)
1127 {
1128 throw new System.NotImplementedException();
1129 }
1130
1131 public void RefreshGroupMembership()
1132 {
1133 throw new System.NotImplementedException();
1134 }
1135
1136 public void SendAvatarNotesReply(UUID targetID, string text)
1137 {
1138 throw new System.NotImplementedException();
1139 }
1140
1141 public void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks)
1142 {
1143 throw new System.NotImplementedException();
1144 }
1145
1146 public void SendPickInfoReply(UUID pickID, UUID creatorID, bool topPick, UUID parcelID, string name, string desc, UUID snapshotID, string user, string originalName, string simName, Vector3 posGlobal, int sortOrder, bool enabled)
1147 {
1148 throw new System.NotImplementedException();
1149 }
1150
1151 public void SendAvatarClassifiedReply(UUID targetID, Dictionary<UUID, string> classifieds)
1152 {
1153 throw new System.NotImplementedException();
1154 }
1155
1156 public void SendAvatarInterestUpdate(IClientAPI client, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages)
1157 {
1158 throw new System.NotImplementedException();
1159 }
1160
1161 public void SendParcelDwellReply(int localID, UUID parcelID, float dwell)
1162 {
1163 throw new System.NotImplementedException();
1164 }
1165
1166 public void SendUserInfoReply(bool imViaEmail, bool visible, string email)
1167 {
1168 throw new System.NotImplementedException();
1169 }
1170
1171 public void SendUseCachedMuteList()
1172 {
1173 throw new System.NotImplementedException();
1174 }
1175
1176 public void SendMuteListUpdate(string filename)
1177 {
1178 throw new System.NotImplementedException();
1179 }
1180
1181 public void KillEndDone()
1182 {
1183 throw new System.NotImplementedException();
1184 }
1185
1186 public bool AddGenericPacketHandler(string MethodName, GenericMessage handler)
1187 {
1188 throw new System.NotImplementedException();
1189 }
1190
1191 #endregion
1192
1193 public void SendRebakeAvatarTextures(UUID textureID)
1194 {
1195 }
1196
1197 public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
1198 {
1199 }
1200
1201 public void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt)
1202 {
1203 }
1204
1205 public void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier)
1206 {
1207 }
1208
1209 public void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID,int amt)
1210 {
1211 }
1212
1213 public void SendGroupVoteHistory(UUID groupID, UUID transactionID, GroupVoteHistory[] Votes)
1214 {
1215 }
1216
1217 public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals)
1218 {
1219 }
1220
1221 public void SendChangeUserRights(UUID agentID, UUID friendID, int rights)
1222 {
1223 }
1224
1225 public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId)
1226 {
1227 }
1228
1229 public void StopFlying(ISceneEntity presence)
1230 {
1231 }
1232
1233 public void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data)
1234 {
1235 }
1236 }
1237}
diff --git a/OpenSim/Client/VWoHTTP/VWoHTTPModule.cs b/OpenSim/Client/VWoHTTP/VWoHTTPModule.cs
deleted file mode 100644
index 31385ba..0000000
--- a/OpenSim/Client/VWoHTTP/VWoHTTPModule.cs
+++ /dev/null
@@ -1,133 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27using System;
28using System.Collections.Generic;
29using System.Text;
30using Nini.Config;
31using OpenMetaverse;
32using OpenSim.Client.VWoHTTP.ClientStack;
33using OpenSim.Framework;
34using OpenSim.Framework.Servers;
35using OpenSim.Framework.Servers.HttpServer;
36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.Framework.Scenes;
38
39namespace OpenSim.Client.VWoHTTP
40{
41 class VWoHTTPModule : IRegionModule, IHttpAgentHandler
42 {
43 private bool m_disabled = true;
44
45 private IHttpServer m_httpd;
46
47 private readonly List<Scene> m_scenes = new List<Scene>();
48
49 private Dictionary<UUID, VWHClientView> m_clients = new Dictionary<UUID, VWHClientView>();
50
51 #region Implementation of IRegionModule
52
53 public void Initialise(Scene scene, IConfigSource source)
54 {
55 if (m_disabled)
56 return;
57
58 m_scenes.Add(scene);
59
60 m_httpd = MainServer.Instance;
61 }
62
63 public void PostInitialise()
64 {
65 if (m_disabled)
66 return;
67
68 m_httpd.AddAgentHandler("vwohttp", this);
69 }
70
71 public void Close()
72 {
73 if (m_disabled)
74 return;
75
76 m_httpd.RemoveAgentHandler("vwohttp", this);
77 }
78
79 public string Name
80 {
81 get { return "VWoHTTP ClientStack"; }
82 }
83
84 public bool IsSharedModule
85 {
86 get { return true; }
87 }
88
89 #endregion
90
91 #region Implementation of IHttpAgentHandler
92
93 public bool Handle(OSHttpRequest req, OSHttpResponse resp)
94 {
95 string[] urlparts = req.Url.AbsolutePath.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
96
97 if (urlparts.Length < 2)
98 return false;
99
100 if (urlparts[1] == "connect")
101 {
102 UUID sessID = UUID.Random();
103
104 VWHClientView client = new VWHClientView(sessID, UUID.Random(), "VWoHTTPClient", m_scenes[0]);
105
106 m_clients.Add(sessID, client);
107
108 return true;
109 }
110 else
111 {
112 if (urlparts.Length < 3)
113 return false;
114
115 UUID sessionID;
116 if (!UUID.TryParse(urlparts[1], out sessionID))
117 return false;
118
119 if (!m_clients.ContainsKey(sessionID))
120 return false;
121
122 return m_clients[sessionID].ProcessInMsg(req, resp);
123 }
124 }
125
126 public bool Match(OSHttpRequest req, OSHttpResponse resp)
127 {
128 return req.Url.ToString().Contains("vwohttp");
129 }
130
131 #endregion
132 }
133}
diff --git a/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs b/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs
index 904366e..19e8fa6 100644
--- a/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs
+++ b/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs
@@ -56,15 +56,15 @@ namespace OpenSim.Data.MSSQL
56 string realm, string storeName) 56 string realm, string storeName)
57 { 57 {
58 m_Realm = realm; 58 m_Realm = realm;
59
60 m_ConnectionString = connectionString;
59 61
60 if (storeName != String.Empty) 62 if (storeName != String.Empty)
61 { 63 {
62 Assembly assem = GetType().Assembly;
63 m_ConnectionString = connectionString;
64 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 64 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
65 { 65 {
66 conn.Open(); 66 conn.Open();
67 Migration m = new Migration(conn, assem, storeName); 67 Migration m = new Migration(conn, GetType().Assembly, storeName);
68 m.Update(); 68 m.Update();
69 } 69 }
70 70
diff --git a/OpenSim/Data/MSSQL/MSSQLMigration.cs b/OpenSim/Data/MSSQL/MSSQLMigration.cs
index aea31c9..cd395b8 100644
--- a/OpenSim/Data/MSSQL/MSSQLMigration.cs
+++ b/OpenSim/Data/MSSQL/MSSQLMigration.cs
@@ -61,7 +61,8 @@ namespace OpenSim.Data.MSSQL
61 } 61 }
62 catch 62 catch
63 { 63 {
64 // Something went wrong, so we're version 0 64 // Return -1 to indicate table does not exist
65 return -1;
65 } 66 }
66 } 67 }
67 return version; 68 return version;
diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
index 80ec65e..5155e56 100644
--- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
@@ -492,12 +492,11 @@ ELSE
492 using (SqlConnection conn = new SqlConnection(m_connectionString)) 492 using (SqlConnection conn = new SqlConnection(m_connectionString))
493 using (SqlCommand cmd = new SqlCommand(sql, conn)) 493 using (SqlCommand cmd = new SqlCommand(sql, conn))
494 { 494 {
495 conn.Open();
495 foreach (TaskInventoryItem taskItem in items) 496 foreach (TaskInventoryItem taskItem in items)
496 { 497 {
497 cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem)); 498 cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem));
498 conn.Open();
499 cmd.ExecuteNonQuery(); 499 cmd.ExecuteNonQuery();
500
501 cmd.Parameters.Clear(); 500 cmd.Parameters.Clear();
502 } 501 }
503 } 502 }
@@ -1154,9 +1153,9 @@ VALUES
1154 PrimitiveBaseShape baseShape = new PrimitiveBaseShape(); 1153 PrimitiveBaseShape baseShape = new PrimitiveBaseShape();
1155 1154
1156 baseShape.Scale = new Vector3( 1155 baseShape.Scale = new Vector3(
1157 Convert.ToSingle(shapeRow["ScaleX"]), 1156 (float)Convert.ToDouble(shapeRow["ScaleX"]),
1158 Convert.ToSingle(shapeRow["ScaleY"]), 1157 (float)Convert.ToDouble(shapeRow["ScaleY"]),
1159 Convert.ToSingle(shapeRow["ScaleZ"])); 1158 (float)Convert.ToDouble(shapeRow["ScaleZ"]));
1160 1159
1161 // paths 1160 // paths
1162 baseShape.PCode = Convert.ToByte(shapeRow["PCode"]); 1161 baseShape.PCode = Convert.ToByte(shapeRow["PCode"]);
@@ -1193,8 +1192,11 @@ VALUES
1193 { 1192 {
1194 } 1193 }
1195 1194
1196 if (!(shapeRow["Media"] is System.DBNull)) 1195 if (!(shapeRow["Media"] is System.DBNull) )
1196 {
1197 baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]); 1197 baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]);
1198 }
1199
1198 1200
1199 return baseShape; 1201 return baseShape;
1200 } 1202 }
@@ -1573,7 +1575,16 @@ VALUES
1573 parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry)); 1575 parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry));
1574 parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams)); 1576 parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams));
1575 parameters.Add(_Database.CreateParameter("State", s.State)); 1577 parameters.Add(_Database.CreateParameter("State", s.State));
1576 parameters.Add(_Database.CreateParameter("Media", null == s.Media ? null : s.Media.ToXml())); 1578
1579 if(null == s.Media )
1580 {
1581 parameters.Add(_Database.CreateParameter("Media", DBNull.Value));
1582 }
1583 else
1584 {
1585 parameters.Add(_Database.CreateParameter("Media", s.Media.ToXml()));
1586 }
1587
1577 1588
1578 return parameters.ToArray(); 1589 return parameters.ToArray();
1579 } 1590 }
diff --git a/OpenSim/Data/MSSQL/Resources/AuthStore.migrations b/OpenSim/Data/MSSQL/Resources/AuthStore.migrations
index 5b90ca3..eb91296 100644
--- a/OpenSim/Data/MSSQL/Resources/AuthStore.migrations
+++ b/OpenSim/Data/MSSQL/Resources/AuthStore.migrations
@@ -22,7 +22,11 @@ COMMIT
22 22
23BEGIN TRANSACTION 23BEGIN TRANSACTION
24 24
25INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users; 25IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[users]') AND type in (N'U'))
26 INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users;
27
28COMMIT
29
30
26 31
27 32
28COMMIT \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/Avatar.migrations b/OpenSim/Data/MSSQL/Resources/Avatar.migrations
index 759e939..5364153 100644
--- a/OpenSim/Data/MSSQL/Resources/Avatar.migrations
+++ b/OpenSim/Data/MSSQL/Resources/Avatar.migrations
@@ -13,5 +13,28 @@ PRIMARY KEY CLUSTERED
13) ON [PRIMARY] 13) ON [PRIMARY]
14 14
15 15
16COMMIT
17
18:VERSION 2
19
20BEGIN TRANSACTION
21
22CREATE TABLE dbo.Tmp_Avatars
23 (
24 PrincipalID uniqueidentifier NOT NULL,
25 [Name] varchar(32) NOT NULL,
26 Value text NOT NULL DEFAULT '',
27 ) ON [PRIMARY]
28 TEXTIMAGE_ON [PRIMARY]
29
30IF EXISTS(SELECT * FROM dbo.Avatars)
31 EXEC('INSERT INTO dbo.Tmp_Avatars (PrincipalID, Name, Value)
32 SELECT PrincipalID, CONVERT(text, Name), Value FROM dbo.Avatars WITH (HOLDLOCK TABLOCKX)')
33
34DROP TABLE dbo.Avatars
35
36EXECUTE sp_rename N'dbo.Tmp_Avatars', N'Avatars', 'OBJECT'
37
38COMMIT
39
16 40
17COMMIT \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations
index f981a91..4d8ab0f 100644
--- a/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations
+++ b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations
@@ -15,6 +15,8 @@ COMMIT
15 15
16BEGIN TRANSACTION 16BEGIN TRANSACTION
17 17
18INSERT INTO Friends (PrincipalID, Friend, Flags, Offered) SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends; 18IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[userfriends]') AND type in (N'U'))
19INSERT INTO Friends (PrincipalID, Friend, Flags, Offered)
20SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends;
19 21
20COMMIT \ No newline at end of file 22COMMIT \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/GridStore.migrations b/OpenSim/Data/MSSQL/Resources/GridStore.migrations
index d2ca27a..c6342fc 100644
--- a/OpenSim/Data/MSSQL/Resources/GridStore.migrations
+++ b/OpenSim/Data/MSSQL/Resources/GridStore.migrations
@@ -222,4 +222,17 @@ ALTER TABLE [regions] ADD [Token] varchar(255) NOT NULL DEFAULT 0;
222 222
223COMMIT 223COMMIT
224 224
225:VERSION 8
225 226
227BEGIN TRANSACTION
228ALTER TABLE regions ALTER COLUMN regionName VarChar(128)
229
230DROP INDEX IX_regions_name ON dbo.regions
231ALTER TABLE regions ALTER COLUMN regionName VarChar(128) null
232
233CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions
234 (
235 regionName
236 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
237
238COMMIT \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations
index e2a8d57..4a3cb27 100644
--- a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations
+++ b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations
@@ -238,7 +238,10 @@ alter table inventoryitems
238 238
239COMMIT 239COMMIT
240 240
241 241:VERSION 8
242
243
244 242
243ALTER TABLE inventoryitems
244ADD CONSTRAINT DF_inventoryitems_creatorID
245DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID
246
247:GO \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/Presence.migrations b/OpenSim/Data/MSSQL/Resources/Presence.migrations
index 35f78e1..bcb6328 100644
--- a/OpenSim/Data/MSSQL/Resources/Presence.migrations
+++ b/OpenSim/Data/MSSQL/Resources/Presence.migrations
@@ -7,14 +7,7 @@ CREATE TABLE [Presence] (
7[RegionID] uniqueidentifier NOT NULL, 7[RegionID] uniqueidentifier NOT NULL,
8[SessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', 8[SessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
9[SecureSessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', 9[SecureSessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
10[Online] char(5) NOT NULL DEFAULT 'false', 10
11[Login] char(16) NOT NULL DEFAULT '0',
12[Logout] char(16) NOT NULL DEFAULT '0',
13[Position] char(64) NOT NULL DEFAULT '<0,0,0>',
14[LookAt] char(64) NOT NULL DEFAULT '<0,0,0>',
15[HomeRegionID] uniqueidentifier NOT NULL,
16[HomePosition] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
17[HomeLookAt] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
18) 11)
19 ON [PRIMARY] 12 ON [PRIMARY]
20 13
@@ -27,4 +20,12 @@ BEGIN TRANSACTION
27CREATE UNIQUE INDEX SessionID ON Presence(SessionID); 20CREATE UNIQUE INDEX SessionID ON Presence(SessionID);
28CREATE INDEX UserID ON Presence(UserID); 21CREATE INDEX UserID ON Presence(UserID);
29 22
23COMMIT
24
25:VERSION 2
26
27BEGIN TRANSACTION
28
29ALTER TABLE Presence ADD LastSeen DateTime
30
30COMMIT \ No newline at end of file 31COMMIT \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
index e2e8cbb..340b63d 100644
--- a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
+++ b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
@@ -1,4 +1,3 @@
1
2:VERSION 1 1:VERSION 1
3 2
4CREATE TABLE [dbo].[prims]( 3CREATE TABLE [dbo].[prims](
@@ -926,11 +925,121 @@ ALTER TABLE regionsettings ADD loaded_creation_datetime int NOT NULL default 0
926COMMIT 925COMMIT
927 926
928:VERSION 24 927:VERSION 24
929-- Added post 0.7
930 928
931BEGIN TRANSACTION 929BEGIN TRANSACTION
932 930
933ALTER TABLE prims ADD COLUMN MediaURL varchar(255) 931ALTER TABLE prims ADD MediaURL varchar(255)
934ALTER TABLE primshapes ADD COLUMN Media TEXT 932ALTER TABLE primshapes ADD Media TEXT NULL
933
934COMMIT
935
936:VERSION 25
937
938BEGIN TRANSACTION
939CREATE TABLE "regionwindlight" (
940 "region_id" varchar(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000',
941 "water_color_r" [float] NOT NULL DEFAULT '4.000000',
942 "water_color_g" [float] NOT NULL DEFAULT '38.000000',
943 "water_color_b" [float] NOT NULL DEFAULT '64.000000',
944 "water_fog_density_exponent" [float] NOT NULL DEFAULT '4.0',
945 "underwater_fog_modifier" [float] NOT NULL DEFAULT '0.25',
946 "reflection_wavelet_scale_1" [float] NOT NULL DEFAULT '2.0',
947 "reflection_wavelet_scale_2" [float] NOT NULL DEFAULT '2.0',
948 "reflection_wavelet_scale_3" [float] NOT NULL DEFAULT '2.0',
949 "fresnel_scale" [float] NOT NULL DEFAULT '0.40',
950 "fresnel_offset" [float] NOT NULL DEFAULT '0.50',
951 "refract_scale_above" [float] NOT NULL DEFAULT '0.03',
952 "refract_scale_below" [float] NOT NULL DEFAULT '0.20',
953 "blur_multiplier" [float] NOT NULL DEFAULT '0.040',
954 "big_wave_direction_x" [float] NOT NULL DEFAULT '1.05',
955 "big_wave_direction_y" [float] NOT NULL DEFAULT '-0.42',
956 "little_wave_direction_x" [float] NOT NULL DEFAULT '1.11',
957 "little_wave_direction_y" [float] NOT NULL DEFAULT '-1.16',
958 "normal_map_texture" varchar(36) NOT NULL DEFAULT '822ded49-9a6c-f61c-cb89-6df54f42cdf4',
959 "horizon_r" [float] NOT NULL DEFAULT '0.25',
960 "horizon_g" [float] NOT NULL DEFAULT '0.25',
961 "horizon_b" [float] NOT NULL DEFAULT '0.32',
962 "horizon_i" [float] NOT NULL DEFAULT '0.32',
963 "haze_horizon" [float] NOT NULL DEFAULT '0.19',
964 "blue_density_r" [float] NOT NULL DEFAULT '0.12',
965 "blue_density_g" [float] NOT NULL DEFAULT '0.22',
966 "blue_density_b" [float] NOT NULL DEFAULT '0.38',
967 "blue_density_i" [float] NOT NULL DEFAULT '0.38',
968 "haze_density" [float] NOT NULL DEFAULT '0.70',
969 "density_multiplier" [float] NOT NULL DEFAULT '0.18',
970 "distance_multiplier" [float] NOT NULL DEFAULT '0.8',
971 "max_altitude" int NOT NULL DEFAULT '1605',
972 "sun_moon_color_r" [float] NOT NULL DEFAULT '0.24',
973 "sun_moon_color_g" [float] NOT NULL DEFAULT '0.26',
974 "sun_moon_color_b" [float] NOT NULL DEFAULT '0.30',
975 "sun_moon_color_i" [float] NOT NULL DEFAULT '0.30',
976 "sun_moon_position" [float] NOT NULL DEFAULT '0.317',
977 "ambient_r" [float] NOT NULL DEFAULT '0.35',
978 "ambient_g" [float] NOT NULL DEFAULT '0.35',
979 "ambient_b" [float] NOT NULL DEFAULT '0.35',
980 "ambient_i" [float] NOT NULL DEFAULT '0.35',
981 "east_angle" [float] NOT NULL DEFAULT '0.00',
982 "sun_glow_focus" [float] NOT NULL DEFAULT '0.10',
983 "sun_glow_size" [float] NOT NULL DEFAULT '1.75',
984 "scene_gamma" [float] NOT NULL DEFAULT '1.00',
985 "star_brightness" [float] NOT NULL DEFAULT '0.00',
986 "cloud_color_r" [float] NOT NULL DEFAULT '0.41',
987 "cloud_color_g" [float] NOT NULL DEFAULT '0.41',
988 "cloud_color_b" [float] NOT NULL DEFAULT '0.41',
989 "cloud_color_i" [float] NOT NULL DEFAULT '0.41',
990 "cloud_x" [float] NOT NULL DEFAULT '1.00',
991 "cloud_y" [float] NOT NULL DEFAULT '0.53',
992 "cloud_density" [float] NOT NULL DEFAULT '1.00',
993 "cloud_coverage" [float] NOT NULL DEFAULT '0.27',
994 "cloud_scale" [float] NOT NULL DEFAULT '0.42',
995 "cloud_detail_x" [float] NOT NULL DEFAULT '1.00',
996 "cloud_detail_y" [float] NOT NULL DEFAULT '0.53',
997 "cloud_detail_density" [float] NOT NULL DEFAULT '0.12',
998 "cloud_scroll_x" [float] NOT NULL DEFAULT '0.20',
999 "cloud_scroll_x_lock" tinyint NOT NULL DEFAULT '0',
1000 "cloud_scroll_y" [float] NOT NULL DEFAULT '0.01',
1001 "cloud_scroll_y_lock" tinyint NOT NULL DEFAULT '0',
1002 "draw_classic_clouds" tinyint NOT NULL DEFAULT '1',
1003 PRIMARY KEY ("region_id")
1004)
1005
1006COMMIT TRANSACTION
1007
1008:VERSION 26
1009
1010BEGIN TRANSACTION
1011
1012ALTER TABLE regionsettings ADD map_tile_ID CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
1013
1014COMMIT
1015
1016:VERSION 27 #---------------------
935 1017
936COMMIT \ No newline at end of file 1018BEGIN TRANSACTION
1019ALTER TABLE land ADD MediaType VARCHAR(32) NOT NULL DEFAULT 'none/none'
1020ALTER TABLE land ADD MediaDescription VARCHAR(255) NOT NULL DEFAULT ''
1021ALTER TABLE land ADD MediaSize VARCHAR(16) NOT NULL DEFAULT '0,0'
1022ALTER TABLE land ADD MediaLoop bit NOT NULL DEFAULT 0
1023ALTER TABLE land ADD ObscureMusic bit NOT NULL DEFAULT 0
1024ALTER TABLE land ADD ObscureMedia bit NOT NULL DEFAULT 0
1025COMMIT
1026
1027:VERSION 28 #---------------------
1028
1029BEGIN TRANSACTION
1030
1031ALTER TABLE prims
1032ADD CONSTRAINT DF_prims_CreatorID
1033DEFAULT '00000000-0000-0000-0000-000000000000'
1034FOR CreatorID
1035
1036ALTER TABLE prims ALTER COLUMN CreatorID uniqueidentifier NOT NULL
1037
1038ALTER TABLE primitems
1039ADD CONSTRAINT DF_primitems_CreatorID
1040DEFAULT '00000000-0000-0000-0000-000000000000'
1041FOR CreatorID
1042
1043ALTER TABLE primitems ALTER COLUMN CreatorID uniqueidentifier NOT NULL
1044
1045COMMIT
diff --git a/OpenSim/Data/MSSQL/Resources/UserAccount.migrations b/OpenSim/Data/MSSQL/Resources/UserAccount.migrations
index 8534e23..a81704d 100644
--- a/OpenSim/Data/MSSQL/Resources/UserAccount.migrations
+++ b/OpenSim/Data/MSSQL/Resources/UserAccount.migrations
@@ -19,7 +19,7 @@ CREATE TABLE [UserAccounts] (
19:VERSION 2 19:VERSION 2
20 20
21BEGIN TRANSACTION 21BEGIN TRANSACTION
22 22IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[users]') AND type in (N'U'))
23INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, 23INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID,
24username AS FirstName, 24username AS FirstName,
25lastname AS LastName, 25lastname AS LastName,
diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs
index 3dbc215..dbd47d3 100644
--- a/OpenSim/Framework/AgentCircuitData.cs
+++ b/OpenSim/Framework/AgentCircuitData.cs
@@ -152,27 +152,6 @@ namespace OpenSim.Framework
152 } 152 }
153 153
154 /// <summary> 154 /// <summary>
155 /// Create AgentCircuitData from a Serializable AgentCircuitData
156 /// </summary>
157 /// <param name="cAgent"></param>
158 public AgentCircuitData(sAgentCircuitData cAgent)
159 {
160 AgentID = new UUID(cAgent.AgentID);
161 SessionID = new UUID(cAgent.SessionID);
162 SecureSessionID = new UUID(cAgent.SecureSessionID);
163 startpos = new Vector3(cAgent.startposx, cAgent.startposy, cAgent.startposz);
164 firstname = cAgent.firstname;
165 lastname = cAgent.lastname;
166 circuitcode = cAgent.circuitcode;
167 child = cAgent.child;
168 InventoryFolder = new UUID(cAgent.InventoryFolder);
169 BaseFolder = new UUID(cAgent.BaseFolder);
170 CapsPath = cAgent.CapsPath;
171 ChildrenCapSeeds = cAgent.ChildrenCapSeeds;
172 Viewer = cAgent.Viewer;
173 }
174
175 /// <summary>
176 /// Pack AgentCircuitData into an OSDMap for transmission over LLSD XML or LLSD json 155 /// Pack AgentCircuitData into an OSDMap for transmission over LLSD XML or LLSD json
177 /// </summary> 156 /// </summary>
178 /// <returns>map of the agent circuit data</returns> 157 /// <returns>map of the agent circuit data</returns>
@@ -369,52 +348,4 @@ namespace OpenSim.Framework
369 } 348 }
370 349
371 350
372 /// <summary>
373 /// Serializable Agent Circuit Data
374 /// </summary>
375 [Serializable]
376 public class sAgentCircuitData
377 {
378 public Guid AgentID;
379 public Guid BaseFolder;
380 public string CapsPath = String.Empty;
381 public Dictionary<ulong, string> ChildrenCapSeeds;
382 public bool child;
383 public uint circuitcode;
384 public string firstname;
385 public Guid InventoryFolder;
386 public string lastname;
387 public Guid SecureSessionID;
388 public Guid SessionID;
389 public float startposx;
390 public float startposy;
391 public float startposz;
392 public string Viewer;
393 public string Channel;
394 public string Mac;
395 public string Id0;
396
397 public sAgentCircuitData()
398 {
399 }
400
401 public sAgentCircuitData(AgentCircuitData cAgent)
402 {
403 AgentID = cAgent.AgentID.Guid;
404 SessionID = cAgent.SessionID.Guid;
405 SecureSessionID = cAgent.SecureSessionID.Guid;
406 startposx = cAgent.startpos.X;
407 startposy = cAgent.startpos.Y;
408 startposz = cAgent.startpos.Z;
409 firstname = cAgent.firstname;
410 lastname = cAgent.lastname;
411 circuitcode = cAgent.circuitcode;
412 child = cAgent.child;
413 InventoryFolder = cAgent.InventoryFolder.Guid;
414 BaseFolder = cAgent.BaseFolder.Guid;
415 CapsPath = cAgent.CapsPath;
416 ChildrenCapSeeds = cAgent.ChildrenCapSeeds;
417 Viewer = cAgent.Viewer;
418 }
419 }
420} 351}
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs
index ce0b2fb..a626b82 100644
--- a/OpenSim/Framework/ChildAgentDataUpdate.cs
+++ b/OpenSim/Framework/ChildAgentDataUpdate.cs
@@ -62,7 +62,7 @@ namespace OpenSim.Framework
62 UUID AgentID { get; set; } 62 UUID AgentID { get; set; }
63 63
64 OSDMap Pack(); 64 OSDMap Pack();
65 void Unpack(OSDMap map); 65 void Unpack(OSDMap map, IScene scene);
66 } 66 }
67 67
68 /// <summary> 68 /// <summary>
@@ -122,7 +122,7 @@ namespace OpenSim.Framework
122 return args; 122 return args;
123 } 123 }
124 124
125 public void Unpack(OSDMap args) 125 public void Unpack(OSDMap args, IScene scene)
126 { 126 {
127 if (args.ContainsKey("region_handle")) 127 if (args.ContainsKey("region_handle"))
128 UInt64.TryParse(args["region_handle"].AsString(), out RegionHandle); 128 UInt64.TryParse(args["region_handle"].AsString(), out RegionHandle);
@@ -329,6 +329,10 @@ namespace OpenSim.Framework
329 329
330 public string CallbackURI; 330 public string CallbackURI;
331 331
332 // These two must have the same Count
333 public List<ISceneObject> AttachmentObjects;
334 public List<string> AttachmentObjectStates;
335
332 public virtual OSDMap Pack() 336 public virtual OSDMap Pack()
333 { 337 {
334 m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data"); 338 m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data");
@@ -441,7 +445,30 @@ namespace OpenSim.Framework
441 if ((CallbackURI != null) && (!CallbackURI.Equals(""))) 445 if ((CallbackURI != null) && (!CallbackURI.Equals("")))
442 args["callback_uri"] = OSD.FromString(CallbackURI); 446 args["callback_uri"] = OSD.FromString(CallbackURI);
443 447
448 // Attachment objects for fatpack messages
449 if (AttachmentObjects != null)
450 {
451 int i = 0;
452 OSDArray attObjs = new OSDArray(AttachmentObjects.Count);
453 foreach (ISceneObject so in AttachmentObjects)
454 {
455 OSDMap info = new OSDMap(4);
456 info["sog"] = OSD.FromString(so.ToXml2());
457 info["extra"] = OSD.FromString(so.ExtraToXmlString());
458 info["modified"] = OSD.FromBoolean(so.HasGroupChanged);
459 try
460 {
461 info["state"] = OSD.FromString(AttachmentObjectStates[i++]);
462 }
463 catch (IndexOutOfRangeException e)
464 {
465 m_log.WarnFormat("[CHILD AGENT DATA]: scrtips list is shorter than object list.");
466 }
444 467
468 attObjs.Add(info);
469 }
470 args["attach_objects"] = attObjs;
471 }
445 return args; 472 return args;
446 } 473 }
447 474
@@ -450,7 +477,7 @@ namespace OpenSim.Framework
450 /// Avoiding reflection makes it painful to write, but that's the price! 477 /// Avoiding reflection makes it painful to write, but that's the price!
451 /// </summary> 478 /// </summary>
452 /// <param name="hash"></param> 479 /// <param name="hash"></param>
453 public virtual void Unpack(OSDMap args) 480 public virtual void Unpack(OSDMap args, IScene scene)
454 { 481 {
455 m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Unpack data"); 482 m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Unpack data");
456 483
@@ -628,6 +655,26 @@ namespace OpenSim.Framework
628 655
629 if (args["callback_uri"] != null) 656 if (args["callback_uri"] != null)
630 CallbackURI = args["callback_uri"].AsString(); 657 CallbackURI = args["callback_uri"].AsString();
658
659 // Attachment objects
660 if (args["attach_objects"] != null && args["attach_objects"].Type == OSDType.Array)
661 {
662 OSDArray attObjs = (OSDArray)(args["attach_objects"]);
663 AttachmentObjects = new List<ISceneObject>();
664 AttachmentObjectStates = new List<string>();
665 foreach (OSD o in attObjs)
666 {
667 if (o.Type == OSDType.Map)
668 {
669 OSDMap info = (OSDMap)o;
670 ISceneObject so = scene.DeserializeObject(info["sog"].AsString());
671 so.ExtraFromXmlString(info["extra"].AsString());
672 so.HasGroupChanged = info["modified"].AsBoolean();
673 AttachmentObjects.Add(so);
674 AttachmentObjectStates.Add(info["state"].AsString());
675 }
676 }
677 }
631 } 678 }
632 679
633 public AgentData() 680 public AgentData()
@@ -655,9 +702,9 @@ namespace OpenSim.Framework
655 return base.Pack(); 702 return base.Pack();
656 } 703 }
657 704
658 public override void Unpack(OSDMap map) 705 public override void Unpack(OSDMap map, IScene scene)
659 { 706 {
660 base.Unpack(map); 707 base.Unpack(map, scene);
661 } 708 }
662 } 709 }
663} 710}
diff --git a/OpenSim/Framework/ClientInfo.cs b/OpenSim/Framework/ClientInfo.cs
index fbd18b5..62acb70 100644
--- a/OpenSim/Framework/ClientInfo.cs
+++ b/OpenSim/Framework/ClientInfo.cs
@@ -31,10 +31,9 @@ using System.Net;
31 31
32namespace OpenSim.Framework 32namespace OpenSim.Framework
33{ 33{
34 [Serializable]
35 public class ClientInfo 34 public class ClientInfo
36 { 35 {
37 public sAgentCircuitData agentcircuit; 36 public AgentCircuitData agentcircuit;
38 37
39 public Dictionary<uint, byte[]> needAck; 38 public Dictionary<uint, byte[]> needAck;
40 39
diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs
index eec2a92..3e6fdaa 100644
--- a/OpenSim/Framework/PriorityQueue.cs
+++ b/OpenSim/Framework/PriorityQueue.cs
@@ -42,22 +42,40 @@ namespace OpenSim.Framework
42 42
43 public delegate bool UpdatePriorityHandler(ref uint priority, ISceneEntity entity); 43 public delegate bool UpdatePriorityHandler(ref uint priority, ISceneEntity entity);
44 44
45 // Heap[0] for self updates 45 /// <summary>
46 // Heap[1..12] for entity updates 46 /// Total number of queues (priorities) available
47 47 /// </summary>
48 public const uint NumberOfQueues = 12; 48 public const uint NumberOfQueues = 12;
49 public const uint ImmediateQueue = 0; 49
50 /// <summary>
51 /// Number of queuest (priorities) that are processed immediately
52 /// </summary.
53 public const uint NumberOfImmediateQueues = 2;
50 54
51 private MinHeap<MinHeapItem>[] m_heaps = new MinHeap<MinHeapItem>[NumberOfQueues]; 55 private MinHeap<MinHeapItem>[] m_heaps = new MinHeap<MinHeapItem>[NumberOfQueues];
52 private Dictionary<uint, LookupItem> m_lookupTable; 56 private Dictionary<uint, LookupItem> m_lookupTable;
57
58 // internal state used to ensure the deqeues are spread across the priority
59 // queues "fairly". queuecounts is the amount to pull from each queue in
60 // each pass. weighted towards the higher priority queues
53 private uint m_nextQueue = 0; 61 private uint m_nextQueue = 0;
62 private uint m_countFromQueue = 0;
63 private uint[] m_queueCounts = { 8, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1 };
64
65 // next request is a counter of the number of updates queued, it provides
66 // a total ordering on the updates coming through the queue and is more
67 // lightweight (and more discriminating) than tick count
54 private UInt64 m_nextRequest = 0; 68 private UInt64 m_nextRequest = 0;
55 69
70 /// <summary>
71 /// Lock for enqueue and dequeue operations on the priority queue
72 /// </summary>
56 private object m_syncRoot = new object(); 73 private object m_syncRoot = new object();
57 public object SyncRoot { 74 public object SyncRoot {
58 get { return this.m_syncRoot; } 75 get { return this.m_syncRoot; }
59 } 76 }
60 77
78#region constructor
61 public PriorityQueue() : this(MinHeap<MinHeapItem>.DEFAULT_CAPACITY) { } 79 public PriorityQueue() : this(MinHeap<MinHeapItem>.DEFAULT_CAPACITY) { }
62 80
63 public PriorityQueue(int capacity) 81 public PriorityQueue(int capacity)
@@ -66,8 +84,16 @@ namespace OpenSim.Framework
66 84
67 for (int i = 0; i < m_heaps.Length; ++i) 85 for (int i = 0; i < m_heaps.Length; ++i)
68 m_heaps[i] = new MinHeap<MinHeapItem>(capacity); 86 m_heaps[i] = new MinHeap<MinHeapItem>(capacity);
87
88 m_nextQueue = NumberOfImmediateQueues;
89 m_countFromQueue = m_queueCounts[m_nextQueue];
69 } 90 }
91#endregion Constructor
70 92
93#region PublicMethods
94 /// <summary>
95 /// Return the number of items in the queues
96 /// </summary>
71 public int Count 97 public int Count
72 { 98 {
73 get 99 get
@@ -75,10 +101,14 @@ namespace OpenSim.Framework
75 int count = 0; 101 int count = 0;
76 for (int i = 0; i < m_heaps.Length; ++i) 102 for (int i = 0; i < m_heaps.Length; ++i)
77 count += m_heaps[i].Count; 103 count += m_heaps[i].Count;
104
78 return count; 105 return count;
79 } 106 }
80 } 107 }
81 108
109 /// <summary>
110 /// Enqueue an item into the specified priority queue
111 /// </summary>
82 public bool Enqueue(uint pqueue, IEntityUpdate value) 112 public bool Enqueue(uint pqueue, IEntityUpdate value)
83 { 113 {
84 LookupItem lookup; 114 LookupItem lookup;
@@ -100,32 +130,62 @@ namespace OpenSim.Framework
100 return true; 130 return true;
101 } 131 }
102 132
133 /// <summary>
134 /// Remove an item from one of the queues. Specifically, it removes the
135 /// oldest item from the next queue in order to provide fair access to
136 /// all of the queues
137 /// </summary>
103 public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue) 138 public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue)
104 { 139 {
105 // If there is anything in priority queue 0, return it first no 140 // If there is anything in priority queue 0, return it first no
106 // matter what else. Breaks fairness. But very useful. 141 // matter what else. Breaks fairness. But very useful.
107 if (m_heaps[ImmediateQueue].Count > 0) 142 for (int iq = 0; iq < NumberOfImmediateQueues; iq++)
108 { 143 {
109 MinHeapItem item = m_heaps[ImmediateQueue].RemoveMin(); 144 if (m_heaps[iq].Count > 0)
145 {
146 MinHeapItem item = m_heaps[iq].RemoveMin();
147 m_lookupTable.Remove(item.Value.Entity.LocalId);
148 timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime);
149 value = item.Value;
150
151 return true;
152 }
153 }
154
155 // To get the fair queing, we cycle through each of the
156 // queues when finding an element to dequeue.
157 // We pull (NumberOfQueues - QueueIndex) items from each queue in order
158 // to give lower numbered queues a higher priority and higher percentage
159 // of the bandwidth.
160
161 // Check for more items to be pulled from the current queue
162 if (m_heaps[m_nextQueue].Count > 0 && m_countFromQueue > 0)
163 {
164 m_countFromQueue--;
165
166 MinHeapItem item = m_heaps[m_nextQueue].RemoveMin();
110 m_lookupTable.Remove(item.Value.Entity.LocalId); 167 m_lookupTable.Remove(item.Value.Entity.LocalId);
111 timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); 168 timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime);
112 value = item.Value; 169 value = item.Value;
113 170
114 return true; 171 return true;
115 } 172 }
116 173
174 // Find the next non-immediate queue with updates in it
117 for (int i = 0; i < NumberOfQueues; ++i) 175 for (int i = 0; i < NumberOfQueues; ++i)
118 { 176 {
119 // To get the fair queing, we cycle through each of the 177 m_nextQueue = (uint)((m_nextQueue + 1) % NumberOfQueues);
120 // queues when finding an element to dequeue, this code 178 m_countFromQueue = m_queueCounts[m_nextQueue];
121 // assumes that the distribution of updates in the queues 179
122 // is polynomial, probably quadractic (eg distance of PI * R^2) 180 // if this is one of the immediate queues, just skip it
123 uint h = (uint)((m_nextQueue + i) % NumberOfQueues); 181 if (m_nextQueue < NumberOfImmediateQueues)
124 if (m_heaps[h].Count > 0) 182 continue;
183
184 if (m_heaps[m_nextQueue].Count > 0)
125 { 185 {
126 m_nextQueue = (uint)((h + 1) % NumberOfQueues); 186 m_countFromQueue--;
127 187
128 MinHeapItem item = m_heaps[h].RemoveMin(); 188 MinHeapItem item = m_heaps[m_nextQueue].RemoveMin();
129 m_lookupTable.Remove(item.Value.Entity.LocalId); 189 m_lookupTable.Remove(item.Value.Entity.LocalId);
130 timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); 190 timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime);
131 value = item.Value; 191 value = item.Value;
@@ -139,6 +199,10 @@ namespace OpenSim.Framework
139 return false; 199 return false;
140 } 200 }
141 201
202 /// <summary>
203 /// Reapply the prioritization function to each of the updates currently
204 /// stored in the priority queues.
205 /// </summary
142 public void Reprioritize(UpdatePriorityHandler handler) 206 public void Reprioritize(UpdatePriorityHandler handler)
143 { 207 {
144 MinHeapItem item; 208 MinHeapItem item;
@@ -174,17 +238,18 @@ namespace OpenSim.Framework
174 } 238 }
175 } 239 }
176 240
241 /// <summary>
242 /// </summary>
177 public override string ToString() 243 public override string ToString()
178 { 244 {
179 string s = ""; 245 string s = "";
180 for (int i = 0; i < NumberOfQueues; i++) 246 for (int i = 0; i < NumberOfQueues; i++)
181 { 247 s += String.Format("{0,7} ",m_heaps[i].Count);
182 if (s != "") s += ",";
183 s += m_heaps[i].Count.ToString();
184 }
185 return s; 248 return s;
186 } 249 }
187 250
251#endregion PublicMethods
252
188#region MinHeapItem 253#region MinHeapItem
189 private struct MinHeapItem : IComparable<MinHeapItem> 254 private struct MinHeapItem : IComparable<MinHeapItem>
190 { 255 {
diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
index e131260..34a3f15 100644
--- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
+++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
@@ -115,7 +115,7 @@ namespace OpenSim.Framework.Tests
115 position2 = new AgentPosition(); 115 position2 = new AgentPosition();
116 116
117 Assert.IsFalse(position2.AgentID == position1.AgentID, "Test Error, position2 should be a blank uninitialized AgentPosition"); 117 Assert.IsFalse(position2.AgentID == position1.AgentID, "Test Error, position2 should be a blank uninitialized AgentPosition");
118 position2.Unpack(position1.Pack()); 118 position2.Unpack(position1.Pack(), null);
119 119
120 Assert.IsTrue(position2.AgentID == position1.AgentID, "Agent ID didn't unpack the same way it packed"); 120 Assert.IsTrue(position2.AgentID == position1.AgentID, "Agent ID didn't unpack the same way it packed");
121 Assert.IsTrue(position2.Position == position1.Position, "Position didn't unpack the same way it packed"); 121 Assert.IsTrue(position2.Position == position1.Position, "Position didn't unpack the same way it packed");
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index cd438d6..910fb76 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -395,6 +395,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
395 public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); } 395 public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); }
396 396
397 /// <summary> 397 /// <summary>
398 /// Entity update queues
399 /// </summary>
400 public PriorityQueue EntityUpdateQueue { get { return m_entityUpdates; } }
401
402 /// <summary>
398 /// First name of the agent/avatar represented by the client 403 /// First name of the agent/avatar represented by the client
399 /// </summary> 404 /// </summary>
400 public string FirstName { get { return m_firstName; } } 405 public string FirstName { get { return m_firstName; } }
@@ -3625,7 +3630,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3625 // Remove the update packet from the list of packets waiting for acknowledgement 3630 // Remove the update packet from the list of packets waiting for acknowledgement
3626 // because we are requeuing the list of updates. They will be resent in new packets 3631 // because we are requeuing the list of updates. They will be resent in new packets
3627 // with the most recent state and priority. 3632 // with the most recent state and priority.
3628 m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber, 0, true); 3633 m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
3634
3635 // Count this as a resent packet since we are going to requeue all of the updates contained in it
3636 Interlocked.Increment(ref m_udpClient.PacketsResent);
3637
3629 foreach (EntityUpdate update in updates) 3638 foreach (EntityUpdate update in updates)
3630 ResendPrimUpdate(update); 3639 ResendPrimUpdate(update);
3631 } 3640 }
@@ -4092,7 +4101,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4092 // Remove the update packet from the list of packets waiting for acknowledgement 4101 // Remove the update packet from the list of packets waiting for acknowledgement
4093 // because we are requeuing the list of updates. They will be resent in new packets 4102 // because we are requeuing the list of updates. They will be resent in new packets
4094 // with the most recent state. 4103 // with the most recent state.
4095 m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber, 0, true); 4104 m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
4105
4106 // Count this as a resent packet since we are going to requeue all of the updates contained in it
4107 Interlocked.Increment(ref m_udpClient.PacketsResent);
4108
4096 foreach (ObjectPropertyUpdate update in updates) 4109 foreach (ObjectPropertyUpdate update in updates)
4097 ResendPropertyUpdate(update); 4110 ResendPropertyUpdate(update);
4098 } 4111 }
@@ -4897,7 +4910,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4897 data.RelativePosition.ToBytes(objectData, 0); 4910 data.RelativePosition.ToBytes(objectData, 0);
4898 data.Velocity.ToBytes(objectData, 12); 4911 data.Velocity.ToBytes(objectData, 12);
4899 data.Acceleration.ToBytes(objectData, 24); 4912 data.Acceleration.ToBytes(objectData, 24);
4900 data.RotationOffset.ToBytes(objectData, 36); 4913 try
4914 {
4915 data.RotationOffset.ToBytes(objectData, 36);
4916 }
4917 catch (Exception e)
4918 {
4919 m_log.Warn("[LLClientView]: exception converting quaternion to bytes, using Quaternion.Identity. Exception: " + e.ToString());
4920 OpenMetaverse.Quaternion.Identity.ToBytes(objectData, 36);
4921 }
4901 data.AngularVelocity.ToBytes(objectData, 48); 4922 data.AngularVelocity.ToBytes(objectData, 48);
4902 4923
4903 ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); 4924 ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
@@ -11513,7 +11534,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11513 /// <returns></returns> 11534 /// <returns></returns>
11514 public byte[] GetThrottlesPacked(float multiplier) 11535 public byte[] GetThrottlesPacked(float multiplier)
11515 { 11536 {
11516 return m_udpClient.GetThrottlesPacked(); 11537 return m_udpClient.GetThrottlesPacked(multiplier);
11517 } 11538 }
11518 11539
11519 /// <summary> 11540 /// <summary>
@@ -11706,7 +11727,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11706 11727
11707 info.userEP = m_userEndPoint; 11728 info.userEP = m_userEndPoint;
11708 info.proxyEP = null; 11729 info.proxyEP = null;
11709 info.agentcircuit = new sAgentCircuitData(RequestClientInfo()); 11730 info.agentcircuit = RequestClientInfo();
11710 11731
11711 return info; 11732 return info;
11712 } 11733 }
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index e54d326..95a8e23 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -182,9 +182,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
182 m_maxRTO = maxRTO; 182 m_maxRTO = maxRTO;
183 183
184 // Create a token bucket throttle for this client that has the scene token bucket as a parent 184 // Create a token bucket throttle for this client that has the scene token bucket as a parent
185 m_throttleClient = new AdaptiveTokenBucket(parentThrottle, rates.TotalLimit); 185 m_throttleClient = new AdaptiveTokenBucket(parentThrottle, rates.Total, rates.AdaptiveThrottlesEnabled);
186 // Create a token bucket throttle for the total categary with the client bucket as a throttle 186 // Create a token bucket throttle for the total categary with the client bucket as a throttle
187 m_throttleCategory = new TokenBucket(m_throttleClient, rates.TotalLimit); 187 m_throttleCategory = new TokenBucket(m_throttleClient, 0);
188 // Create an array of token buckets for this clients different throttle categories 188 // Create an array of token buckets for this clients different throttle categories
189 m_throttleCategories = new TokenBucket[THROTTLE_CATEGORY_COUNT]; 189 m_throttleCategories = new TokenBucket[THROTTLE_CATEGORY_COUNT];
190 190
@@ -195,7 +195,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
195 // Initialize the packet outboxes, where packets sit while they are waiting for tokens 195 // Initialize the packet outboxes, where packets sit while they are waiting for tokens
196 m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>(); 196 m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>();
197 // Initialize the token buckets that control the throttling for each category 197 // Initialize the token buckets that control the throttling for each category
198 m_throttleCategories[i] = new TokenBucket(m_throttleCategory, rates.GetLimit(type)); 198 m_throttleCategories[i] = new TokenBucket(m_throttleCategory, rates.GetRate(type));
199 } 199 }
200 200
201 // Default the retransmission timeout to three seconds 201 // Default the retransmission timeout to three seconds
@@ -229,26 +229,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
229 /// <returns>Information about the client connection</returns> 229 /// <returns>Information about the client connection</returns>
230 public ClientInfo GetClientInfo() 230 public ClientInfo GetClientInfo()
231 { 231 {
232///<mic>
233 TokenBucket tb;
234
235 tb = m_throttleClient.Parent;
236 m_log.WarnFormat("[TOKENS] {3}: Actual={0},Request={1},TotalRequest={2}",tb.DripRate,tb.RequestedDripRate,tb.TotalDripRequest,"ROOT");
237
238 tb = m_throttleClient;
239 m_log.WarnFormat("[TOKENS] {3}: Actual={0},Request={1},TotalRequest={2}",tb.DripRate,tb.RequestedDripRate,tb.TotalDripRequest," CLIENT");
240
241 tb = m_throttleCategory;
242 m_log.WarnFormat("[TOKENS] {3}: Actual={0},Request={1},TotalRequest={2}",tb.DripRate,tb.RequestedDripRate,tb.TotalDripRequest," CATEGORY");
243
244 for (int i = 0; i < THROTTLE_CATEGORY_COUNT; i++)
245 {
246 tb = m_throttleCategories[i];
247 m_log.WarnFormat("[TOKENS] {4} <{0}:{1}>: Actual={2},Requested={3}",AgentID,i,tb.DripRate,tb.RequestedDripRate," BUCKET");
248 }
249
250///</mic>
251
252 // TODO: This data structure is wrong in so many ways. Locking and copying the entire lists 232 // TODO: This data structure is wrong in so many ways. Locking and copying the entire lists
253 // of pending and needed ACKs for every client every time some method wants information about 233 // of pending and needed ACKs for every client every time some method wants information about
254 // this connection is a recipe for poor performance 234 // this connection is a recipe for poor performance
@@ -260,12 +240,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
260 info.landThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate; 240 info.landThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate;
261 info.windThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate; 241 info.windThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate;
262 info.cloudThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate; 242 info.cloudThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate;
263 // info.taskThrottle = m_throttleCategories[(int)ThrottleOutPacketType.State].DripRate + m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate;
264 info.taskThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate; 243 info.taskThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate;
265 info.assetThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate; 244 info.assetThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate;
266 info.textureThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate; 245 info.textureThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate;
267 info.totalThrottle = info.resendThrottle + info.landThrottle + info.windThrottle + info.cloudThrottle + 246 info.totalThrottle = (int)m_throttleCategory.DripRate;
268 info.taskThrottle + info.assetThrottle + info.textureThrottle;
269 247
270 return info; 248 return info;
271 } 249 }
@@ -352,8 +330,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
352 int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); 330 int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f);
353 // State is a subcategory of task that we allocate a percentage to 331 // State is a subcategory of task that we allocate a percentage to
354 int state = 0; 332 int state = 0;
355 // int state = (int)((float)task * STATE_TASK_PERCENTAGE);
356 // task -= state;
357 333
358 // Make sure none of the throttles are set below our packet MTU, 334 // Make sure none of the throttles are set below our packet MTU,
359 // otherwise a throttle could become permanently clogged 335 // otherwise a throttle could become permanently clogged
@@ -364,19 +340,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
364 task = Math.Max(task, LLUDPServer.MTU); 340 task = Math.Max(task, LLUDPServer.MTU);
365 texture = Math.Max(texture, LLUDPServer.MTU); 341 texture = Math.Max(texture, LLUDPServer.MTU);
366 asset = Math.Max(asset, LLUDPServer.MTU); 342 asset = Math.Max(asset, LLUDPServer.MTU);
367 state = Math.Max(state, LLUDPServer.MTU);
368 343
369 int total = resend + land + wind + cloud + task + texture + asset + state; 344 //int total = resend + land + wind + cloud + task + texture + asset;
370 345 //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, Total={8}",
371 //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, State={8}, Total={9}", 346 // AgentID, resend, land, wind, cloud, task, texture, asset, total);
372 // AgentID, resend, land, wind, cloud, task, texture, asset, state, total);
373 347
374 // Update the token buckets with new throttle values 348 // Update the token buckets with new throttle values
375 TokenBucket bucket; 349 TokenBucket bucket;
376 350
377 bucket = m_throttleCategory;
378 bucket.RequestedDripRate = total;
379
380 bucket = m_throttleCategories[(int)ThrottleOutPacketType.Resend]; 351 bucket = m_throttleCategories[(int)ThrottleOutPacketType.Resend];
381 bucket.RequestedDripRate = resend; 352 bucket.RequestedDripRate = resend;
382 353
@@ -405,22 +376,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP
405 m_packedThrottles = null; 376 m_packedThrottles = null;
406 } 377 }
407 378
408 public byte[] GetThrottlesPacked() 379 public byte[] GetThrottlesPacked(float multiplier)
409 { 380 {
410 byte[] data = m_packedThrottles; 381 byte[] data = m_packedThrottles;
411 382
412 if (data == null) 383 if (data == null)
413 { 384 {
385 float rate;
386
414 data = new byte[7 * 4]; 387 data = new byte[7 * 4];
415 int i = 0; 388 int i = 0;
416 389
417 Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].RequestedDripRate), 0, data, i, 4); i += 4; 390 // multiply by 8 to convert bytes back to bits
418 Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Land].RequestedDripRate), 0, data, i, 4); i += 4; 391 rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].RequestedDripRate * 8 * multiplier;
419 Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].RequestedDripRate), 0, data, i, 4); i += 4; 392 Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4;
420 Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].RequestedDripRate), 0, data, i, 4); i += 4; 393
421 Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Task].RequestedDripRate), 0, data, i, 4); i += 4; 394 rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Land].RequestedDripRate * 8 * multiplier;
422 Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].RequestedDripRate), 0, data, i, 4); i += 4; 395 Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4;
423 Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].RequestedDripRate), 0, data, i, 4); i += 4; 396
397 rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].RequestedDripRate * 8 * multiplier;
398 Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4;
399
400 rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].RequestedDripRate * 8 * multiplier;
401 Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4;
402
403 rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Task].RequestedDripRate * 8 * multiplier;
404 Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4;
405
406 rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].RequestedDripRate * 8 * multiplier;
407 Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4;
408
409 rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].RequestedDripRate * 8 * multiplier;
410 Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4;
424 411
425 m_packedThrottles = data; 412 m_packedThrottles = data;
426 } 413 }
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index a1a58e5..ab6674d 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -672,7 +672,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
672 if (packet.Header.AppendedAcks && packet.Header.AckList != null) 672 if (packet.Header.AppendedAcks && packet.Header.AckList != null)
673 { 673 {
674 for (int i = 0; i < packet.Header.AckList.Length; i++) 674 for (int i = 0; i < packet.Header.AckList.Length; i++)
675 udpClient.NeedAcks.Remove(packet.Header.AckList[i], now, packet.Header.Resent); 675 udpClient.NeedAcks.Acknowledge(packet.Header.AckList[i], now, packet.Header.Resent);
676 } 676 }
677 677
678 // Handle PacketAck packets 678 // Handle PacketAck packets
@@ -681,7 +681,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
681 PacketAckPacket ackPacket = (PacketAckPacket)packet; 681 PacketAckPacket ackPacket = (PacketAckPacket)packet;
682 682
683 for (int i = 0; i < ackPacket.Packets.Length; i++) 683 for (int i = 0; i < ackPacket.Packets.Length; i++)
684 udpClient.NeedAcks.Remove(ackPacket.Packets[i].ID, now, packet.Header.Resent); 684 udpClient.NeedAcks.Acknowledge(ackPacket.Packets[i].ID, now, packet.Header.Resent);
685 685
686 // We don't need to do anything else with PacketAck packets 686 // We don't need to do anything else with PacketAck packets
687 return; 687 return;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
index aaf6e26..c9aac0b 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
@@ -52,30 +52,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
52 public int Texture; 52 public int Texture;
53 /// <summary>Drip rate for asset packets</summary> 53 /// <summary>Drip rate for asset packets</summary>
54 public int Asset; 54 public int Asset;
55 /// <summary>Drip rate for state packets</summary> 55
56 public int State;
57 /// <summary>Drip rate for the parent token bucket</summary> 56 /// <summary>Drip rate for the parent token bucket</summary>
58 public int Total; 57 public int Total;
59 58
60 /// <summary>Maximum burst rate for resent packets</summary> 59 /// <summary>Flag used to enable adaptive throttles</summary>
61 public int ResendLimit; 60 public bool AdaptiveThrottlesEnabled;
62 /// <summary>Maximum burst rate for land packets</summary> 61
63 public int LandLimit;
64 /// <summary>Maximum burst rate for wind packets</summary>
65 public int WindLimit;
66 /// <summary>Maximum burst rate for cloud packets</summary>
67 public int CloudLimit;
68 /// <summary>Maximum burst rate for task (state and transaction) packets</summary>
69 public int TaskLimit;
70 /// <summary>Maximum burst rate for texture packets</summary>
71 public int TextureLimit;
72 /// <summary>Maximum burst rate for asset packets</summary>
73 public int AssetLimit;
74 /// <summary>Maximum burst rate for state packets</summary>
75 public int StateLimit;
76 /// <summary>Burst rate for the parent token bucket</summary>
77 public int TotalLimit;
78
79 /// <summary> 62 /// <summary>
80 /// Default constructor 63 /// Default constructor
81 /// </summary> 64 /// </summary>
@@ -86,26 +69,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
86 { 69 {
87 IConfig throttleConfig = config.Configs["ClientStack.LindenUDP"]; 70 IConfig throttleConfig = config.Configs["ClientStack.LindenUDP"];
88 71
89 Resend = throttleConfig.GetInt("resend_default", 12500); 72 Resend = throttleConfig.GetInt("resend_default", 6625);
90 Land = throttleConfig.GetInt("land_default", 1000); 73 Land = throttleConfig.GetInt("land_default", 9125);
91 Wind = throttleConfig.GetInt("wind_default", 1000); 74 Wind = throttleConfig.GetInt("wind_default", 1750);
92 Cloud = throttleConfig.GetInt("cloud_default", 1000); 75 Cloud = throttleConfig.GetInt("cloud_default", 1750);
93 Task = throttleConfig.GetInt("task_default", 1000); 76 Task = throttleConfig.GetInt("task_default", 18500);
94 Texture = throttleConfig.GetInt("texture_default", 1000); 77 Texture = throttleConfig.GetInt("texture_default", 18500);
95 Asset = throttleConfig.GetInt("asset_default", 1000); 78 Asset = throttleConfig.GetInt("asset_default", 10500);
96 State = throttleConfig.GetInt("state_default", 1000);
97
98 ResendLimit = throttleConfig.GetInt("resend_limit", 18750);
99 LandLimit = throttleConfig.GetInt("land_limit", 29750);
100 WindLimit = throttleConfig.GetInt("wind_limit", 18750);
101 CloudLimit = throttleConfig.GetInt("cloud_limit", 18750);
102 TaskLimit = throttleConfig.GetInt("task_limit", 18750);
103 TextureLimit = throttleConfig.GetInt("texture_limit", 55750);
104 AssetLimit = throttleConfig.GetInt("asset_limit", 27500);
105 StateLimit = throttleConfig.GetInt("state_limit", 37000);
106 79
107 Total = throttleConfig.GetInt("client_throttle_max_bps", 0); 80 Total = throttleConfig.GetInt("client_throttle_max_bps", 0);
108 TotalLimit = Total; 81
82 AdaptiveThrottlesEnabled = throttleConfig.GetBoolean("enable_adaptive_throttles", false);
109 } 83 }
110 catch (Exception) { } 84 catch (Exception) { }
111 } 85 }
@@ -128,34 +102,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
128 return Texture; 102 return Texture;
129 case ThrottleOutPacketType.Asset: 103 case ThrottleOutPacketType.Asset:
130 return Asset; 104 return Asset;
131 case ThrottleOutPacketType.State:
132 return State;
133 case ThrottleOutPacketType.Unknown:
134 default:
135 return 0;
136 }
137 }
138
139 public int GetLimit(ThrottleOutPacketType type)
140 {
141 switch (type)
142 {
143 case ThrottleOutPacketType.Resend:
144 return ResendLimit;
145 case ThrottleOutPacketType.Land:
146 return LandLimit;
147 case ThrottleOutPacketType.Wind:
148 return WindLimit;
149 case ThrottleOutPacketType.Cloud:
150 return CloudLimit;
151 case ThrottleOutPacketType.Task:
152 return TaskLimit;
153 case ThrottleOutPacketType.Texture:
154 return TextureLimit;
155 case ThrottleOutPacketType.Asset:
156 return AssetLimit;
157 case ThrottleOutPacketType.State:
158 return StateLimit;
159 case ThrottleOutPacketType.Unknown: 105 case ThrottleOutPacketType.Unknown:
160 default: 106 default:
161 return 0; 107 return 0;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
index 4ee6d3a..29fd1a4 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
@@ -29,6 +29,8 @@ using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Reflection; 31using System.Reflection;
32using OpenSim.Framework;
33
32using log4net; 34using log4net;
33 35
34namespace OpenSim.Region.ClientStack.LindenUDP 36namespace OpenSim.Region.ClientStack.LindenUDP
@@ -177,7 +179,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
177 RequestedDripRate = dripRate; 179 RequestedDripRate = dripRate;
178 // TotalDripRequest = dripRate; // this will be overwritten when a child node registers 180 // TotalDripRequest = dripRate; // this will be overwritten when a child node registers
179 // MaxBurst = (Int64)((double)dripRate * m_quantumsPerBurst); 181 // MaxBurst = (Int64)((double)dripRate * m_quantumsPerBurst);
180 m_lastDrip = Environment.TickCount & Int32.MaxValue; 182 m_lastDrip = Util.EnvironmentTickCount();
181 } 183 }
182 184
183#endregion Constructor 185#endregion Constructor
@@ -211,12 +213,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
211 /// </summary> 213 /// </summary>
212 public void RegisterRequest(TokenBucket child, Int64 request) 214 public void RegisterRequest(TokenBucket child, Int64 request)
213 { 215 {
214 m_children[child] = request; 216 lock (m_children)
215 // m_totalDripRequest = m_children.Values.Sum(); 217 {
218 m_children[child] = request;
219 // m_totalDripRequest = m_children.Values.Sum();
216 220
217 m_totalDripRequest = 0; 221 m_totalDripRequest = 0;
218 foreach (KeyValuePair<TokenBucket, Int64> cref in m_children) 222 foreach (KeyValuePair<TokenBucket, Int64> cref in m_children)
219 m_totalDripRequest += cref.Value; 223 m_totalDripRequest += cref.Value;
224 }
220 225
221 // Pass the new values up to the parent 226 // Pass the new values up to the parent
222 if (m_parent != null) 227 if (m_parent != null)
@@ -229,12 +234,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
229 /// </summary> 234 /// </summary>
230 public void UnregisterRequest(TokenBucket child) 235 public void UnregisterRequest(TokenBucket child)
231 { 236 {
232 m_children.Remove(child); 237 lock (m_children)
233 // m_totalDripRequest = m_children.Values.Sum(); 238 {
239 m_children.Remove(child);
240 // m_totalDripRequest = m_children.Values.Sum();
234 241
235 m_totalDripRequest = 0; 242 m_totalDripRequest = 0;
236 foreach (KeyValuePair<TokenBucket, Int64> cref in m_children) 243 foreach (KeyValuePair<TokenBucket, Int64> cref in m_children)
237 m_totalDripRequest += cref.Value; 244 m_totalDripRequest += cref.Value;
245 }
246
238 247
239 // Pass the new values up to the parent 248 // Pass the new values up to the parent
240 if (m_parent != null) 249 if (m_parent != null)
@@ -297,10 +306,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
297 306
298 // Determine the interval over which we are adding tokens, never add 307 // Determine the interval over which we are adding tokens, never add
299 // more than a single quantum of tokens 308 // more than a single quantum of tokens
300 Int32 now = Environment.TickCount & Int32.MaxValue; 309 Int32 deltaMS = Math.Min(Util.EnvironmentTickCountSubtract(m_lastDrip), m_ticksPerQuantum);
301 Int32 deltaMS = Math.Min(now - m_lastDrip, m_ticksPerQuantum); 310 m_lastDrip = Util.EnvironmentTickCount();
302
303 m_lastDrip = now;
304 311
305 // This can be 0 in the very unusual case that the timer wrapped 312 // This can be 0 in the very unusual case that the timer wrapped
306 // It can be 0 if we try add tokens at a sub-tick rate 313 // It can be 0 if we try add tokens at a sub-tick rate
@@ -315,10 +322,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
315 { 322 {
316 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 323 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
317 324
318 // <summary> 325 /// <summary>
319 // The minimum rate for flow control. 326 /// The minimum rate for flow control. Minimum drip rate is one
320 // </summary> 327 /// packet per second. Open the throttle to 15 packets per second
321 protected const Int64 m_minimumFlow = m_minimumDripRate * 10; 328 /// or about 160kbps.
329 /// </summary>
330 protected const Int64 m_minimumFlow = m_minimumDripRate * 15;
322 331
323 // <summary> 332 // <summary>
324 // The maximum rate for flow control. Drip rate can never be 333 // The maximum rate for flow control. Drip rate can never be
@@ -331,6 +340,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
331 set { m_maxDripRate = (value == 0 ? 0 : Math.Max(value,m_minimumFlow)); } 340 set { m_maxDripRate = (value == 0 ? 0 : Math.Max(value,m_minimumFlow)); }
332 } 341 }
333 342
343 private bool m_enabled = false;
344
334 // <summary> 345 // <summary>
335 // 346 //
336 // </summary> 347 // </summary>
@@ -348,9 +359,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
348 // <summary> 359 // <summary>
349 // 360 //
350 // </summary> 361 // </summary>
351 public AdaptiveTokenBucket(TokenBucket parent, Int64 maxDripRate) : base(parent,m_minimumFlow) 362 public AdaptiveTokenBucket(TokenBucket parent, Int64 maxDripRate, bool enabled) : base(parent,maxDripRate)
352 { 363 {
353 MaxDripRate = maxDripRate; 364 m_enabled = enabled;
365
366 if (m_enabled)
367 {
368 // m_log.DebugFormat("[TOKENBUCKET] Adaptive throttle enabled");
369 MaxDripRate = maxDripRate;
370 AdjustedDripRate = m_minimumFlow;
371 }
354 } 372 }
355 373
356 // <summary> 374 // <summary>
@@ -359,7 +377,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
359 public void ExpirePackets(Int32 count) 377 public void ExpirePackets(Int32 count)
360 { 378 {
361 // m_log.WarnFormat("[ADAPTIVEBUCKET] drop {0} by {1} expired packets",AdjustedDripRate,count); 379 // m_log.WarnFormat("[ADAPTIVEBUCKET] drop {0} by {1} expired packets",AdjustedDripRate,count);
362 AdjustedDripRate = (Int64) (AdjustedDripRate / Math.Pow(2,count)); 380 if (m_enabled)
381 AdjustedDripRate = (Int64) (AdjustedDripRate / Math.Pow(2,count));
363 } 382 }
364 383
365 // <summary> 384 // <summary>
@@ -367,7 +386,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
367 // </summary> 386 // </summary>
368 public void AcknowledgePackets(Int32 count) 387 public void AcknowledgePackets(Int32 count)
369 { 388 {
370 AdjustedDripRate = AdjustedDripRate + count; 389 if (m_enabled)
390 AdjustedDripRate = AdjustedDripRate + count;
371 } 391 }
372 } 392 }
373} 393}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs
index b170964..793aefe 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs
@@ -65,7 +65,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
65 /// <summary>Holds packets that need to be added to the unacknowledged list</summary> 65 /// <summary>Holds packets that need to be added to the unacknowledged list</summary>
66 private LocklessQueue<OutgoingPacket> m_pendingAdds = new LocklessQueue<OutgoingPacket>(); 66 private LocklessQueue<OutgoingPacket> m_pendingAdds = new LocklessQueue<OutgoingPacket>();
67 /// <summary>Holds information about pending acknowledgements</summary> 67 /// <summary>Holds information about pending acknowledgements</summary>
68 private LocklessQueue<PendingAck> m_pendingRemoves = new LocklessQueue<PendingAck>(); 68 private LocklessQueue<PendingAck> m_pendingAcknowledgements = new LocklessQueue<PendingAck>();
69 /// <summary>Holds information about pending removals</summary>
70 private LocklessQueue<uint> m_pendingRemoves = new LocklessQueue<uint>();
69 71
70 /// <summary> 72 /// <summary>
71 /// Add an unacked packet to the collection 73 /// Add an unacked packet to the collection
@@ -83,15 +85,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP
83 85
84 /// <summary> 86 /// <summary>
85 /// Marks a packet as acknowledged 87 /// Marks a packet as acknowledged
88 /// This method is used when an acknowledgement is received from the network for a previously
89 /// sent packet. Effects of removal this way are to update unacked byte count, adjust RTT
90 /// and increase throttle to the coresponding client.
86 /// </summary> 91 /// </summary>
87 /// <param name="sequenceNumber">Sequence number of the packet to 92 /// <param name="sequenceNumber">Sequence number of the packet to
88 /// acknowledge</param> 93 /// acknowledge</param>
89 /// <param name="currentTime">Current value of Environment.TickCount</param> 94 /// <param name="currentTime">Current value of Environment.TickCount</param>
90 /// <remarks>This does not immediately acknowledge the packet, it only 95 /// <remarks>This does not immediately acknowledge the packet, it only
91 /// queues the ack so it can be handled in a thread-safe way later</remarks> 96 /// queues the ack so it can be handled in a thread-safe way later</remarks>
92 public void Remove(uint sequenceNumber, int currentTime, bool fromResend) 97 public void Acknowledge(uint sequenceNumber, int currentTime, bool fromResend)
93 { 98 {
94 m_pendingRemoves.Enqueue(new PendingAck(sequenceNumber, currentTime, fromResend)); 99 m_pendingAcknowledgements.Enqueue(new PendingAck(sequenceNumber, currentTime, fromResend));
100 }
101
102 /// <summary>
103 /// Marks a packet as no longer needing acknowledgement without a received acknowledgement.
104 /// This method is called when a packet expires and we no longer need an acknowledgement.
105 /// When some reliable packet types expire, they are handled in a way other than simply
106 /// resending them. The only effect of removal this way is to update unacked byte count.
107 /// </summary>
108 /// <param name="sequenceNumber">Sequence number of the packet to
109 /// acknowledge</param>
110 /// <remarks>The does not immediately remove the packet, it only queues the removal
111 /// so it can be handled in a thread safe way later</remarks>
112 public void Remove(uint sequenceNumber)
113 {
114 m_pendingRemoves.Enqueue(sequenceNumber);
95 } 115 }
96 116
97 /// <summary> 117 /// <summary>
@@ -151,15 +171,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
151 m_packets[pendingAdd.SequenceNumber] = pendingAdd; 171 m_packets[pendingAdd.SequenceNumber] = pendingAdd;
152 172
153 // Process all the pending removes, including updating statistics and round-trip times 173 // Process all the pending removes, including updating statistics and round-trip times
154 PendingAck pendingRemove; 174 PendingAck pendingAcknowledgement;
155 OutgoingPacket ackedPacket; 175 while (m_pendingAcknowledgements.TryDequeue(out pendingAcknowledgement))
156 while (m_pendingRemoves.TryDequeue(out pendingRemove))
157 { 176 {
158 if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket)) 177 OutgoingPacket ackedPacket;
178 if (m_packets.TryGetValue(pendingAcknowledgement.SequenceNumber, out ackedPacket))
159 { 179 {
160 if (ackedPacket != null) 180 if (ackedPacket != null)
161 { 181 {
162 m_packets.Remove(pendingRemove.SequenceNumber); 182 m_packets.Remove(pendingAcknowledgement.SequenceNumber);
163 183
164 // As with other network applications, assume that an acknowledged packet is an 184 // As with other network applications, assume that an acknowledged packet is an
165 // indication that the network can handle a little more load, speed up the transmission 185 // indication that the network can handle a little more load, speed up the transmission
@@ -168,16 +188,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP
168 // Update stats 188 // Update stats
169 Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength); 189 Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength);
170 190
171 if (!pendingRemove.FromResend) 191 if (!pendingAcknowledgement.FromResend)
172 { 192 {
173 // Calculate the round-trip time for this packet and its ACK 193 // Calculate the round-trip time for this packet and its ACK
174 int rtt = pendingRemove.RemoveTime - ackedPacket.TickCount; 194 int rtt = pendingAcknowledgement.RemoveTime - ackedPacket.TickCount;
175 if (rtt > 0) 195 if (rtt > 0)
176 ackedPacket.Client.UpdateRoundTrip(rtt); 196 ackedPacket.Client.UpdateRoundTrip(rtt);
177 } 197 }
178 } 198 }
179 } 199 }
180 } 200 }
201
202 uint pendingRemove;
203 while(m_pendingRemoves.TryDequeue(out pendingRemove))
204 {
205 OutgoingPacket removedPacket;
206 if (m_packets.TryGetValue(pendingRemove, out removedPacket))
207 {
208 if (removedPacket != null)
209 {
210 m_packets.Remove(pendingRemove);
211
212 // Update stats
213 Interlocked.Add(ref removedPacket.Client.UnackedBytes, -removedPacket.Buffer.DataLength);
214 }
215 }
216 }
181 } 217 }
182 } 218 }
183} \ No newline at end of file 219}
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
index 4255c79..ff4ec4c 100644
--- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
+++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
@@ -41,8 +41,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
41 /// </summary> 41 /// </summary>
42 public class AgentAssetTransactions 42 public class AgentAssetTransactions
43 { 43 {
44// private static readonly ILog m_log = LogManager.GetLogger( 44// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45// MethodBase.GetCurrentMethod().DeclaringType);
46 45
47 // Fields 46 // Fields
48 private bool m_dumpAssetsToFile; 47 private bool m_dumpAssetsToFile;
@@ -149,6 +148,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
149 148
150 if (asset != null) 149 if (asset != null)
151 { 150 {
151// m_log.DebugFormat(
152// "[AGENT ASSETS TRANSACTIONS]: Updating item {0} in {1} for transaction {2}",
153// item.Name, part.Name, transactionID);
154
152 asset.FullID = UUID.Random(); 155 asset.FullID = UUID.Random();
153 asset.Name = item.Name; 156 asset.Name = item.Name;
154 asset.Description = item.Description; 157 asset.Description = item.Description;
@@ -156,8 +159,6 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
156 item.AssetID = asset.FullID; 159 item.AssetID = asset.FullID;
157 160
158 m_Scene.AssetService.Store(asset); 161 m_Scene.AssetService.Store(asset);
159
160 part.Inventory.UpdateInventoryItem(item);
161 } 162 }
162 } 163 }
163 } 164 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index dc33dbb..47476a9 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -571,14 +571,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
571 /// <param name="sp"></param> 571 /// <param name="sp"></param>
572 /// <param name="so"></param> 572 /// <param name="so"></param>
573 /// <param name="attachmentpoint"></param> 573 /// <param name="attachmentpoint"></param>
574 /// <param name="AttachOffset"></param> 574 /// <param name="attachOffset"></param>
575 /// <param name="silent"></param> 575 /// <param name="silent"></param>
576 protected void AttachToAgent(ScenePresence avatar, SceneObjectGroup so, uint attachmentpoint, Vector3 AttachOffset, bool silent) 576 protected void AttachToAgent(ScenePresence avatar, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent)
577 { 577 {
578 // don't attach attachments to child agents
579 if (avatar.IsChildAgent) return;
580 578
581// m_log.DebugFormat("[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1}", Name, avatar.Name); 579 m_log.DebugFormat("[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", Name, avatar.Name,
580 attachmentpoint, attachOffset, so.RootPart.AttachedPos);
582 581
583 so.DetachFromBackup(); 582 so.DetachFromBackup();
584 583
@@ -599,8 +598,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
599 so.RootPart.PhysActor = null; 598 so.RootPart.PhysActor = null;
600 } 599 }
601 600
602 so.AbsolutePosition = AttachOffset; 601 so.AbsolutePosition = attachOffset;
603 so.RootPart.AttachedPos = AttachOffset; 602 so.RootPart.AttachedPos = attachOffset;
604 so.RootPart.IsAttachment = true; 603 so.RootPart.IsAttachment = true;
605 604
606 so.RootPart.SetParentLocalId(avatar.LocalId); 605 so.RootPart.SetParentLocalId(avatar.LocalId);
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 138556f..e2bdee0 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -286,11 +286,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
286 } 286 }
287 287
288 string reason; 288 string reason;
289 if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out reason)) 289 string version;
290 if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason))
290 { 291 {
291 sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason); 292 sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason);
292 return; 293 return;
293 } 294 }
295 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version);
294 296
295 sp.ControllingClient.SendTeleportStart(teleportFlags); 297 sp.ControllingClient.SendTeleportStart(teleportFlags);
296 298
@@ -372,20 +374,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
372 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); 374 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
373 } 375 }
374 376
375 // Expect avatar crossing is a heavy-duty function at the destination.
376 // That is where MakeRoot is called, which fetches appearance and inventory.
377 // Plus triggers OnMakeRoot, which spawns a series of asynchronous updates.
378 //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId,
379 // position, false);
380
381 //{
382 // avatar.ControllingClient.SendTeleportFailed("Problem with destination.");
383 // // We should close that agent we just created over at destination...
384 // List<ulong> lst = new List<ulong>();
385 // lst.Add(reg.RegionHandle);
386 // SendCloseChildAgentAsync(avatar.UUID, lst);
387 // return;
388 //}
389 377
390 SetInTransit(sp.UUID); 378 SetInTransit(sp.UUID);
391 379
@@ -427,7 +415,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
427 415
428 // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which 416 // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which
429 // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation 417 // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation
430 // that the client contacted the destination before we send the attachments and close things here. 418 // that the client contacted the destination before we close things here.
431 if (!WaitForCallback(sp.UUID)) 419 if (!WaitForCallback(sp.UUID))
432 { 420 {
433 m_log.WarnFormat( 421 m_log.WarnFormat(
@@ -438,14 +426,20 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
438 return; 426 return;
439 } 427 }
440 428
441 // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it 429 // For backwards compatibility
442 CrossAttachmentsIntoNewRegion(finalDestination, sp, true); 430 if (version == "Unknown" || version == string.Empty)
431 {
432 // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
433 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one...");
434 CrossAttachmentsIntoNewRegion(finalDestination, sp, true);
435 }
436
437 // May need to logout or other cleanup
438 AgentHasMovedAway(sp, logout);
443 439
444 // Well, this is it. The agent is over there. 440 // Well, this is it. The agent is over there.
445 KillEntity(sp.Scene, sp.LocalId); 441 KillEntity(sp.Scene, sp.LocalId);
446 442
447 // May need to logout or other cleanup
448 AgentHasMovedAway(sp.ControllingClient.SessionId, logout);
449 443
450 // Now let's make it officially a child agent 444 // Now let's make it officially a child agent
451 sp.MakeChildAgent(); 445 sp.MakeChildAgent();
@@ -486,7 +480,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
486 480
487 // Fail. Reset it back 481 // Fail. Reset it back
488 sp.IsChildAgent = false; 482 sp.IsChildAgent = false;
489 483 ReInstantiateScripts(sp);
490 ResetFromTransit(sp.UUID); 484 ResetFromTransit(sp.UUID);
491 485
492 EnableChildAgents(sp); 486 EnableChildAgents(sp);
@@ -514,8 +508,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
514 508
515 } 509 }
516 510
517 protected virtual void AgentHasMovedAway(UUID sessionID, bool logout) 511 protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout)
518 { 512 {
513 foreach (SceneObjectGroup sop in sp.Attachments)
514 {
515 sop.Scene.DeleteSceneObject(sop, true);
516 }
517 sp.Attachments.Clear();
519 } 518 }
520 519
521 protected void KillEntity(Scene scene, uint localID) 520 protected void KillEntity(Scene scene, uint localID)
@@ -803,7 +802,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
803 GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); 802 GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
804 803
805 string reason; 804 string reason;
806 if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos, out reason)) 805 string version;
806 if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos, out version, out reason))
807 { 807 {
808 agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel"); 808 agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel");
809 if (r == null) 809 if (r == null)
@@ -823,7 +823,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
823 agent.InTransit(); 823 agent.InTransit();
824 824
825 CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync; 825 CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
826 d.BeginInvoke(agent, newpos, neighbourx, neighboury, neighbourRegion, isFlying, CrossAgentToNewRegionCompleted, d); 826 d.BeginInvoke(agent, newpos, neighbourx, neighboury, neighbourRegion, isFlying, version, CrossAgentToNewRegionCompleted, d);
827 827
828 return true; 828 return true;
829 } 829 }
@@ -880,17 +880,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
880 icon.EndInvoke(iar); 880 icon.EndInvoke(iar);
881 } 881 }
882 882
883 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying); 883 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying, string version);
884 884
885 /// <summary> 885 /// <summary>
886 /// This Closes child agents on neighbouring regions 886 /// This Closes child agents on neighbouring regions
887 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 887 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
888 /// </summary> 888 /// </summary>
889 protected ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying) 889 protected ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, bool isFlying, string version)
890 { 890 {
891 ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); 891 ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
892 892
893 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3}", agent.Firstname, agent.Lastname, neighbourx, neighboury); 893 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", agent.Firstname, agent.Lastname, neighbourx, neighboury, version);
894 894
895 Scene m_scene = agent.Scene; 895 Scene m_scene = agent.Scene;
896 896
@@ -953,6 +953,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
953 if (!WaitForCallback(agent.UUID)) 953 if (!WaitForCallback(agent.UUID))
954 { 954 {
955 m_log.Debug("[ENTITY TRANSFER MODULE]: Callback never came in crossing agent"); 955 m_log.Debug("[ENTITY TRANSFER MODULE]: Callback never came in crossing agent");
956 ReInstantiateScripts(agent);
956 ResetFromTransit(agent.UUID); 957 ResetFromTransit(agent.UUID);
957 958
958 // Yikes! We should just have a ref to scene here. 959 // Yikes! We should just have a ref to scene here.
@@ -968,7 +969,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
968 agent.SendOtherAgentsAvatarDataToMe(); 969 agent.SendOtherAgentsAvatarDataToMe();
969 agent.SendOtherAgentsAppearanceToMe(); 970 agent.SendOtherAgentsAppearanceToMe();
970 971
971 CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); 972 // Backwards compatibility
973 if (version == "Unknown" || version == string.Empty)
974 {
975 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old neighbor, passing attachments one by one...");
976 CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
977 }
978
979 AgentHasMovedAway(agent, false);
972 980
973 // the user may change their profile information in other region, 981 // the user may change their profile information in other region,
974 // so the userinfo in UserProfileCache is not reliable any more, delete it 982 // so the userinfo in UserProfileCache is not reliable any more, delete it
@@ -1775,7 +1783,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1775 return false; 1783 return false;
1776 } 1784 }
1777 1785
1778 1786 protected void ReInstantiateScripts(ScenePresence sp)
1787 {
1788 sp.Attachments.ForEach(delegate(SceneObjectGroup sog)
1789 {
1790 sog.CreateScriptInstances(0, false, sp.Scene.DefaultScriptEngine, 0);
1791 sog.ResumeScripts();
1792 });
1793 }
1779 #endregion 1794 #endregion
1780 1795
1781 } 1796 }
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 5a80100..1ccbcfd 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -142,11 +142,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
142 return false; 142 return false;
143 } 143 }
144 144
145 protected override void AgentHasMovedAway(UUID sessionID, bool logout) 145 protected override void AgentHasMovedAway(ScenePresence sp, bool logout)
146 { 146 {
147 base.AgentHasMovedAway(sp, logout);
147 if (logout) 148 if (logout)
148 // Log them out of this grid 149 // Log them out of this grid
149 m_aScene.PresenceService.LogoutAgent(sessionID); 150 m_aScene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
150 } 151 }
151 152
152 protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) 153 protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index 41dbffb..9714c36 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -41,6 +41,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
41 public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService 41 public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService
42 { 42 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44 // Version of this service
45 private const string m_Version = "SIMULATION/0.1";
46
44 private List<Scene> m_sceneList = new List<Scene>(); 47 private List<Scene> m_sceneList = new List<Scene>();
45 48
46 private IEntityTransferModule m_AgentTransferModule; 49 private IEntityTransferModule m_AgentTransferModule;
@@ -257,9 +260,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
257 return false; 260 return false;
258 } 261 }
259 262
260 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) 263 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason)
261 { 264 {
262 reason = "Communications failure"; 265 reason = "Communications failure";
266 version = m_Version;
263 if (destination == null) 267 if (destination == null)
264 return false; 268 return false;
265 269
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index 97833f3..5564067 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -229,19 +229,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
229 229
230 } 230 }
231 231
232 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) 232 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason)
233 { 233 {
234 reason = "Communications failure"; 234 reason = "Communications failure";
235 version = "Unknown";
235 if (destination == null) 236 if (destination == null)
236 return false; 237 return false;
237 238
238 // Try local first 239 // Try local first
239 if (m_localBackend.QueryAccess(destination, id, position, out reason)) 240 if (m_localBackend.QueryAccess(destination, id, position, out version, out reason))
240 return true; 241 return true;
241 242
242 // else do the remote thing 243 // else do the remote thing
243 if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) 244 if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
244 return m_remoteConnector.QueryAccess(destination, id, position, out reason); 245 return m_remoteConnector.QueryAccess(destination, id, position, out version, out reason);
245 246
246 return false; 247 return false;
247 248
diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
index 17b2da1..0f35894 100644
--- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs
+++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
@@ -88,7 +88,7 @@ namespace OpenSim.Region.Framework.Scenes
88 88
89 // If this is an update for our own avatar give it the highest priority 89 // If this is an update for our own avatar give it the highest priority
90 if (client.AgentId == entity.UUID) 90 if (client.AgentId == entity.UUID)
91 return PriorityQueue.ImmediateQueue; 91 return 0;
92 92
93 uint priority; 93 uint priority;
94 94
@@ -119,16 +119,40 @@ namespace OpenSim.Region.Framework.Scenes
119 119
120 private uint GetPriorityByTime(IClientAPI client, ISceneEntity entity) 120 private uint GetPriorityByTime(IClientAPI client, ISceneEntity entity)
121 { 121 {
122 return 1; 122 // And anything attached to this avatar gets top priority as well
123 if (entity is SceneObjectPart)
124 {
125 SceneObjectPart sop = (SceneObjectPart)entity;
126 if (sop.ParentGroup.RootPart.IsAttachment && client.AgentId == sop.ParentGroup.RootPart.AttachedAvatar)
127 return 1;
128 }
129
130 return PriorityQueue.NumberOfImmediateQueues; // first queue past the immediate queues
123 } 131 }
124 132
125 private uint GetPriorityByDistance(IClientAPI client, ISceneEntity entity) 133 private uint GetPriorityByDistance(IClientAPI client, ISceneEntity entity)
126 { 134 {
135 // And anything attached to this avatar gets top priority as well
136 if (entity is SceneObjectPart)
137 {
138 SceneObjectPart sop = (SceneObjectPart)entity;
139 if (sop.ParentGroup.RootPart.IsAttachment && client.AgentId == sop.ParentGroup.RootPart.AttachedAvatar)
140 return 1;
141 }
142
127 return ComputeDistancePriority(client,entity,false); 143 return ComputeDistancePriority(client,entity,false);
128 } 144 }
129 145
130 private uint GetPriorityByFrontBack(IClientAPI client, ISceneEntity entity) 146 private uint GetPriorityByFrontBack(IClientAPI client, ISceneEntity entity)
131 { 147 {
148 // And anything attached to this avatar gets top priority as well
149 if (entity is SceneObjectPart)
150 {
151 SceneObjectPart sop = (SceneObjectPart)entity;
152 if (sop.ParentGroup.RootPart.IsAttachment && client.AgentId == sop.ParentGroup.RootPart.AttachedAvatar)
153 return 1;
154 }
155
132 return ComputeDistancePriority(client,entity,true); 156 return ComputeDistancePriority(client,entity,true);
133 } 157 }
134 158
@@ -143,18 +167,20 @@ namespace OpenSim.Region.Framework.Scenes
143 { 167 {
144 if (!presence.IsChildAgent) 168 if (!presence.IsChildAgent)
145 { 169 {
170 // All avatars other than our own go into pqueue 1
171 if (entity is ScenePresence)
172 return 1;
173
146 if (entity is SceneObjectPart) 174 if (entity is SceneObjectPart)
147 { 175 {
176 // Attachments are high priority,
177 if (((SceneObjectPart)entity).ParentGroup.RootPart.IsAttachment)
178 return 1;
179
148 // Non physical prims are lower priority than physical prims 180 // Non physical prims are lower priority than physical prims
149 PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor; 181 PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor;
150 if (physActor == null || !physActor.IsPhysical) 182 if (physActor == null || !physActor.IsPhysical)
151 pqueue++; 183 pqueue++;
152
153 // Attachments are high priority,
154 // MIC: shouldn't these already be in the highest priority queue already
155 // since their root position is same as the avatars?
156 if (((SceneObjectPart)entity).ParentGroup.RootPart.IsAttachment)
157 pqueue = 1;
158 } 184 }
159 } 185 }
160 } 186 }
@@ -205,8 +231,10 @@ namespace OpenSim.Region.Framework.Scenes
205 231
206 // And convert the distance to a priority queue, this computation gives queues 232 // And convert the distance to a priority queue, this computation gives queues
207 // at 10, 20, 40, 80, 160, 320, 640, and 1280m 233 // at 10, 20, 40, 80, 160, 320, 640, and 1280m
208 uint pqueue = 1; 234 uint pqueue = PriorityQueue.NumberOfImmediateQueues;
209 for (int i = 0; i < 8; i++) 235 uint queues = PriorityQueue.NumberOfQueues - PriorityQueue.NumberOfImmediateQueues;
236
237 for (int i = 0; i < queues - 1; i++)
210 { 238 {
211 if (distance < 10 * Math.Pow(2.0,i)) 239 if (distance < 10 * Math.Pow(2.0,i))
212 break; 240 break;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index f41c6b9..5b7a297 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1449,6 +1449,10 @@ namespace OpenSim.Region.Framework.Scenes
1449 } 1449 }
1450 else // Updating existing item with new perms etc 1450 else // Updating existing item with new perms etc
1451 { 1451 {
1452// m_log.DebugFormat(
1453// "[PRIM INVENTORY]: Updating item {0} in {1} for UpdateTaskInventory()",
1454// currentItem.Name, part.Name);
1455
1452 IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); 1456 IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
1453 if (agentTransactions != null) 1457 if (agentTransactions != null)
1454 { 1458 {
@@ -2089,6 +2093,12 @@ namespace OpenSim.Region.Framework.Scenes
2089 if (rot != null) 2093 if (rot != null)
2090 group.UpdateGroupRotationR((Quaternion)rot); 2094 group.UpdateGroupRotationR((Quaternion)rot);
2091 2095
2096 // TODO: This needs to be refactored with the similar code in
2097 // SceneGraph.AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, Vector3 pos, Quaternion rot, Vector3 vel)
2098 // possibly by allowing this method to take a null rotation.
2099 if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
2100 group.RootPart.ApplyImpulse((vel * group.GetMass()), false);
2101
2092 // We can only call this after adding the scene object, since the scene object references the scene 2102 // We can only call this after adding the scene object, since the scene object references the scene
2093 // to find out if scripts should be activated at all. 2103 // to find out if scripts should be activated at all.
2094 group.CreateScriptInstances(param, true, DefaultScriptEngine, 3); 2104 group.CreateScriptInstances(param, true, DefaultScriptEngine, 3);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 4d619c3..1d06889 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1255,7 +1255,6 @@ namespace OpenSim.Region.Framework.Scenes
1255 1255
1256 // Increment the frame counter 1256 // Increment the frame counter
1257 ++Frame; 1257 ++Frame;
1258
1259 try 1258 try
1260 { 1259 {
1261 // Check if any objects have reached their targets 1260 // Check if any objects have reached their targets
@@ -2383,7 +2382,9 @@ namespace OpenSim.Region.Framework.Scenes
2383 /// <returns></returns> 2382 /// <returns></returns>
2384 public bool IncomingCreateObject(ISceneObject sog) 2383 public bool IncomingCreateObject(ISceneObject sog)
2385 { 2384 {
2386 //m_log.Debug(" >>> IncomingCreateObject(sog) <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted); 2385 //m_log.DebugFormat(" >>> IncomingCreateObject(sog) <<< {0} deleted? {1} isAttach? {2}", ((SceneObjectGroup)sog).AbsolutePosition,
2386 // ((SceneObjectGroup)sog).IsDeleted, ((SceneObjectGroup)sog).RootPart.IsAttachment);
2387
2387 SceneObjectGroup newObject; 2388 SceneObjectGroup newObject;
2388 try 2389 try
2389 { 2390 {
@@ -2401,9 +2402,13 @@ namespace OpenSim.Region.Framework.Scenes
2401 return false; 2402 return false;
2402 } 2403 }
2403 2404
2404 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); 2405 // For attachments, we need to wait until the agent is root
2405 2406 // before we restart the scripts, or else some functions won't work.
2406 newObject.ResumeScripts(); 2407 if (!newObject.IsAttachment)
2408 {
2409 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
2410 newObject.ResumeScripts();
2411 }
2407 2412
2408 // Do this as late as possible so that listeners have full access to the incoming object 2413 // Do this as late as possible so that listeners have full access to the incoming object
2409 EventManager.TriggerOnIncomingSceneObject(newObject); 2414 EventManager.TriggerOnIncomingSceneObject(newObject);
@@ -2540,17 +2545,8 @@ namespace OpenSim.Region.Framework.Scenes
2540 ScenePresence sp = GetScenePresence(sog.OwnerID); 2545 ScenePresence sp = GetScenePresence(sog.OwnerID);
2541 2546
2542 if (sp != null) 2547 if (sp != null)
2543 { 2548 return sp.GetStateSource();
2544 AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(sp.UUID);
2545
2546 if (aCircuit != null && (aCircuit.teleportFlags != (uint)TeleportFlags.Default))
2547 {
2548 // This will get your attention
2549 //m_log.Error("[XXX] Triggering CHANGED_TELEPORT");
2550 2549
2551 return 5; // StateSource.Teleporting
2552 }
2553 }
2554 return 2; // StateSource.PrimCrossing 2550 return 2; // StateSource.PrimCrossing
2555 } 2551 }
2556 2552
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 3e0241c..56680df 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -884,6 +884,8 @@ namespace OpenSim.Region.Framework.Scenes
884 884
885 if (m_items.ContainsKey(item.ItemID)) 885 if (m_items.ContainsKey(item.ItemID))
886 { 886 {
887// m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name);
888
887 item.ParentID = m_part.UUID; 889 item.ParentID = m_part.UUID;
888 item.ParentPartID = m_part.UUID; 890 item.ParentPartID = m_part.UUID;
889 891
@@ -899,6 +901,7 @@ namespace OpenSim.Region.Framework.Scenes
899 m_inventorySerial++; 901 m_inventorySerial++;
900 if (fireScriptEvents) 902 if (fireScriptEvents)
901 m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 903 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
904
902 if (considerChanged) 905 if (considerChanged)
903 { 906 {
904 HasInventoryChanged = true; 907 HasInventoryChanged = true;
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9e48447..cdf8366 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -924,6 +924,9 @@ namespace OpenSim.Region.Framework.Scenes
924 924
925 //m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count); 925 //m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count);
926 926
927 bool wasChild = m_isChildAgent;
928 m_isChildAgent = false;
929
927 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); 930 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>();
928 if (gm != null) 931 if (gm != null)
929 m_grouptitle = gm.GetGroupTitle(m_uuid); 932 m_grouptitle = gm.GetGroupTitle(m_uuid);
@@ -1069,14 +1072,21 @@ namespace OpenSim.Region.Framework.Scenes
1069 // Animator.SendAnimPack(); 1072 // Animator.SendAnimPack();
1070 1073
1071 m_scene.SwapRootAgentCount(false); 1074 m_scene.SwapRootAgentCount(false);
1072 1075
1073 //CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid); 1076 // The initial login scene presence is already root when it gets here
1074 //if (userInfo != null) 1077 // and it has already rezzed the attachments and started their scripts.
1075 // userInfo.FetchInventory(); 1078 // We do the following only for non-login agents, because their scripts
1076 //else 1079 // haven't started yet.
1077 // m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid); 1080 if (wasChild)
1078 1081 {
1079 m_isChildAgent = false; 1082 m_log.DebugFormat("[SCENE PRESENCE]: Restarting scripts in attachments...");
1083 // Resume scripts
1084 Attachments.ForEach(delegate(SceneObjectGroup sog)
1085 {
1086 sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource());
1087 sog.ResumeScripts();
1088 });
1089 }
1080 1090
1081 // send the animations of the other presences to me 1091 // send the animations of the other presences to me
1082 m_scene.ForEachScenePresence(delegate(ScenePresence presence) 1092 m_scene.ForEachScenePresence(delegate(ScenePresence presence)
@@ -1088,6 +1098,20 @@ namespace OpenSim.Region.Framework.Scenes
1088 m_scene.EventManager.TriggerOnMakeRootAgent(this); 1098 m_scene.EventManager.TriggerOnMakeRootAgent(this);
1089 } 1099 }
1090 1100
1101 public int GetStateSource()
1102 {
1103 AgentCircuitData aCircuit = m_scene.AuthenticateHandler.GetAgentCircuitData(UUID);
1104
1105 if (aCircuit != null && (aCircuit.teleportFlags != (uint)TeleportFlags.Default))
1106 {
1107 // This will get your attention
1108 //m_log.Error("[XXX] Triggering CHANGED_TELEPORT");
1109
1110 return 5; // StateSource.Teleporting
1111 }
1112 return 2; // StateSource.PrimCrossing
1113 }
1114
1091 /// <summary> 1115 /// <summary>
1092 /// This turns a root agent into a child agent 1116 /// This turns a root agent into a child agent
1093 /// when an agent departs this region for a neighbor, this gets called. 1117 /// when an agent departs this region for a neighbor, this gets called.
@@ -1288,7 +1312,6 @@ namespace OpenSim.Region.Framework.Scenes
1288 AbsolutePosition = pos; 1312 AbsolutePosition = pos;
1289 } 1313 }
1290 1314
1291 m_isChildAgent = false;
1292 bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); 1315 bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1293 MakeRootAgent(AbsolutePosition, m_flying); 1316 MakeRootAgent(AbsolutePosition, m_flying);
1294 1317
@@ -2757,12 +2780,14 @@ namespace OpenSim.Region.Framework.Scenes
2757 2780
2758 #region Update Client(s) 2781 #region Update Client(s)
2759 2782
2783
2760 /// <summary> 2784 /// <summary>
2761 /// Sends a location update to the client connected to this scenePresence 2785 /// Sends a location update to the client connected to this scenePresence
2762 /// </summary> 2786 /// </summary>
2763 /// <param name="remoteClient"></param> 2787 /// <param name="remoteClient"></param>
2764 public void SendTerseUpdateToClient(IClientAPI remoteClient) 2788 public void SendTerseUpdateToClient(IClientAPI remoteClient)
2765 { 2789 {
2790
2766 // If the client is inactive, it's getting its updates from another 2791 // If the client is inactive, it's getting its updates from another
2767 // server. 2792 // server.
2768 if (remoteClient.IsActive) 2793 if (remoteClient.IsActive)
@@ -2775,8 +2800,8 @@ namespace OpenSim.Region.Framework.Scenes
2775 //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); 2800 //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
2776 2801
2777 remoteClient.SendPrimUpdate( 2802 remoteClient.SendPrimUpdate(
2778 this, 2803 this,
2779 PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity 2804 PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity
2780 | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); 2805 | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity);
2781 2806
2782 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); 2807 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
@@ -2784,16 +2809,31 @@ namespace OpenSim.Region.Framework.Scenes
2784 } 2809 }
2785 } 2810 }
2786 2811
2812
2813 // vars to support reduced update frequency when velocity is unchanged
2814 private Vector3 lastVelocitySentToAllClients = Vector3.Zero;
2815 private int lastTerseUpdateToAllClientsTick = Util.EnvironmentTickCount();
2816
2787 /// <summary> 2817 /// <summary>
2788 /// Send a location/velocity/accelleration update to all agents in scene 2818 /// Send a location/velocity/accelleration update to all agents in scene
2789 /// </summary> 2819 /// </summary>
2790 public void SendTerseUpdateToAllClients() 2820 public void SendTerseUpdateToAllClients()
2791 { 2821 {
2792 m_perfMonMS = Util.EnvironmentTickCount(); 2822 int currentTick = Util.EnvironmentTickCount();
2793
2794 m_scene.ForEachClient(SendTerseUpdateToClient);
2795 2823
2796 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); 2824 // decrease update frequency when avatar is moving but velocity is not changing
2825 if (m_velocity.Length() < 0.01f
2826 || Vector3.Distance(lastVelocitySentToAllClients, m_velocity) > 0.01f
2827 || currentTick - lastTerseUpdateToAllClientsTick > 1500)
2828 {
2829 m_perfMonMS = currentTick;
2830 lastVelocitySentToAllClients = m_velocity;
2831 lastTerseUpdateToAllClientsTick = currentTick;
2832
2833 m_scene.ForEachClient(SendTerseUpdateToClient);
2834
2835 m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
2836 }
2797 } 2837 }
2798 2838
2799 public void SendCoarseLocations(List<Vector3> coarseLocations, List<UUID> avatarUUIDs) 2839 public void SendCoarseLocations(List<Vector3> coarseLocations, List<UUID> avatarUUIDs)
@@ -3049,18 +3089,17 @@ namespace OpenSim.Region.Framework.Scenes
3049 cadu.GroupAccess = 0; 3089 cadu.GroupAccess = 0;
3050 cadu.Position = AbsolutePosition; 3090 cadu.Position = AbsolutePosition;
3051 cadu.regionHandle = m_rootRegionHandle; 3091 cadu.regionHandle = m_rootRegionHandle;
3092
3093 // Throttles
3052 float multiplier = 1; 3094 float multiplier = 1;
3053 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); 3095 int childRegions = m_knownChildRegions.Count;
3054 if (innacurateNeighbors != 0) 3096 if (childRegions != 0)
3055 { 3097 multiplier = 1f / childRegions;
3056 multiplier = 1f / (float)innacurateNeighbors; 3098
3057 } 3099 // Minimum throttle for a child region is 1/4 of the root region throttle
3058 if (multiplier <= 0f) 3100 if (multiplier <= 0.25f)
3059 {
3060 multiplier = 0.25f; 3101 multiplier = 0.25f;
3061 }
3062 3102
3063 //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
3064 cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier); 3103 cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier);
3065 cadu.Velocity = Velocity; 3104 cadu.Velocity = Velocity;
3066 3105
@@ -3456,16 +3495,14 @@ namespace OpenSim.Region.Framework.Scenes
3456 3495
3457 // Throttles 3496 // Throttles
3458 float multiplier = 1; 3497 float multiplier = 1;
3459 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); 3498 int childRegions = m_knownChildRegions.Count;
3460 if (innacurateNeighbors != 0) 3499 if (childRegions != 0)
3461 { 3500 multiplier = 1f / childRegions;
3462 multiplier = 1f / innacurateNeighbors; 3501
3463 } 3502 // Minimum throttle for a child region is 1/4 of the root region throttle
3464 if (multiplier <= 0f) 3503 if (multiplier <= 0.25f)
3465 {
3466 multiplier = 0.25f; 3504 multiplier = 0.25f;
3467 } 3505
3468 //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
3469 cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier); 3506 cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier);
3470 3507
3471 cAgent.HeadRotation = m_headrotation; 3508 cAgent.HeadRotation = m_headrotation;
@@ -3481,54 +3518,6 @@ namespace OpenSim.Region.Framework.Scenes
3481 3518
3482 cAgent.Appearance = new AvatarAppearance(m_appearance); 3519 cAgent.Appearance = new AvatarAppearance(m_appearance);
3483 3520
3484/*
3485 try
3486 {
3487 // We might not pass the Wearables in all cases...
3488 // They're only needed so that persistent changes to the appearance
3489 // are preserved in the new region where the user is moving to.
3490 // But in Hypergrid we might not let this happen.
3491 int i = 0;
3492 UUID[] wears = new UUID[m_appearance.Wearables.Length * 2];
3493 foreach (AvatarWearable aw in m_appearance.Wearables)
3494 {
3495 if (aw != null)
3496 {
3497 wears[i++] = aw.ItemID;
3498 wears[i++] = aw.AssetID;
3499 }
3500 else
3501 {
3502 wears[i++] = UUID.Zero;
3503 wears[i++] = UUID.Zero;
3504 }
3505 }
3506 cAgent.Wearables = wears;
3507
3508 cAgent.VisualParams = m_appearance.VisualParams;
3509
3510 if (m_appearance.Texture != null)
3511 cAgent.AgentTextures = m_appearance.Texture.GetBytes();
3512 }
3513 catch (Exception e)
3514 {
3515 m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message);
3516 }
3517
3518 //Attachments
3519 List<int> attPoints = m_appearance.GetAttachedPoints();
3520 if (attPoints != null)
3521 {
3522 //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
3523 int i = 0;
3524 AvatarAttachment[] attachs = new AvatarAttachment[attPoints.Count];
3525 foreach (int point in attPoints)
3526 {
3527 attachs[i++] = new AvatarAttachment(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
3528 }
3529 cAgent.Attachments = attachs;
3530 }
3531*/
3532 lock (scriptedcontrols) 3521 lock (scriptedcontrols)
3533 { 3522 {
3534 ControllerData[] controls = new ControllerData[scriptedcontrols.Count]; 3523 ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
@@ -3548,9 +3537,26 @@ namespace OpenSim.Region.Framework.Scenes
3548 } 3537 }
3549 catch { } 3538 catch { }
3550 3539
3551 // cAgent.GroupID = ?? 3540 // Attachment objects
3552 // Groups??? 3541 if (m_attachments != null && m_attachments.Count > 0)
3553 3542 {
3543 cAgent.AttachmentObjects = new List<ISceneObject>();
3544 cAgent.AttachmentObjectStates = new List<string>();
3545 IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
3546 foreach (SceneObjectGroup sog in m_attachments)
3547 {
3548 // We need to make a copy and pass that copy
3549 // because of transfers withn the same sim
3550 ISceneObject clone = sog.CloneForNewScene();
3551 // Attachment module assumes that GroupPosition holds the offsets...!
3552 ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
3553 ((SceneObjectGroup)clone).RootPart.IsAttachment = false;
3554 cAgent.AttachmentObjects.Add(clone);
3555 cAgent.AttachmentObjectStates.Add(sog.GetStateSnapshot());
3556 // Let's remove the scripts of the original object here
3557 sog.RemoveScriptInstances(true);
3558 }
3559 }
3554 } 3560 }
3555 3561
3556 public void CopyFrom(AgentData cAgent) 3562 public void CopyFrom(AgentData cAgent)
@@ -3592,50 +3598,6 @@ namespace OpenSim.Region.Framework.Scenes
3592 AddToPhysicalScene(isFlying); 3598 AddToPhysicalScene(isFlying);
3593 } 3599 }
3594 3600
3595/*
3596 uint i = 0;
3597 try
3598 {
3599 if (cAgent.Wearables == null)
3600 cAgent.Wearables = new UUID[0];
3601 AvatarWearable[] wears = new AvatarWearable[cAgent.Wearables.Length / 2];
3602 for (uint n = 0; n < cAgent.Wearables.Length; n += 2)
3603 {
3604 UUID itemId = cAgent.Wearables[n];
3605 UUID assetId = cAgent.Wearables[n + 1];
3606 wears[i++] = new AvatarWearable(itemId, assetId);
3607 }
3608 // m_appearance.Wearables = wears;
3609 Primitive.TextureEntry textures = null;
3610 if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1)
3611 textures = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length);
3612
3613 byte[] visuals = null;
3614
3615 if ((cAgent.VisualParams != null) && (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
3616 visuals = (byte[])cAgent.VisualParams.Clone();
3617
3618 m_appearance = new AvatarAppearance(cAgent.AgentID,wears,textures,visuals);
3619 }
3620 catch (Exception e)
3621 {
3622 m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message);
3623 }
3624
3625 // Attachments
3626 try
3627 {
3628 if (cAgent.Attachments != null)
3629 {
3630 m_appearance.ClearAttachments();
3631 foreach (AvatarAttachment att in cAgent.Attachments)
3632 {
3633 m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
3634 }
3635 }
3636 }
3637 catch { }
3638*/
3639 try 3601 try
3640 { 3602 {
3641 lock (scriptedcontrols) 3603 lock (scriptedcontrols)
@@ -3665,8 +3627,18 @@ namespace OpenSim.Region.Framework.Scenes
3665 } 3627 }
3666 catch { } 3628 catch { }
3667 3629
3668 //cAgent.GroupID = ?? 3630 if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0)
3669 //Groups??? 3631 {
3632 m_attachments = new List<SceneObjectGroup>();
3633 int i = 0;
3634 foreach (ISceneObject so in cAgent.AttachmentObjects)
3635 {
3636 ((SceneObjectGroup)so).LocalId = 0;
3637 ((SceneObjectGroup)so).RootPart.UpdateFlag = 0;
3638 so.SetState(cAgent.AttachmentObjectStates[i++], m_scene);
3639 m_scene.IncomingCreateObject(so);
3640 }
3641 }
3670 } 3642 }
3671 3643
3672 public bool CopyAgent(out IAgentData agent) 3644 public bool CopyAgent(out IAgentData agent)
diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
index 6a24cc1..db17d8f 100644
--- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
@@ -82,6 +82,14 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
82 m_scenes[scene.RegionInfo.RegionID] = scene; 82 m_scenes[scene.RegionInfo.RegionID] = scene;
83 83
84 scene.AddCommand( 84 scene.AddCommand(
85 this, "show pqueues",
86 "show pqueues [full]",
87 "Show priority queue data for each client",
88 "Without the 'full' option, only root agents are shown."
89 + " With the 'full' option child agents are also shown.",
90 ShowPQueuesReport);
91
92 scene.AddCommand(
85 this, "show queues", 93 this, "show queues",
86 "show queues [full]", 94 "show queues [full]",
87 "Show queue data for each client", 95 "Show queue data for each client",
@@ -119,6 +127,11 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
119// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); 127// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
120 } 128 }
121 129
130 protected void ShowPQueuesReport(string module, string[] cmd)
131 {
132 MainConsole.Instance.Output(GetPQueuesReport(cmd));
133 }
134
122 protected void ShowQueuesReport(string module, string[] cmd) 135 protected void ShowQueuesReport(string module, string[] cmd)
123 { 136 {
124 MainConsole.Instance.Output(GetQueuesReport(cmd)); 137 MainConsole.Instance.Output(GetQueuesReport(cmd));
@@ -155,6 +168,80 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
155 ""); 168 "");
156 } 169 }
157 170
171
172 /// <summary>
173 /// Generate UDP Queue data report for each client
174 /// </summary>
175 /// <param name="showParams"></param>
176 /// <returns></returns>
177 protected string GetPQueuesReport(string[] showParams)
178 {
179 bool showChildren = false;
180 string pname = "";
181
182 if (showParams.Length > 2 && showParams[2] == "full")
183 showChildren = true;
184 else if (showParams.Length > 3)
185 pname = showParams[2] + " " + showParams[3];
186
187 StringBuilder report = new StringBuilder();
188
189 int columnPadding = 2;
190 int maxNameLength = 18;
191 int maxRegionNameLength = 14;
192 int maxTypeLength = 4;
193 int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding;
194
195 report.Append(GetColumnEntry("User", maxNameLength, columnPadding));
196 report.Append(GetColumnEntry("Region", maxRegionNameLength, columnPadding));
197 report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding));
198
199 report.AppendFormat(
200 "{0,7} {1,7} {2,7} {3,7} {4,7} {5,7} {6,7} {7,7} {8,7} {9,7} {10,7} {11,7}\n",
201 "Pri 0",
202 "Pri 1",
203 "Pri 2",
204 "Pri 3",
205 "Pri 4",
206 "Pri 5",
207 "Pri 6",
208 "Pri 7",
209 "Pri 8",
210 "Pri 9",
211 "Pri 10",
212 "Pri 11");
213
214 lock (m_scenes)
215 {
216 foreach (Scene scene in m_scenes.Values)
217 {
218 scene.ForEachClient(
219 delegate(IClientAPI client)
220 {
221 if (client is LLClientView)
222 {
223 bool isChild = scene.PresenceChildStatus(client.AgentId);
224 if (isChild && !showChildren)
225 return;
226
227 string name = client.Name;
228 if (pname != "" && name != pname)
229 return;
230
231 string regionName = scene.RegionInfo.RegionName;
232
233 report.Append(GetColumnEntry(name, maxNameLength, columnPadding));
234 report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding));
235 report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding));
236 report.AppendLine(((LLClientView)client).EntityUpdateQueue.ToString());
237 }
238 });
239 }
240 }
241
242 return report.ToString();
243 }
244
158 /// <summary> 245 /// <summary>
159 /// Generate UDP Queue data report for each client 246 /// Generate UDP Queue data report for each client
160 /// </summary> 247 /// </summary>
@@ -163,10 +250,13 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
163 protected string GetQueuesReport(string[] showParams) 250 protected string GetQueuesReport(string[] showParams)
164 { 251 {
165 bool showChildren = false; 252 bool showChildren = false;
253 string pname = "";
166 254
167 if (showParams.Length > 2 && showParams[2] == "full") 255 if (showParams.Length > 2 && showParams[2] == "full")
168 showChildren = true; 256 showChildren = true;
169 257 else if (showParams.Length > 3)
258 pname = showParams[2] + " " + showParams[3];
259
170 StringBuilder report = new StringBuilder(); 260 StringBuilder report = new StringBuilder();
171 261
172 int columnPadding = 2; 262 int columnPadding = 2;
@@ -224,6 +314,9 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
224 return; 314 return;
225 315
226 string name = client.Name; 316 string name = client.Name;
317 if (pname != "" && name != pname)
318 return;
319
227 string regionName = scene.RegionInfo.RegionName; 320 string regionName = scene.RegionInfo.RegionName;
228 321
229 report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); 322 report.Append(GetColumnEntry(name, maxNameLength, columnPadding));
@@ -249,10 +342,13 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
249 protected string GetThrottlesReport(string[] showParams) 342 protected string GetThrottlesReport(string[] showParams)
250 { 343 {
251 bool showChildren = false; 344 bool showChildren = false;
345 string pname = "";
252 346
253 if (showParams.Length > 2 && showParams[2] == "full") 347 if (showParams.Length > 2 && showParams[2] == "full")
254 showChildren = true; 348 showChildren = true;
255 349 else if (showParams.Length > 3)
350 pname = showParams[2] + " " + showParams[3];
351
256 StringBuilder report = new StringBuilder(); 352 StringBuilder report = new StringBuilder();
257 353
258 int columnPadding = 2; 354 int columnPadding = 2;
@@ -302,7 +398,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
302 if (client is LLClientView) 398 if (client is LLClientView)
303 { 399 {
304 LLClientView llClient = client as LLClientView; 400 LLClientView llClient = client as LLClientView;
305 401
306 if (firstClient) 402 if (firstClient)
307 { 403 {
308 report.AppendLine(GetServerThrottlesReport(llClient.UDPServer)); 404 report.AppendLine(GetServerThrottlesReport(llClient.UDPServer));
@@ -314,6 +410,9 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
314 return; 410 return;
315 411
316 string name = client.Name; 412 string name = client.Name;
413 if (pname != "" && name != pname)
414 return;
415
317 string regionName = scene.RegionInfo.RegionName; 416 string regionName = scene.RegionInfo.RegionName;
318 417
319 LLUDPClient llUdpClient = llClient.UDPClient; 418 LLUDPClient llUdpClient = llClient.UDPClient;
@@ -352,7 +451,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
352 int maxRegionNameLength = 14; 451 int maxRegionNameLength = 14;
353 int maxTypeLength = 4; 452 int maxTypeLength = 4;
354 453
355 string name = "SERVER AGENT LIMITS"; 454 string name = "SERVER AGENT RATES";
356 455
357 report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); 456 report.Append(GetColumnEntry(name, maxNameLength, columnPadding));
358 report.Append(GetColumnEntry("-", maxRegionNameLength, columnPadding)); 457 report.Append(GetColumnEntry("-", maxRegionNameLength, columnPadding));
@@ -362,13 +461,13 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
362 report.AppendFormat( 461 report.AppendFormat(
363 "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}", 462 "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}",
364 (throttleRates.Total * 8) / 1000, 463 (throttleRates.Total * 8) / 1000,
365 (throttleRates.ResendLimit * 8) / 1000, 464 (throttleRates.Resend * 8) / 1000,
366 (throttleRates.LandLimit * 8) / 1000, 465 (throttleRates.Land * 8) / 1000,
367 (throttleRates.WindLimit * 8) / 1000, 466 (throttleRates.Wind * 8) / 1000,
368 (throttleRates.CloudLimit * 8) / 1000, 467 (throttleRates.Cloud * 8) / 1000,
369 (throttleRates.TaskLimit * 8) / 1000, 468 (throttleRates.Task * 8) / 1000,
370 (throttleRates.TextureLimit * 8) / 1000, 469 (throttleRates.Texture * 8) / 1000,
371 (throttleRates.AssetLimit * 8) / 1000); 470 (throttleRates.Asset * 8) / 1000);
372 471
373 return report.ToString(); 472 return report.ToString();
374 } 473 }
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index 64774d8..f89b824 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -88,7 +88,8 @@ namespace OpenSim.Region.Physics.Meshing
88 88
89 decodedSculptMapPath = start_config.GetString("DecodedSculptMapPath","j2kDecodeCache"); 89 decodedSculptMapPath = start_config.GetString("DecodedSculptMapPath","j2kDecodeCache");
90 cacheSculptMaps = start_config.GetBoolean("CacheSculptMaps", cacheSculptMaps); 90 cacheSculptMaps = start_config.GetBoolean("CacheSculptMaps", cacheSculptMaps);
91 useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh); 91 if(mesh_config != null)
92 useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh);
92 93
93 try 94 try
94 { 95 {
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
index 616aef3..b51290d 100644
--- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
@@ -50,6 +50,7 @@ namespace OpenSim.Server.Handlers.Simulation
50 public class AgentHandler 50 public class AgentHandler
51 { 51 {
52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
53
53 private ISimulationService m_SimulationService; 54 private ISimulationService m_SimulationService;
54 55
55 protected bool m_Proxy = false; 56 protected bool m_Proxy = false;
@@ -280,7 +281,7 @@ namespace OpenSim.Server.Handlers.Simulation
280 AgentData agent = new AgentData(); 281 AgentData agent = new AgentData();
281 try 282 try
282 { 283 {
283 agent.Unpack(args); 284 agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle));
284 } 285 }
285 catch (Exception ex) 286 catch (Exception ex)
286 { 287 {
@@ -300,7 +301,7 @@ namespace OpenSim.Server.Handlers.Simulation
300 AgentPosition agent = new AgentPosition(); 301 AgentPosition agent = new AgentPosition();
301 try 302 try
302 { 303 {
303 agent.Unpack(args); 304 agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle));
304 } 305 }
305 catch (Exception ex) 306 catch (Exception ex)
306 { 307 {
@@ -347,7 +348,8 @@ namespace OpenSim.Server.Handlers.Simulation
347 destination.RegionID = regionID; 348 destination.RegionID = regionID;
348 349
349 string reason; 350 string reason;
350 bool result = m_SimulationService.QueryAccess(destination, id, position, out reason); 351 string version;
352 bool result = m_SimulationService.QueryAccess(destination, id, position, out version, out reason);
351 353
352 responsedata["int_response_code"] = HttpStatusCode.OK; 354 responsedata["int_response_code"] = HttpStatusCode.OK;
353 355
@@ -355,6 +357,7 @@ namespace OpenSim.Server.Handlers.Simulation
355 357
356 resp["success"] = OSD.FromBoolean(result); 358 resp["success"] = OSD.FromBoolean(result);
357 resp["reason"] = OSD.FromString(reason); 359 resp["reason"] = OSD.FromString(reason);
360 resp["version"] = OSD.FromString(version);
358 361
359 responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); 362 responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp);
360 } 363 }
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index 8f80788..6ce0a47 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -241,7 +241,7 @@ namespace OpenSim.Services.Connectors.Simulation
241 if (args != null) 241 if (args != null)
242 { 242 {
243 agent = new CompleteAgentData(); 243 agent = new CompleteAgentData();
244 agent.Unpack(args); 244 agent.Unpack(args, null);
245 return true; 245 return true;
246 } 246 }
247 } 247 }
@@ -256,9 +256,10 @@ namespace OpenSim.Services.Connectors.Simulation
256 256
257 /// <summary> 257 /// <summary>
258 /// </summary> 258 /// </summary>
259 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) 259 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason)
260 { 260 {
261 reason = "Failed to contact destination"; 261 reason = "Failed to contact destination";
262 version = "Unknown";
262 263
263 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position); 264 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position);
264 265
@@ -274,23 +275,27 @@ namespace OpenSim.Services.Connectors.Simulation
274 try 275 try
275 { 276 {
276 OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 10000); 277 OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 10000);
278 OSDMap data = (OSDMap)result["_Result"];
279
277 bool success = result["success"].AsBoolean(); 280 bool success = result["success"].AsBoolean();
278 reason = result["reason"].AsString(); 281 reason = data["reason"].AsString();
282 if (data["version"] != null && data["version"].AsString() != string.Empty)
283 version = data["version"].AsString();
279 284
280 //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}", uri, success); 285 m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1} version {2} ({3})", uri, success, version, data["version"].AsString());
281 286
282 if (!success) 287 if (!success)
283 { 288 {
284 if (result.ContainsKey("Message")) 289 if (data.ContainsKey("Message"))
285 { 290 {
286 string message = result["Message"].AsString(); 291 string message = data["Message"].AsString();
287 if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region 292 if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region
288 { 293 {
289 m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); 294 m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored");
290 return true; 295 return true;
291 } 296 }
292 297
293 reason = result["Message"]; 298 reason = data["Message"];
294 } 299 }
295 else 300 else
296 { 301 {
diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs
index b66bfed..9385b8d 100644
--- a/OpenSim/Services/HypergridService/GatekeeperService.cs
+++ b/OpenSim/Services/HypergridService/GatekeeperService.cs
@@ -29,6 +29,7 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Net; 30using System.Net;
31using System.Reflection; 31using System.Reflection;
32using System.Text.RegularExpressions;
32 33
33using OpenSim.Framework; 34using OpenSim.Framework;
34using OpenSim.Services.Interfaces; 35using OpenSim.Services.Interfaces;
@@ -57,6 +58,9 @@ namespace OpenSim.Services.HypergridService
57 private static IUserAgentService m_UserAgentService; 58 private static IUserAgentService m_UserAgentService;
58 private static ISimulationService m_SimulationService; 59 private static ISimulationService m_SimulationService;
59 60
61 protected string m_AllowedClients = string.Empty;
62 protected string m_DeniedClients = string.Empty;
63
60 private static UUID m_ScopeID; 64 private static UUID m_ScopeID;
61 private static bool m_AllowTeleportsToAnyRegion; 65 private static bool m_AllowTeleportsToAnyRegion;
62 private static string m_ExternalName; 66 private static string m_ExternalName;
@@ -104,6 +108,9 @@ namespace OpenSim.Services.HypergridService
104 else if (simulationService != string.Empty) 108 else if (simulationService != string.Empty)
105 m_SimulationService = ServerUtils.LoadPlugin<ISimulationService>(simulationService, args); 109 m_SimulationService = ServerUtils.LoadPlugin<ISimulationService>(simulationService, args);
106 110
111 m_AllowedClients = serverConfig.GetString("AllowedClients", string.Empty);
112 m_DeniedClients = serverConfig.GetString("DeniedClients", string.Empty);
113
107 if (m_GridService == null || m_PresenceService == null || m_SimulationService == null) 114 if (m_GridService == null || m_PresenceService == null || m_SimulationService == null)
108 throw new Exception("Unable to load a required plugin, Gatekeeper Service cannot function."); 115 throw new Exception("Unable to load a required plugin, Gatekeeper Service cannot function.");
109 116
@@ -181,8 +188,36 @@ namespace OpenSim.Services.HypergridService
181 string authURL = string.Empty; 188 string authURL = string.Empty;
182 if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) 189 if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
183 authURL = aCircuit.ServiceURLs["HomeURI"].ToString(); 190 authURL = aCircuit.ServiceURLs["HomeURI"].ToString();
184 m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to login foreign agent {0} {1} @ {2} ({3}) at destination {4}", 191 m_log.InfoFormat("[GATEKEEPER SERVICE]: Login request for {0} {1} @ {2} ({3}) at {4} using viewer {5}, channel {6}, IP {7}, Mac {8}, Id0 {9}",
185 aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName); 192 aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName,
193 aCircuit.Viewer, aCircuit.Channel, aCircuit.IPAddress, aCircuit.Mac, aCircuit.Id0);
194
195 //
196 // Check client
197 //
198 if (m_AllowedClients != string.Empty)
199 {
200 Regex arx = new Regex(m_AllowedClients);
201 Match am = arx.Match(aCircuit.Viewer);
202
203 if (!am.Success)
204 {
205 m_log.InfoFormat("[GATEKEEPER SERVICE]: Login failed, reason: client {0} is not allowed", aCircuit.Viewer);
206 return false;
207 }
208 }
209
210 if (m_DeniedClients != string.Empty)
211 {
212 Regex drx = new Regex(m_DeniedClients);
213 Match dm = drx.Match(aCircuit.Viewer);
214
215 if (dm.Success)
216 {
217 m_log.InfoFormat("[GATEKEEPER SERVICE]: Login failed, reason: client {0} is denied", aCircuit.Viewer);
218 return false;
219 }
220 }
186 221
187 // 222 //
188 // Authenticate the user 223 // Authenticate the user
diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs
index f2184fc..ae6bd72 100644
--- a/OpenSim/Services/Interfaces/ISimulationService.cs
+++ b/OpenSim/Services/Interfaces/ISimulationService.cs
@@ -67,7 +67,7 @@ namespace OpenSim.Services.Interfaces
67 67
68 bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent); 68 bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent);
69 69
70 bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason); 70 bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason);
71 71
72 /// <summary> 72 /// <summary>
73 /// Message from receiving region to departing region, telling it got contacted by the client. 73 /// Message from receiving region to departing region, telling it got contacted by the client.
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs
index c6e6768..250f8f1 100644
--- a/OpenSim/Services/LLLoginService/LLLoginService.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -77,7 +77,11 @@ namespace OpenSim.Services.LLLoginService
77 protected string m_MapTileURL; 77 protected string m_MapTileURL;
78 protected string m_SearchURL; 78 protected string m_SearchURL;
79 79
80 protected string m_AllowedClients;
81 protected string m_DeniedClients;
82
80 IConfig m_LoginServerConfig; 83 IConfig m_LoginServerConfig;
84 IConfig m_ClientsConfig;
81 85
82 public LLLoginService(IConfigSource config, ISimulationService simService, ILibraryService libraryService) 86 public LLLoginService(IConfigSource config, ISimulationService simService, ILibraryService libraryService)
83 { 87 {
@@ -105,7 +109,10 @@ namespace OpenSim.Services.LLLoginService
105 m_GatekeeperURL = m_LoginServerConfig.GetString("GatekeeperURI", string.Empty); 109 m_GatekeeperURL = m_LoginServerConfig.GetString("GatekeeperURI", string.Empty);
106 m_MapTileURL = m_LoginServerConfig.GetString("MapTileURL", string.Empty); 110 m_MapTileURL = m_LoginServerConfig.GetString("MapTileURL", string.Empty);
107 m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty); 111 m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty);
108 112
113 m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty);
114 m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty);
115
109 // These are required; the others aren't 116 // These are required; the others aren't
110 if (accountService == string.Empty || authService == string.Empty) 117 if (accountService == string.Empty || authService == string.Empty)
111 throw new Exception("LoginService is missing service specifications"); 118 throw new Exception("LoginService is missing service specifications");
@@ -216,11 +223,38 @@ namespace OpenSim.Services.LLLoginService
216 bool success = false; 223 bool success = false;
217 UUID session = UUID.Random(); 224 UUID session = UUID.Random();
218 225
219 m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} from {2} with user agent {3} starting in {4}", 226 m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} at {2} using viewer {3}, channel {4}, IP {5}, Mac {6}, Id0 {7}",
220 firstName, lastName, clientIP.Address.ToString(), clientVersion, startLocation); 227 firstName, lastName, startLocation, clientVersion, channel, clientIP.Address.ToString(), mac, id0);
221 try 228 try
222 { 229 {
223 // 230 //
231 // Check client
232 //
233 if (m_AllowedClients != string.Empty)
234 {
235 Regex arx = new Regex(m_AllowedClients);
236 Match am = arx.Match(clientVersion);
237
238 if (!am.Success)
239 {
240 m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: client {0} is not allowed", clientVersion);
241 return LLFailedLoginResponse.LoginBlockedProblem;
242 }
243 }
244
245 if (m_DeniedClients != string.Empty)
246 {
247 Regex drx = new Regex(m_DeniedClients);
248 Match dm = drx.Match(clientVersion);
249
250 if (dm.Success)
251 {
252 m_log.InfoFormat("[LLOGIN SERVICE]: Login failed, reason: client {0} is denied", clientVersion);
253 return LLFailedLoginResponse.LoginBlockedProblem;
254 }
255 }
256
257 //
224 // Get the account and check that it exists 258 // Get the account and check that it exists
225 // 259 //
226 UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); 260 UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName);