aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r--OpenSim/Framework/AssetBase.cs11
-rw-r--r--OpenSim/Framework/AvatarAppearance.cs313
-rw-r--r--OpenSim/Framework/AvatarWearable.cs18
-rw-r--r--OpenSim/Framework/ChildAgentDataUpdate.cs18
-rw-r--r--OpenSim/Framework/Communications/RestClient.cs2
-rw-r--r--OpenSim/Framework/Console/CommandConsole.cs19
-rw-r--r--OpenSim/Framework/EstateSettings.cs23
-rw-r--r--OpenSim/Framework/IClientAPI.cs31
-rw-r--r--OpenSim/Framework/IImprovedAssetCache.cs1
-rw-r--r--OpenSim/Framework/ILandObject.cs1
-rw-r--r--OpenSim/Framework/IMoneyModule.cs3
-rw-r--r--OpenSim/Framework/LandData.cs4
-rw-r--r--OpenSim/Framework/LocklessQueue.cs8
-rw-r--r--OpenSim/Framework/Monitoring/BaseStatsCollector.cs21
-rw-r--r--OpenSim/Framework/Monitoring/Watchdog.cs2
-rw-r--r--OpenSim/Framework/OSChatMessage.cs21
-rw-r--r--OpenSim/Framework/ObjectChangeData.cs80
-rw-r--r--OpenSim/Framework/ParcelMediaCommandEnum.cs2
-rw-r--r--OpenSim/Framework/PluginLoader.cs17
-rw-r--r--OpenSim/Framework/PrimitiveBaseShape.cs38
-rw-r--r--OpenSim/Framework/PriorityQueue.cs20
-rw-r--r--OpenSim/Framework/RegionInfo.cs13
-rw-r--r--OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs133
-rw-r--r--OpenSim/Framework/RegionSettings.cs22
-rw-r--r--OpenSim/Framework/Servers/BaseOpenSimServer.cs14
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs87
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs4
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs145
-rw-r--r--OpenSim/Framework/Servers/ServerBase.cs4
-rw-r--r--OpenSim/Framework/Servers/Tests/OSHttpTests.cs4
-rw-r--r--OpenSim/Framework/Servers/VersionInfo.cs6
-rw-r--r--OpenSim/Framework/TaskInventoryDictionary.cs189
-rw-r--r--OpenSim/Framework/TaskInventoryItem.cs2
-rw-r--r--OpenSim/Framework/Tests/MundaneFrameworkTests.cs6
-rw-r--r--OpenSim/Framework/ThrottleOutPacketType.cs2
-rw-r--r--OpenSim/Framework/Util.cs46
-rw-r--r--OpenSim/Framework/WearableCacheItem.cs157
-rw-r--r--OpenSim/Framework/WebUtil.cs33
38 files changed, 1162 insertions, 358 deletions
diff --git a/OpenSim/Framework/AssetBase.cs b/OpenSim/Framework/AssetBase.cs
index d2c6c57..5da8e11 100644
--- a/OpenSim/Framework/AssetBase.cs
+++ b/OpenSim/Framework/AssetBase.cs
@@ -60,6 +60,8 @@ namespace OpenSim.Framework
60 /// </summary> 60 /// </summary>
61 private AssetMetadata m_metadata; 61 private AssetMetadata m_metadata;
62 62
63 private int m_uploadAttempts;
64
63 // This is needed for .NET serialization!!! 65 // This is needed for .NET serialization!!!
64 // Do NOT "Optimize" away! 66 // Do NOT "Optimize" away!
65 public AssetBase() 67 public AssetBase()
@@ -148,7 +150,8 @@ namespace OpenSim.Framework
148 Type == (sbyte)AssetType.SnapshotFolder || 150 Type == (sbyte)AssetType.SnapshotFolder ||
149 Type == (sbyte)AssetType.TrashFolder || 151 Type == (sbyte)AssetType.TrashFolder ||
150 Type == (sbyte)AssetType.ImageJPEG || 152 Type == (sbyte)AssetType.ImageJPEG ||
151 Type == (sbyte) AssetType.ImageTGA || 153 Type == (sbyte)AssetType.ImageTGA ||
154 Type == (sbyte)AssetType.Mesh ||
152 Type == (sbyte) AssetType.LSLBytecode); 155 Type == (sbyte) AssetType.LSLBytecode);
153 } 156 }
154 } 157 }
@@ -198,6 +201,12 @@ namespace OpenSim.Framework
198 set { m_metadata.Type = value; } 201 set { m_metadata.Type = value; }
199 } 202 }
200 203
204 public int UploadAttempts
205 {
206 get { return m_uploadAttempts; }
207 set { m_uploadAttempts = value; }
208 }
209
201 /// <summary> 210 /// <summary>
202 /// Is this a region only asset, or does this exist on the asset server also 211 /// Is this a region only asset, or does this exist on the asset server also
203 /// </summary> 212 /// </summary>
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs
index 157feb5..b7a0adf 100644
--- a/OpenSim/Framework/AvatarAppearance.cs
+++ b/OpenSim/Framework/AvatarAppearance.cs
@@ -40,8 +40,17 @@ namespace OpenSim.Framework
40 /// </summary> 40 /// </summary>
41 public class AvatarAppearance 41 public class AvatarAppearance
42 { 42 {
43 // SL box diferent to size
44 const float AVBOXAJUST = 0.2f;
45 // constrains for ubitode physics
46 const float AVBOXMINX = 0.2f;
47 const float AVBOXMINY = 0.3f;
48 const float AVBOXMINZ = 1.2f;
49
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44 51
52 // this is viewer capabilities and weared things dependent
53 // should be only used as initial default value ( V1 viewers )
45 public readonly static int VISUALPARAM_COUNT = 218; 54 public readonly static int VISUALPARAM_COUNT = 218;
46 55
47 public readonly static int TEXTURE_COUNT = 21; 56 public readonly static int TEXTURE_COUNT = 21;
@@ -53,7 +62,12 @@ namespace OpenSim.Framework
53 protected AvatarWearable[] m_wearables; 62 protected AvatarWearable[] m_wearables;
54 protected Dictionary<int, List<AvatarAttachment>> m_attachments; 63 protected Dictionary<int, List<AvatarAttachment>> m_attachments;
55 protected float m_avatarHeight = 0; 64 protected float m_avatarHeight = 0;
56 protected UUID[] m_texturehashes; 65 protected Vector3 m_avatarSize = new Vector3(0.45f, 0.6f, 1.9f); // sl Z cloud value
66 protected Vector3 m_avatarBoxSize = new Vector3(0.45f, 0.6f, 1.9f);
67 protected float m_avatarFeetOffset = 0;
68 protected float m_avatarAnimOffset = 0;
69 protected WearableCacheItem[] m_cacheitems;
70 protected bool m_cacheItemsDirty = true;
57 71
58 public virtual int Serial 72 public virtual int Serial
59 { 73 {
@@ -67,6 +81,21 @@ namespace OpenSim.Framework
67 set { m_visualparams = value; } 81 set { m_visualparams = value; }
68 } 82 }
69 83
84 public virtual Vector3 AvatarSize
85 {
86 get { return m_avatarSize; }
87 }
88
89 public virtual Vector3 AvatarBoxSize
90 {
91 get { return m_avatarBoxSize; }
92 }
93
94 public virtual float AvatarFeetOffset
95 {
96 get { return m_avatarFeetOffset + m_avatarAnimOffset; }
97 }
98
70 public virtual Primitive.TextureEntry Texture 99 public virtual Primitive.TextureEntry Texture
71 { 100 {
72 get { return m_texture; } 101 get { return m_texture; }
@@ -88,6 +117,18 @@ namespace OpenSim.Framework
88 get { return m_avatarHeight; } 117 get { return m_avatarHeight; }
89 set { m_avatarHeight = value; } 118 set { m_avatarHeight = value; }
90 } 119 }
120
121 public virtual WearableCacheItem[] WearableCacheItems
122 {
123 get { return m_cacheitems; }
124 set { m_cacheitems = value; }
125 }
126
127 public virtual bool WearableCacheItemsDirty
128 {
129 get { return m_cacheItemsDirty; }
130 set { m_cacheItemsDirty = value; }
131 }
91 132
92 public AvatarAppearance() 133 public AvatarAppearance()
93 { 134 {
@@ -97,10 +138,9 @@ namespace OpenSim.Framework
97 SetDefaultWearables(); 138 SetDefaultWearables();
98 SetDefaultTexture(); 139 SetDefaultTexture();
99 SetDefaultParams(); 140 SetDefaultParams();
100 SetHeight(); 141// SetHeight();
142 SetSize(new Vector3(0.45f,0.6f,1.9f));
101 m_attachments = new Dictionary<int, List<AvatarAttachment>>(); 143 m_attachments = new Dictionary<int, List<AvatarAttachment>>();
102
103 ResetTextureHashes();
104 } 144 }
105 145
106 public AvatarAppearance(OSDMap map) 146 public AvatarAppearance(OSDMap map)
@@ -108,7 +148,35 @@ namespace OpenSim.Framework
108// m_log.WarnFormat("[AVATAR APPEARANCE]: create appearance from OSDMap"); 148// m_log.WarnFormat("[AVATAR APPEARANCE]: create appearance from OSDMap");
109 149
110 Unpack(map); 150 Unpack(map);
111 SetHeight(); 151// SetHeight(); done in Unpack
152 }
153
154 public AvatarAppearance(AvatarWearable[] wearables, Primitive.TextureEntry textureEntry, byte[] visualParams)
155 {
156// m_log.WarnFormat("[AVATAR APPEARANCE] create initialized appearance");
157
158 m_serial = 0;
159
160 if (wearables != null)
161 m_wearables = wearables;
162 else
163 SetDefaultWearables();
164
165 if (textureEntry != null)
166 m_texture = textureEntry;
167 else
168 SetDefaultTexture();
169
170 if (visualParams != null)
171 m_visualparams = visualParams;
172 else
173 SetDefaultParams();
174
175// SetHeight();
176 if(m_avatarHeight == 0)
177 SetSize(new Vector3(0.45f,0.6f,1.9f));
178
179 m_attachments = new Dictionary<int, List<AvatarAttachment>>();
112 } 180 }
113 181
114 public AvatarAppearance(AvatarAppearance appearance) : this(appearance, true) 182 public AvatarAppearance(AvatarAppearance appearance) : this(appearance, true)
@@ -125,11 +193,10 @@ namespace OpenSim.Framework
125 SetDefaultWearables(); 193 SetDefaultWearables();
126 SetDefaultTexture(); 194 SetDefaultTexture();
127 SetDefaultParams(); 195 SetDefaultParams();
128 SetHeight(); 196// SetHeight();
197 SetSize(new Vector3(0.45f, 0.6f, 1.9f));
129 m_attachments = new Dictionary<int, List<AvatarAttachment>>(); 198 m_attachments = new Dictionary<int, List<AvatarAttachment>>();
130 199
131 ResetTextureHashes();
132
133 return; 200 return;
134 } 201 }
135 202
@@ -145,10 +212,6 @@ namespace OpenSim.Framework
145 SetWearable(i,appearance.Wearables[i]); 212 SetWearable(i,appearance.Wearables[i]);
146 } 213 }
147 214
148 m_texturehashes = new UUID[AvatarAppearance.TEXTURE_COUNT];
149 for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
150 m_texturehashes[i] = new UUID(appearance.m_texturehashes[i]);
151
152 m_texture = null; 215 m_texture = null;
153 if (appearance.Texture != null) 216 if (appearance.Texture != null)
154 { 217 {
@@ -160,7 +223,8 @@ namespace OpenSim.Framework
160 if (appearance.VisualParams != null) 223 if (appearance.VisualParams != null)
161 m_visualparams = (byte[])appearance.VisualParams.Clone(); 224 m_visualparams = (byte[])appearance.VisualParams.Clone();
162 225
163 m_avatarHeight = appearance.m_avatarHeight; 226// m_avatarHeight = appearance.m_avatarHeight;
227 SetSize(appearance.AvatarSize);
164 228
165 // Copy the attachment, force append mode since that ensures consistency 229 // Copy the attachment, force append mode since that ensures consistency
166 m_attachments = new Dictionary<int, List<AvatarAttachment>>(); 230 m_attachments = new Dictionary<int, List<AvatarAttachment>>();
@@ -183,37 +247,6 @@ namespace OpenSim.Framework
183 } 247 }
184 } 248 }
185 249
186 public void ResetTextureHashes()
187 {
188 m_texturehashes = new UUID[AvatarAppearance.TEXTURE_COUNT];
189 for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
190 m_texturehashes[i] = UUID.Zero;
191 }
192
193 public UUID GetTextureHash(int textureIndex)
194 {
195 return m_texturehashes[NormalizeBakedTextureIndex(textureIndex)];
196 }
197
198 public void SetTextureHash(int textureIndex, UUID textureHash)
199 {
200 m_texturehashes[NormalizeBakedTextureIndex(textureIndex)] = new UUID(textureHash);
201 }
202
203 /// <summary>
204 /// Normalizes the texture index to the actual bake index, this is done to
205 /// accommodate older viewers that send the BAKE_INDICES index rather than
206 /// the actual texture index
207 /// </summary>
208 private int NormalizeBakedTextureIndex(int textureIndex)
209 {
210 // Earlier viewer send the index into the baked index array, just trying to be careful here
211 if (textureIndex < BAKE_INDICES.Length)
212 return BAKE_INDICES[textureIndex];
213
214 return textureIndex;
215 }
216
217 public void ClearWearables() 250 public void ClearWearables()
218 { 251 {
219 m_wearables = new AvatarWearable[AvatarWearable.MAX_WEARABLES]; 252 m_wearables = new AvatarWearable[AvatarWearable.MAX_WEARABLES];
@@ -237,7 +270,12 @@ namespace OpenSim.Framework
237 m_serial = 0; 270 m_serial = 0;
238 271
239 SetDefaultTexture(); 272 SetDefaultTexture();
240 ResetTextureHashes(); 273
274 //for (int i = 0; i < BAKE_INDICES.Length; i++)
275 // {
276 // int idx = BAKE_INDICES[i];
277 // m_texture.FaceTextures[idx].TextureID = UUID.Zero;
278 // }
241 } 279 }
242 280
243 protected virtual void SetDefaultParams() 281 protected virtual void SetDefaultParams()
@@ -249,6 +287,21 @@ namespace OpenSim.Framework
249// } 287// }
250 } 288 }
251 289
290 /// <summary>
291 /// Invalidate all of the baked textures in the appearance, useful
292 /// if you know that none are valid
293 /// </summary>
294 public virtual void ResetBakedTextures()
295 {
296 SetDefaultTexture();
297
298 //for (int i = 0; i < BAKE_INDICES.Length; i++)
299 // {
300 // int idx = BAKE_INDICES[i];
301 // m_texture.FaceTextures[idx].TextureID = UUID.Zero;
302 // }
303 }
304
252 protected virtual void SetDefaultTexture() 305 protected virtual void SetDefaultTexture()
253 { 306 {
254 m_texture = new Primitive.TextureEntry(new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE)); 307 m_texture = new Primitive.TextureEntry(new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE));
@@ -313,22 +366,33 @@ namespace OpenSim.Framework
313 // made. We determine if any of the visual parameters actually 366 // made. We determine if any of the visual parameters actually
314 // changed to know if the appearance should be saved later 367 // changed to know if the appearance should be saved later
315 bool changed = false; 368 bool changed = false;
316 for (int i = 0; i < AvatarAppearance.VISUALPARAM_COUNT; i++) 369
370 int newsize = visualParams.Length;
371
372 if (newsize != m_visualparams.Length)
373 {
374 changed = true;
375 m_visualparams = (byte[])visualParams.Clone();
376 }
377 else
317 { 378 {
318 if (visualParams[i] != m_visualparams[i]) 379
380 for (int i = 0; i < newsize; i++)
319 { 381 {
320// DEBUG ON 382 if (visualParams[i] != m_visualparams[i])
321// m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}", 383 {
322// i,m_visualparams[i],visualParams[i]); 384 // DEBUG ON
323// DEBUG OFF 385 // m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}",
324 m_visualparams[i] = visualParams[i]; 386 // i,m_visualparams[i],visualParams[i]);
325 changed = true; 387 // DEBUG OFF
388 m_visualparams[i] = visualParams[i];
389 changed = true;
390 }
326 } 391 }
327 } 392 }
328
329 // Reset the height if the visual parameters actually changed 393 // Reset the height if the visual parameters actually changed
330 if (changed) 394// if (changed)
331 SetHeight(); 395// SetHeight();
332 396
333 return changed; 397 return changed;
334 } 398 }
@@ -344,6 +408,7 @@ namespace OpenSim.Framework
344 /// </summary> 408 /// </summary>
345 public virtual void SetHeight() 409 public virtual void SetHeight()
346 { 410 {
411/*
347 // Start with shortest possible female avatar height 412 // Start with shortest possible female avatar height
348 m_avatarHeight = 1.14597f; 413 m_avatarHeight = 1.14597f;
349 // Add offset for male avatars 414 // Add offset for male avatars
@@ -356,6 +421,35 @@ namespace OpenSim.Framework
356 + 0.07f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f 421 + 0.07f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f
357 + 0.08f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f 422 + 0.08f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f
358 + 0.076f * (float)m_visualparams[(int)VPElement.SHAPE_NECK_LENGTH] / 255.0f; 423 + 0.076f * (float)m_visualparams[(int)VPElement.SHAPE_NECK_LENGTH] / 255.0f;
424*/
425 }
426
427 public void SetSize(Vector3 avSize)
428 {
429 if (avSize.X > 32f)
430 avSize.X = 32f;
431 else if (avSize.X < 0.1f)
432 avSize.X = 0.1f;
433
434 if (avSize.Y > 32f)
435 avSize.Y = 32f;
436 else if (avSize.Y < 0.1f)
437 avSize.Y = 0.1f;
438 if (avSize.Z > 32f)
439 avSize.Z = 32f;
440 else if (avSize.Z < 0.1f)
441 avSize.Z = 0.1f;
442
443 m_avatarSize = avSize;
444 m_avatarBoxSize = avSize;
445 m_avatarBoxSize.Z += AVBOXAJUST;
446 if (m_avatarBoxSize.X < AVBOXMINX)
447 m_avatarBoxSize.X = AVBOXMINX;
448 if (m_avatarBoxSize.Y < AVBOXMINY)
449 m_avatarBoxSize.Y = AVBOXMINY;
450 if (m_avatarBoxSize.Z < AVBOXMINZ)
451 m_avatarBoxSize.Z = AVBOXMINZ;
452 m_avatarHeight = m_avatarSize.Z;
359 } 453 }
360 454
361 public virtual void SetWearable(int wearableId, AvatarWearable wearable) 455 public virtual void SetWearable(int wearableId, AvatarWearable wearable)
@@ -386,7 +480,8 @@ namespace OpenSim.Framework
386 } 480 }
387 481
388 s += "Visual Params: "; 482 s += "Visual Params: ";
389 for (uint j = 0; j < AvatarAppearance.VISUALPARAM_COUNT; j++) 483 // for (uint j = 0; j < AvatarAppearance.VISUALPARAM_COUNT; j++)
484 for (uint j = 0; j < m_visualparams.Length; j++)
390 s += String.Format("{0},",m_visualparams[j]); 485 s += String.Format("{0},",m_visualparams[j]);
391 s += "\n"; 486 s += "\n";
392 487
@@ -402,18 +497,16 @@ namespace OpenSim.Framework
402 /// </remarks> 497 /// </remarks>
403 public List<AvatarAttachment> GetAttachments() 498 public List<AvatarAttachment> GetAttachments()
404 { 499 {
405 List<AvatarAttachment> alist = new List<AvatarAttachment>();
406
407 lock (m_attachments) 500 lock (m_attachments)
408 { 501 {
502 List<AvatarAttachment> alist = new List<AvatarAttachment>();
409 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) 503 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments)
410 { 504 {
411 foreach (AvatarAttachment attach in kvp.Value) 505 foreach (AvatarAttachment attach in kvp.Value)
412 alist.Add(new AvatarAttachment(attach)); 506 alist.Add(new AvatarAttachment(attach));
413 } 507 }
414 } 508 return alist;
415 509 }
416 return alist;
417 } 510 }
418 511
419 internal void AppendAttachment(AvatarAttachment attach) 512 internal void AppendAttachment(AvatarAttachment attach)
@@ -557,7 +650,6 @@ namespace OpenSim.Framework
557 return kvp.Key; 650 return kvp.Key;
558 } 651 }
559 } 652 }
560
561 return 0; 653 return 0;
562 } 654 }
563 655
@@ -607,12 +699,6 @@ namespace OpenSim.Framework
607 data["serial"] = OSD.FromInteger(m_serial); 699 data["serial"] = OSD.FromInteger(m_serial);
608 data["height"] = OSD.FromReal(m_avatarHeight); 700 data["height"] = OSD.FromReal(m_avatarHeight);
609 701
610 // Hashes
611 OSDArray hashes = new OSDArray(AvatarAppearance.TEXTURE_COUNT);
612 for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
613 hashes.Add(OSD.FromUUID(m_texturehashes[i]));
614 data["hashes"] = hashes;
615
616 // Wearables 702 // Wearables
617 OSDArray wears = new OSDArray(AvatarWearable.MAX_WEARABLES); 703 OSDArray wears = new OSDArray(AvatarWearable.MAX_WEARABLES);
618 for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) 704 for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)
@@ -634,12 +720,14 @@ namespace OpenSim.Framework
634 OSDBinary visualparams = new OSDBinary(m_visualparams); 720 OSDBinary visualparams = new OSDBinary(m_visualparams);
635 data["visualparams"] = visualparams; 721 data["visualparams"] = visualparams;
636 722
637 // Attachments 723 lock (m_attachments)
638 List<AvatarAttachment> attachments = GetAttachments(); 724 {
639 OSDArray attachs = new OSDArray(attachments.Count); 725 // Attachments
640 foreach (AvatarAttachment attach in GetAttachments()) 726 OSDArray attachs = new OSDArray(m_attachments.Count);
641 attachs.Add(attach.Pack()); 727 foreach (AvatarAttachment attach in GetAttachments())
642 data["attachments"] = attachs; 728 attachs.Add(attach.Pack());
729 data["attachments"] = attachs;
730 }
643 731
644 return data; 732 return data;
645 } 733 }
@@ -653,29 +741,11 @@ namespace OpenSim.Framework
653 if ((data != null) && (data["serial"] != null)) 741 if ((data != null) && (data["serial"] != null))
654 m_serial = data["serial"].AsInteger(); 742 m_serial = data["serial"].AsInteger();
655 if ((data != null) && (data["height"] != null)) 743 if ((data != null) && (data["height"] != null))
656 m_avatarHeight = (float)data["height"].AsReal(); 744// m_avatarHeight = (float)data["height"].AsReal();
745 SetSize(new Vector3(0.45f,0.6f, (float)data["height"].AsReal()));
657 746
658 try 747 try
659 { 748 {
660 // Hashes
661 m_texturehashes = new UUID[AvatarAppearance.TEXTURE_COUNT];
662 if ((data != null) && (data["hashes"] != null) && (data["hashes"]).Type == OSDType.Array)
663 {
664 OSDArray hashes = (OSDArray)(data["hashes"]);
665 for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
666 {
667 UUID hashID = UUID.Zero;
668 if (i < hashes.Count && hashes[i] != null)
669 hashID = hashes[i].AsUUID();
670 m_texturehashes[i] = hashID;
671 }
672 }
673 else
674 {
675 for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
676 m_texturehashes[i] = UUID.Zero;
677 }
678
679 // Wearables 749 // Wearables
680 SetDefaultWearables(); 750 SetDefaultWearables();
681 if ((data != null) && (data["wearables"] != null) && (data["wearables"]).Type == OSDType.Array) 751 if ((data != null) && (data["wearables"] != null) && (data["wearables"]).Type == OSDType.Array)
@@ -1505,7 +1575,58 @@ namespace OpenSim.Framework
1505 SHAPE_EYELID_INNER_CORNER_UP = 214, 1575 SHAPE_EYELID_INNER_CORNER_UP = 214,
1506 SKIRT_SKIRT_RED = 215, 1576 SKIRT_SKIRT_RED = 215,
1507 SKIRT_SKIRT_GREEN = 216, 1577 SKIRT_SKIRT_GREEN = 216,
1508 SKIRT_SKIRT_BLUE = 217 1578 SKIRT_SKIRT_BLUE = 217,
1579
1580 /// <summary>
1581 /// Avatar Physics section. These are 0 type visual params which get transmitted.
1582 /// </summary>
1583
1584 /// <summary>
1585 /// Breast Part 1
1586 /// </summary>
1587 BREAST_PHYSICS_MASS = 218,
1588 BREAST_PHYSICS_GRAVITY = 219,
1589 BREAST_PHYSICS_DRAG = 220,
1590 BREAST_PHYSICS_UPDOWN_MAX_EFFECT = 221,
1591 BREAST_PHYSICS_UPDOWN_SPRING = 222,
1592 BREAST_PHYSICS_UPDOWN_GAIN = 223,
1593 BREAST_PHYSICS_UPDOWN_DAMPING = 224,
1594 BREAST_PHYSICS_INOUT_MAX_EFFECT = 225,
1595 BREAST_PHYSICS_INOUT_SPRING = 226,
1596 BREAST_PHYSICS_INOUT_GAIN = 227,
1597 BREAST_PHYSICS_INOUT_DAMPING = 228,
1598 /// <summary>
1599 /// Belly
1600 /// </summary>
1601 BELLY_PHYISCS_MASS = 229,
1602 BELLY_PHYSICS_GRAVITY = 230,
1603 BELLY_PHYSICS_DRAG = 231,
1604 BELLY_PHYISCS_UPDOWN_MAX_EFFECT = 232,
1605 BELLY_PHYSICS_UPDOWN_SPRING = 233,
1606 BELLY_PHYSICS_UPDOWN_GAIN = 234,
1607 BELLY_PHYSICS_UPDOWN_DAMPING = 235,
1608
1609 /// <summary>
1610 /// Butt
1611 /// </summary>
1612 BUTT_PHYSICS_MASS = 236,
1613 BUTT_PHYSICS_GRAVITY = 237,
1614 BUTT_PHYSICS_DRAG = 238,
1615 BUTT_PHYSICS_UPDOWN_MAX_EFFECT = 239,
1616 BUTT_PHYSICS_UPDOWN_SPRING = 240,
1617 BUTT_PHYSICS_UPDOWN_GAIN = 241,
1618 BUTT_PHYSICS_UPDOWN_DAMPING = 242,
1619 BUTT_PHYSICS_LEFTRIGHT_MAX_EFFECT = 243,
1620 BUTT_PHYSICS_LEFTRIGHT_SPRING = 244,
1621 BUTT_PHYSICS_LEFTRIGHT_GAIN = 245,
1622 BUTT_PHYSICS_LEFTRIGHT_DAMPING = 246,
1623 /// <summary>
1624 /// Breast Part 2
1625 /// </summary>
1626 BREAST_PHYSICS_LEFTRIGHT_MAX_EFFECT = 247,
1627 BREAST_PHYSICS_LEFTRIGHT_SPRING= 248,
1628 BREAST_PHYSICS_LEFTRIGHT_GAIN = 249,
1629 BREAST_PHYSICS_LEFTRIGHT_DAMPING = 250
1509 } 1630 }
1510 #endregion 1631 #endregion
1511 } 1632 }
diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs
index 8e27596..aee295a 100644
--- a/OpenSim/Framework/AvatarWearable.cs
+++ b/OpenSim/Framework/AvatarWearable.cs
@@ -62,9 +62,14 @@ namespace OpenSim.Framework
62 public static readonly int UNDERSHIRT = 10; 62 public static readonly int UNDERSHIRT = 10;
63 public static readonly int UNDERPANTS = 11; 63 public static readonly int UNDERPANTS = 11;
64 public static readonly int SKIRT = 12; 64 public static readonly int SKIRT = 12;
65
66 public static readonly int MAX_BASICWEARABLES = 13;
67
65 public static readonly int ALPHA = 13; 68 public static readonly int ALPHA = 13;
66 public static readonly int TATTOO = 14; 69 public static readonly int TATTOO = 14;
70// public static readonly int PHYSICS = 15;
67 71
72 // public static readonly int MAX_WEARABLES = 16;
68 public static readonly int MAX_WEARABLES = 15; 73 public static readonly int MAX_WEARABLES = 15;
69 74
70 public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); 75 public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9");
@@ -219,7 +224,7 @@ namespace OpenSim.Framework
219 { 224 {
220 get 225 get
221 { 226 {
222 AvatarWearable[] defaultWearables = new AvatarWearable[MAX_WEARABLES]; //should be 15 of these 227 AvatarWearable[] defaultWearables = new AvatarWearable[MAX_WEARABLES];
223 for (int i = 0; i < MAX_WEARABLES; i++) 228 for (int i = 0; i < MAX_WEARABLES; i++)
224 { 229 {
225 defaultWearables[i] = new AvatarWearable(); 230 defaultWearables[i] = new AvatarWearable();
@@ -242,10 +247,13 @@ namespace OpenSim.Framework
242 247
243// // Alpha 248// // Alpha
244// defaultWearables[ALPHA].Add(DEFAULT_ALPHA_ITEM, DEFAULT_ALPHA_ASSET); 249// defaultWearables[ALPHA].Add(DEFAULT_ALPHA_ITEM, DEFAULT_ALPHA_ASSET);
245 250
246// // Tattoo 251 // // Tattoo
247// defaultWearables[TATTOO].Add(DEFAULT_TATTOO_ITEM, DEFAULT_TATTOO_ASSET); 252 // defaultWearables[TATTOO].Add(DEFAULT_TATTOO_ITEM, DEFAULT_TATTOO_ASSET);
248 253
254 // // Physics
255 // defaultWearables[PHYSICS].Add(DEFAULT_TATTOO_ITEM, DEFAULT_TATTOO_ASSET);
256
249 return defaultWearables; 257 return defaultWearables;
250 } 258 }
251 } 259 }
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs
index 18d008c..2a8e67d 100644
--- a/OpenSim/Framework/ChildAgentDataUpdate.cs
+++ b/OpenSim/Framework/ChildAgentDataUpdate.cs
@@ -230,12 +230,14 @@ namespace OpenSim.Framework
230 230
231 public class ControllerData 231 public class ControllerData
232 { 232 {
233 public UUID ObjectID;
233 public UUID ItemID; 234 public UUID ItemID;
234 public uint IgnoreControls; 235 public uint IgnoreControls;
235 public uint EventControls; 236 public uint EventControls;
236 237
237 public ControllerData(UUID item, uint ignore, uint ev) 238 public ControllerData(UUID obj, UUID item, uint ignore, uint ev)
238 { 239 {
240 ObjectID = obj;
239 ItemID = item; 241 ItemID = item;
240 IgnoreControls = ignore; 242 IgnoreControls = ignore;
241 EventControls = ev; 243 EventControls = ev;
@@ -249,6 +251,7 @@ namespace OpenSim.Framework
249 public OSDMap PackUpdateMessage() 251 public OSDMap PackUpdateMessage()
250 { 252 {
251 OSDMap controldata = new OSDMap(); 253 OSDMap controldata = new OSDMap();
254 controldata["object"] = OSD.FromUUID(ObjectID);
252 controldata["item"] = OSD.FromUUID(ItemID); 255 controldata["item"] = OSD.FromUUID(ItemID);
253 controldata["ignore"] = OSD.FromInteger(IgnoreControls); 256 controldata["ignore"] = OSD.FromInteger(IgnoreControls);
254 controldata["event"] = OSD.FromInteger(EventControls); 257 controldata["event"] = OSD.FromInteger(EventControls);
@@ -259,6 +262,8 @@ namespace OpenSim.Framework
259 262
260 public void UnpackUpdateMessage(OSDMap args) 263 public void UnpackUpdateMessage(OSDMap args)
261 { 264 {
265 if (args["object"] != null)
266 ObjectID = args["object"].AsUUID();
262 if (args["item"] != null) 267 if (args["item"] != null)
263 ItemID = args["item"].AsUUID(); 268 ItemID = args["item"].AsUUID();
264 if (args["ignore"] != null) 269 if (args["ignore"] != null)
@@ -317,6 +322,8 @@ namespace OpenSim.Framework
317 public Animation AnimState = null; 322 public Animation AnimState = null;
318 323
319 public UUID GranterID; 324 public UUID GranterID;
325 public UUID ParentPart;
326 public Vector3 SitOffset;
320 327
321 // Appearance 328 // Appearance
322 public AvatarAppearance Appearance; 329 public AvatarAppearance Appearance;
@@ -488,6 +495,10 @@ namespace OpenSim.Framework
488 } 495 }
489 args["attach_objects"] = attObjs; 496 args["attach_objects"] = attObjs;
490 } 497 }
498
499 args["parent_part"] = OSD.FromUUID(ParentPart);
500 args["sit_offset"] = OSD.FromString(SitOffset.ToString());
501
491 return args; 502 return args;
492 } 503 }
493 504
@@ -719,6 +730,11 @@ namespace OpenSim.Framework
719 } 730 }
720 } 731 }
721 } 732 }
733
734 if (args["parent_part"] != null)
735 ParentPart = args["parent_part"].AsUUID();
736 if (args["sit_offset"] != null)
737 Vector3.TryParse(args["sit_offset"].AsString(), out SitOffset);
722 } 738 }
723 739
724 public AgentData() 740 public AgentData()
diff --git a/OpenSim/Framework/Communications/RestClient.cs b/OpenSim/Framework/Communications/RestClient.cs
index 97b3b60..42c0b18 100644
--- a/OpenSim/Framework/Communications/RestClient.cs
+++ b/OpenSim/Framework/Communications/RestClient.cs
@@ -363,7 +363,7 @@ namespace OpenSim.Framework.Communications
363 _request = (HttpWebRequest) WebRequest.Create(buildUri()); 363 _request = (HttpWebRequest) WebRequest.Create(buildUri());
364 _request.KeepAlive = false; 364 _request.KeepAlive = false;
365 _request.ContentType = "application/xml"; 365 _request.ContentType = "application/xml";
366 _request.Timeout = 900000; 366 _request.Timeout = 30000;
367 _request.Method = RequestMethod; 367 _request.Method = RequestMethod;
368 _asyncException = null; 368 _asyncException = null;
369 _request.ContentLength = src.Length; 369 _request.ContentLength = src.Length;
diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs
index b9f402a..9490013 100644
--- a/OpenSim/Framework/Console/CommandConsole.cs
+++ b/OpenSim/Framework/Console/CommandConsole.cs
@@ -83,7 +83,7 @@ namespace OpenSim.Framework.Console
83 = "To enter an argument that contains spaces, surround the argument with double quotes.\nFor example, show object name \"My long object name\"\n"; 83 = "To enter an argument that contains spaces, surround the argument with double quotes.\nFor example, show object name \"My long object name\"\n";
84 84
85 public const string ItemHelpText 85 public const string ItemHelpText
86= @"For more information, type 'help all' to get a list of all commands, 86= @"For more information, type 'help' to get a list of all commands,
87 or type help <item>' where <item> is one of the following:"; 87 or type help <item>' where <item> is one of the following:";
88 88
89 /// <value> 89 /// <value>
@@ -116,12 +116,14 @@ namespace OpenSim.Framework.Console
116 if (helpParts.Count == 0) 116 if (helpParts.Count == 0)
117 { 117 {
118 help.Add(GeneralHelpText); 118 help.Add(GeneralHelpText);
119 help.Add(ItemHelpText); 119 help.AddRange(CollectAllCommandsHelp());
120 help.AddRange(CollectModulesHelp(tree));
121 } 120 }
122 else if (helpParts.Count == 1 && helpParts[0] == "all") 121 else if (helpParts.Count == 1 && helpParts[0] == "categories")
123 { 122 {
124 help.AddRange(CollectAllCommandsHelp()); 123 help.Add(""); // Will become a newline.
124 help.Add(GeneralHelpText);
125 help.Add(ItemHelpText);
126 help.AddRange(CollectModulesHelp(tree));
125 } 127 }
126 else 128 else
127 { 129 {
@@ -145,8 +147,11 @@ namespace OpenSim.Framework.Console
145 { 147 {
146 foreach (List<CommandInfo> commands in m_modulesCommands.Values) 148 foreach (List<CommandInfo> commands in m_modulesCommands.Values)
147 { 149 {
148 var ourHelpText = commands.ConvertAll(c => string.Format("{0} - {1}", c.help_text, c.long_help)); 150 foreach (CommandInfo c in commands)
149 help.AddRange(ourHelpText); 151 {
152 if (c.long_help != String.Empty)
153 help.Add(string.Format("{0} - {1}", c.help_text, c.long_help));
154 }
150 } 155 }
151 } 156 }
152 157
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs
index a02993d..5ddbd61 100644
--- a/OpenSim/Framework/EstateSettings.cs
+++ b/OpenSim/Framework/EstateSettings.cs
@@ -362,11 +362,30 @@ namespace OpenSim.Framework
362 return false; 362 return false;
363 } 363 }
364 364
365 public bool IsBanned(UUID avatarID) 365 public bool IsBanned(UUID avatarID, int userFlags)
366 { 366 {
367 foreach (EstateBan ban in l_EstateBans) 367 foreach (EstateBan ban in l_EstateBans)
368 if (ban.BannedUserID == avatarID) 368 if (ban.BannedUserID == avatarID)
369 return true; 369 return true;
370
371 if (!IsEstateManagerOrOwner(avatarID) && !HasAccess(avatarID))
372 {
373 if (DenyMinors)
374 {
375 if ((userFlags & 32) == 0)
376 {
377 return true;
378 }
379 }
380 if (DenyAnonymous)
381 {
382 if ((userFlags & 4) == 0)
383 {
384 return true;
385 }
386 }
387 }
388
370 return false; 389 return false;
371 } 390 }
372 391
@@ -374,7 +393,7 @@ namespace OpenSim.Framework
374 { 393 {
375 if (ban == null) 394 if (ban == null)
376 return; 395 return;
377 if (!IsBanned(ban.BannedUserID)) 396 if (!IsBanned(ban.BannedUserID, 32)) //Ignore age-based bans
378 l_EstateBans.Add(ban); 397 l_EstateBans.Add(ban);
379 } 398 }
380 399
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 98358e5..22cc79d 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -64,14 +64,15 @@ namespace OpenSim.Framework
64 64
65 public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes); 65 public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes);
66 66
67 public delegate void SetAppearance(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 AvSize, WearableCacheItem[] CacheItems);
67 public delegate void CachedTextureRequest(IClientAPI remoteClient, int serial, List<CachedTextureRequestArg> cachedTextureRequest); 68 public delegate void CachedTextureRequest(IClientAPI remoteClient, int serial, List<CachedTextureRequestArg> cachedTextureRequest);
68 69
69 public delegate void SetAppearance(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, List<CachedTextureRequestArg> cachedTextureData);
70
71 public delegate void StartAnim(IClientAPI remoteClient, UUID animID); 70 public delegate void StartAnim(IClientAPI remoteClient, UUID animID);
72 71
73 public delegate void StopAnim(IClientAPI remoteClient, UUID animID); 72 public delegate void StopAnim(IClientAPI remoteClient, UUID animID);
74 73
74 public delegate void ChangeAnim(UUID animID, bool addOrRemove, bool sendPack);
75
75 public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children); 76 public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children);
76 77
77 public delegate void DelinkObjects(List<uint> primIds, IClientAPI client); 78 public delegate void DelinkObjects(List<uint> primIds, IClientAPI client);
@@ -132,6 +133,8 @@ namespace OpenSim.Framework
132 133
133 public delegate void UpdateVector(uint localID, Vector3 pos, IClientAPI remoteClient); 134 public delegate void UpdateVector(uint localID, Vector3 pos, IClientAPI remoteClient);
134 135
136 public delegate void ClientChangeObject(uint localID, object data ,IClientAPI remoteClient);
137
135 public delegate void UpdatePrimRotation(uint localID, Quaternion rot, IClientAPI remoteClient); 138 public delegate void UpdatePrimRotation(uint localID, Quaternion rot, IClientAPI remoteClient);
136 139
137 public delegate void UpdatePrimSingleRotation(uint localID, Quaternion rot, IClientAPI remoteClient); 140 public delegate void UpdatePrimSingleRotation(uint localID, Quaternion rot, IClientAPI remoteClient);
@@ -268,6 +271,9 @@ namespace OpenSim.Framework
268 public delegate void MoveInventoryItem( 271 public delegate void MoveInventoryItem(
269 IClientAPI remoteClient, List<InventoryItemBase> items); 272 IClientAPI remoteClient, List<InventoryItemBase> items);
270 273
274 public delegate void MoveItemsAndLeaveCopy(
275 IClientAPI remoteClient, List<InventoryItemBase> items, UUID destFolder);
276
271 public delegate void RemoveInventoryItem( 277 public delegate void RemoveInventoryItem(
272 IClientAPI remoteClient, List<UUID> itemIDs); 278 IClientAPI remoteClient, List<UUID> itemIDs);
273 279
@@ -443,6 +449,7 @@ namespace OpenSim.Framework
443 public delegate void ClassifiedInfoRequest(UUID classifiedID, IClientAPI client); 449 public delegate void ClassifiedInfoRequest(UUID classifiedID, IClientAPI client);
444 public delegate void ClassifiedInfoUpdate(UUID classifiedID, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, Vector3 globalPos, byte classifiedFlags, int price, IClientAPI client); 450 public delegate void ClassifiedInfoUpdate(UUID classifiedID, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, Vector3 globalPos, byte classifiedFlags, int price, IClientAPI client);
445 public delegate void ClassifiedDelete(UUID classifiedID, IClientAPI client); 451 public delegate void ClassifiedDelete(UUID classifiedID, IClientAPI client);
452 public delegate void ClassifiedGodDelete(UUID classifiedID, UUID queryID, IClientAPI client);
446 453
447 public delegate void EventNotificationAddRequest(uint EventID, IClientAPI client); 454 public delegate void EventNotificationAddRequest(uint EventID, IClientAPI client);
448 public delegate void EventNotificationRemoveRequest(uint EventID, IClientAPI client); 455 public delegate void EventNotificationRemoveRequest(uint EventID, IClientAPI client);
@@ -465,9 +472,9 @@ namespace OpenSim.Framework
465 472
466 public delegate void AgentFOV(IClientAPI client, float verticalAngle); 473 public delegate void AgentFOV(IClientAPI client, float verticalAngle);
467 474
468 public delegate void MuteListEntryUpdate(IClientAPI client, UUID MuteID, string Name, int Flags,UUID AgentID); 475 public delegate void MuteListEntryUpdate(IClientAPI client, UUID MuteID, string Name, int type, uint flags);
469 476
470 public delegate void MuteListEntryRemove(IClientAPI client, UUID MuteID, string Name, UUID AgentID); 477 public delegate void MuteListEntryRemove(IClientAPI client, UUID MuteID, string Name);
471 478
472 public delegate void AvatarInterestReply(IClientAPI client,UUID target, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages); 479 public delegate void AvatarInterestReply(IClientAPI client,UUID target, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages);
473 480
@@ -505,6 +512,7 @@ namespace OpenSim.Framework
505 public delegate void SimWideDeletesDelegate(IClientAPI client,UUID agentID, int flags, UUID targetID); 512 public delegate void SimWideDeletesDelegate(IClientAPI client,UUID agentID, int flags, UUID targetID);
506 513
507 public delegate void SendPostcard(IClientAPI client); 514 public delegate void SendPostcard(IClientAPI client);
515 public delegate void ChangeInventoryItemFlags(IClientAPI client, UUID itemID, uint flags);
508 516
509 #endregion 517 #endregion
510 518
@@ -794,6 +802,7 @@ namespace OpenSim.Framework
794 event ObjectDrop OnObjectDrop; 802 event ObjectDrop OnObjectDrop;
795 event StartAnim OnStartAnim; 803 event StartAnim OnStartAnim;
796 event StopAnim OnStopAnim; 804 event StopAnim OnStopAnim;
805 event ChangeAnim OnChangeAnim;
797 event LinkObjects OnLinkObjects; 806 event LinkObjects OnLinkObjects;
798 event DelinkObjects OnDelinkObjects; 807 event DelinkObjects OnDelinkObjects;
799 event RequestMapBlocks OnRequestMapBlocks; 808 event RequestMapBlocks OnRequestMapBlocks;
@@ -860,6 +869,7 @@ namespace OpenSim.Framework
860 event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily; 869 event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
861 event UpdatePrimFlags OnUpdatePrimFlags; 870 event UpdatePrimFlags OnUpdatePrimFlags;
862 event UpdatePrimTexture OnUpdatePrimTexture; 871 event UpdatePrimTexture OnUpdatePrimTexture;
872 event ClientChangeObject onClientChangeObject;
863 event UpdateVector OnUpdatePrimGroupPosition; 873 event UpdateVector OnUpdatePrimGroupPosition;
864 event UpdateVector OnUpdatePrimSinglePosition; 874 event UpdateVector OnUpdatePrimSinglePosition;
865 event UpdatePrimRotation OnUpdatePrimGroupRotation; 875 event UpdatePrimRotation OnUpdatePrimGroupRotation;
@@ -884,6 +894,7 @@ namespace OpenSim.Framework
884 event RequestTaskInventory OnRequestTaskInventory; 894 event RequestTaskInventory OnRequestTaskInventory;
885 event UpdateInventoryItem OnUpdateInventoryItem; 895 event UpdateInventoryItem OnUpdateInventoryItem;
886 event CopyInventoryItem OnCopyInventoryItem; 896 event CopyInventoryItem OnCopyInventoryItem;
897 event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy;
887 event MoveInventoryItem OnMoveInventoryItem; 898 event MoveInventoryItem OnMoveInventoryItem;
888 event RemoveInventoryFolder OnRemoveInventoryFolder; 899 event RemoveInventoryFolder OnRemoveInventoryFolder;
889 event RemoveInventoryItem OnRemoveInventoryItem; 900 event RemoveInventoryItem OnRemoveInventoryItem;
@@ -1002,7 +1013,7 @@ namespace OpenSim.Framework
1002 event ClassifiedInfoRequest OnClassifiedInfoRequest; 1013 event ClassifiedInfoRequest OnClassifiedInfoRequest;
1003 event ClassifiedInfoUpdate OnClassifiedInfoUpdate; 1014 event ClassifiedInfoUpdate OnClassifiedInfoUpdate;
1004 event ClassifiedDelete OnClassifiedDelete; 1015 event ClassifiedDelete OnClassifiedDelete;
1005 event ClassifiedDelete OnClassifiedGodDelete; 1016 event ClassifiedGodDelete OnClassifiedGodDelete;
1006 1017
1007 event EventNotificationAddRequest OnEventNotificationAddRequest; 1018 event EventNotificationAddRequest OnEventNotificationAddRequest;
1008 event EventNotificationRemoveRequest OnEventNotificationRemoveRequest; 1019 event EventNotificationRemoveRequest OnEventNotificationRemoveRequest;
@@ -1041,11 +1052,12 @@ namespace OpenSim.Framework
1041 event GroupVoteHistoryRequest OnGroupVoteHistoryRequest; 1052 event GroupVoteHistoryRequest OnGroupVoteHistoryRequest;
1042 event SimWideDeletesDelegate OnSimWideDeletes; 1053 event SimWideDeletesDelegate OnSimWideDeletes;
1043 event SendPostcard OnSendPostcard; 1054 event SendPostcard OnSendPostcard;
1055 event ChangeInventoryItemFlags OnChangeInventoryItemFlags;
1044 event MuteListEntryUpdate OnUpdateMuteListEntry; 1056 event MuteListEntryUpdate OnUpdateMuteListEntry;
1045 event MuteListEntryRemove OnRemoveMuteListEntry; 1057 event MuteListEntryRemove OnRemoveMuteListEntry;
1046 event GodlikeMessage onGodlikeMessage; 1058 event GodlikeMessage onGodlikeMessage;
1047 event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; 1059 event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
1048 1060 event GenericCall2 OnUpdateThrottles;
1049 /// <summary> 1061 /// <summary>
1050 /// Set the debug level at which packet output should be printed to console. 1062 /// Set the debug level at which packet output should be printed to console.
1051 /// </summary> 1063 /// </summary>
@@ -1066,7 +1078,7 @@ namespace OpenSim.Framework
1066 /// If true, attempts the close without checking active status. You do not want to try this except as a last 1078 /// If true, attempts the close without checking active status. You do not want to try this except as a last
1067 /// ditch attempt where Active == false but the ScenePresence still exists. 1079 /// ditch attempt where Active == false but the ScenePresence still exists.
1068 /// </param> 1080 /// </param>
1069 void Close(bool force); 1081 void Close(bool sendStop, bool force);
1070 1082
1071 void Kick(string message); 1083 void Kick(string message);
1072 1084
@@ -1169,6 +1181,8 @@ namespace OpenSim.Framework
1169 1181
1170 void SetChildAgentThrottle(byte[] throttle); 1182 void SetChildAgentThrottle(byte[] throttle);
1171 1183
1184 void SetAgentThrottleSilent(int throttle, int setting);
1185
1172 void SendAvatarDataImmediate(ISceneEntity avatar); 1186 void SendAvatarDataImmediate(ISceneEntity avatar);
1173 1187
1174 /// <summary> 1188 /// <summary>
@@ -1192,6 +1206,7 @@ namespace OpenSim.Framework
1192 /// </summary> 1206 /// </summary>
1193 /// <param name="Item"></param> 1207 /// <param name="Item"></param>
1194 void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId); 1208 void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId);
1209 void SendInventoryItemCreateUpdate(InventoryItemBase Item, UUID transactionID, uint callbackId);
1195 1210
1196 void SendRemoveInventoryItem(UUID itemID); 1211 void SendRemoveInventoryItem(UUID itemID);
1197 1212
@@ -1211,7 +1226,7 @@ namespace OpenSim.Framework
1211 /// <param name="node"></param> 1226 /// <param name="node"></param>
1212 void SendBulkUpdateInventory(InventoryNodeBase node); 1227 void SendBulkUpdateInventory(InventoryNodeBase node);
1213 1228
1214 void SendXferPacket(ulong xferID, uint packet, byte[] data); 1229 void SendXferPacket(ulong xferID, uint packet, byte[] data, bool isTaskInventory);
1215 1230
1216 void SendAbortXferPacket(ulong xferID); 1231 void SendAbortXferPacket(ulong xferID);
1217 1232
diff --git a/OpenSim/Framework/IImprovedAssetCache.cs b/OpenSim/Framework/IImprovedAssetCache.cs
index 251215a..a0b8b55 100644
--- a/OpenSim/Framework/IImprovedAssetCache.cs
+++ b/OpenSim/Framework/IImprovedAssetCache.cs
@@ -33,6 +33,7 @@ namespace OpenSim.Framework
33 { 33 {
34 void Cache(AssetBase asset); 34 void Cache(AssetBase asset);
35 AssetBase Get(string id); 35 AssetBase Get(string id);
36 bool Check(string id);
36 void Expire(string id); 37 void Expire(string id);
37 void Clear(); 38 void Clear();
38 } 39 }
diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs
index 4f98d7b..7a24d1e 100644
--- a/OpenSim/Framework/ILandObject.cs
+++ b/OpenSim/Framework/ILandObject.cs
@@ -70,6 +70,7 @@ namespace OpenSim.Framework
70 void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client); 70 void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client);
71 bool IsEitherBannedOrRestricted(UUID avatar); 71 bool IsEitherBannedOrRestricted(UUID avatar);
72 bool IsBannedFromLand(UUID avatar); 72 bool IsBannedFromLand(UUID avatar);
73 bool CanBeOnThisLand(UUID avatar, float posHeight);
73 bool IsRestrictedFromLand(UUID avatar); 74 bool IsRestrictedFromLand(UUID avatar);
74 bool IsInLandAccessList(UUID avatar); 75 bool IsInLandAccessList(UUID avatar);
75 void SendLandUpdateToClient(IClientAPI remote_client); 76 void SendLandUpdateToClient(IClientAPI remote_client);
diff --git a/OpenSim/Framework/IMoneyModule.cs b/OpenSim/Framework/IMoneyModule.cs
index 52f3e83..55c9613 100644
--- a/OpenSim/Framework/IMoneyModule.cs
+++ b/OpenSim/Framework/IMoneyModule.cs
@@ -33,7 +33,7 @@ namespace OpenSim.Framework
33 public interface IMoneyModule 33 public interface IMoneyModule
34 { 34 {
35 bool ObjectGiveMoney(UUID objectID, UUID fromID, UUID toID, 35 bool ObjectGiveMoney(UUID objectID, UUID fromID, UUID toID,
36 int amount); 36 int amount, UUID txn, out string reason);
37 37
38 int GetBalance(UUID agentID); 38 int GetBalance(UUID agentID);
39 bool UploadCovered(UUID agentID, int amount); 39 bool UploadCovered(UUID agentID, int amount);
@@ -41,6 +41,7 @@ namespace OpenSim.Framework
41 void ApplyCharge(UUID agentID, int amount, MoneyTransactionType type); 41 void ApplyCharge(UUID agentID, int amount, MoneyTransactionType type);
42 void ApplyCharge(UUID agentID, int amount, MoneyTransactionType type, string extraData); 42 void ApplyCharge(UUID agentID, int amount, MoneyTransactionType type, string extraData);
43 void ApplyUploadCharge(UUID agentID, int amount, string text); 43 void ApplyUploadCharge(UUID agentID, int amount, string text);
44 void MoveMoney(UUID fromUser, UUID toUser, int amount, string text);
44 45
45 int UploadCharge { get; } 46 int UploadCharge { get; }
46 int GroupCreationCharge { get; } 47 int GroupCreationCharge { get; }
diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs
index fc02f33..4dffd3f 100644
--- a/OpenSim/Framework/LandData.cs
+++ b/OpenSim/Framework/LandData.cs
@@ -67,9 +67,9 @@ namespace OpenSim.Framework
67 67
68 private uint _flags = (uint)ParcelFlags.AllowFly | (uint)ParcelFlags.AllowLandmark | 68 private uint _flags = (uint)ParcelFlags.AllowFly | (uint)ParcelFlags.AllowLandmark |
69 (uint)ParcelFlags.AllowAPrimitiveEntry | 69 (uint)ParcelFlags.AllowAPrimitiveEntry |
70 (uint)ParcelFlags.AllowDeedToGroup | (uint)ParcelFlags.AllowTerraform | 70 (uint)ParcelFlags.AllowDeedToGroup |
71 (uint)ParcelFlags.CreateObjects | (uint)ParcelFlags.AllowOtherScripts | 71 (uint)ParcelFlags.CreateObjects | (uint)ParcelFlags.AllowOtherScripts |
72 (uint)ParcelFlags.SoundLocal | (uint)ParcelFlags.AllowVoiceChat; 72 (uint)ParcelFlags.AllowVoiceChat;
73 73
74 private byte _landingType = 0; 74 private byte _landingType = 0;
75 private string _name = "Your Parcel"; 75 private string _name = "Your Parcel";
diff --git a/OpenSim/Framework/LocklessQueue.cs b/OpenSim/Framework/LocklessQueue.cs
index 84f887c..9bd9baf 100644
--- a/OpenSim/Framework/LocklessQueue.cs
+++ b/OpenSim/Framework/LocklessQueue.cs
@@ -29,7 +29,7 @@ using System.Threading;
29 29
30namespace OpenSim.Framework 30namespace OpenSim.Framework
31{ 31{
32 public sealed class LocklessQueue<T> 32 public class LocklessQueue<T>
33 { 33 {
34 private sealed class SingleLinkNode 34 private sealed class SingleLinkNode
35 { 35 {
@@ -41,7 +41,7 @@ namespace OpenSim.Framework
41 SingleLinkNode tail; 41 SingleLinkNode tail;
42 int count; 42 int count;
43 43
44 public int Count { get { return count; } } 44 public virtual int Count { get { return count; } }
45 45
46 public LocklessQueue() 46 public LocklessQueue()
47 { 47 {
@@ -76,7 +76,7 @@ namespace OpenSim.Framework
76 Interlocked.Increment(ref count); 76 Interlocked.Increment(ref count);
77 } 77 }
78 78
79 public bool Dequeue(out T item) 79 public virtual bool Dequeue(out T item)
80 { 80 {
81 item = default(T); 81 item = default(T);
82 SingleLinkNode oldHead = null; 82 SingleLinkNode oldHead = null;
@@ -136,4 +136,4 @@ namespace OpenSim.Framework
136 (object)Interlocked.CompareExchange<SingleLinkNode>(ref location, newValue, comparand); 136 (object)Interlocked.CompareExchange<SingleLinkNode>(ref location, newValue, comparand);
137 } 137 }
138 } 138 }
139} \ No newline at end of file 139}
diff --git a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs
index 20495f6..96536e8 100644
--- a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs
+++ b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs
@@ -43,7 +43,6 @@ namespace OpenSim.Framework.Monitoring
43 StringBuilder sb = new StringBuilder(Environment.NewLine); 43 StringBuilder sb = new StringBuilder(Environment.NewLine);
44 sb.Append("MEMORY STATISTICS"); 44 sb.Append("MEMORY STATISTICS");
45 sb.Append(Environment.NewLine); 45 sb.Append(Environment.NewLine);
46
47 sb.AppendFormat( 46 sb.AppendFormat(
48 "Heap allocated to OpenSim : {0} MB\n", 47 "Heap allocated to OpenSim : {0} MB\n",
49 Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0)); 48 Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0));
@@ -56,9 +55,23 @@ namespace OpenSim.Framework.Monitoring
56 "Average heap allocation rate: {0} MB/s\n", 55 "Average heap allocation rate: {0} MB/s\n",
57 Math.Round((MemoryWatchdog.AverageHeapAllocationRate * 1000) / 1024.0 / 1024, 3)); 56 Math.Round((MemoryWatchdog.AverageHeapAllocationRate * 1000) / 1024.0 / 1024, 3));
58 57
59 sb.AppendFormat( 58 Process myprocess = Process.GetCurrentProcess();
60 "Process memory : {0} MB\n", 59 if (!myprocess.HasExited)
61 Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0)); 60 {
61 myprocess.Refresh();
62 sb.AppendFormat(
63 "Process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n",
64 Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0),
65 Math.Round(Process.GetCurrentProcess().PagedMemorySize64 / 1024.0 / 1024.0),
66 Math.Round(Process.GetCurrentProcess().VirtualMemorySize64 / 1024.0 / 1024.0));
67 sb.AppendFormat(
68 "Peak process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n",
69 Math.Round(Process.GetCurrentProcess().PeakWorkingSet64 / 1024.0 / 1024.0),
70 Math.Round(Process.GetCurrentProcess().PeakPagedMemorySize64 / 1024.0 / 1024.0),
71 Math.Round(Process.GetCurrentProcess().PeakVirtualMemorySize64 / 1024.0 / 1024.0));
72 }
73 else
74 sb.Append("Process reported as Exited \n");
62 75
63 return sb.ToString(); 76 return sb.ToString();
64 } 77 }
diff --git a/OpenSim/Framework/Monitoring/Watchdog.cs b/OpenSim/Framework/Monitoring/Watchdog.cs
index 45762a6..32724ec 100644
--- a/OpenSim/Framework/Monitoring/Watchdog.cs
+++ b/OpenSim/Framework/Monitoring/Watchdog.cs
@@ -386,4 +386,4 @@ namespace OpenSim.Framework.Monitoring
386 m_watchdogTimer.Start(); 386 m_watchdogTimer.Start();
387 } 387 }
388 } 388 }
389} \ No newline at end of file 389}
diff --git a/OpenSim/Framework/OSChatMessage.cs b/OpenSim/Framework/OSChatMessage.cs
index 455756d..7450be2 100644
--- a/OpenSim/Framework/OSChatMessage.cs
+++ b/OpenSim/Framework/OSChatMessage.cs
@@ -51,12 +51,11 @@ namespace OpenSim.Framework
51 protected object m_senderObject; 51 protected object m_senderObject;
52 protected ChatTypeEnum m_type; 52 protected ChatTypeEnum m_type;
53 protected UUID m_fromID; 53 protected UUID m_fromID;
54 protected UUID m_toID; 54 protected UUID m_destination = UUID.Zero;
55 55
56 public OSChatMessage() 56 public OSChatMessage()
57 { 57 {
58 m_position = new Vector3(); 58 m_position = new Vector3();
59 m_toID = UUID.Zero;
60 } 59 }
61 60
62 /// <summary> 61 /// <summary>
@@ -104,15 +103,6 @@ namespace OpenSim.Framework
104 set { m_from = value; } 103 set { m_from = value; }
105 } 104 }
106 105
107 /// <summary>
108 /// The name of the sender (needed for scripts)
109 /// </summary>
110 public string To
111 {
112 get { return m_from; }
113 set { m_from = value; }
114 }
115
116 #region IEventArgs Members 106 #region IEventArgs Members
117 107
118 /// TODO: Sender and SenderObject should just be Sender and of 108 /// TODO: Sender and SenderObject should just be Sender and of
@@ -142,13 +132,10 @@ namespace OpenSim.Framework
142 set { m_fromID = value; } 132 set { m_fromID = value; }
143 } 133 }
144 134
145 /// <summary> 135 public UUID Destination
146 /// The single recipient or all if not set.
147 /// </summary>
148 public UUID TargetUUID
149 { 136 {
150 get { return m_toID; } 137 get { return m_destination; }
151 set { m_toID = value; } 138 set { m_destination = value; }
152 } 139 }
153 140
154 /// <summary> 141 /// <summary>
diff --git a/OpenSim/Framework/ObjectChangeData.cs b/OpenSim/Framework/ObjectChangeData.cs
new file mode 100644
index 0000000..8d56291
--- /dev/null
+++ b/OpenSim/Framework/ObjectChangeData.cs
@@ -0,0 +1,80 @@
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 OpenMetaverse;
29
30namespace OpenSim.Framework
31{
32 public enum ObjectChangeType : uint
33 {
34 // bits definitions
35 Position = 0x01,
36 Rotation = 0x02,
37 Scale = 0x04,
38 Group = 0x08,
39 UniformScale = 0x10,
40
41 // macros from above
42 // single prim
43 primP = 0x01,
44 primR = 0x02,
45 primPR = 0x03,
46 primS = 0x04,
47 primPS = 0x05,
48 primRS = 0x06,
49 primPSR = 0x07,
50
51 primUS = 0x14,
52 primPUS = 0x15,
53 primRUS = 0x16,
54 primPUSR = 0x17,
55
56 // group
57 groupP = 0x09,
58 groupR = 0x0A,
59 groupPR = 0x0B,
60 groupS = 0x0C,
61 groupPS = 0x0D,
62 groupRS = 0x0E,
63 groupPSR = 0x0F,
64
65 groupUS = 0x1C,
66 groupPUS = 0x1D,
67 groupRUS = 0x1E,
68 groupPUSR = 0x1F,
69
70 PRSmask = 0x07
71 }
72
73 public struct ObjectChangeData
74 {
75 public Quaternion rotation;
76 public Vector3 position;
77 public Vector3 scale;
78 public ObjectChangeType change;
79 }
80}
diff --git a/OpenSim/Framework/ParcelMediaCommandEnum.cs b/OpenSim/Framework/ParcelMediaCommandEnum.cs
index 93c41ec..e714382 100644
--- a/OpenSim/Framework/ParcelMediaCommandEnum.cs
+++ b/OpenSim/Framework/ParcelMediaCommandEnum.cs
@@ -27,7 +27,7 @@
27 27
28namespace OpenSim.Framework 28namespace OpenSim.Framework
29{ 29{
30 public enum ParcelMediaCommandEnum 30 public enum ParcelMediaCommandEnum : int
31 { 31 {
32 Stop = 0, 32 Stop = 0,
33 Pause = 1, 33 Pause = 1,
diff --git a/OpenSim/Framework/PluginLoader.cs b/OpenSim/Framework/PluginLoader.cs
index 819cb7b..cc80943 100644
--- a/OpenSim/Framework/PluginLoader.cs
+++ b/OpenSim/Framework/PluginLoader.cs
@@ -244,13 +244,22 @@ namespace OpenSim.Framework
244 // The Mono addin manager (in Mono.Addins.dll version 0.2.0.0) 244 // The Mono addin manager (in Mono.Addins.dll version 0.2.0.0)
245 // occasionally seems to corrupt its addin cache 245 // occasionally seems to corrupt its addin cache
246 // Hence, as a temporary solution we'll remove it before each startup 246 // Hence, as a temporary solution we'll remove it before each startup
247
248 string customDir = Environment.GetEnvironmentVariable ("MONO_ADDINS_REGISTRY");
249 string v0 = "addin-db-000";
250 string v1 = "addin-db-001";
251 if (customDir != null && customDir != String.Empty)
252 {
253 v0 = Path.Combine(customDir, v0);
254 v1 = Path.Combine(customDir, v1);
255 }
247 try 256 try
248 { 257 {
249 if (Directory.Exists("addin-db-000")) 258 if (Directory.Exists(v0))
250 Directory.Delete("addin-db-000", true); 259 Directory.Delete(v0, true);
251 260
252 if (Directory.Exists("addin-db-001")) 261 if (Directory.Exists(v1))
253 Directory.Delete("addin-db-001", true); 262 Directory.Delete(v1, true);
254 } 263 }
255 catch (IOException) 264 catch (IOException)
256 { 265 {
diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs
index c8a5376..6a12a45 100644
--- a/OpenSim/Framework/PrimitiveBaseShape.cs
+++ b/OpenSim/Framework/PrimitiveBaseShape.cs
@@ -728,7 +728,12 @@ namespace OpenSim.Framework
728 return _lightColorR; 728 return _lightColorR;
729 } 729 }
730 set { 730 set {
731 _lightColorR = value; 731 if (value < 0)
732 _lightColorR = 0;
733 else if (value > 1.0f)
734 _lightColorR = 1.0f;
735 else
736 _lightColorR = value;
732 } 737 }
733 } 738 }
734 739
@@ -737,7 +742,12 @@ namespace OpenSim.Framework
737 return _lightColorG; 742 return _lightColorG;
738 } 743 }
739 set { 744 set {
740 _lightColorG = value; 745 if (value < 0)
746 _lightColorG = 0;
747 else if (value > 1.0f)
748 _lightColorG = 1.0f;
749 else
750 _lightColorG = value;
741 } 751 }
742 } 752 }
743 753
@@ -746,7 +756,12 @@ namespace OpenSim.Framework
746 return _lightColorB; 756 return _lightColorB;
747 } 757 }
748 set { 758 set {
749 _lightColorB = value; 759 if (value < 0)
760 _lightColorB = 0;
761 else if (value > 1.0f)
762 _lightColorB = 1.0f;
763 else
764 _lightColorB = value;
750 } 765 }
751 } 766 }
752 767
@@ -755,7 +770,12 @@ namespace OpenSim.Framework
755 return _lightColorA; 770 return _lightColorA;
756 } 771 }
757 set { 772 set {
758 _lightColorA = value; 773 if (value < 0)
774 _lightColorA = 0;
775 else if (value > 1.0f)
776 _lightColorA = 1.0f;
777 else
778 _lightColorA = value;
759 } 779 }
760 } 780 }
761 781
@@ -869,6 +889,11 @@ namespace OpenSim.Framework
869 889
870 public ulong GetMeshKey(Vector3 size, float lod) 890 public ulong GetMeshKey(Vector3 size, float lod)
871 { 891 {
892 return GetMeshKey(size, lod, false);
893 }
894
895 public ulong GetMeshKey(Vector3 size, float lod, bool convex)
896 {
872 ulong hash = 5381; 897 ulong hash = 5381;
873 898
874 hash = djb2(hash, this.PathCurve); 899 hash = djb2(hash, this.PathCurve);
@@ -914,6 +939,9 @@ namespace OpenSim.Framework
914 hash = djb2(hash, scaleBytes[i]); 939 hash = djb2(hash, scaleBytes[i]);
915 } 940 }
916 941
942 if(convex)
943 hash = djb2(hash, 0xa5);
944
917 return hash; 945 return hash;
918 } 946 }
919 947
@@ -1417,7 +1445,7 @@ namespace OpenSim.Framework
1417 prim.Textures = this.Textures; 1445 prim.Textures = this.Textures;
1418 1446
1419 prim.Properties = new Primitive.ObjectProperties(); 1447 prim.Properties = new Primitive.ObjectProperties();
1420 prim.Properties.Name = "Primitive"; 1448 prim.Properties.Name = "Object";
1421 prim.Properties.Description = ""; 1449 prim.Properties.Description = "";
1422 prim.Properties.CreatorID = UUID.Zero; 1450 prim.Properties.CreatorID = UUID.Zero;
1423 prim.Properties.GroupID = UUID.Zero; 1451 prim.Properties.GroupID = UUID.Zero;
diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs
index e7a7f7f..e4f1111 100644
--- a/OpenSim/Framework/PriorityQueue.cs
+++ b/OpenSim/Framework/PriorityQueue.cs
@@ -45,7 +45,8 @@ namespace OpenSim.Framework
45 /// <summary> 45 /// <summary>
46 /// Total number of queues (priorities) available 46 /// Total number of queues (priorities) available
47 /// </summary> 47 /// </summary>
48 public const uint NumberOfQueues = 12; 48
49 public const uint NumberOfQueues = 12; // includes immediate queues, m_queueCounts need to be set acording
49 50
50 /// <summary> 51 /// <summary>
51 /// Number of queuest (priorities) that are processed immediately 52 /// Number of queuest (priorities) that are processed immediately
@@ -60,7 +61,8 @@ namespace OpenSim.Framework
60 // each pass. weighted towards the higher priority queues 61 // each pass. weighted towards the higher priority queues
61 private uint m_nextQueue = 0; 62 private uint m_nextQueue = 0;
62 private uint m_countFromQueue = 0; 63 private uint m_countFromQueue = 0;
63 private uint[] m_queueCounts = { 8, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1 }; 64 // first queues are imediate, so no counts
65 private uint[] m_queueCounts = {0, 0, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1};
64 66
65 // next request is a counter of the number of updates queued, it provides 67 // 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 68 // a total ordering on the updates coming through the queue and is more
@@ -137,7 +139,7 @@ namespace OpenSim.Framework
137 /// </summary> 139 /// </summary>
138 public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue) 140 public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue)
139 { 141 {
140 // If there is anything in priority queue 0, return it first no 142 // If there is anything in imediate queues, return it first no
141 // matter what else. Breaks fairness. But very useful. 143 // matter what else. Breaks fairness. But very useful.
142 for (int iq = 0; iq < NumberOfImmediateQueues; iq++) 144 for (int iq = 0; iq < NumberOfImmediateQueues; iq++)
143 { 145 {
@@ -172,14 +174,13 @@ namespace OpenSim.Framework
172 } 174 }
173 175
174 // Find the next non-immediate queue with updates in it 176 // Find the next non-immediate queue with updates in it
175 for (int i = 0; i < NumberOfQueues; ++i) 177 for (uint i = NumberOfImmediateQueues; i < NumberOfQueues; ++i)
176 { 178 {
177 m_nextQueue = (uint)((m_nextQueue + 1) % NumberOfQueues); 179 m_nextQueue++;
178 m_countFromQueue = m_queueCounts[m_nextQueue]; 180 if(m_nextQueue >= NumberOfQueues)
181 m_nextQueue = NumberOfImmediateQueues;
179 182
180 // if this is one of the immediate queues, just skip it 183 m_countFromQueue = m_queueCounts[m_nextQueue];
181 if (m_nextQueue < NumberOfImmediateQueues)
182 continue;
183 184
184 if (m_heaps[m_nextQueue].Count > 0) 185 if (m_heaps[m_nextQueue].Count > 0)
185 { 186 {
@@ -189,7 +190,6 @@ namespace OpenSim.Framework
189 m_lookupTable.Remove(item.Value.Entity.LocalId); 190 m_lookupTable.Remove(item.Value.Entity.LocalId);
190 timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); 191 timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime);
191 value = item.Value; 192 value = item.Value;
192
193 return true; 193 return true;
194 } 194 }
195 } 195 }
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index 24b9c89..6dde62f 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -40,6 +40,7 @@ using OpenMetaverse.StructuredData;
40 40
41namespace OpenSim.Framework 41namespace OpenSim.Framework
42{ 42{
43 [Serializable]
43 public class RegionLightShareData : ICloneable 44 public class RegionLightShareData : ICloneable
44 { 45 {
45 public bool valid = false; 46 public bool valid = false;
@@ -102,6 +103,7 @@ namespace OpenSim.Framework
102 103
103 public bool commFailTF = false; 104 public bool commFailTF = false;
104 public ConfigurationMember configMember; 105 public ConfigurationMember configMember;
106 public string DataStore = String.Empty;
105 public string RegionFile = String.Empty; 107 public string RegionFile = String.Empty;
106 public bool isSandbox = false; 108 public bool isSandbox = false;
107 public bool Persistent = true; 109 public bool Persistent = true;
@@ -707,6 +709,9 @@ namespace OpenSim.Framework
707 string location = String.Format("{0},{1}", m_regionLocX, m_regionLocY); 709 string location = String.Format("{0},{1}", m_regionLocX, m_regionLocY);
708 config.Set("Location", location); 710 config.Set("Location", location);
709 711
712 if (DataStore != String.Empty)
713 config.Set("Datastore", DataStore);
714
710 config.Set("InternalAddress", m_internalEndPoint.Address.ToString()); 715 config.Set("InternalAddress", m_internalEndPoint.Address.ToString());
711 config.Set("InternalPort", m_internalEndPoint.Port); 716 config.Set("InternalPort", m_internalEndPoint.Port);
712 717
@@ -921,6 +926,9 @@ namespace OpenSim.Framework
921 case "sim_location_y": 926 case "sim_location_y":
922 m_regionLocY = (uint) configuration_result; 927 m_regionLocY = (uint) configuration_result;
923 break; 928 break;
929 case "datastore":
930 DataStore = (string) configuration_result;
931 break;
924 case "internal_ip_address": 932 case "internal_ip_address":
925 IPAddress address = (IPAddress) configuration_result; 933 IPAddress address = (IPAddress) configuration_result;
926 m_internalEndPoint = new IPEndPoint(address, 0); 934 m_internalEndPoint = new IPEndPoint(address, 0);
@@ -1077,6 +1085,11 @@ namespace OpenSim.Framework
1077 return regionInfo; 1085 return regionInfo;
1078 } 1086 }
1079 1087
1088 public int getInternalEndPointPort()
1089 {
1090 return m_internalEndPoint.Port;
1091 }
1092
1080 public Dictionary<string, object> ToKeyValuePairs() 1093 public Dictionary<string, object> ToKeyValuePairs()
1081 { 1094 {
1082 Dictionary<string, object> kvp = new Dictionary<string, object>(); 1095 Dictionary<string, object> kvp = new Dictionary<string, object>();
diff --git a/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs b/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs
index 05c64fa..c7caf6f 100644
--- a/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs
+++ b/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs
@@ -48,6 +48,9 @@ namespace OpenSim.Framework.RegionLoader.Web
48 48
49 public RegionInfo[] LoadRegions() 49 public RegionInfo[] LoadRegions()
50 { 50 {
51 int tries = 3;
52 int wait = 2000;
53
51 if (m_configSource == null) 54 if (m_configSource == null)
52 { 55 {
53 m_log.Error("[WEBLOADER]: Unable to load configuration source!"); 56 m_log.Error("[WEBLOADER]: Unable to load configuration source!");
@@ -66,82 +69,74 @@ namespace OpenSim.Framework.RegionLoader.Web
66 } 69 }
67 else 70 else
68 { 71 {
69 RegionInfo[] regionInfos = new RegionInfo[] {}; 72 while(tries > 0)
70 int regionCount = 0; 73 {
71 HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url); 74 RegionInfo[] regionInfos = new RegionInfo[] {};
72 webRequest.Timeout = 30000; //30 Second Timeout 75 int regionCount = 0;
73 m_log.DebugFormat("[WEBLOADER]: Sending download request to {0}", url); 76 HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url);
74 77 webRequest.Timeout = 30000; //30 Second Timeout
75 try 78 m_log.DebugFormat("[WEBLOADER]: Sending download request to {0}", url);
76 {
77 string xmlSource = String.Empty;
78 79
79 using (HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse()) 80 try
80 { 81 {
81 m_log.Debug("[WEBLOADER]: Downloading region information..."); 82 HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();
83 m_log.Debug("[WEBLOADER]: Downloading region information...");
84 StreamReader reader = new StreamReader(webResponse.GetResponseStream());
85 string xmlSource = String.Empty;
86 string tempStr = reader.ReadLine();
87 while (tempStr != null)
88 {
89 xmlSource = xmlSource + tempStr;
90 tempStr = reader.ReadLine();
91 }
92 m_log.Debug("[WEBLOADER]: Done downloading region information from server. Total Bytes: " +
93 xmlSource.Length);
94 XmlDocument xmlDoc = new XmlDocument();
95 xmlDoc.LoadXml(xmlSource);
96 if (xmlDoc.FirstChild.Name == "Regions")
97 {
98 regionCount = xmlDoc.FirstChild.ChildNodes.Count;
99
100 if (regionCount > 0)
101 {
102 regionInfos = new RegionInfo[regionCount];
103 int i;
104 for (i = 0; i < xmlDoc.FirstChild.ChildNodes.Count; i++)
105 {
106 m_log.Debug(xmlDoc.FirstChild.ChildNodes[i].OuterXml);
107 regionInfos[i] =
108 new RegionInfo("REGION CONFIG #" + (i + 1), xmlDoc.FirstChild.ChildNodes[i],false,m_configSource);
109 }
110 }
111 }
112 }
113 catch (WebException ex)
114 {
115 if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)
116 {
117 if (!allowRegionless)
118 throw ex;
119 }
120 else
121 throw ex;
122 }
82 123
83 using (Stream s = webResponse.GetResponseStream()) 124 if (regionCount > 0 | allowRegionless)
84 { 125 return regionInfos;
85 using (StreamReader reader = new StreamReader(s))
86 {
87 string tempStr = reader.ReadLine();
88 while (tempStr != null)
89 {
90 xmlSource = xmlSource + tempStr;
91 tempStr = reader.ReadLine();
92 }
93 }
94 }
95 }
96 126
97 m_log.Debug("[WEBLOADER]: Done downloading region information from server. Total Bytes: " + 127 m_log.Debug("[WEBLOADER]: Request yielded no regions.");
98 xmlSource.Length); 128 tries--;
99 XmlDocument xmlDoc = new XmlDocument(); 129 if (tries > 0)
100 xmlDoc.LoadXml(xmlSource);
101 if (xmlDoc.FirstChild.Name == "Regions")
102 {
103 regionCount = xmlDoc.FirstChild.ChildNodes.Count;
104
105 if (regionCount > 0)
106 {
107 regionInfos = new RegionInfo[regionCount];
108 int i;
109 for (i = 0; i < xmlDoc.FirstChild.ChildNodes.Count; i++)
110 {
111 m_log.Debug(xmlDoc.FirstChild.ChildNodes[i].OuterXml);
112 regionInfos[i] =
113 new RegionInfo("REGION CONFIG #" + (i + 1), xmlDoc.FirstChild.ChildNodes[i],false,m_configSource);
114 }
115 }
116 }
117 }
118 catch (WebException ex)
119 {
120 using (HttpWebResponse response = (HttpWebResponse)ex.Response)
121 { 130 {
122 if (response.StatusCode == HttpStatusCode.NotFound) 131 m_log.Debug("[WEBLOADER]: Retrying");
123 { 132 System.Threading.Thread.Sleep(wait);
124 if (!allowRegionless)
125 throw ex;
126 }
127 else
128 {
129 throw ex;
130 }
131 } 133 }
132 } 134 }
133 135
134 if (regionCount > 0 | allowRegionless) 136 m_log.Error("[WEBLOADER]: No region configs were available.");
135 { 137 return null;
136 return regionInfos;
137 }
138 else
139 {
140 m_log.Error("[WEBLOADER]: No region configs were available.");
141 return null;
142 }
143 } 138 }
144 } 139 }
145 } 140 }
146 } 141 }
147} \ No newline at end of file 142}
diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs
index db8c53e..2c6529d 100644
--- a/OpenSim/Framework/RegionSettings.cs
+++ b/OpenSim/Framework/RegionSettings.cs
@@ -482,6 +482,28 @@ namespace OpenSim.Framework
482 set { m_LoadedCreationID = value; } 482 set { m_LoadedCreationID = value; }
483 } 483 }
484 484
485 private bool m_GodBlockSearch = false;
486 public bool GodBlockSearch
487 {
488 get { return m_GodBlockSearch; }
489 set { m_GodBlockSearch = value; }
490 }
491
492 private bool m_Casino = false;
493 public bool Casino
494 {
495 get { return m_Casino; }
496 set { m_Casino = value; }
497 }
498
499 // Telehub support
500 private bool m_TelehubEnabled = false;
501 public bool HasTelehub
502 {
503 get { return m_TelehubEnabled; }
504 set { m_TelehubEnabled = value; }
505 }
506
485 // Connected Telehub object 507 // Connected Telehub object
486 private UUID m_TelehubObject = UUID.Zero; 508 private UUID m_TelehubObject = UUID.Zero;
487 public UUID TelehubObject 509 public UUID TelehubObject
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 4ab6908..bfd67c7 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -130,7 +130,17 @@ namespace OpenSim.Framework.Servers
130 /// Performs initialisation of the scene, such as loading configuration from disk. 130 /// Performs initialisation of the scene, such as loading configuration from disk.
131 /// </summary> 131 /// </summary>
132 public virtual void Startup() 132 public virtual void Startup()
133 { 133 {
134 m_log.Info("[STARTUP]: Beginning startup processing");
135
136 m_log.Info("[STARTUP]: Careminster version: " + m_version + Environment.NewLine);
137 // clr version potentially is more confusing than helpful, since it doesn't tell us if we're running under Mono/MS .NET and
138 // the clr version number doesn't match the project version number under Mono.
139 //m_log.Info("[STARTUP]: Virtual machine runtime version: " + Environment.Version + Environment.NewLine);
140 m_log.InfoFormat(
141 "[STARTUP]: Operating system version: {0}, .NET platform {1}, {2}-bit\n",
142 Environment.OSVersion, Environment.OSVersion.Platform, Util.Is64BitProcess() ? "64" : "32");
143
134 StartupSpecific(); 144 StartupSpecific();
135 145
136 TimeSpan timeTaken = DateTime.Now - m_startuptime; 146 TimeSpan timeTaken = DateTime.Now - m_startuptime;
@@ -159,4 +169,4 @@ namespace OpenSim.Framework.Servers
159 } 169 }
160 } 170 }
161 } 171 }
162} \ No newline at end of file 172}
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index e1ae74e..7841f47 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -401,6 +401,7 @@ namespace OpenSim.Framework.Servers.HttpServer
401 StreamReader reader = new StreamReader(requestStream, encoding); 401 StreamReader reader = new StreamReader(requestStream, encoding);
402 402
403 string requestBody = reader.ReadToEnd(); 403 string requestBody = reader.ReadToEnd();
404 reader.Close();
404 405
405 Hashtable keysvals = new Hashtable(); 406 Hashtable keysvals = new Hashtable();
406 Hashtable headervals = new Hashtable(); 407 Hashtable headervals = new Hashtable();
@@ -740,7 +741,7 @@ namespace OpenSim.Framework.Servers.HttpServer
740 // Every month or so this will wrap and give bad numbers, not really a problem 741 // Every month or so this will wrap and give bad numbers, not really a problem
741 // since its just for reporting 742 // since its just for reporting
742 int tickdiff = requestEndTick - requestStartTick; 743 int tickdiff = requestEndTick - requestStartTick;
743 if (tickdiff > 3000 && requestHandler != null && requestHandler.Name != "GetTexture") 744 if (tickdiff > 3000 && (requestHandler == null || requestHandler.Name == null || requestHandler.Name != "GetTexture"))
744 { 745 {
745 m_log.InfoFormat( 746 m_log.InfoFormat(
746 "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} {4} from {5} took {6}ms", 747 "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} {4} from {5} took {6}ms",
@@ -1675,10 +1676,40 @@ namespace OpenSim.Framework.Servers.HttpServer
1675 1676
1676 internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) 1677 internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response)
1677 { 1678 {
1678 //m_log.Info("[BASE HTTP SERVER]: Doing HTTP Grunt work with response"); 1679 int responsecode;
1679 int responsecode = (int)responsedata["int_response_code"]; 1680 string responseString = String.Empty;
1680 string responseString = (string)responsedata["str_response_string"]; 1681 byte[] responseData = null;
1681 string contentType = (string)responsedata["content_type"]; 1682 string contentType;
1683
1684 if (responsedata == null)
1685 {
1686 responsecode = 500;
1687 responseString = "No response could be obtained";
1688 contentType = "text/plain";
1689 responsedata = new Hashtable();
1690 }
1691 else
1692 {
1693 try
1694 {
1695 //m_log.Info("[BASE HTTP SERVER]: Doing HTTP Grunt work with response");
1696 responsecode = (int)responsedata["int_response_code"];
1697 if (responsedata["bin_response_data"] != null)
1698 responseData = (byte[])responsedata["bin_response_data"];
1699 else
1700 responseString = (string)responsedata["str_response_string"];
1701 contentType = (string)responsedata["content_type"];
1702 if (responseString == null)
1703 responseString = String.Empty;
1704 }
1705 catch
1706 {
1707 responsecode = 500;
1708 responseString = "No response could be obtained";
1709 contentType = "text/plain";
1710 responsedata = new Hashtable();
1711 }
1712 }
1682 1713
1683 if (responsedata.ContainsKey("error_status_text")) 1714 if (responsedata.ContainsKey("error_status_text"))
1684 { 1715 {
@@ -1723,25 +1754,40 @@ namespace OpenSim.Framework.Servers.HttpServer
1723 1754
1724 response.AddHeader("Content-Type", contentType); 1755 response.AddHeader("Content-Type", contentType);
1725 1756
1757 if (responsedata.ContainsKey("headers"))
1758 {
1759 Hashtable headerdata = (Hashtable)responsedata["headers"];
1760
1761 foreach (string header in headerdata.Keys)
1762 response.AddHeader(header, (string)headerdata[header]);
1763 }
1764
1726 byte[] buffer; 1765 byte[] buffer;
1727 1766
1728 if (!(contentType.Contains("image") 1767 if (responseData != null)
1729 || contentType.Contains("x-shockwave-flash")
1730 || contentType.Contains("application/x-oar")
1731 || contentType.Contains("application/vnd.ll.mesh")))
1732 { 1768 {
1733 // Text 1769 buffer = responseData;
1734 buffer = Encoding.UTF8.GetBytes(responseString);
1735 } 1770 }
1736 else 1771 else
1737 { 1772 {
1738 // Binary! 1773 if (!(contentType.Contains("image")
1739 buffer = Convert.FromBase64String(responseString); 1774 || contentType.Contains("x-shockwave-flash")
1740 } 1775 || contentType.Contains("application/x-oar")
1776 || contentType.Contains("application/vnd.ll.mesh")))
1777 {
1778 // Text
1779 buffer = Encoding.UTF8.GetBytes(responseString);
1780 }
1781 else
1782 {
1783 // Binary!
1784 buffer = Convert.FromBase64String(responseString);
1785 }
1741 1786
1742 response.SendChunked = false; 1787 response.SendChunked = false;
1743 response.ContentLength64 = buffer.Length; 1788 response.ContentLength64 = buffer.Length;
1744 response.ContentEncoding = Encoding.UTF8; 1789 response.ContentEncoding = Encoding.UTF8;
1790 }
1745 1791
1746 return buffer; 1792 return buffer;
1747 } 1793 }
@@ -1822,7 +1868,7 @@ namespace OpenSim.Framework.Servers.HttpServer
1822 m_httpListener2.Start(64); 1868 m_httpListener2.Start(64);
1823 1869
1824 // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events 1870 // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events
1825 m_PollServiceManager = new PollServiceRequestManager(this, 3, 25000); 1871 m_PollServiceManager = new PollServiceRequestManager(this, 4, 25000);
1826 m_PollServiceManager.Start(); 1872 m_PollServiceManager.Start();
1827 HTTPDRunning = true; 1873 HTTPDRunning = true;
1828 1874
@@ -1872,7 +1918,9 @@ namespace OpenSim.Framework.Servers.HttpServer
1872 1918
1873 public void httpServerException(object source, Exception exception) 1919 public void httpServerException(object source, Exception exception)
1874 { 1920 {
1875 m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1} ", source.ToString(), exception.Message), exception); 1921 if (source.ToString() == "HttpServer.HttpListener" && exception.ToString().StartsWith("Mono.Security.Protocol.Tls.TlsException"))
1922 return;
1923 m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString());
1876 /* 1924 /*
1877 if (HTTPDRunning)// && NotSocketErrors > 5) 1925 if (HTTPDRunning)// && NotSocketErrors > 5)
1878 { 1926 {
@@ -1919,6 +1967,7 @@ namespace OpenSim.Framework.Servers.HttpServer
1919 1967
1920 public void RemoveHTTPHandler(string httpMethod, string path) 1968 public void RemoveHTTPHandler(string httpMethod, string path)
1921 { 1969 {
1970 if (path == null) return; // Caps module isn't loaded, tries to remove handler where path = null
1922 lock (m_HTTPHandlers) 1971 lock (m_HTTPHandlers)
1923 { 1972 {
1924 if (httpMethod != null && httpMethod.Length == 0) 1973 if (httpMethod != null && httpMethod.Length == 0)
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
index 9477100..3fd3bf7 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
@@ -52,7 +52,9 @@ namespace OpenSim.Framework.Servers.HttpServer
52 { 52 {
53 LongPoll = 0, 53 LongPoll = 0,
54 LslHttp = 1, 54 LslHttp = 1,
55 Inventory = 2 55 Inventory = 2,
56 Texture = 3,
57 Mesh = 4
56 } 58 }
57 59
58 public string Url { get; set; } 60 public string Url { get; set; }
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index 6aa5907..44f7045 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -47,17 +47,18 @@ namespace OpenSim.Framework.Servers.HttpServer
47 private readonly BaseHttpServer m_server; 47 private readonly BaseHttpServer m_server;
48 48
49 private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>(); 49 private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>();
50 private static List<PollServiceHttpRequest> m_longPollRequests = new List<PollServiceHttpRequest>(); 50 private static Queue<PollServiceHttpRequest> m_slowRequests = new Queue<PollServiceHttpRequest>();
51 private static Queue<PollServiceHttpRequest> m_retryRequests = new Queue<PollServiceHttpRequest>();
51 52
52 private uint m_WorkerThreadCount = 0; 53 private uint m_WorkerThreadCount = 0;
53 private Thread[] m_workerThreads; 54 private Thread[] m_workerThreads;
55 private Thread m_retrysThread;
54 56
55 private bool m_running = true; 57 private bool m_running = true;
58 private int slowCount = 0;
56 59
57 private SmartThreadPool m_threadPool = new SmartThreadPool(20000, 12, 2); 60 private SmartThreadPool m_threadPool = new SmartThreadPool(20000, 12, 2);
58 61
59// private int m_timeout = 1000; // increase timeout 250; now use the event one
60
61 public PollServiceRequestManager(BaseHttpServer pSrv, uint pWorkerThreadCount, int pTimeout) 62 public PollServiceRequestManager(BaseHttpServer pSrv, uint pWorkerThreadCount, int pTimeout)
62 { 63 {
63 m_server = pSrv; 64 m_server = pSrv;
@@ -81,9 +82,9 @@ namespace OpenSim.Framework.Servers.HttpServer
81 int.MaxValue); 82 int.MaxValue);
82 } 83 }
83 84
84 Watchdog.StartThread( 85 m_retrysThread = Watchdog.StartThread(
85 this.CheckLongPollThreads, 86 this.CheckRetries,
86 string.Format("LongPollServiceWatcherThread:{0}", m_server.Port), 87 string.Format("PollServiceWatcherThread:{0}", m_server.Port),
87 ThreadPriority.Normal, 88 ThreadPriority.Normal,
88 false, 89 false,
89 true, 90 true,
@@ -95,15 +96,8 @@ namespace OpenSim.Framework.Servers.HttpServer
95 { 96 {
96 if (m_running) 97 if (m_running)
97 { 98 {
98 // delay the enqueueing for 100ms. There's no need to have the event 99 lock (m_retryRequests)
99 // actively on the queue 100 m_retryRequests.Enqueue(req);
100 Timer t = new Timer(self => {
101 ((Timer)self).Dispose();
102 m_requests.Enqueue(req);
103 });
104
105 t.Change(100, Timeout.Infinite);
106
107 } 101 }
108 } 102 }
109 103
@@ -111,47 +105,39 @@ namespace OpenSim.Framework.Servers.HttpServer
111 { 105 {
112 if (m_running) 106 if (m_running)
113 { 107 {
114 if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll) 108 if (req.PollServiceArgs.Type != PollServiceEventArgs.EventType.LongPoll)
115 { 109 {
116 lock (m_longPollRequests) 110 m_requests.Enqueue(req);
117 m_longPollRequests.Add(req);
118 } 111 }
119 else 112 else
120 m_requests.Enqueue(req); 113 {
114 lock (m_slowRequests)
115 m_slowRequests.Enqueue(req);
116 }
121 } 117 }
122 } 118 }
123 119
124 private void CheckLongPollThreads() 120 private void CheckRetries()
125 { 121 {
126 // The only purpose of this thread is to check the EQs for events.
127 // If there are events, that thread will be placed in the "ready-to-serve" queue, m_requests.
128 // If there are no events, that thread will be back to its "waiting" queue, m_longPollRequests.
129 // All other types of tasks (Inventory handlers, http-in, etc) don't have the long-poll nature,
130 // so if they aren't ready to be served by a worker thread (no events), they are placed
131 // directly back in the "ready-to-serve" queue by the worker thread.
132 while (m_running) 122 while (m_running)
133 { 123 {
134 Thread.Sleep(500); 124 Thread.Sleep(100); // let the world move .. back to faster rate
135 Watchdog.UpdateThread(); 125 Watchdog.UpdateThread();
136 126 lock (m_retryRequests)
137// List<PollServiceHttpRequest> not_ready = new List<PollServiceHttpRequest>();
138 lock (m_longPollRequests)
139 { 127 {
140 if (m_longPollRequests.Count > 0 && m_running) 128 while (m_retryRequests.Count > 0 && m_running)
141 { 129 m_requests.Enqueue(m_retryRequests.Dequeue());
142 List<PollServiceHttpRequest> ready = m_longPollRequests.FindAll(req => 130 }
143 (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id) || // there are events in this EQ 131 slowCount++;
144 (Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) // no events, but timeout 132 if (slowCount >= 10)
145 ); 133 {
146 134 slowCount = 0;
147 ready.ForEach(req =>
148 {
149 m_requests.Enqueue(req);
150 m_longPollRequests.Remove(req);
151 });
152 135
136 lock (m_slowRequests)
137 {
138 while (m_slowRequests.Count > 0 && m_running)
139 m_requests.Enqueue(m_slowRequests.Dequeue());
153 } 140 }
154
155 } 141 }
156 } 142 }
157 } 143 }
@@ -159,18 +145,30 @@ namespace OpenSim.Framework.Servers.HttpServer
159 public void Stop() 145 public void Stop()
160 { 146 {
161 m_running = false; 147 m_running = false;
162// m_timeout = -10000; // cause all to expire
163 Thread.Sleep(1000); // let the world move 148 Thread.Sleep(1000); // let the world move
164 149
165 foreach (Thread t in m_workerThreads) 150 foreach (Thread t in m_workerThreads)
166 Watchdog.AbortThread(t.ManagedThreadId); 151 Watchdog.AbortThread(t.ManagedThreadId);
167 152
153 try
154 {
155 foreach (PollServiceHttpRequest req in m_retryRequests)
156 {
157 DoHTTPGruntWork(m_server,req,
158 req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
159 }
160 }
161 catch
162 {
163 }
164
168 PollServiceHttpRequest wreq; 165 PollServiceHttpRequest wreq;
166 m_retryRequests.Clear();
169 167
170 lock (m_longPollRequests) 168 lock (m_slowRequests)
171 { 169 {
172 if (m_longPollRequests.Count > 0 && m_running) 170 while (m_slowRequests.Count > 0 && m_running)
173 m_longPollRequests.ForEach(req => m_requests.Enqueue(req)); 171 m_requests.Enqueue(m_slowRequests.Dequeue());
174 } 172 }
175 173
176 while (m_requests.Count() > 0) 174 while (m_requests.Count() > 0)
@@ -178,15 +176,14 @@ namespace OpenSim.Framework.Servers.HttpServer
178 try 176 try
179 { 177 {
180 wreq = m_requests.Dequeue(0); 178 wreq = m_requests.Dequeue(0);
181 wreq.DoHTTPGruntWork( 179 DoHTTPGruntWork(m_server,wreq,
182 m_server, wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id)); 180 wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id));
183 } 181 }
184 catch 182 catch
185 { 183 {
186 } 184 }
187 } 185 }
188 186
189 m_longPollRequests.Clear();
190 m_requests.Clear(); 187 m_requests.Clear();
191 } 188 }
192 189
@@ -197,7 +194,6 @@ namespace OpenSim.Framework.Servers.HttpServer
197 while (m_running) 194 while (m_running)
198 { 195 {
199 PollServiceHttpRequest req = m_requests.Dequeue(5000); 196 PollServiceHttpRequest req = m_requests.Dequeue(5000);
200 //m_log.WarnFormat("[YYY]: Dequeued {0}", (req == null ? "null" : req.PollServiceArgs.Type.ToString()));
201 197
202 Watchdog.UpdateThread(); 198 Watchdog.UpdateThread();
203 if (req != null) 199 if (req != null)
@@ -215,7 +211,7 @@ namespace OpenSim.Framework.Servers.HttpServer
215 { 211 {
216 try 212 try
217 { 213 {
218 req.DoHTTPGruntWork(m_server, responsedata); 214 DoHTTPGruntWork(m_server, req, responsedata);
219 } 215 }
220 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream 216 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
221 { 217 {
@@ -228,7 +224,7 @@ namespace OpenSim.Framework.Servers.HttpServer
228 { 224 {
229 try 225 try
230 { 226 {
231 req.DoHTTPGruntWork(m_server, responsedata); 227 DoHTTPGruntWork(m_server, req, responsedata);
232 } 228 }
233 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream 229 catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
234 { 230 {
@@ -243,8 +239,8 @@ namespace OpenSim.Framework.Servers.HttpServer
243 { 239 {
244 if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) 240 if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms)
245 { 241 {
246 req.DoHTTPGruntWork( 242 DoHTTPGruntWork(m_server, req,
247 m_server, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); 243 req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
248 } 244 }
249 else 245 else
250 { 246 {
@@ -259,5 +255,42 @@ namespace OpenSim.Framework.Servers.HttpServer
259 } 255 }
260 } 256 }
261 } 257 }
258
259 // DoHTTPGruntWork changed, not sending response
260 // do the same work around as core
261
262 internal static void DoHTTPGruntWork(BaseHttpServer server, PollServiceHttpRequest req, Hashtable responsedata)
263 {
264 OSHttpResponse response
265 = new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext);
266
267 byte[] buffer = server.DoHTTPGruntWork(responsedata, response);
268
269 response.SendChunked = false;
270 response.ContentLength64 = buffer.Length;
271 response.ContentEncoding = Encoding.UTF8;
272
273 try
274 {
275 response.OutputStream.Write(buffer, 0, buffer.Length);
276 }
277 catch (Exception ex)
278 {
279 m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex));
280 }
281 finally
282 {
283 try
284 {
285 response.OutputStream.Flush();
286 response.Send();
287 }
288 catch (Exception e)
289 {
290 m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e));
291 }
292 }
293 }
262 } 294 }
263} \ No newline at end of file 295}
296
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index c258ff6..7108314 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -769,7 +769,7 @@ namespace OpenSim.Framework.Servers
769 } 769 }
770 } 770 }
771 771
772 protected string GetVersionText() 772 public string GetVersionText()
773 { 773 {
774 return String.Format("Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion); 774 return String.Format("Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion);
775 } 775 }
@@ -942,4 +942,4 @@ namespace OpenSim.Framework.Servers
942 /// </summary> 942 /// </summary>
943 protected virtual void ShutdownSpecific() {} 943 protected virtual void ShutdownSpecific() {}
944 } 944 }
945} \ No newline at end of file 945}
diff --git a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
index 5b912b4..deae45c 100644
--- a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
+++ b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
@@ -81,6 +81,10 @@ namespace OpenSim.Framework.Servers.Tests
81 /// </summary> 81 /// </summary>
82 public event EventHandler<RequestEventArgs> RequestReceived = delegate { }; 82 public event EventHandler<RequestEventArgs> RequestReceived = delegate { };
83 83
84 public bool CanSend { get { return true; } }
85 public string RemoteEndPoint { get { return ""; } }
86 public string RemoteEndPointAddress { get { return ""; } }
87 public string RemoteEndPointPort { get { return ""; } }
84 } 88 }
85 89
86 public class TestHttpRequest: IHttpRequest 90 public class TestHttpRequest: IHttpRequest
diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs
index 98c19b9..33b1366 100644
--- a/OpenSim/Framework/Servers/VersionInfo.cs
+++ b/OpenSim/Framework/Servers/VersionInfo.cs
@@ -29,11 +29,11 @@ namespace OpenSim
29{ 29{
30 public class VersionInfo 30 public class VersionInfo
31 { 31 {
32 private const string VERSION_NUMBER = "0.8.0"; 32 private const string VERSION_NUMBER = "0.8.0CM";
33 private const Flavour VERSION_FLAVOUR = Flavour.Dev; 33 private const Flavour VERSION_FLAVOUR = Flavour.Dev;
34 34
35 public enum Flavour 35 public enum Flavour
36 { 36 {
37 Unknown, 37 Unknown,
38 Dev, 38 Dev,
39 RC1, 39 RC1,
@@ -50,7 +50,7 @@ namespace OpenSim
50 50
51 public static string GetVersionString(string versionNumber, Flavour flavour) 51 public static string GetVersionString(string versionNumber, Flavour flavour)
52 { 52 {
53 string versionString = "OpenSim " + versionNumber + " " + flavour; 53 string versionString = "Careminster " + versionNumber + " " + flavour;
54 return versionString.PadRight(VERSIONINFO_VERSION_LENGTH); 54 return versionString.PadRight(VERSIONINFO_VERSION_LENGTH);
55 } 55 }
56 56
diff --git a/OpenSim/Framework/TaskInventoryDictionary.cs b/OpenSim/Framework/TaskInventoryDictionary.cs
index 8af2c41..62ecbd1 100644
--- a/OpenSim/Framework/TaskInventoryDictionary.cs
+++ b/OpenSim/Framework/TaskInventoryDictionary.cs
@@ -27,9 +27,13 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Threading;
31using System.Reflection;
30using System.Xml; 32using System.Xml;
33using System.Diagnostics;
31using System.Xml.Schema; 34using System.Xml.Schema;
32using System.Xml.Serialization; 35using System.Xml.Serialization;
36using log4net;
33using OpenMetaverse; 37using OpenMetaverse;
34 38
35namespace OpenSim.Framework 39namespace OpenSim.Framework
@@ -47,6 +51,180 @@ namespace OpenSim.Framework
47 // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48 52
49 private static XmlSerializer tiiSerializer = new XmlSerializer(typeof (TaskInventoryItem)); 53 private static XmlSerializer tiiSerializer = new XmlSerializer(typeof (TaskInventoryItem));
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55
56 private Thread LockedByThread;
57// private string WriterStack;
58
59// private Dictionary<Thread, string> ReadLockers =
60// new Dictionary<Thread, string>();
61
62 /// <value>
63 /// An advanced lock for inventory data
64 /// </value>
65 private System.Threading.ReaderWriterLockSlim m_itemLock = new System.Threading.ReaderWriterLockSlim();
66
67 /// <summary>
68 /// Are we readlocked by the calling thread?
69 /// </summary>
70 public bool IsReadLockedByMe()
71 {
72 if (m_itemLock.RecursiveReadCount > 0)
73 {
74 return true;
75 }
76 else
77 {
78 return false;
79 }
80 }
81
82 /// <summary>
83 /// Lock our inventory list for reading (many can read, one can write)
84 /// </summary>
85 public void LockItemsForRead(bool locked)
86 {
87 if (locked)
88 {
89 if (m_itemLock.IsWriteLockHeld && LockedByThread != null)
90 {
91 if (!LockedByThread.IsAlive)
92 {
93 //Locked by dead thread, reset.
94 m_itemLock = new System.Threading.ReaderWriterLockSlim();
95 }
96 }
97
98 if (m_itemLock.RecursiveReadCount > 0)
99 {
100 m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
101 try
102 {
103 // That call stack is useful for end users only. RealProgrammers need a full dump. Commented.
104 // StackTrace stackTrace = new StackTrace(); // get call stack
105 // StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames)
106 //
107 // // write call stack method names
108 // foreach (StackFrame stackFrame in stackFrames)
109 // {
110 // m_log.Error("[SceneObjectGroup.m_parts] "+(stackFrame.GetMethod().Name)); // write method name
111 // }
112
113 // The below is far more useful
114// System.Console.WriteLine("------------------------------------------");
115// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace);
116// System.Console.WriteLine("------------------------------------------");
117// foreach (KeyValuePair<Thread, string> kvp in ReadLockers)
118// {
119// System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name);
120// System.Console.WriteLine("------------------------------------------");
121// }
122 }
123 catch
124 {}
125 m_itemLock.ExitReadLock();
126 }
127 if (m_itemLock.RecursiveWriteCount > 0)
128 {
129 m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed.");
130// try
131// {
132// System.Console.WriteLine("------------------------------------------");
133// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace);
134// System.Console.WriteLine("------------------------------------------");
135// System.Console.WriteLine("Locker's call stack:\n" + WriterStack);
136// System.Console.WriteLine("------------------------------------------");
137// }
138// catch
139// {}
140 m_itemLock.ExitWriteLock();
141 }
142
143 while (!m_itemLock.TryEnterReadLock(60000))
144 {
145 m_log.Error("Thread lock detected while trying to aquire READ lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
146 if (m_itemLock.IsWriteLockHeld)
147 {
148 m_itemLock = new System.Threading.ReaderWriterLockSlim();
149// System.Console.WriteLine("------------------------------------------");
150// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace);
151// System.Console.WriteLine("------------------------------------------");
152// System.Console.WriteLine("Locker's call stack:\n" + WriterStack);
153// System.Console.WriteLine("------------------------------------------");
154// LockedByThread = null;
155// ReadLockers.Clear();
156 }
157 }
158// ReadLockers[Thread.CurrentThread] = Environment.StackTrace;
159 }
160 else
161 {
162 if (m_itemLock.RecursiveReadCount>0)
163 {
164 m_itemLock.ExitReadLock();
165 }
166// if (m_itemLock.RecursiveReadCount == 0)
167// ReadLockers.Remove(Thread.CurrentThread);
168 }
169 }
170
171 /// <summary>
172 /// Lock our inventory list for writing (many can read, one can write)
173 /// </summary>
174 public void LockItemsForWrite(bool locked)
175 {
176 if (locked)
177 {
178 //Enter a write lock, wait indefinately for one to open.
179 if (m_itemLock.RecursiveReadCount > 0)
180 {
181 m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
182 m_itemLock.ExitReadLock();
183 }
184 if (m_itemLock.RecursiveWriteCount > 0)
185 {
186 m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed.");
187
188 m_itemLock.ExitWriteLock();
189 }
190 while (!m_itemLock.TryEnterWriteLock(60000))
191 {
192 if (m_itemLock.IsWriteLockHeld)
193 {
194 m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
195// System.Console.WriteLine("------------------------------------------");
196// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace);
197// System.Console.WriteLine("------------------------------------------");
198// System.Console.WriteLine("Locker's call stack:\n" + WriterStack);
199// System.Console.WriteLine("------------------------------------------");
200 }
201 else
202 {
203 m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by a reader. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
204// System.Console.WriteLine("------------------------------------------");
205// System.Console.WriteLine("My call stack:\n" + Environment.StackTrace);
206// System.Console.WriteLine("------------------------------------------");
207// foreach (KeyValuePair<Thread, string> kvp in ReadLockers)
208// {
209// System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name);
210// System.Console.WriteLine("------------------------------------------");
211// }
212 }
213 m_itemLock = new System.Threading.ReaderWriterLockSlim();
214// ReadLockers.Clear();
215 }
216
217 LockedByThread = Thread.CurrentThread;
218// WriterStack = Environment.StackTrace;
219 }
220 else
221 {
222 if (m_itemLock.RecursiveWriteCount > 0)
223 {
224 m_itemLock.ExitWriteLock();
225 }
226 }
227 }
50 228
51 #region ICloneable Members 229 #region ICloneable Members
52 230
@@ -54,14 +232,13 @@ namespace OpenSim.Framework
54 { 232 {
55 TaskInventoryDictionary clone = new TaskInventoryDictionary(); 233 TaskInventoryDictionary clone = new TaskInventoryDictionary();
56 234
57 lock (this) 235 m_itemLock.EnterReadLock();
236 foreach (UUID uuid in Keys)
58 { 237 {
59 foreach (UUID uuid in Keys) 238 clone.Add(uuid, (TaskInventoryItem) this[uuid].Clone());
60 {
61 clone.Add(uuid, (TaskInventoryItem) this[uuid].Clone());
62 }
63 } 239 }
64 240 m_itemLock.ExitReadLock();
241
65 return clone; 242 return clone;
66 } 243 }
67 244
diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs
index 307cb75..2ec4bd1 100644
--- a/OpenSim/Framework/TaskInventoryItem.cs
+++ b/OpenSim/Framework/TaskInventoryItem.cs
@@ -72,7 +72,7 @@ namespace OpenSim.Framework
72 private UUID _loadedID = UUID.Zero; 72 private UUID _loadedID = UUID.Zero;
73 73
74 private bool _ownerChanged = false; 74 private bool _ownerChanged = false;
75 75
76 public UUID AssetID { 76 public UUID AssetID {
77 get { 77 get {
78 return _assetID; 78 return _assetID;
diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
index 3f0a031..08f2af5 100644
--- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
+++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
@@ -218,12 +218,12 @@ namespace OpenSim.Framework.Tests
218 BannedHostNameMask = string.Empty, 218 BannedHostNameMask = string.Empty,
219 BannedUserID = bannedUserId} 219 BannedUserID = bannedUserId}
220 ); 220 );
221 Assert.IsTrue(es.IsBanned(bannedUserId), "User Should be banned but is not."); 221 Assert.IsTrue(es.IsBanned(bannedUserId, 32), "User Should be banned but is not.");
222 Assert.IsFalse(es.IsBanned(UUID.Zero), "User Should not be banned but is."); 222 Assert.IsFalse(es.IsBanned(UUID.Zero, 32), "User Should not be banned but is.");
223 223
224 es.RemoveBan(bannedUserId); 224 es.RemoveBan(bannedUserId);
225 225
226 Assert.IsFalse(es.IsBanned(bannedUserId), "User Should not be banned but is."); 226 Assert.IsFalse(es.IsBanned(bannedUserId, 32), "User Should not be banned but is.");
227 227
228 es.AddEstateManager(UUID.Zero); 228 es.AddEstateManager(UUID.Zero);
229 229
diff --git a/OpenSim/Framework/ThrottleOutPacketType.cs b/OpenSim/Framework/ThrottleOutPacketType.cs
index ca4b126..87899f0 100644
--- a/OpenSim/Framework/ThrottleOutPacketType.cs
+++ b/OpenSim/Framework/ThrottleOutPacketType.cs
@@ -47,6 +47,8 @@ namespace OpenSim.Framework
47 Texture = 5, 47 Texture = 5,
48 /// <summary>Non-texture assets</summary> 48 /// <summary>Non-texture assets</summary>
49 Asset = 6, 49 Asset = 6,
50
51 HighPriority = 128,
50 } 52 }
51 53
52 [Flags] 54 [Flags]
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index e8dfec1..7db575b 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -540,19 +540,25 @@ namespace OpenSim.Framework
540 /// </summary> 540 /// </summary>
541 /// <param name="data"></param> 541 /// <param name="data"></param>
542 /// <returns></returns> 542 /// <returns></returns>
543
543 public static string Md5Hash(string data) 544 public static string Md5Hash(string data)
544 { 545 {
545 byte[] dataMd5 = ComputeMD5Hash(data); 546 return Md5Hash(data, Encoding.Default);
547 }
548
549 public static string Md5Hash(string data, Encoding encoding)
550 {
551 byte[] dataMd5 = ComputeMD5Hash(data, encoding);
546 StringBuilder sb = new StringBuilder(); 552 StringBuilder sb = new StringBuilder();
547 for (int i = 0; i < dataMd5.Length; i++) 553 for (int i = 0; i < dataMd5.Length; i++)
548 sb.AppendFormat("{0:x2}", dataMd5[i]); 554 sb.AppendFormat("{0:x2}", dataMd5[i]);
549 return sb.ToString(); 555 return sb.ToString();
550 } 556 }
551 557
552 private static byte[] ComputeMD5Hash(string data) 558 private static byte[] ComputeMD5Hash(string data, Encoding encoding)
553 { 559 {
554 MD5 md5 = MD5.Create(); 560 MD5 md5 = MD5.Create();
555 return md5.ComputeHash(Encoding.Default.GetBytes(data)); 561 return md5.ComputeHash(encoding.GetBytes(data));
556 } 562 }
557 563
558 /// <summary> 564 /// <summary>
@@ -560,6 +566,12 @@ namespace OpenSim.Framework
560 /// </summary> 566 /// </summary>
561 /// <param name="data"></param> 567 /// <param name="data"></param>
562 /// <returns></returns> 568 /// <returns></returns>
569
570 public static string SHA1Hash(string data, Encoding enc)
571 {
572 return SHA1Hash(enc.GetBytes(data));
573 }
574
563 public static string SHA1Hash(string data) 575 public static string SHA1Hash(string data)
564 { 576 {
565 return SHA1Hash(Encoding.Default.GetBytes(data)); 577 return SHA1Hash(Encoding.Default.GetBytes(data));
@@ -1301,19 +1313,19 @@ namespace OpenSim.Framework
1301 { 1313 {
1302 string os = String.Empty; 1314 string os = String.Empty;
1303 1315
1304 if (Environment.OSVersion.Platform != PlatformID.Unix) 1316// if (Environment.OSVersion.Platform != PlatformID.Unix)
1305 { 1317// {
1306 os = Environment.OSVersion.ToString(); 1318// os = Environment.OSVersion.ToString();
1307 } 1319// }
1308 else 1320// else
1309 { 1321// {
1310 os = ReadEtcIssue(); 1322// os = ReadEtcIssue();
1311 } 1323// }
1312 1324//
1313 if (os.Length > 45) 1325// if (os.Length > 45)
1314 { 1326// {
1315 os = os.Substring(0, 45); 1327// os = os.Substring(0, 45);
1316 } 1328// }
1317 1329
1318 return os; 1330 return os;
1319 } 1331 }
@@ -1445,7 +1457,7 @@ namespace OpenSim.Framework
1445 1457
1446 public static Guid GetHashGuid(string data, string salt) 1458 public static Guid GetHashGuid(string data, string salt)
1447 { 1459 {
1448 byte[] hash = ComputeMD5Hash(data + salt); 1460 byte[] hash = ComputeMD5Hash(data + salt, Encoding.Default);
1449 1461
1450 //string s = BitConverter.ToString(hash); 1462 //string s = BitConverter.ToString(hash);
1451 1463
diff --git a/OpenSim/Framework/WearableCacheItem.cs b/OpenSim/Framework/WearableCacheItem.cs
new file mode 100644
index 0000000..1aecf79
--- /dev/null
+++ b/OpenSim/Framework/WearableCacheItem.cs
@@ -0,0 +1,157 @@
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 OpenMetaverse;
31using OpenMetaverse.StructuredData;
32
33namespace OpenSim.Framework
34{
35 [Serializable]
36 public class WearableCacheItem
37 {
38 public uint TextureIndex { get; set; }
39 public UUID CacheId { get; set; }
40 public UUID TextureID { get; set; }
41 public AssetBase TextureAsset { get; set; }
42
43
44 public static WearableCacheItem[] GetDefaultCacheItem()
45 {
46 int itemmax = 21;
47 WearableCacheItem[] retitems = new WearableCacheItem[itemmax];
48 for (uint i=0;i<itemmax;i++)
49 retitems[i] = new WearableCacheItem() {CacheId = UUID.Zero, TextureID = UUID.Zero, TextureIndex = i + 1};
50 return retitems;
51 }
52 public static WearableCacheItem[] FromOSD(OSD pInput, IImprovedAssetCache dataCache)
53 {
54 List<WearableCacheItem> ret = new List<WearableCacheItem>();
55 if (pInput.Type == OSDType.Array)
56 {
57 OSDArray itemarray = (OSDArray) pInput;
58 foreach (OSDMap item in itemarray)
59 {
60 ret.Add(new WearableCacheItem()
61 {
62 TextureIndex = item["textureindex"].AsUInteger(),
63 CacheId = item["cacheid"].AsUUID(),
64 TextureID = item["textureid"].AsUUID()
65 });
66
67 if (dataCache != null && item.ContainsKey("assetdata"))
68 {
69 AssetBase asset = new AssetBase(item["textureid"].AsUUID(),"BakedTexture",(sbyte)AssetType.Texture,UUID.Zero.ToString());
70 asset.Temporary = true;
71 asset.Data = item["assetdata"].AsBinary();
72 dataCache.Cache(asset);
73 }
74 }
75 }
76 else if (pInput.Type == OSDType.Map)
77 {
78 OSDMap item = (OSDMap) pInput;
79 ret.Add(new WearableCacheItem(){
80 TextureIndex = item["textureindex"].AsUInteger(),
81 CacheId = item["cacheid"].AsUUID(),
82 TextureID = item["textureid"].AsUUID()
83 });
84 if (dataCache != null && item.ContainsKey("assetdata"))
85 {
86 string assetCreator = item["assetcreator"].AsString();
87 string assetName = item["assetname"].AsString();
88 AssetBase asset = new AssetBase(item["textureid"].AsUUID(), assetName, (sbyte)AssetType.Texture, assetCreator);
89 asset.Temporary = true;
90 asset.Data = item["assetdata"].AsBinary();
91 dataCache.Cache(asset);
92 }
93 }
94 else
95 {
96 return new WearableCacheItem[0];
97 }
98 return ret.ToArray();
99
100 }
101 public static OSD ToOSD(WearableCacheItem[] pcacheItems, IImprovedAssetCache dataCache)
102 {
103 OSDArray arr = new OSDArray();
104 foreach (WearableCacheItem item in pcacheItems)
105 {
106 OSDMap itemmap = new OSDMap();
107 itemmap.Add("textureindex", OSD.FromUInteger(item.TextureIndex));
108 itemmap.Add("cacheid", OSD.FromUUID(item.CacheId));
109 itemmap.Add("textureid", OSD.FromUUID(item.TextureID));
110 if (dataCache != null)
111 {
112 if (dataCache.Check(item.TextureID.ToString()))
113 {
114 AssetBase assetItem = dataCache.Get(item.TextureID.ToString());
115 if (assetItem != null)
116 {
117 itemmap.Add("assetdata", OSD.FromBinary(assetItem.Data));
118 itemmap.Add("assetcreator", OSD.FromString(assetItem.CreatorID));
119 itemmap.Add("assetname", OSD.FromString(assetItem.Name));
120 }
121 }
122 }
123 arr.Add(itemmap);
124 }
125 return arr;
126 }
127 public static WearableCacheItem SearchTextureIndex(uint pTextureIndex,WearableCacheItem[] pcacheItems)
128 {
129 for (int i = 0; i < pcacheItems.Length; i++)
130 {
131 if (pcacheItems[i].TextureIndex == pTextureIndex)
132 return pcacheItems[i];
133 }
134 return null;
135 }
136 public static WearableCacheItem SearchTextureCacheId(UUID pCacheId, WearableCacheItem[] pcacheItems)
137 {
138 for (int i = 0; i < pcacheItems.Length; i++)
139 {
140 if (pcacheItems[i].CacheId == pCacheId)
141 return pcacheItems[i];
142 }
143 return null;
144 }
145 public static WearableCacheItem SearchTextureTextureId(UUID pTextureId, WearableCacheItem[] pcacheItems)
146 {
147 for (int i = 0; i < pcacheItems.Length; i++)
148 {
149 if (pcacheItems[i].TextureID == pTextureId)
150 return pcacheItems[i];
151 }
152 return null;
153 }
154 }
155
156
157}
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index bcf6af8..33ef8e0 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -284,6 +284,7 @@ namespace OpenSim.Framework
284 catch (Exception ex) 284 catch (Exception ex)
285 { 285 {
286 errorMessage = ex.Message; 286 errorMessage = ex.Message;
287 m_log.Debug("[WEB UTIL]: Exception making request: " + ex.ToString());
287 } 288 }
288 finally 289 finally
289 { 290 {
@@ -367,7 +368,7 @@ namespace OpenSim.Framework
367 /// </summary> 368 /// </summary>
368 public static OSDMap PostToService(string url, NameValueCollection data) 369 public static OSDMap PostToService(string url, NameValueCollection data)
369 { 370 {
370 return ServiceFormRequest(url,data,10000); 371 return ServiceFormRequest(url,data, 20000);
371 } 372 }
372 373
373 public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout) 374 public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout)
@@ -785,7 +786,8 @@ namespace OpenSim.Framework
785 reqnum, verb, requestUrl); 786 reqnum, verb, requestUrl);
786 787
787 int tickstart = Util.EnvironmentTickCount(); 788 int tickstart = Util.EnvironmentTickCount();
788 int tickdata = 0; 789// int tickdata = 0;
790 int tickdiff = 0;
789 791
790 Type type = typeof(TRequest); 792 Type type = typeof(TRequest);
791 793
@@ -831,8 +833,8 @@ namespace OpenSim.Framework
831 requestStream.Close(); 833 requestStream.Close();
832 834
833 // capture how much time was spent writing 835 // capture how much time was spent writing
834 tickdata = Util.EnvironmentTickCountSubtract(tickstart); 836 // useless in this async
835 837// tickdata = Util.EnvironmentTickCountSubtract(tickstart);
836 request.BeginGetResponse(delegate(IAsyncResult ar) 838 request.BeginGetResponse(delegate(IAsyncResult ar)
837 { 839 {
838 response = request.EndGetResponse(ar); 840 response = request.EndGetResponse(ar);
@@ -849,7 +851,8 @@ namespace OpenSim.Framework
849 finally 851 finally
850 { 852 {
851 // Let's not close this 853 // Let's not close this
852 //buffer.Close(); 854 // yes do close it
855 buffer.Close();
853 respStream.Close(); 856 respStream.Close();
854 response.Close(); 857 response.Close();
855 } 858 }
@@ -918,7 +921,6 @@ namespace OpenSim.Framework
918 } 921 }
919 922
920 // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); 923 // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString());
921
922 try 924 try
923 { 925 {
924 action(deserial); 926 action(deserial);
@@ -933,9 +935,10 @@ namespace OpenSim.Framework
933 }, null); 935 }, null);
934 } 936 }
935 937
936 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); 938 tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
937 if (tickdiff > WebUtil.LongCallTime) 939 if (tickdiff > WebUtil.LongCallTime)
938 { 940 {
941/*
939 string originalRequest = null; 942 string originalRequest = null;
940 943
941 if (buffer != null) 944 if (buffer != null)
@@ -954,12 +957,19 @@ namespace OpenSim.Framework
954 tickdiff, 957 tickdiff,
955 tickdata, 958 tickdata,
956 originalRequest); 959 originalRequest);
960*/
961 m_log.InfoFormat(
962 "[ASYNC REQUEST]: Slow WebRequest SETUP <{0}> {1} {2} took {3}ms",
963 reqnum,
964 verb,
965 requestUrl,
966 tickdiff);
957 } 967 }
958 else if (WebUtil.DebugLevel >= 4) 968 else if (WebUtil.DebugLevel >= 4)
959 { 969 {
960 m_log.DebugFormat( 970 m_log.DebugFormat(
961 "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", 971 "[WEB UTIL]: HTTP OUT {0} took {1}ms",
962 reqnum, tickdiff, tickdata); 972 reqnum, tickdiff);
963 } 973 }
964 } 974 }
965 } 975 }
@@ -997,6 +1007,8 @@ namespace OpenSim.Framework
997 request.Timeout = timeoutsecs * 1000; 1007 request.Timeout = timeoutsecs * 1000;
998 string respstring = String.Empty; 1008 string respstring = String.Empty;
999 1009
1010 int tickset = Util.EnvironmentTickCountSubtract(tickstart);
1011
1000 using (MemoryStream buffer = new MemoryStream()) 1012 using (MemoryStream buffer = new MemoryStream())
1001 { 1013 {
1002 if ((verb == "POST") || (verb == "PUT")) 1014 if ((verb == "POST") || (verb == "PUT"))
@@ -1079,6 +1091,7 @@ namespace OpenSim.Framework
1079 verb, 1091 verb,
1080 requestUrl, 1092 requestUrl,
1081 tickdiff, 1093 tickdiff,
1094 tickset,
1082 tickdata, 1095 tickdata,
1083 obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); 1096 obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj);
1084 else if (WebUtil.DebugLevel >= 4) 1097 else if (WebUtil.DebugLevel >= 4)
@@ -1142,6 +1155,8 @@ namespace OpenSim.Framework
1142 ht.ServicePoint.ConnectionLimit = maxConnections; 1155 ht.ServicePoint.ConnectionLimit = maxConnections;
1143 1156
1144 request.Method = verb; 1157 request.Method = verb;
1158 if (pTimeout != 0)
1159 request.Timeout = pTimeout * 1000;
1145 MemoryStream buffer = null; 1160 MemoryStream buffer = null;
1146 1161
1147 if ((verb == "POST") || (verb == "PUT")) 1162 if ((verb == "POST") || (verb == "PUT"))