diff options
Diffstat (limited to 'OpenSim/Framework')
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 | ||
30 | namespace OpenSim.Framework | 30 | namespace 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 | |||
28 | using OpenMetaverse; | ||
29 | |||
30 | namespace 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 | ||
28 | namespace OpenSim.Framework | 28 | namespace 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 | ||
41 | namespace OpenSim.Framework | 41 | namespace 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 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Threading; | ||
31 | using System.Reflection; | ||
30 | using System.Xml; | 32 | using System.Xml; |
33 | using System.Diagnostics; | ||
31 | using System.Xml.Schema; | 34 | using System.Xml.Schema; |
32 | using System.Xml.Serialization; | 35 | using System.Xml.Serialization; |
36 | using log4net; | ||
33 | using OpenMetaverse; | 37 | using OpenMetaverse; |
34 | 38 | ||
35 | namespace OpenSim.Framework | 39 | namespace 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 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using OpenMetaverse; | ||
31 | using OpenMetaverse.StructuredData; | ||
32 | |||
33 | namespace 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")) |