diff options
Diffstat (limited to 'OpenSim/Framework')
55 files changed, 3002 insertions, 1031 deletions
diff --git a/OpenSim/Framework/AssemblyInfo.cs b/OpenSim/Framework/AssemblyInfo.cs index adeaeb2..02986d5 100644 --- a/OpenSim/Framework/AssemblyInfo.cs +++ b/OpenSim/Framework/AssemblyInfo.cs | |||
@@ -59,5 +59,5 @@ using System.Runtime.InteropServices; | |||
59 | // Revision | 59 | // Revision |
60 | // | 60 | // |
61 | 61 | ||
62 | [assembly : AssemblyVersion("0.6.5.*")] | 62 | [assembly : AssemblyVersion("0.7.5.*")] |
63 | [assembly : AssemblyFileVersion("0.6.5.0")] \ No newline at end of file | 63 | [assembly : AssemblyFileVersion("0.6.5.0")] \ No newline at end of file |
diff --git a/OpenSim/Framework/AssetLoader/Filesystem/Properties/AssemblyInfo.cs b/OpenSim/Framework/AssetLoader/Filesystem/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0498ed4 --- /dev/null +++ b/OpenSim/Framework/AssetLoader/Filesystem/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.AssetLoader.Filesystem")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("8cb9cf69-4771-4d3a-a2ba-bac7230de326")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/AssetPermissions.cs b/OpenSim/Framework/AssetPermissions.cs new file mode 100644 index 0000000..4a905c2 --- /dev/null +++ b/OpenSim/Framework/AssetPermissions.cs | |||
@@ -0,0 +1,84 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Reflection; | ||
4 | |||
5 | using Nini.Config; | ||
6 | using log4net; | ||
7 | |||
8 | using OpenMetaverse; | ||
9 | |||
10 | namespace OpenSim.Framework | ||
11 | { | ||
12 | public class AssetPermissions | ||
13 | { | ||
14 | private static readonly ILog m_log = | ||
15 | LogManager.GetLogger( | ||
16 | MethodBase.GetCurrentMethod().DeclaringType); | ||
17 | |||
18 | private bool[] m_DisallowExport, m_DisallowImport; | ||
19 | private string[] m_AssetTypeNames; | ||
20 | |||
21 | public AssetPermissions(IConfig config) | ||
22 | { | ||
23 | Type enumType = typeof(AssetType); | ||
24 | m_AssetTypeNames = Enum.GetNames(enumType); | ||
25 | for (int i = 0; i < m_AssetTypeNames.Length; i++) | ||
26 | m_AssetTypeNames[i] = m_AssetTypeNames[i].ToLower(); | ||
27 | int n = Enum.GetValues(enumType).Length; | ||
28 | m_DisallowExport = new bool[n]; | ||
29 | m_DisallowImport = new bool[n]; | ||
30 | |||
31 | LoadPermsFromConfig(config, "DisallowExport", m_DisallowExport); | ||
32 | LoadPermsFromConfig(config, "DisallowImport", m_DisallowImport); | ||
33 | |||
34 | } | ||
35 | |||
36 | private void LoadPermsFromConfig(IConfig assetConfig, string variable, bool[] bitArray) | ||
37 | { | ||
38 | if (assetConfig == null) | ||
39 | return; | ||
40 | |||
41 | string perms = assetConfig.GetString(variable, String.Empty); | ||
42 | string[] parts = perms.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); | ||
43 | foreach (string s in parts) | ||
44 | { | ||
45 | int index = Array.IndexOf(m_AssetTypeNames, s.Trim().ToLower()); | ||
46 | if (index >= 0) | ||
47 | bitArray[index] = true; | ||
48 | else | ||
49 | m_log.WarnFormat("[Asset Permissions]: Invalid AssetType {0}", s); | ||
50 | } | ||
51 | |||
52 | } | ||
53 | |||
54 | public bool AllowedExport(sbyte type) | ||
55 | { | ||
56 | string assetTypeName = ((AssetType)type).ToString(); | ||
57 | |||
58 | int index = Array.IndexOf(m_AssetTypeNames, assetTypeName.ToLower()); | ||
59 | if (index >= 0 && m_DisallowExport[index]) | ||
60 | { | ||
61 | m_log.DebugFormat("[Asset Permissions]: Export denied: configuration does not allow export of AssetType {0}", assetTypeName); | ||
62 | return false; | ||
63 | } | ||
64 | |||
65 | return true; | ||
66 | } | ||
67 | |||
68 | public bool AllowedImport(sbyte type) | ||
69 | { | ||
70 | string assetTypeName = ((AssetType)type).ToString(); | ||
71 | |||
72 | int index = Array.IndexOf(m_AssetTypeNames, assetTypeName.ToLower()); | ||
73 | if (index >= 0 && m_DisallowImport[index]) | ||
74 | { | ||
75 | m_log.DebugFormat("[Asset Permissions]: Import denied: configuration does not allow import of AssetType {0}", assetTypeName); | ||
76 | return false; | ||
77 | } | ||
78 | |||
79 | return true; | ||
80 | } | ||
81 | |||
82 | |||
83 | } | ||
84 | } | ||
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index c5d9641..1638541 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -358,6 +358,9 @@ namespace OpenSim.Framework | |||
358 | SetVisualParams(visualParams); | 358 | SetVisualParams(visualParams); |
359 | } | 359 | } |
360 | 360 | ||
361 | /// <summary> | ||
362 | /// Set avatar height by a calculation based on their visual parameters. | ||
363 | /// </summary> | ||
361 | public virtual void SetHeight() | 364 | public virtual void SetHeight() |
362 | { | 365 | { |
363 | // Start with shortest possible female avatar height | 366 | // Start with shortest possible female avatar height |
diff --git a/OpenSim/Framework/Cache.cs b/OpenSim/Framework/Cache.cs index 79e20fc..31cab4a 100644 --- a/OpenSim/Framework/Cache.cs +++ b/OpenSim/Framework/Cache.cs | |||
@@ -199,7 +199,14 @@ namespace OpenSim.Framework | |||
199 | // | 199 | // |
200 | public class Cache | 200 | public class Cache |
201 | { | 201 | { |
202 | /// <summary> | ||
203 | /// Must only be accessed under lock. | ||
204 | /// </summary> | ||
202 | private List<CacheItemBase> m_Index = new List<CacheItemBase>(); | 205 | private List<CacheItemBase> m_Index = new List<CacheItemBase>(); |
206 | |||
207 | /// <summary> | ||
208 | /// Must only be accessed under m_Index lock. | ||
209 | /// </summary> | ||
203 | private Dictionary<string, CacheItemBase> m_Lookup = | 210 | private Dictionary<string, CacheItemBase> m_Lookup = |
204 | new Dictionary<string, CacheItemBase>(); | 211 | new Dictionary<string, CacheItemBase>(); |
205 | 212 | ||
@@ -320,19 +327,19 @@ namespace OpenSim.Framework | |||
320 | { | 327 | { |
321 | if (m_Lookup.ContainsKey(index)) | 328 | if (m_Lookup.ContainsKey(index)) |
322 | item = m_Lookup[index]; | 329 | item = m_Lookup[index]; |
323 | } | ||
324 | 330 | ||
325 | if (item == null) | 331 | if (item == null) |
326 | { | 332 | { |
333 | Expire(true); | ||
334 | return null; | ||
335 | } | ||
336 | |||
337 | item.hits++; | ||
338 | item.lastUsed = DateTime.Now; | ||
339 | |||
327 | Expire(true); | 340 | Expire(true); |
328 | return null; | ||
329 | } | 341 | } |
330 | 342 | ||
331 | item.hits++; | ||
332 | item.lastUsed = DateTime.Now; | ||
333 | |||
334 | Expire(true); | ||
335 | |||
336 | return item; | 343 | return item; |
337 | } | 344 | } |
338 | 345 | ||
@@ -385,7 +392,10 @@ namespace OpenSim.Framework | |||
385 | // | 392 | // |
386 | public Object Find(Predicate<CacheItemBase> d) | 393 | public Object Find(Predicate<CacheItemBase> d) |
387 | { | 394 | { |
388 | CacheItemBase item = m_Index.Find(d); | 395 | CacheItemBase item; |
396 | |||
397 | lock (m_Index) | ||
398 | item = m_Index.Find(d); | ||
389 | 399 | ||
390 | if (item == null) | 400 | if (item == null) |
391 | return null; | 401 | return null; |
@@ -419,12 +429,12 @@ namespace OpenSim.Framework | |||
419 | public virtual void Store(string index, Object data, Type container, | 429 | public virtual void Store(string index, Object data, Type container, |
420 | Object[] parameters) | 430 | Object[] parameters) |
421 | { | 431 | { |
422 | Expire(false); | ||
423 | |||
424 | CacheItemBase item; | 432 | CacheItemBase item; |
425 | 433 | ||
426 | lock (m_Index) | 434 | lock (m_Index) |
427 | { | 435 | { |
436 | Expire(false); | ||
437 | |||
428 | if (m_Index.Contains(new CacheItemBase(index))) | 438 | if (m_Index.Contains(new CacheItemBase(index))) |
429 | { | 439 | { |
430 | if ((m_Flags & CacheFlags.AllowUpdate) != 0) | 440 | if ((m_Flags & CacheFlags.AllowUpdate) != 0) |
@@ -450,9 +460,17 @@ namespace OpenSim.Framework | |||
450 | m_Index.Add(item); | 460 | m_Index.Add(item); |
451 | m_Lookup[index] = item; | 461 | m_Lookup[index] = item; |
452 | } | 462 | } |
463 | |||
453 | item.Store(data); | 464 | item.Store(data); |
454 | } | 465 | } |
455 | 466 | ||
467 | /// <summary> | ||
468 | /// Expire items as appropriate. | ||
469 | /// </summary> | ||
470 | /// <remarks> | ||
471 | /// Callers must lock m_Index. | ||
472 | /// </remarks> | ||
473 | /// <param name='getting'></param> | ||
456 | protected virtual void Expire(bool getting) | 474 | protected virtual void Expire(bool getting) |
457 | { | 475 | { |
458 | if (getting && (m_Strategy == CacheStrategy.Aggressive)) | 476 | if (getting && (m_Strategy == CacheStrategy.Aggressive)) |
@@ -475,12 +493,10 @@ namespace OpenSim.Framework | |||
475 | 493 | ||
476 | switch (m_Strategy) | 494 | switch (m_Strategy) |
477 | { | 495 | { |
478 | case CacheStrategy.Aggressive: | 496 | case CacheStrategy.Aggressive: |
479 | if (Count < Size) | 497 | if (Count < Size) |
480 | return; | 498 | return; |
481 | 499 | ||
482 | lock (m_Index) | ||
483 | { | ||
484 | m_Index.Sort(new SortLRU()); | 500 | m_Index.Sort(new SortLRU()); |
485 | m_Index.Reverse(); | 501 | m_Index.Reverse(); |
486 | 502 | ||
@@ -490,7 +506,7 @@ namespace OpenSim.Framework | |||
490 | 506 | ||
491 | ExpireDelegate doExpire = OnExpire; | 507 | ExpireDelegate doExpire = OnExpire; |
492 | 508 | ||
493 | if (doExpire != null) | 509 | if (doExpire != null) |
494 | { | 510 | { |
495 | List<CacheItemBase> candidates = | 511 | List<CacheItemBase> candidates = |
496 | m_Index.GetRange(target, Count - target); | 512 | m_Index.GetRange(target, Count - target); |
@@ -513,27 +529,34 @@ namespace OpenSim.Framework | |||
513 | foreach (CacheItemBase item in m_Index) | 529 | foreach (CacheItemBase item in m_Index) |
514 | m_Lookup[item.uuid] = item; | 530 | m_Lookup[item.uuid] = item; |
515 | } | 531 | } |
516 | } | 532 | |
517 | break; | 533 | break; |
518 | default: | 534 | |
519 | break; | 535 | default: |
536 | break; | ||
520 | } | 537 | } |
521 | } | 538 | } |
522 | 539 | ||
523 | public void Invalidate(string uuid) | 540 | public void Invalidate(string uuid) |
524 | { | 541 | { |
525 | if (!m_Lookup.ContainsKey(uuid)) | 542 | lock (m_Index) |
526 | return; | 543 | { |
544 | if (!m_Lookup.ContainsKey(uuid)) | ||
545 | return; | ||
527 | 546 | ||
528 | CacheItemBase item = m_Lookup[uuid]; | 547 | CacheItemBase item = m_Lookup[uuid]; |
529 | m_Lookup.Remove(uuid); | 548 | m_Lookup.Remove(uuid); |
530 | m_Index.Remove(item); | 549 | m_Index.Remove(item); |
550 | } | ||
531 | } | 551 | } |
532 | 552 | ||
533 | public void Clear() | 553 | public void Clear() |
534 | { | 554 | { |
535 | m_Index.Clear(); | 555 | lock (m_Index) |
536 | m_Lookup.Clear(); | 556 | { |
557 | m_Index.Clear(); | ||
558 | m_Lookup.Clear(); | ||
559 | } | ||
537 | } | 560 | } |
538 | } | 561 | } |
539 | } | 562 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index e718aa6..8c32734 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs | |||
@@ -312,6 +312,7 @@ namespace OpenSim.Framework | |||
312 | public AgentGroupData[] Groups; | 312 | public AgentGroupData[] Groups; |
313 | public Animation[] Anims; | 313 | public Animation[] Anims; |
314 | public Animation DefaultAnim = null; | 314 | public Animation DefaultAnim = null; |
315 | public Animation AnimState = null; | ||
315 | 316 | ||
316 | public UUID GranterID; | 317 | public UUID GranterID; |
317 | public UUID ParentPart; | 318 | public UUID ParentPart; |
@@ -403,6 +404,11 @@ namespace OpenSim.Framework | |||
403 | args["default_animation"] = DefaultAnim.PackUpdateMessage(); | 404 | args["default_animation"] = DefaultAnim.PackUpdateMessage(); |
404 | } | 405 | } |
405 | 406 | ||
407 | if (AnimState != null) | ||
408 | { | ||
409 | args["animation_state"] = AnimState.PackUpdateMessage(); | ||
410 | } | ||
411 | |||
406 | if (Appearance != null) | 412 | if (Appearance != null) |
407 | args["packed_appearance"] = Appearance.Pack(); | 413 | args["packed_appearance"] = Appearance.Pack(); |
408 | 414 | ||
@@ -612,6 +618,18 @@ namespace OpenSim.Framework | |||
612 | } | 618 | } |
613 | } | 619 | } |
614 | 620 | ||
621 | if (args["animation_state"] != null) | ||
622 | { | ||
623 | try | ||
624 | { | ||
625 | AnimState = new Animation((OSDMap)args["animation_state"]); | ||
626 | } | ||
627 | catch | ||
628 | { | ||
629 | AnimState = null; | ||
630 | } | ||
631 | } | ||
632 | |||
615 | //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) | 633 | //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) |
616 | //{ | 634 | //{ |
617 | // OSDArray textures = (OSDArray)(args["agent_textures"]); | 635 | // OSDArray textures = (OSDArray)(args["agent_textures"]); |
diff --git a/OpenSim/Framework/Client/IClientChat.cs b/OpenSim/Framework/Client/IClientChat.cs index 078ea9b..86b1faa 100644 --- a/OpenSim/Framework/Client/IClientChat.cs +++ b/OpenSim/Framework/Client/IClientChat.cs | |||
@@ -33,7 +33,8 @@ namespace OpenSim.Framework.Client | |||
33 | { | 33 | { |
34 | event ChatMessage OnChatFromClient; | 34 | event ChatMessage OnChatFromClient; |
35 | 35 | ||
36 | void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName, UUID fromAgentID, byte source, | 36 | void SendChatMessage( |
37 | byte audible); | 37 | string message, byte type, Vector3 fromPos, string fromName, UUID fromAgentID, UUID ownerID, byte source, |
38 | byte audible); | ||
38 | } | 39 | } |
39 | } | 40 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Communications/Properties/AssemblyInfo.cs b/OpenSim/Framework/Communications/Properties/AssemblyInfo.cs index 2df6ace..6d1c03a 100644 --- a/OpenSim/Framework/Communications/Properties/AssemblyInfo.cs +++ b/OpenSim/Framework/Communications/Properties/AssemblyInfo.cs | |||
@@ -32,12 +32,12 @@ using System.Runtime.InteropServices; | |||
32 | // set of attributes. Change these attribute values to modify the information | 32 | // set of attributes. Change these attribute values to modify the information |
33 | // associated with an assembly. | 33 | // associated with an assembly. |
34 | 34 | ||
35 | [assembly : AssemblyTitle("OpenGrid.Framework.Communications")] | 35 | [assembly : AssemblyTitle("OpenSim.Framework.Communications")] |
36 | [assembly : AssemblyDescription("")] | 36 | [assembly : AssemblyDescription("")] |
37 | [assembly : AssemblyConfiguration("")] | 37 | [assembly : AssemblyConfiguration("")] |
38 | [assembly : AssemblyCompany("http://opensimulator.org")] | 38 | [assembly : AssemblyCompany("http://opensimulator.org")] |
39 | [assembly : AssemblyProduct("OpenGrid.Framework.Communications")] | 39 | [assembly : AssemblyProduct("OpenSim")] |
40 | [assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] | 40 | [assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers")] |
41 | [assembly : AssemblyTrademark("")] | 41 | [assembly : AssemblyTrademark("")] |
42 | [assembly : AssemblyCulture("")] | 42 | [assembly : AssemblyCulture("")] |
43 | 43 | ||
@@ -61,5 +61,5 @@ using System.Runtime.InteropServices; | |||
61 | // You can specify all the values or you can default the Revision and Build Numbers | 61 | // You can specify all the values or you can default the Revision and Build Numbers |
62 | // by using the '*' as shown below: | 62 | // by using the '*' as shown below: |
63 | 63 | ||
64 | [assembly : AssemblyVersion("0.6.5.*")] | 64 | [assembly : AssemblyVersion("0.7.5.*")] |
65 | [assembly : AssemblyFileVersion("0.6.5.0")] | 65 | [assembly : AssemblyFileVersion("0.6.5.0")] |
diff --git a/OpenSim/Framework/Configuration/HTTP/Properties/AssemblyInfo.cs b/OpenSim/Framework/Configuration/HTTP/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0674656 --- /dev/null +++ b/OpenSim/Framework/Configuration/HTTP/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.Configuration.HTTP")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator develoeprs")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("cb78b672-d000-4f93-88f9-dae151cc0061")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/Configuration/XML/Properties/AssemblyInfo.cs b/OpenSim/Framework/Configuration/XML/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1095b23 --- /dev/null +++ b/OpenSim/Framework/Configuration/XML/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.Configuration.XML")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("eeb880df-0112-4c3d-87ed-b2108d614c55")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/Console/AssemblyInfo.cs b/OpenSim/Framework/Console/AssemblyInfo.cs index 75e35bf..37c7304 100644 --- a/OpenSim/Framework/Console/AssemblyInfo.cs +++ b/OpenSim/Framework/Console/AssemblyInfo.cs | |||
@@ -39,7 +39,7 @@ using System.Runtime.InteropServices; | |||
39 | [assembly: AssemblyConfiguration("")] | 39 | [assembly: AssemblyConfiguration("")] |
40 | [assembly: AssemblyCompany("http://opensimulator.org")] | 40 | [assembly: AssemblyCompany("http://opensimulator.org")] |
41 | [assembly : AssemblyProduct("ServerConsole")] | 41 | [assembly : AssemblyProduct("ServerConsole")] |
42 | [assembly: AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] | 42 | [assembly: AssemblyCopyright("Copyright (c) OpenSimulator.org Developers")] |
43 | [assembly: AssemblyTrademark("")] | 43 | [assembly: AssemblyTrademark("")] |
44 | [assembly: AssemblyCulture("")] | 44 | [assembly: AssemblyCulture("")] |
45 | 45 | ||
@@ -55,4 +55,4 @@ using System.Runtime.InteropServices; | |||
55 | // You can specify all values by your own or you can build default build and revision | 55 | // You can specify all values by your own or you can build default build and revision |
56 | // numbers with the '*' character (the default): | 56 | // numbers with the '*' character (the default): |
57 | 57 | ||
58 | [assembly : AssemblyVersion("0.6.5.*")] | 58 | [assembly : AssemblyVersion("0.7.5.*")] |
diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index bd23d1c..d703d78 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs | |||
@@ -83,7 +83,8 @@ 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 <item>' where <item> is one of the following:"; | 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 | 88 | ||
88 | /// <value> | 89 | /// <value> |
89 | /// Commands organized by keyword in a tree | 90 | /// Commands organized by keyword in a tree |
@@ -114,6 +115,12 @@ namespace OpenSim.Framework.Console | |||
114 | { | 115 | { |
115 | help.Add(""); // Will become a newline. | 116 | help.Add(""); // Will become a newline. |
116 | help.Add(GeneralHelpText); | 117 | help.Add(GeneralHelpText); |
118 | help.AddRange(CollectAllCommandsHelp()); | ||
119 | } | ||
120 | else if (helpParts.Count == 1 && helpParts[0] == "categories") | ||
121 | { | ||
122 | help.Add(""); // Will become a newline. | ||
123 | help.Add(GeneralHelpText); | ||
117 | help.Add(ItemHelpText); | 124 | help.Add(ItemHelpText); |
118 | help.AddRange(CollectModulesHelp(tree)); | 125 | help.AddRange(CollectModulesHelp(tree)); |
119 | } | 126 | } |
@@ -124,6 +131,31 @@ namespace OpenSim.Framework.Console | |||
124 | 131 | ||
125 | return help; | 132 | return help; |
126 | } | 133 | } |
134 | |||
135 | /// <summary> | ||
136 | /// Collects the help from all commands and return in alphabetical order. | ||
137 | /// </summary> | ||
138 | /// <returns></returns> | ||
139 | private List<string> CollectAllCommandsHelp() | ||
140 | { | ||
141 | List<string> help = new List<string>(); | ||
142 | |||
143 | lock (m_modulesCommands) | ||
144 | { | ||
145 | foreach (List<CommandInfo> commands in m_modulesCommands.Values) | ||
146 | { | ||
147 | foreach (CommandInfo c in commands) | ||
148 | { | ||
149 | if (c.long_help != String.Empty) | ||
150 | help.Add(string.Format("{0} - {1}", c.help_text, c.long_help)); | ||
151 | } | ||
152 | } | ||
153 | } | ||
154 | |||
155 | help.Sort(); | ||
156 | |||
157 | return help; | ||
158 | } | ||
127 | 159 | ||
128 | /// <summary> | 160 | /// <summary> |
129 | /// See if we can find the requested command in order to display longer help | 161 | /// See if we can find the requested command in order to display longer help |
@@ -711,7 +743,7 @@ namespace OpenSim.Framework.Console | |||
711 | /// </summary> | 743 | /// </summary> |
712 | public void Prompt() | 744 | public void Prompt() |
713 | { | 745 | { |
714 | string line = ReadLine(m_defaultPrompt + "# ", true, true); | 746 | string line = ReadLine(DefaultPrompt + "# ", true, true); |
715 | 747 | ||
716 | if (line != String.Empty) | 748 | if (line != String.Empty) |
717 | Output("Invalid command"); | 749 | Output("Invalid command"); |
diff --git a/OpenSim/Framework/Console/ConsoleBase.cs b/OpenSim/Framework/Console/ConsoleBase.cs index 4b375d9..2d8e723 100755 --- a/OpenSim/Framework/Console/ConsoleBase.cs +++ b/OpenSim/Framework/Console/ConsoleBase.cs | |||
@@ -43,15 +43,7 @@ namespace OpenSim.Framework.Console | |||
43 | 43 | ||
44 | public object ConsoleScene { get; set; } | 44 | public object ConsoleScene { get; set; } |
45 | 45 | ||
46 | /// <summary> | 46 | public string DefaultPrompt { get; set; } |
47 | /// The default prompt text. | ||
48 | /// </summary> | ||
49 | public string DefaultPrompt | ||
50 | { | ||
51 | set { m_defaultPrompt = value; } | ||
52 | get { return m_defaultPrompt; } | ||
53 | } | ||
54 | protected string m_defaultPrompt; | ||
55 | 47 | ||
56 | public ConsoleBase(string defaultPrompt) | 48 | public ConsoleBase(string defaultPrompt) |
57 | { | 49 | { |
diff --git a/OpenSim/Framework/Console/ConsoleUtil.cs b/OpenSim/Framework/Console/ConsoleUtil.cs new file mode 100644 index 0000000..16a63e0 --- /dev/null +++ b/OpenSim/Framework/Console/ConsoleUtil.cs | |||
@@ -0,0 +1,228 @@ | |||
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 System.IO; | ||
31 | using System.Linq; | ||
32 | using System.Reflection; | ||
33 | using log4net; | ||
34 | using OpenMetaverse; | ||
35 | |||
36 | namespace OpenSim.Framework.Console | ||
37 | { | ||
38 | public class ConsoleUtil | ||
39 | { | ||
40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
41 | |||
42 | public const int LocalIdNotFound = 0; | ||
43 | |||
44 | /// <summary> | ||
45 | /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section | ||
46 | /// rather than in each help summary. | ||
47 | /// </summary> | ||
48 | public const string CoordHelp | ||
49 | = @"Each component of the coord is comma separated. There must be no spaces between the commas. | ||
50 | If you don't care about the z component you can simply omit it. | ||
51 | If you don't care about the x or y components then you can leave them blank (though a comma is still required) | ||
52 | If you want to specify the maxmimum value of a component then you can use ~ instead of a number | ||
53 | If you want to specify the minimum value of a component then you can use -~ instead of a number | ||
54 | e.g. | ||
55 | delete object pos 20,20,20 to 40,40,40 | ||
56 | delete object pos 20,20 to 40,40 | ||
57 | delete object pos ,20,20 to ,40,40 | ||
58 | delete object pos ,,30 to ,,~ | ||
59 | delete object pos ,,-~ to ,,30"; | ||
60 | |||
61 | public const string MinRawConsoleVectorValue = "-~"; | ||
62 | public const string MaxRawConsoleVectorValue = "~"; | ||
63 | |||
64 | public const string VectorSeparator = ","; | ||
65 | public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray(); | ||
66 | |||
67 | /// <summary> | ||
68 | /// Check if the given file path exists. | ||
69 | /// </summary> | ||
70 | /// <remarks>If not, warning is printed to the given console.</remarks> | ||
71 | /// <returns>true if the file does not exist, false otherwise.</returns> | ||
72 | /// <param name='console'></param> | ||
73 | /// <param name='path'></param> | ||
74 | public static bool CheckFileDoesNotExist(ICommandConsole console, string path) | ||
75 | { | ||
76 | if (File.Exists(path)) | ||
77 | { | ||
78 | console.OutputFormat("File {0} already exists. Please move or remove it.", path); | ||
79 | return false; | ||
80 | } | ||
81 | |||
82 | return true; | ||
83 | } | ||
84 | |||
85 | /// <summary> | ||
86 | /// Try to parse a console UUID from the console. | ||
87 | /// </summary> | ||
88 | /// <remarks> | ||
89 | /// Will complain to the console if parsing fails. | ||
90 | /// </remarks> | ||
91 | /// <returns></returns> | ||
92 | /// <param name='console'>If null then no complaint is printed.</param> | ||
93 | /// <param name='rawUuid'></param> | ||
94 | /// <param name='uuid'></param> | ||
95 | public static bool TryParseConsoleUuid(ICommandConsole console, string rawUuid, out UUID uuid) | ||
96 | { | ||
97 | if (!UUID.TryParse(rawUuid, out uuid)) | ||
98 | { | ||
99 | if (console != null) | ||
100 | console.OutputFormat("{0} is not a valid uuid", rawUuid); | ||
101 | |||
102 | return false; | ||
103 | } | ||
104 | |||
105 | return true; | ||
106 | } | ||
107 | |||
108 | public static bool TryParseConsoleLocalId(ICommandConsole console, string rawLocalId, out uint localId) | ||
109 | { | ||
110 | if (!uint.TryParse(rawLocalId, out localId)) | ||
111 | { | ||
112 | if (console != null) | ||
113 | console.OutputFormat("{0} is not a valid local id", localId); | ||
114 | |||
115 | return false; | ||
116 | } | ||
117 | |||
118 | if (localId == 0) | ||
119 | { | ||
120 | if (console != null) | ||
121 | console.OutputFormat("{0} is not a valid local id - it must be greater than 0", localId); | ||
122 | |||
123 | return false; | ||
124 | } | ||
125 | |||
126 | return true; | ||
127 | } | ||
128 | |||
129 | /// <summary> | ||
130 | /// Tries to parse the input as either a UUID or a local ID. | ||
131 | /// </summary> | ||
132 | /// <returns>true if parsing succeeded, false otherwise.</returns> | ||
133 | /// <param name='console'></param> | ||
134 | /// <param name='rawId'></param> | ||
135 | /// <param name='uuid'></param> | ||
136 | /// <param name='localId'> | ||
137 | /// Will be set to ConsoleUtil.LocalIdNotFound if parsing result was a UUID or no parse succeeded. | ||
138 | /// </param> | ||
139 | public static bool TryParseConsoleId(ICommandConsole console, string rawId, out UUID uuid, out uint localId) | ||
140 | { | ||
141 | if (TryParseConsoleUuid(null, rawId, out uuid)) | ||
142 | { | ||
143 | localId = LocalIdNotFound; | ||
144 | return true; | ||
145 | } | ||
146 | |||
147 | if (TryParseConsoleLocalId(null, rawId, out localId)) | ||
148 | { | ||
149 | return true; | ||
150 | } | ||
151 | |||
152 | if (console != null) | ||
153 | console.OutputFormat("{0} is not a valid UUID or local id", rawId); | ||
154 | |||
155 | return false; | ||
156 | } | ||
157 | |||
158 | /// <summary> | ||
159 | /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 | ||
160 | /// </summary> | ||
161 | /// <param name='rawConsoleVector'>/param> | ||
162 | /// <param name='vector'></param> | ||
163 | /// <returns></returns> | ||
164 | public static bool TryParseConsoleMinVector(string rawConsoleVector, out Vector3 vector) | ||
165 | { | ||
166 | return TryParseConsoleVector(rawConsoleVector, c => float.MinValue.ToString(), out vector); | ||
167 | } | ||
168 | |||
169 | /// <summary> | ||
170 | /// Convert a maximum vector input from the console to an OpenMetaverse.Vector3 | ||
171 | /// </summary> | ||
172 | /// <param name='rawConsoleVector'>/param> | ||
173 | /// <param name='vector'></param> | ||
174 | /// <returns></returns> | ||
175 | public static bool TryParseConsoleMaxVector(string rawConsoleVector, out Vector3 vector) | ||
176 | { | ||
177 | return TryParseConsoleVector(rawConsoleVector, c => float.MaxValue.ToString(), out vector); | ||
178 | } | ||
179 | |||
180 | /// <summary> | ||
181 | /// Convert a vector input from the console to an OpenMetaverse.Vector3 | ||
182 | /// </summary> | ||
183 | /// <param name='rawConsoleVector'> | ||
184 | /// A string in the form <x>,<y>,<z> where there is no space between values. | ||
185 | /// Any component can be missing (e.g. ,,40). blankComponentFunc is invoked to replace the blank with a suitable value | ||
186 | /// Also, if the blank component is at the end, then the comma can be missed off entirely (e.g. 40,30 or 40) | ||
187 | /// The strings "~" and "-~" are valid in components. The first substitutes float.MaxValue whilst the second is float.MinValue | ||
188 | /// Other than that, component values must be numeric. | ||
189 | /// </param> | ||
190 | /// <param name='blankComponentFunc'></param> | ||
191 | /// <param name='vector'></param> | ||
192 | /// <returns></returns> | ||
193 | public static bool TryParseConsoleVector( | ||
194 | string rawConsoleVector, Func<string, string> blankComponentFunc, out Vector3 vector) | ||
195 | { | ||
196 | List<string> components = rawConsoleVector.Split(VectorSeparatorChars).ToList(); | ||
197 | |||
198 | if (components.Count < 1 || components.Count > 3) | ||
199 | { | ||
200 | vector = Vector3.Zero; | ||
201 | return false; | ||
202 | } | ||
203 | |||
204 | for (int i = components.Count; i < 3; i++) | ||
205 | components.Add(""); | ||
206 | |||
207 | List<string> semiDigestedComponents | ||
208 | = components.ConvertAll<string>( | ||
209 | c => | ||
210 | { | ||
211 | if (c == "") | ||
212 | return blankComponentFunc.Invoke(c); | ||
213 | else if (c == MaxRawConsoleVectorValue) | ||
214 | return float.MaxValue.ToString(); | ||
215 | else if (c == MinRawConsoleVectorValue) | ||
216 | return float.MinValue.ToString(); | ||
217 | else | ||
218 | return c; | ||
219 | }); | ||
220 | |||
221 | string semiDigestedConsoleVector = string.Join(VectorSeparator, semiDigestedComponents.ToArray()); | ||
222 | |||
223 | // m_log.DebugFormat("[CONSOLE UTIL]: Parsing {0} into OpenMetaverse.Vector3", semiDigestedConsoleVector); | ||
224 | |||
225 | return Vector3.TryParse(semiDigestedConsoleVector, out vector); | ||
226 | } | ||
227 | } | ||
228 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/Console/MockConsole.cs b/OpenSim/Framework/Console/MockConsole.cs index b489f93..8ba58e4 100644 --- a/OpenSim/Framework/Console/MockConsole.cs +++ b/OpenSim/Framework/Console/MockConsole.cs | |||
@@ -46,13 +46,18 @@ namespace OpenSim.Framework.Console | |||
46 | 46 | ||
47 | public ICommands Commands { get { return m_commands; } } | 47 | public ICommands Commands { get { return m_commands; } } |
48 | 48 | ||
49 | public string DefaultPrompt { get; set; } | ||
50 | |||
49 | public void Prompt() {} | 51 | public void Prompt() {} |
50 | 52 | ||
51 | public void RunCommand(string cmd) {} | 53 | public void RunCommand(string cmd) {} |
52 | 54 | ||
53 | public string ReadLine(string p, bool isCommand, bool e) { return ""; } | 55 | public string ReadLine(string p, bool isCommand, bool e) { return ""; } |
54 | 56 | ||
55 | public object ConsoleScene { get { return null; } } | 57 | public object ConsoleScene { |
58 | get { return null; } | ||
59 | set {} | ||
60 | } | ||
56 | 61 | ||
57 | public void Output(string text, string level) {} | 62 | public void Output(string text, string level) {} |
58 | public void Output(string text) {} | 63 | public void Output(string text) {} |
diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs index 1b1aaf2..a2eb5ee 100644 --- a/OpenSim/Framework/Constants.cs +++ b/OpenSim/Framework/Constants.cs | |||
@@ -31,6 +31,7 @@ namespace OpenSim.Framework | |||
31 | public class Constants | 31 | public class Constants |
32 | { | 32 | { |
33 | public const uint RegionSize = 256; | 33 | public const uint RegionSize = 256; |
34 | public const uint RegionHeight = 4096; | ||
34 | public const byte TerrainPatchSize = 16; | 35 | public const byte TerrainPatchSize = 16; |
35 | public const string DefaultTexture = "89556747-24cb-43ed-920b-47caed15465f"; | 36 | public const string DefaultTexture = "89556747-24cb-43ed-920b-47caed15465f"; |
36 | 37 | ||
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 9020761..e03750b 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs | |||
@@ -419,11 +419,11 @@ namespace OpenSim.Framework | |||
419 | 419 | ||
420 | public void SetFromFlags(ulong regionFlags) | 420 | public void SetFromFlags(ulong regionFlags) |
421 | { | 421 | { |
422 | ResetHomeOnTeleport = ((regionFlags & (ulong)RegionFlags.ResetHomeOnTeleport) == (ulong)RegionFlags.ResetHomeOnTeleport); | 422 | ResetHomeOnTeleport = ((regionFlags & (ulong)OpenMetaverse.RegionFlags.ResetHomeOnTeleport) == (ulong)OpenMetaverse.RegionFlags.ResetHomeOnTeleport); |
423 | BlockDwell = ((regionFlags & (ulong)RegionFlags.BlockDwell) == (ulong)RegionFlags.BlockDwell); | 423 | BlockDwell = ((regionFlags & (ulong)OpenMetaverse.RegionFlags.BlockDwell) == (ulong)OpenMetaverse.RegionFlags.BlockDwell); |
424 | AllowLandmark = ((regionFlags & (ulong)RegionFlags.AllowLandmark) == (ulong)RegionFlags.AllowLandmark); | 424 | AllowLandmark = ((regionFlags & (ulong)OpenMetaverse.RegionFlags.AllowLandmark) == (ulong)OpenMetaverse.RegionFlags.AllowLandmark); |
425 | AllowParcelChanges = ((regionFlags & (ulong)RegionFlags.AllowParcelChanges) == (ulong)RegionFlags.AllowParcelChanges); | 425 | AllowParcelChanges = ((regionFlags & (ulong)OpenMetaverse.RegionFlags.AllowParcelChanges) == (ulong)OpenMetaverse.RegionFlags.AllowParcelChanges); |
426 | AllowSetHome = ((regionFlags & (ulong)RegionFlags.AllowSetHome) == (ulong)RegionFlags.AllowSetHome); | 426 | AllowSetHome = ((regionFlags & (ulong)OpenMetaverse.RegionFlags.AllowSetHome) == (ulong)OpenMetaverse.RegionFlags.AllowSetHome); |
427 | } | 427 | } |
428 | 428 | ||
429 | public bool GroupAccess(UUID groupID) | 429 | public bool GroupAccess(UUID groupID) |
diff --git a/OpenSim/Framework/GridInstantMessage.cs b/OpenSim/Framework/GridInstantMessage.cs index a6bf6e3..6ae0488 100644 --- a/OpenSim/Framework/GridInstantMessage.cs +++ b/OpenSim/Framework/GridInstantMessage.cs | |||
@@ -44,7 +44,6 @@ namespace OpenSim.Framework | |||
44 | public Vector3 Position; | 44 | public Vector3 Position; |
45 | public byte[] binaryBucket; | 45 | public byte[] binaryBucket; |
46 | 46 | ||
47 | |||
48 | public uint ParentEstateID; | 47 | public uint ParentEstateID; |
49 | public Guid RegionID; | 48 | public Guid RegionID; |
50 | public uint timestamp; | 49 | public uint timestamp; |
@@ -58,7 +57,7 @@ namespace OpenSim.Framework | |||
58 | string _fromAgentName, UUID _toAgentID, | 57 | string _fromAgentName, UUID _toAgentID, |
59 | byte _dialog, bool _fromGroup, string _message, | 58 | byte _dialog, bool _fromGroup, string _message, |
60 | UUID _imSessionID, bool _offline, Vector3 _position, | 59 | UUID _imSessionID, bool _offline, Vector3 _position, |
61 | byte[] _binaryBucket) | 60 | byte[] _binaryBucket, bool addTimestamp) |
62 | { | 61 | { |
63 | fromAgentID = _fromAgentID.Guid; | 62 | fromAgentID = _fromAgentID.Guid; |
64 | fromAgentName = _fromAgentName; | 63 | fromAgentName = _fromAgentName; |
@@ -79,7 +78,9 @@ namespace OpenSim.Framework | |||
79 | ParentEstateID = scene.RegionInfo.EstateSettings.ParentEstateID; | 78 | ParentEstateID = scene.RegionInfo.EstateSettings.ParentEstateID; |
80 | RegionID = scene.RegionInfo.RegionSettings.RegionUUID.Guid; | 79 | RegionID = scene.RegionInfo.RegionSettings.RegionUUID.Guid; |
81 | } | 80 | } |
82 | timestamp = (uint)Util.UnixTimeSinceEpoch(); | 81 | |
82 | if (addTimestamp) | ||
83 | timestamp = (uint)Util.UnixTimeSinceEpoch(); | ||
83 | } | 84 | } |
84 | 85 | ||
85 | public GridInstantMessage(IScene scene, UUID _fromAgentID, | 86 | public GridInstantMessage(IScene scene, UUID _fromAgentID, |
@@ -87,7 +88,7 @@ namespace OpenSim.Framework | |||
87 | string _message, bool _offline, | 88 | string _message, bool _offline, |
88 | Vector3 _position) : this(scene, _fromAgentID, _fromAgentName, | 89 | Vector3 _position) : this(scene, _fromAgentID, _fromAgentName, |
89 | _toAgentID, _dialog, false, _message, | 90 | _toAgentID, _dialog, false, _message, |
90 | _fromAgentID ^ _toAgentID, _offline, _position, new byte[0]) | 91 | _fromAgentID ^ _toAgentID, _offline, _position, new byte[0], true) |
91 | { | 92 | { |
92 | } | 93 | } |
93 | } | 94 | } |
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 5909ce1..f686c60 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs | |||
@@ -815,8 +815,23 @@ namespace OpenSim.Framework | |||
815 | event Action<IClientAPI> OnRegionHandShakeReply; | 815 | event Action<IClientAPI> OnRegionHandShakeReply; |
816 | event GenericCall1 OnRequestWearables; | 816 | event GenericCall1 OnRequestWearables; |
817 | event Action<IClientAPI, bool> OnCompleteMovementToRegion; | 817 | event Action<IClientAPI, bool> OnCompleteMovementToRegion; |
818 | |||
819 | /// <summary> | ||
820 | /// Called when an AgentUpdate message is received and before OnAgentUpdate. | ||
821 | /// </summary> | ||
822 | /// <remarks> | ||
823 | /// Listeners must not retain a reference to AgentUpdateArgs since this object may be reused for subsequent AgentUpdates. | ||
824 | /// </remarks> | ||
818 | event UpdateAgent OnPreAgentUpdate; | 825 | event UpdateAgent OnPreAgentUpdate; |
826 | |||
827 | /// <summary> | ||
828 | /// Called when an AgentUpdate message is received and after OnPreAgentUpdate. | ||
829 | /// </summary> | ||
830 | /// <remarks> | ||
831 | /// Listeners must not retain a reference to AgentUpdateArgs since this object may be reused for subsequent AgentUpdates. | ||
832 | /// </remarks> | ||
819 | event UpdateAgent OnAgentUpdate; | 833 | event UpdateAgent OnAgentUpdate; |
834 | |||
820 | event AgentRequestSit OnAgentRequestSit; | 835 | event AgentRequestSit OnAgentRequestSit; |
821 | event AgentSit OnAgentSit; | 836 | event AgentSit OnAgentSit; |
822 | event AvatarPickerRequest OnAvatarPickerRequest; | 837 | event AvatarPickerRequest OnAvatarPickerRequest; |
@@ -1038,7 +1053,7 @@ namespace OpenSim.Framework | |||
1038 | event MuteListEntryRemove OnRemoveMuteListEntry; | 1053 | event MuteListEntryRemove OnRemoveMuteListEntry; |
1039 | event GodlikeMessage onGodlikeMessage; | 1054 | event GodlikeMessage onGodlikeMessage; |
1040 | event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; | 1055 | event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; |
1041 | 1056 | event GenericCall2 OnUpdateThrottles; | |
1042 | /// <summary> | 1057 | /// <summary> |
1043 | /// Set the debug level at which packet output should be printed to console. | 1058 | /// Set the debug level at which packet output should be printed to console. |
1044 | /// </summary> | 1059 | /// </summary> |
@@ -1046,8 +1061,21 @@ namespace OpenSim.Framework | |||
1046 | 1061 | ||
1047 | void InPacket(object NewPack); | 1062 | void InPacket(object NewPack); |
1048 | void ProcessInPacket(Packet NewPack); | 1063 | void ProcessInPacket(Packet NewPack); |
1064 | |||
1065 | /// <summary> | ||
1066 | /// Close this client | ||
1067 | /// </summary> | ||
1049 | void Close(); | 1068 | void Close(); |
1050 | void Close(bool sendStop); | 1069 | |
1070 | /// <summary> | ||
1071 | /// Close this client | ||
1072 | /// </summary> | ||
1073 | /// <param name='force'> | ||
1074 | /// If true, attempts the close without checking active status. You do not want to try this except as a last | ||
1075 | /// ditch attempt where Active == false but the ScenePresence still exists. | ||
1076 | /// </param> | ||
1077 | void Close(bool sendStop, bool force); | ||
1078 | |||
1051 | void Kick(string message); | 1079 | void Kick(string message); |
1052 | 1080 | ||
1053 | /// <summary> | 1081 | /// <summary> |
@@ -1084,8 +1112,20 @@ namespace OpenSim.Framework | |||
1084 | void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs); | 1112 | void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs); |
1085 | void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args); | 1113 | void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args); |
1086 | 1114 | ||
1087 | void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName, UUID fromAgentID, byte source, | 1115 | /// <summary> |
1088 | byte audible); | 1116 | /// Send chat to the viewer. |
1117 | /// </summary> | ||
1118 | /// <param name='message'></param> | ||
1119 | /// <param name='type'></param> | ||
1120 | /// <param name='fromPos'></param> | ||
1121 | /// <param name='fromName'></param> | ||
1122 | /// <param name='fromAgentID'></param> | ||
1123 | /// <param name='ownerID'></param> | ||
1124 | /// <param name='source'></param> | ||
1125 | /// <param name='audible'></param> | ||
1126 | void SendChatMessage( | ||
1127 | string message, byte type, Vector3 fromPos, string fromName, UUID fromAgentID, UUID ownerID, byte source, | ||
1128 | byte audible); | ||
1089 | 1129 | ||
1090 | void SendInstantMessage(GridInstantMessage im); | 1130 | void SendInstantMessage(GridInstantMessage im); |
1091 | 1131 | ||
@@ -1135,6 +1175,8 @@ namespace OpenSim.Framework | |||
1135 | 1175 | ||
1136 | void SetChildAgentThrottle(byte[] throttle); | 1176 | void SetChildAgentThrottle(byte[] throttle); |
1137 | 1177 | ||
1178 | void SetAgentThrottleSilent(int throttle, int setting); | ||
1179 | |||
1138 | void SendAvatarDataImmediate(ISceneEntity avatar); | 1180 | void SendAvatarDataImmediate(ISceneEntity avatar); |
1139 | 1181 | ||
1140 | /// <summary> | 1182 | /// <summary> |
diff --git a/OpenSim/Framework/ICommandConsole.cs b/OpenSim/Framework/ICommandConsole.cs index 8cd20da..a6573f8 100644 --- a/OpenSim/Framework/ICommandConsole.cs +++ b/OpenSim/Framework/ICommandConsole.cs | |||
@@ -83,6 +83,11 @@ namespace OpenSim.Framework | |||
83 | ICommands Commands { get; } | 83 | ICommands Commands { get; } |
84 | 84 | ||
85 | /// <summary> | 85 | /// <summary> |
86 | /// The default prompt text. | ||
87 | /// </summary> | ||
88 | string DefaultPrompt { get; set; } | ||
89 | |||
90 | /// <summary> | ||
86 | /// Display a command prompt on the console and wait for user input | 91 | /// Display a command prompt on the console and wait for user input |
87 | /// </summary> | 92 | /// </summary> |
88 | void Prompt(); | 93 | void Prompt(); |
diff --git a/OpenSim/Framework/IConsole.cs b/OpenSim/Framework/IConsole.cs index 33024b2..79560d8 100644 --- a/OpenSim/Framework/IConsole.cs +++ b/OpenSim/Framework/IConsole.cs | |||
@@ -32,7 +32,7 @@ namespace OpenSim.Framework | |||
32 | { | 32 | { |
33 | public interface IConsole | 33 | public interface IConsole |
34 | { | 34 | { |
35 | object ConsoleScene { get; } | 35 | object ConsoleScene { get; set; } |
36 | 36 | ||
37 | void Output(string text, string level); | 37 | void Output(string text, string level); |
38 | void Output(string text); | 38 | void Output(string text); |
diff --git a/OpenSim/Framework/IMoneyModule.cs b/OpenSim/Framework/IMoneyModule.cs index 71de93a..7378d2e 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); |
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); |
diff --git a/OpenSim/Framework/InventoryFolderBase.cs b/OpenSim/Framework/InventoryFolderBase.cs index a12183c..b3457a6 100644 --- a/OpenSim/Framework/InventoryFolderBase.cs +++ b/OpenSim/Framework/InventoryFolderBase.cs | |||
@@ -73,33 +73,27 @@ namespace OpenSim.Framework | |||
73 | { | 73 | { |
74 | } | 74 | } |
75 | 75 | ||
76 | public InventoryFolderBase(UUID id) | 76 | public InventoryFolderBase(UUID id) : this() |
77 | { | 77 | { |
78 | ID = id; | 78 | ID = id; |
79 | } | 79 | } |
80 | 80 | ||
81 | public InventoryFolderBase(UUID id, UUID owner) | 81 | public InventoryFolderBase(UUID id, UUID owner) : this(id) |
82 | { | 82 | { |
83 | ID = id; | ||
84 | Owner = owner; | 83 | Owner = owner; |
85 | } | 84 | } |
86 | 85 | ||
87 | public InventoryFolderBase(UUID id, string name, UUID owner, UUID parent) | 86 | public InventoryFolderBase(UUID id, string name, UUID owner, UUID parent) : this(id, owner) |
88 | { | 87 | { |
89 | ID = id; | ||
90 | Name = name; | 88 | Name = name; |
91 | Owner = owner; | ||
92 | ParentID = parent; | 89 | ParentID = parent; |
93 | } | 90 | } |
94 | 91 | ||
95 | public InventoryFolderBase(UUID id, string name, UUID owner, short type, UUID parent, ushort version) | 92 | public InventoryFolderBase( |
93 | UUID id, string name, UUID owner, short type, UUID parent, ushort version) : this(id, name, owner, parent) | ||
96 | { | 94 | { |
97 | ID = id; | ||
98 | Name = name; | ||
99 | Owner = owner; | ||
100 | Type = type; | 95 | Type = type; |
101 | ParentID = parent; | ||
102 | Version = version; | 96 | Version = version; |
103 | } | 97 | } |
104 | } | 98 | } |
105 | } | 99 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/InventoryItemBase.cs b/OpenSim/Framework/InventoryItemBase.cs index a663680..3d45e76 100644 --- a/OpenSim/Framework/InventoryItemBase.cs +++ b/OpenSim/Framework/InventoryItemBase.cs | |||
@@ -87,16 +87,7 @@ namespace OpenSim.Framework | |||
87 | protected string m_creatorId; | 87 | protected string m_creatorId; |
88 | 88 | ||
89 | /// <value> | 89 | /// <value> |
90 | /// The UUID for the creator. This may be different from the canonical CreatorId. This property is used | 90 | /// The CreatorId expressed as a UUID.tely |
91 | /// for communication with the client over the Second Life protocol, since that protocol can only understand | ||
92 | /// UUIDs. As this is a basic framework class, this means that both the string creator id and the uuid | ||
93 | /// reference have to be settable separately | ||
94 | /// | ||
95 | /// Database plugins don't need to set this, it will be set by | ||
96 | /// upstream code (or set by the get accessor if left unset). | ||
97 | /// | ||
98 | /// XXX: An alternative to having a separate uuid property would be to hash the CreatorId appropriately | ||
99 | /// every time there was communication with a UUID-only client. This may be much more expensive. | ||
100 | /// </value> | 91 | /// </value> |
101 | public UUID CreatorIdAsUuid | 92 | public UUID CreatorIdAsUuid |
102 | { | 93 | { |
@@ -109,20 +100,18 @@ namespace OpenSim.Framework | |||
109 | 100 | ||
110 | return m_creatorIdAsUuid; | 101 | return m_creatorIdAsUuid; |
111 | } | 102 | } |
112 | |||
113 | set | ||
114 | { | ||
115 | m_creatorIdAsUuid = value; | ||
116 | } | ||
117 | } | 103 | } |
118 | protected UUID m_creatorIdAsUuid = UUID.Zero; | 104 | protected UUID m_creatorIdAsUuid = UUID.Zero; |
119 | 105 | ||
120 | protected string m_creatorData = string.Empty; | 106 | /// <summary> |
107 | /// Extended creator information of the form <profile url>;<name> | ||
108 | /// </summary> | ||
121 | public string CreatorData // = <profile url>;<name> | 109 | public string CreatorData // = <profile url>;<name> |
122 | { | 110 | { |
123 | get { return m_creatorData; } | 111 | get { return m_creatorData; } |
124 | set { m_creatorData = value; } | 112 | set { m_creatorData = value; } |
125 | } | 113 | } |
114 | protected string m_creatorData = string.Empty; | ||
126 | 115 | ||
127 | /// <summary> | 116 | /// <summary> |
128 | /// Used by the DB layer to retrieve / store the entire user identification. | 117 | /// Used by the DB layer to retrieve / store the entire user identification. |
@@ -162,7 +151,6 @@ namespace OpenSim.Framework | |||
162 | name = parts[2]; | 151 | name = parts[2]; |
163 | 152 | ||
164 | m_creatorData += ';' + name; | 153 | m_creatorData += ';' + name; |
165 | |||
166 | } | 154 | } |
167 | } | 155 | } |
168 | } | 156 | } |
diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs index dcaa46d..4dffd3f 100644 --- a/OpenSim/Framework/LandData.cs +++ b/OpenSim/Framework/LandData.cs | |||
@@ -49,8 +49,8 @@ namespace OpenSim.Framework | |||
49 | // use only one serializer to give the runtime a chance to | 49 | // use only one serializer to give the runtime a chance to |
50 | // optimize it (it won't do that if you use a new instance | 50 | // optimize it (it won't do that if you use a new instance |
51 | // every time) | 51 | // every time) |
52 | private static XmlSerializer serializer = new XmlSerializer(typeof (LandData)); | 52 | private static XmlSerializer serializer = new XmlSerializer(typeof(LandData)); |
53 | 53 | ||
54 | private Vector3 _AABBMax = new Vector3(); | 54 | private Vector3 _AABBMax = new Vector3(); |
55 | private Vector3 _AABBMin = new Vector3(); | 55 | private Vector3 _AABBMin = new Vector3(); |
56 | private int _area = 0; | 56 | private int _area = 0; |
@@ -65,11 +65,11 @@ namespace OpenSim.Framework | |||
65 | private byte[] _bitmap = new byte[512]; | 65 | private byte[] _bitmap = new byte[512]; |
66 | private string _description = String.Empty; | 66 | private string _description = String.Empty; |
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 | | 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"; |
@@ -97,16 +97,36 @@ namespace OpenSim.Framework | |||
97 | private bool _mediaLoop = false; | 97 | private bool _mediaLoop = false; |
98 | private bool _obscureMusic = false; | 98 | private bool _obscureMusic = false; |
99 | private bool _obscureMedia = false; | 99 | private bool _obscureMedia = false; |
100 | private float _dwell = 0; | ||
101 | |||
102 | /// <summary> | ||
103 | /// Traffic count of parcel | ||
104 | /// </summary> | ||
105 | [XmlIgnore] | ||
106 | public float Dwell | ||
107 | { | ||
108 | get | ||
109 | { | ||
110 | return _dwell; | ||
111 | } | ||
112 | set | ||
113 | { | ||
114 | _dwell = value; | ||
115 | } | ||
116 | } | ||
100 | 117 | ||
101 | /// <summary> | 118 | /// <summary> |
102 | /// Whether to obscure parcel media URL | 119 | /// Whether to obscure parcel media URL |
103 | /// </summary> | 120 | /// </summary> |
104 | [XmlIgnore] | 121 | [XmlIgnore] |
105 | public bool ObscureMedia { | 122 | public bool ObscureMedia |
106 | get { | 123 | { |
124 | get | ||
125 | { | ||
107 | return _obscureMedia; | 126 | return _obscureMedia; |
108 | } | 127 | } |
109 | set { | 128 | set |
129 | { | ||
110 | _obscureMedia = value; | 130 | _obscureMedia = value; |
111 | } | 131 | } |
112 | } | 132 | } |
@@ -115,11 +135,14 @@ namespace OpenSim.Framework | |||
115 | /// Whether to obscure parcel music URL | 135 | /// Whether to obscure parcel music URL |
116 | /// </summary> | 136 | /// </summary> |
117 | [XmlIgnore] | 137 | [XmlIgnore] |
118 | public bool ObscureMusic { | 138 | public bool ObscureMusic |
119 | get { | 139 | { |
140 | get | ||
141 | { | ||
120 | return _obscureMusic; | 142 | return _obscureMusic; |
121 | } | 143 | } |
122 | set { | 144 | set |
145 | { | ||
123 | _obscureMusic = value; | 146 | _obscureMusic = value; |
124 | } | 147 | } |
125 | } | 148 | } |
@@ -128,11 +151,14 @@ namespace OpenSim.Framework | |||
128 | /// Whether to loop parcel media | 151 | /// Whether to loop parcel media |
129 | /// </summary> | 152 | /// </summary> |
130 | [XmlIgnore] | 153 | [XmlIgnore] |
131 | public bool MediaLoop { | 154 | public bool MediaLoop |
132 | get { | 155 | { |
156 | get | ||
157 | { | ||
133 | return _mediaLoop; | 158 | return _mediaLoop; |
134 | } | 159 | } |
135 | set { | 160 | set |
161 | { | ||
136 | _mediaLoop = value; | 162 | _mediaLoop = value; |
137 | } | 163 | } |
138 | } | 164 | } |
@@ -141,11 +167,14 @@ namespace OpenSim.Framework | |||
141 | /// Height of parcel media render | 167 | /// Height of parcel media render |
142 | /// </summary> | 168 | /// </summary> |
143 | [XmlIgnore] | 169 | [XmlIgnore] |
144 | public int MediaHeight { | 170 | public int MediaHeight |
145 | get { | 171 | { |
172 | get | ||
173 | { | ||
146 | return _mediaHeight; | 174 | return _mediaHeight; |
147 | } | 175 | } |
148 | set { | 176 | set |
177 | { | ||
149 | _mediaHeight = value; | 178 | _mediaHeight = value; |
150 | } | 179 | } |
151 | } | 180 | } |
@@ -154,11 +183,14 @@ namespace OpenSim.Framework | |||
154 | /// Width of parcel media render | 183 | /// Width of parcel media render |
155 | /// </summary> | 184 | /// </summary> |
156 | [XmlIgnore] | 185 | [XmlIgnore] |
157 | public int MediaWidth { | 186 | public int MediaWidth |
158 | get { | 187 | { |
188 | get | ||
189 | { | ||
159 | return _mediaWidth; | 190 | return _mediaWidth; |
160 | } | 191 | } |
161 | set { | 192 | set |
193 | { | ||
162 | _mediaWidth = value; | 194 | _mediaWidth = value; |
163 | } | 195 | } |
164 | } | 196 | } |
@@ -167,11 +199,14 @@ namespace OpenSim.Framework | |||
167 | /// Upper corner of the AABB for the parcel | 199 | /// Upper corner of the AABB for the parcel |
168 | /// </summary> | 200 | /// </summary> |
169 | [XmlIgnore] | 201 | [XmlIgnore] |
170 | public Vector3 AABBMax { | 202 | public Vector3 AABBMax |
171 | get { | 203 | { |
204 | get | ||
205 | { | ||
172 | return _AABBMax; | 206 | return _AABBMax; |
173 | } | 207 | } |
174 | set { | 208 | set |
209 | { | ||
175 | _AABBMax = value; | 210 | _AABBMax = value; |
176 | } | 211 | } |
177 | } | 212 | } |
@@ -179,11 +214,14 @@ namespace OpenSim.Framework | |||
179 | /// Lower corner of the AABB for the parcel | 214 | /// Lower corner of the AABB for the parcel |
180 | /// </summary> | 215 | /// </summary> |
181 | [XmlIgnore] | 216 | [XmlIgnore] |
182 | public Vector3 AABBMin { | 217 | public Vector3 AABBMin |
183 | get { | 218 | { |
219 | get | ||
220 | { | ||
184 | return _AABBMin; | 221 | return _AABBMin; |
185 | } | 222 | } |
186 | set { | 223 | set |
224 | { | ||
187 | _AABBMin = value; | 225 | _AABBMin = value; |
188 | } | 226 | } |
189 | } | 227 | } |
@@ -191,11 +229,14 @@ namespace OpenSim.Framework | |||
191 | /// <summary> | 229 | /// <summary> |
192 | /// Area in meters^2 the parcel contains | 230 | /// Area in meters^2 the parcel contains |
193 | /// </summary> | 231 | /// </summary> |
194 | public int Area { | 232 | public int Area |
195 | get { | 233 | { |
234 | get | ||
235 | { | ||
196 | return _area; | 236 | return _area; |
197 | } | 237 | } |
198 | set { | 238 | set |
239 | { | ||
199 | _area = value; | 240 | _area = value; |
200 | } | 241 | } |
201 | } | 242 | } |
@@ -203,11 +244,14 @@ namespace OpenSim.Framework | |||
203 | /// <summary> | 244 | /// <summary> |
204 | /// ID of auction (3rd Party Integration) when parcel is being auctioned | 245 | /// ID of auction (3rd Party Integration) when parcel is being auctioned |
205 | /// </summary> | 246 | /// </summary> |
206 | public uint AuctionID { | 247 | public uint AuctionID |
207 | get { | 248 | { |
249 | get | ||
250 | { | ||
208 | return _auctionID; | 251 | return _auctionID; |
209 | } | 252 | } |
210 | set { | 253 | set |
254 | { | ||
211 | _auctionID = value; | 255 | _auctionID = value; |
212 | } | 256 | } |
213 | } | 257 | } |
@@ -215,11 +259,14 @@ namespace OpenSim.Framework | |||
215 | /// <summary> | 259 | /// <summary> |
216 | /// UUID of authorized buyer of parcel. This is UUID.Zero if anyone can buy it. | 260 | /// UUID of authorized buyer of parcel. This is UUID.Zero if anyone can buy it. |
217 | /// </summary> | 261 | /// </summary> |
218 | public UUID AuthBuyerID { | 262 | public UUID AuthBuyerID |
219 | get { | 263 | { |
264 | get | ||
265 | { | ||
220 | return _authBuyerID; | 266 | return _authBuyerID; |
221 | } | 267 | } |
222 | set { | 268 | set |
269 | { | ||
223 | _authBuyerID = value; | 270 | _authBuyerID = value; |
224 | } | 271 | } |
225 | } | 272 | } |
@@ -227,11 +274,14 @@ namespace OpenSim.Framework | |||
227 | /// <summary> | 274 | /// <summary> |
228 | /// Category of parcel. Used for classifying the parcel in classified listings | 275 | /// Category of parcel. Used for classifying the parcel in classified listings |
229 | /// </summary> | 276 | /// </summary> |
230 | public ParcelCategory Category { | 277 | public ParcelCategory Category |
231 | get { | 278 | { |
279 | get | ||
280 | { | ||
232 | return _category; | 281 | return _category; |
233 | } | 282 | } |
234 | set { | 283 | set |
284 | { | ||
235 | _category = value; | 285 | _category = value; |
236 | } | 286 | } |
237 | } | 287 | } |
@@ -239,11 +289,14 @@ namespace OpenSim.Framework | |||
239 | /// <summary> | 289 | /// <summary> |
240 | /// Date that the current owner purchased or claimed the parcel | 290 | /// Date that the current owner purchased or claimed the parcel |
241 | /// </summary> | 291 | /// </summary> |
242 | public int ClaimDate { | 292 | public int ClaimDate |
243 | get { | 293 | { |
294 | get | ||
295 | { | ||
244 | return _claimDate; | 296 | return _claimDate; |
245 | } | 297 | } |
246 | set { | 298 | set |
299 | { | ||
247 | _claimDate = value; | 300 | _claimDate = value; |
248 | } | 301 | } |
249 | } | 302 | } |
@@ -251,11 +304,14 @@ namespace OpenSim.Framework | |||
251 | /// <summary> | 304 | /// <summary> |
252 | /// The last price that the parcel was sold at | 305 | /// The last price that the parcel was sold at |
253 | /// </summary> | 306 | /// </summary> |
254 | public int ClaimPrice { | 307 | public int ClaimPrice |
255 | get { | 308 | { |
309 | get | ||
310 | { | ||
256 | return _claimPrice; | 311 | return _claimPrice; |
257 | } | 312 | } |
258 | set { | 313 | set |
314 | { | ||
259 | _claimPrice = value; | 315 | _claimPrice = value; |
260 | } | 316 | } |
261 | } | 317 | } |
@@ -263,11 +319,14 @@ namespace OpenSim.Framework | |||
263 | /// <summary> | 319 | /// <summary> |
264 | /// Global ID for the parcel. (3rd Party Integration) | 320 | /// Global ID for the parcel. (3rd Party Integration) |
265 | /// </summary> | 321 | /// </summary> |
266 | public UUID GlobalID { | 322 | public UUID GlobalID |
267 | get { | 323 | { |
324 | get | ||
325 | { | ||
268 | return _globalID; | 326 | return _globalID; |
269 | } | 327 | } |
270 | set { | 328 | set |
329 | { | ||
271 | _globalID = value; | 330 | _globalID = value; |
272 | } | 331 | } |
273 | } | 332 | } |
@@ -275,11 +334,14 @@ namespace OpenSim.Framework | |||
275 | /// <summary> | 334 | /// <summary> |
276 | /// Unique ID of the Group that owns | 335 | /// Unique ID of the Group that owns |
277 | /// </summary> | 336 | /// </summary> |
278 | public UUID GroupID { | 337 | public UUID GroupID |
279 | get { | 338 | { |
339 | get | ||
340 | { | ||
280 | return _groupID; | 341 | return _groupID; |
281 | } | 342 | } |
282 | set { | 343 | set |
344 | { | ||
283 | _groupID = value; | 345 | _groupID = value; |
284 | } | 346 | } |
285 | } | 347 | } |
@@ -287,11 +349,14 @@ namespace OpenSim.Framework | |||
287 | /// <summary> | 349 | /// <summary> |
288 | /// Returns true if the Land Parcel is owned by a group | 350 | /// Returns true if the Land Parcel is owned by a group |
289 | /// </summary> | 351 | /// </summary> |
290 | public bool IsGroupOwned { | 352 | public bool IsGroupOwned |
291 | get { | 353 | { |
354 | get | ||
355 | { | ||
292 | return _isGroupOwned; | 356 | return _isGroupOwned; |
293 | } | 357 | } |
294 | set { | 358 | set |
359 | { | ||
295 | _isGroupOwned = value; | 360 | _isGroupOwned = value; |
296 | } | 361 | } |
297 | } | 362 | } |
@@ -299,11 +364,14 @@ namespace OpenSim.Framework | |||
299 | /// <summary> | 364 | /// <summary> |
300 | /// jp2 data for the image representative of the parcel in the parcel dialog | 365 | /// jp2 data for the image representative of the parcel in the parcel dialog |
301 | /// </summary> | 366 | /// </summary> |
302 | public byte[] Bitmap { | 367 | public byte[] Bitmap |
303 | get { | 368 | { |
369 | get | ||
370 | { | ||
304 | return _bitmap; | 371 | return _bitmap; |
305 | } | 372 | } |
306 | set { | 373 | set |
374 | { | ||
307 | _bitmap = value; | 375 | _bitmap = value; |
308 | } | 376 | } |
309 | } | 377 | } |
@@ -311,11 +379,14 @@ namespace OpenSim.Framework | |||
311 | /// <summary> | 379 | /// <summary> |
312 | /// Parcel Description | 380 | /// Parcel Description |
313 | /// </summary> | 381 | /// </summary> |
314 | public string Description { | 382 | public string Description |
315 | get { | 383 | { |
384 | get | ||
385 | { | ||
316 | return _description; | 386 | return _description; |
317 | } | 387 | } |
318 | set { | 388 | set |
389 | { | ||
319 | _description = value; | 390 | _description = value; |
320 | } | 391 | } |
321 | } | 392 | } |
@@ -323,11 +394,14 @@ namespace OpenSim.Framework | |||
323 | /// <summary> | 394 | /// <summary> |
324 | /// Parcel settings. Access flags, Fly, NoPush, Voice, Scripts allowed, etc. ParcelFlags | 395 | /// Parcel settings. Access flags, Fly, NoPush, Voice, Scripts allowed, etc. ParcelFlags |
325 | /// </summary> | 396 | /// </summary> |
326 | public uint Flags { | 397 | public uint Flags |
327 | get { | 398 | { |
399 | get | ||
400 | { | ||
328 | return _flags; | 401 | return _flags; |
329 | } | 402 | } |
330 | set { | 403 | set |
404 | { | ||
331 | _flags = value; | 405 | _flags = value; |
332 | } | 406 | } |
333 | } | 407 | } |
@@ -336,11 +410,14 @@ namespace OpenSim.Framework | |||
336 | /// Determines if people are able to teleport where they please on the parcel or if they | 410 | /// Determines if people are able to teleport where they please on the parcel or if they |
337 | /// get constrainted to a specific point on teleport within the parcel | 411 | /// get constrainted to a specific point on teleport within the parcel |
338 | /// </summary> | 412 | /// </summary> |
339 | public byte LandingType { | 413 | public byte LandingType |
340 | get { | 414 | { |
415 | get | ||
416 | { | ||
341 | return _landingType; | 417 | return _landingType; |
342 | } | 418 | } |
343 | set { | 419 | set |
420 | { | ||
344 | _landingType = value; | 421 | _landingType = value; |
345 | } | 422 | } |
346 | } | 423 | } |
@@ -348,11 +425,14 @@ namespace OpenSim.Framework | |||
348 | /// <summary> | 425 | /// <summary> |
349 | /// Parcel Name | 426 | /// Parcel Name |
350 | /// </summary> | 427 | /// </summary> |
351 | public string Name { | 428 | public string Name |
352 | get { | 429 | { |
430 | get | ||
431 | { | ||
353 | return _name; | 432 | return _name; |
354 | } | 433 | } |
355 | set { | 434 | set |
435 | { | ||
356 | _name = value; | 436 | _name = value; |
357 | } | 437 | } |
358 | } | 438 | } |
@@ -360,11 +440,14 @@ namespace OpenSim.Framework | |||
360 | /// <summary> | 440 | /// <summary> |
361 | /// Status of Parcel, Leased, Abandoned, For Sale | 441 | /// Status of Parcel, Leased, Abandoned, For Sale |
362 | /// </summary> | 442 | /// </summary> |
363 | public ParcelStatus Status { | 443 | public ParcelStatus Status |
364 | get { | 444 | { |
445 | get | ||
446 | { | ||
365 | return _status; | 447 | return _status; |
366 | } | 448 | } |
367 | set { | 449 | set |
450 | { | ||
368 | _status = value; | 451 | _status = value; |
369 | } | 452 | } |
370 | } | 453 | } |
@@ -372,11 +455,14 @@ namespace OpenSim.Framework | |||
372 | /// <summary> | 455 | /// <summary> |
373 | /// Internal ID of the parcel. Sometimes the client will try to use this value | 456 | /// Internal ID of the parcel. Sometimes the client will try to use this value |
374 | /// </summary> | 457 | /// </summary> |
375 | public int LocalID { | 458 | public int LocalID |
376 | get { | 459 | { |
460 | get | ||
461 | { | ||
377 | return _localID; | 462 | return _localID; |
378 | } | 463 | } |
379 | set { | 464 | set |
465 | { | ||
380 | _localID = value; | 466 | _localID = value; |
381 | } | 467 | } |
382 | } | 468 | } |
@@ -384,11 +470,14 @@ namespace OpenSim.Framework | |||
384 | /// <summary> | 470 | /// <summary> |
385 | /// Determines if we scale the media based on the surface it's on | 471 | /// Determines if we scale the media based on the surface it's on |
386 | /// </summary> | 472 | /// </summary> |
387 | public byte MediaAutoScale { | 473 | public byte MediaAutoScale |
388 | get { | 474 | { |
475 | get | ||
476 | { | ||
389 | return _mediaAutoScale; | 477 | return _mediaAutoScale; |
390 | } | 478 | } |
391 | set { | 479 | set |
480 | { | ||
392 | _mediaAutoScale = value; | 481 | _mediaAutoScale = value; |
393 | } | 482 | } |
394 | } | 483 | } |
@@ -396,11 +485,14 @@ namespace OpenSim.Framework | |||
396 | /// <summary> | 485 | /// <summary> |
397 | /// Texture Guid to replace with the output of the media stream | 486 | /// Texture Guid to replace with the output of the media stream |
398 | /// </summary> | 487 | /// </summary> |
399 | public UUID MediaID { | 488 | public UUID MediaID |
400 | get { | 489 | { |
490 | get | ||
491 | { | ||
401 | return _mediaID; | 492 | return _mediaID; |
402 | } | 493 | } |
403 | set { | 494 | set |
495 | { | ||
404 | _mediaID = value; | 496 | _mediaID = value; |
405 | } | 497 | } |
406 | } | 498 | } |
@@ -408,11 +500,14 @@ namespace OpenSim.Framework | |||
408 | /// <summary> | 500 | /// <summary> |
409 | /// URL to the media file to display | 501 | /// URL to the media file to display |
410 | /// </summary> | 502 | /// </summary> |
411 | public string MediaURL { | 503 | public string MediaURL |
412 | get { | 504 | { |
505 | get | ||
506 | { | ||
413 | return _mediaURL; | 507 | return _mediaURL; |
414 | } | 508 | } |
415 | set { | 509 | set |
510 | { | ||
416 | _mediaURL = value; | 511 | _mediaURL = value; |
417 | } | 512 | } |
418 | } | 513 | } |
@@ -432,11 +527,14 @@ namespace OpenSim.Framework | |||
432 | /// <summary> | 527 | /// <summary> |
433 | /// URL to the shoutcast music stream to play on the parcel | 528 | /// URL to the shoutcast music stream to play on the parcel |
434 | /// </summary> | 529 | /// </summary> |
435 | public string MusicURL { | 530 | public string MusicURL |
436 | get { | 531 | { |
532 | get | ||
533 | { | ||
437 | return _musicURL; | 534 | return _musicURL; |
438 | } | 535 | } |
439 | set { | 536 | set |
537 | { | ||
440 | _musicURL = value; | 538 | _musicURL = value; |
441 | } | 539 | } |
442 | } | 540 | } |
@@ -445,11 +543,14 @@ namespace OpenSim.Framework | |||
445 | /// Owner Avatar or Group of the parcel. Naturally, all land masses must be | 543 | /// Owner Avatar or Group of the parcel. Naturally, all land masses must be |
446 | /// owned by someone | 544 | /// owned by someone |
447 | /// </summary> | 545 | /// </summary> |
448 | public UUID OwnerID { | 546 | public UUID OwnerID |
449 | get { | 547 | { |
548 | get | ||
549 | { | ||
450 | return _ownerID; | 550 | return _ownerID; |
451 | } | 551 | } |
452 | set { | 552 | set |
553 | { | ||
453 | _ownerID = value; | 554 | _ownerID = value; |
454 | } | 555 | } |
455 | } | 556 | } |
@@ -457,11 +558,14 @@ namespace OpenSim.Framework | |||
457 | /// <summary> | 558 | /// <summary> |
458 | /// List of access data for the parcel. User data, some bitflags, and a time | 559 | /// List of access data for the parcel. User data, some bitflags, and a time |
459 | /// </summary> | 560 | /// </summary> |
460 | public List<LandAccessEntry> ParcelAccessList { | 561 | public List<LandAccessEntry> ParcelAccessList |
461 | get { | 562 | { |
563 | get | ||
564 | { | ||
462 | return _parcelAccessList; | 565 | return _parcelAccessList; |
463 | } | 566 | } |
464 | set { | 567 | set |
568 | { | ||
465 | _parcelAccessList = value; | 569 | _parcelAccessList = value; |
466 | } | 570 | } |
467 | } | 571 | } |
@@ -469,11 +573,14 @@ namespace OpenSim.Framework | |||
469 | /// <summary> | 573 | /// <summary> |
470 | /// How long in hours a Pass to the parcel is given | 574 | /// How long in hours a Pass to the parcel is given |
471 | /// </summary> | 575 | /// </summary> |
472 | public float PassHours { | 576 | public float PassHours |
473 | get { | 577 | { |
578 | get | ||
579 | { | ||
474 | return _passHours; | 580 | return _passHours; |
475 | } | 581 | } |
476 | set { | 582 | set |
583 | { | ||
477 | _passHours = value; | 584 | _passHours = value; |
478 | } | 585 | } |
479 | } | 586 | } |
@@ -481,11 +588,14 @@ namespace OpenSim.Framework | |||
481 | /// <summary> | 588 | /// <summary> |
482 | /// Price to purchase a Pass to a restricted parcel | 589 | /// Price to purchase a Pass to a restricted parcel |
483 | /// </summary> | 590 | /// </summary> |
484 | public int PassPrice { | 591 | public int PassPrice |
485 | get { | 592 | { |
593 | get | ||
594 | { | ||
486 | return _passPrice; | 595 | return _passPrice; |
487 | } | 596 | } |
488 | set { | 597 | set |
598 | { | ||
489 | _passPrice = value; | 599 | _passPrice = value; |
490 | } | 600 | } |
491 | } | 601 | } |
@@ -493,11 +603,14 @@ namespace OpenSim.Framework | |||
493 | /// <summary> | 603 | /// <summary> |
494 | /// When the parcel is being sold, this is the price to purchase the parcel | 604 | /// When the parcel is being sold, this is the price to purchase the parcel |
495 | /// </summary> | 605 | /// </summary> |
496 | public int SalePrice { | 606 | public int SalePrice |
497 | get { | 607 | { |
608 | get | ||
609 | { | ||
498 | return _salePrice; | 610 | return _salePrice; |
499 | } | 611 | } |
500 | set { | 612 | set |
613 | { | ||
501 | _salePrice = value; | 614 | _salePrice = value; |
502 | } | 615 | } |
503 | } | 616 | } |
@@ -506,11 +619,14 @@ namespace OpenSim.Framework | |||
506 | /// Number of meters^2 in the Simulator | 619 | /// Number of meters^2 in the Simulator |
507 | /// </summary> | 620 | /// </summary> |
508 | [XmlIgnore] | 621 | [XmlIgnore] |
509 | public int SimwideArea { | 622 | public int SimwideArea |
510 | get { | 623 | { |
624 | get | ||
625 | { | ||
511 | return _simwideArea; | 626 | return _simwideArea; |
512 | } | 627 | } |
513 | set { | 628 | set |
629 | { | ||
514 | _simwideArea = value; | 630 | _simwideArea = value; |
515 | } | 631 | } |
516 | } | 632 | } |
@@ -519,11 +635,14 @@ namespace OpenSim.Framework | |||
519 | /// Number of SceneObjectPart in the Simulator | 635 | /// Number of SceneObjectPart in the Simulator |
520 | /// </summary> | 636 | /// </summary> |
521 | [XmlIgnore] | 637 | [XmlIgnore] |
522 | public int SimwidePrims { | 638 | public int SimwidePrims |
523 | get { | 639 | { |
640 | get | ||
641 | { | ||
524 | return _simwidePrims; | 642 | return _simwidePrims; |
525 | } | 643 | } |
526 | set { | 644 | set |
645 | { | ||
527 | _simwidePrims = value; | 646 | _simwidePrims = value; |
528 | } | 647 | } |
529 | } | 648 | } |
@@ -531,11 +650,14 @@ namespace OpenSim.Framework | |||
531 | /// <summary> | 650 | /// <summary> |
532 | /// ID of the snapshot used in the client parcel dialog of the parcel | 651 | /// ID of the snapshot used in the client parcel dialog of the parcel |
533 | /// </summary> | 652 | /// </summary> |
534 | public UUID SnapshotID { | 653 | public UUID SnapshotID |
535 | get { | 654 | { |
655 | get | ||
656 | { | ||
536 | return _snapshotID; | 657 | return _snapshotID; |
537 | } | 658 | } |
538 | set { | 659 | set |
660 | { | ||
539 | _snapshotID = value; | 661 | _snapshotID = value; |
540 | } | 662 | } |
541 | } | 663 | } |
@@ -544,11 +666,14 @@ namespace OpenSim.Framework | |||
544 | /// When teleporting is restricted to a certain point, this is the location | 666 | /// When teleporting is restricted to a certain point, this is the location |
545 | /// that the user will be redirected to | 667 | /// that the user will be redirected to |
546 | /// </summary> | 668 | /// </summary> |
547 | public Vector3 UserLocation { | 669 | public Vector3 UserLocation |
548 | get { | 670 | { |
671 | get | ||
672 | { | ||
549 | return _userLocation; | 673 | return _userLocation; |
550 | } | 674 | } |
551 | set { | 675 | set |
676 | { | ||
552 | _userLocation = value; | 677 | _userLocation = value; |
553 | } | 678 | } |
554 | } | 679 | } |
@@ -557,11 +682,14 @@ namespace OpenSim.Framework | |||
557 | /// When teleporting is restricted to a certain point, this is the rotation | 682 | /// When teleporting is restricted to a certain point, this is the rotation |
558 | /// that the user will be positioned | 683 | /// that the user will be positioned |
559 | /// </summary> | 684 | /// </summary> |
560 | public Vector3 UserLookAt { | 685 | public Vector3 UserLookAt |
561 | get { | 686 | { |
687 | get | ||
688 | { | ||
562 | return _userLookAt; | 689 | return _userLookAt; |
563 | } | 690 | } |
564 | set { | 691 | set |
692 | { | ||
565 | _userLookAt = value; | 693 | _userLookAt = value; |
566 | } | 694 | } |
567 | } | 695 | } |
@@ -570,11 +698,14 @@ namespace OpenSim.Framework | |||
570 | /// Autoreturn number of minutes to return SceneObjectGroup that are owned by someone who doesn't own | 698 | /// Autoreturn number of minutes to return SceneObjectGroup that are owned by someone who doesn't own |
571 | /// the parcel and isn't set to the same 'group' as the parcel. | 699 | /// the parcel and isn't set to the same 'group' as the parcel. |
572 | /// </summary> | 700 | /// </summary> |
573 | public int OtherCleanTime { | 701 | public int OtherCleanTime |
574 | get { | 702 | { |
703 | get | ||
704 | { | ||
575 | return _otherCleanTime; | 705 | return _otherCleanTime; |
576 | } | 706 | } |
577 | set { | 707 | set |
708 | { | ||
578 | _otherCleanTime = value; | 709 | _otherCleanTime = value; |
579 | } | 710 | } |
580 | } | 711 | } |
@@ -582,11 +713,14 @@ namespace OpenSim.Framework | |||
582 | /// <summary> | 713 | /// <summary> |
583 | /// parcel media description | 714 | /// parcel media description |
584 | /// </summary> | 715 | /// </summary> |
585 | public string MediaDescription { | 716 | public string MediaDescription |
586 | get { | 717 | { |
718 | get | ||
719 | { | ||
587 | return _mediaDescription; | 720 | return _mediaDescription; |
588 | } | 721 | } |
589 | set { | 722 | set |
723 | { | ||
590 | _mediaDescription = value; | 724 | _mediaDescription = value; |
591 | } | 725 | } |
592 | } | 726 | } |
@@ -622,7 +756,7 @@ namespace OpenSim.Framework | |||
622 | landData._mediaURL = _mediaURL; | 756 | landData._mediaURL = _mediaURL; |
623 | landData._musicURL = _musicURL; | 757 | landData._musicURL = _musicURL; |
624 | landData._ownerID = _ownerID; | 758 | landData._ownerID = _ownerID; |
625 | landData._bitmap = (byte[]) _bitmap.Clone(); | 759 | landData._bitmap = (byte[])_bitmap.Clone(); |
626 | landData._description = _description; | 760 | landData._description = _description; |
627 | landData._flags = _flags; | 761 | landData._flags = _flags; |
628 | landData._name = _name; | 762 | landData._name = _name; |
@@ -643,6 +777,7 @@ namespace OpenSim.Framework | |||
643 | landData._obscureMedia = _obscureMedia; | 777 | landData._obscureMedia = _obscureMedia; |
644 | landData._simwideArea = _simwideArea; | 778 | landData._simwideArea = _simwideArea; |
645 | landData._simwidePrims = _simwidePrims; | 779 | landData._simwidePrims = _simwidePrims; |
780 | landData._dwell = _dwell; | ||
646 | 781 | ||
647 | landData._parcelAccessList.Clear(); | 782 | landData._parcelAccessList.Clear(); |
648 | foreach (LandAccessEntry entry in _parcelAccessList) | 783 | foreach (LandAccessEntry entry in _parcelAccessList) |
diff --git a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs index 9ee0876..446e3c0 100644 --- a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs +++ b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs | |||
@@ -43,27 +43,32 @@ 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 | sb.Append( | 46 | sb.AppendFormat( |
47 | string.Format( | ||
48 | "Allocated to OpenSim objects: {0} MB\n", | 47 | "Allocated to OpenSim objects: {0} MB\n", |
49 | Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0))); | 48 | Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0)); |
49 | |||
50 | sb.AppendFormat( | ||
51 | "OpenSim last object memory churn : {0} MB/s\n", | ||
52 | Math.Round((MemoryWatchdog.LastMemoryChurn * 1000) / 1024.0 / 1024, 3)); | ||
53 | |||
54 | sb.AppendFormat( | ||
55 | "OpenSim average object memory churn : {0} MB/s\n", | ||
56 | Math.Round((MemoryWatchdog.AverageMemoryChurn * 1000) / 1024.0 / 1024, 3)); | ||
50 | 57 | ||
51 | Process myprocess = Process.GetCurrentProcess(); | 58 | Process myprocess = Process.GetCurrentProcess(); |
52 | if (!myprocess.HasExited) | 59 | if (!myprocess.HasExited) |
53 | { | 60 | { |
54 | myprocess.Refresh(); | 61 | myprocess.Refresh(); |
55 | sb.Append( | 62 | sb.AppendFormat( |
56 | string.Format( | ||
57 | "Process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n", | 63 | "Process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n", |
58 | Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0), | 64 | Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0), |
59 | Math.Round(Process.GetCurrentProcess().PagedMemorySize64 / 1024.0 / 1024.0), | 65 | Math.Round(Process.GetCurrentProcess().PagedMemorySize64 / 1024.0 / 1024.0), |
60 | Math.Round(Process.GetCurrentProcess().VirtualMemorySize64 / 1024.0 / 1024.0))); | 66 | Math.Round(Process.GetCurrentProcess().VirtualMemorySize64 / 1024.0 / 1024.0)); |
61 | sb.Append( | 67 | sb.AppendFormat( |
62 | string.Format( | ||
63 | "Peak process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n", | 68 | "Peak process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n", |
64 | Math.Round(Process.GetCurrentProcess().PeakWorkingSet64 / 1024.0 / 1024.0), | 69 | Math.Round(Process.GetCurrentProcess().PeakWorkingSet64 / 1024.0 / 1024.0), |
65 | Math.Round(Process.GetCurrentProcess().PeakPagedMemorySize64 / 1024.0 / 1024.0), | 70 | Math.Round(Process.GetCurrentProcess().PeakPagedMemorySize64 / 1024.0 / 1024.0), |
66 | Math.Round(Process.GetCurrentProcess().PeakVirtualMemorySize64 / 1024.0 / 1024.0))); | 71 | Math.Round(Process.GetCurrentProcess().PeakVirtualMemorySize64 / 1024.0 / 1024.0)); |
67 | } | 72 | } |
68 | else | 73 | else |
69 | sb.Append("Process reported as Exited \n"); | 74 | sb.Append("Process reported as Exited \n"); |
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs index a23cf1f..c6010cd 100644 --- a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs +++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs | |||
@@ -60,7 +60,7 @@ namespace OpenSim.Framework.Monitoring | |||
60 | private static bool m_enabled; | 60 | private static bool m_enabled; |
61 | 61 | ||
62 | /// <summary> | 62 | /// <summary> |
63 | /// Average memory churn in bytes per millisecond. | 63 | /// Last memory churn in bytes per millisecond. |
64 | /// </summary> | 64 | /// </summary> |
65 | public static double AverageMemoryChurn | 65 | public static double AverageMemoryChurn |
66 | { | 66 | { |
@@ -68,6 +68,14 @@ namespace OpenSim.Framework.Monitoring | |||
68 | } | 68 | } |
69 | 69 | ||
70 | /// <summary> | 70 | /// <summary> |
71 | /// Average memory churn in bytes per millisecond. | ||
72 | /// </summary> | ||
73 | public static double LastMemoryChurn | ||
74 | { | ||
75 | get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; } | ||
76 | } | ||
77 | |||
78 | /// <summary> | ||
71 | /// Maximum number of statistical samples. | 79 | /// Maximum number of statistical samples. |
72 | /// </summary> | 80 | /// </summary> |
73 | /// <remarks> | 81 | /// <remarks> |
diff --git a/OpenSim/Framework/Monitoring/Properties/AssemblyInfo.cs b/OpenSim/Framework/Monitoring/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1f2bb40 --- /dev/null +++ b/OpenSim/Framework/Monitoring/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.Monitoring")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("74506fe3-2f9d-44c1-94c9-a30f79d9e0cb")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs index cdd7cc7..aa86202 100644 --- a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs +++ b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs | |||
@@ -355,10 +355,25 @@ Asset service request failures: {3}" + Environment.NewLine, | |||
355 | sb.Append(Environment.NewLine); | 355 | sb.Append(Environment.NewLine); |
356 | sb.Append( | 356 | sb.Append( |
357 | string.Format( | 357 | string.Format( |
358 | "{0,6:0} {1,6:0} {2,6:0} {3,6:0} {4,6:0} {5,6:0.0} {6,6:0.0} {7,6:0.0} {8,6:0.0} {9,6:0.0} {10,6:0.0}", | 358 | "{0,6:0} {1,6:0} {2,6:0} {3,6:0} {4,6:0} {5,6:0.0} {6,6:0.0} {7,6:0.0} {8,6:0.0} {9,6:0.0} {10,6:0.0}\n\n", |
359 | inPacketsPerSecond, outPacketsPerSecond, pendingDownloads, pendingUploads, unackedBytes, totalFrameTime, | 359 | inPacketsPerSecond, outPacketsPerSecond, pendingDownloads, pendingUploads, unackedBytes, totalFrameTime, |
360 | netFrameTime, physicsFrameTime, otherFrameTime, agentFrameTime, imageFrameTime)); | 360 | netFrameTime, physicsFrameTime, otherFrameTime, agentFrameTime, imageFrameTime)); |
361 | sb.Append(Environment.NewLine); | 361 | |
362 | Dictionary<string, Dictionary<string, Stat>> sceneStats; | ||
363 | |||
364 | if (StatsManager.TryGetStats("scene", out sceneStats)) | ||
365 | { | ||
366 | foreach (KeyValuePair<string, Dictionary<string, Stat>> kvp in sceneStats) | ||
367 | { | ||
368 | foreach (Stat stat in kvp.Value.Values) | ||
369 | { | ||
370 | if (stat.Verbosity == StatVerbosity.Info) | ||
371 | { | ||
372 | sb.AppendFormat("{0} ({1}): {2}{3}\n", stat.Name, stat.Container, stat.Value, stat.UnitName); | ||
373 | } | ||
374 | } | ||
375 | } | ||
376 | } | ||
362 | 377 | ||
363 | /* | 378 | /* |
364 | sb.Append(Environment.NewLine); | 379 | sb.Append(Environment.NewLine); |
diff --git a/OpenSim/Framework/Monitoring/Stats/PercentageStat.cs b/OpenSim/Framework/Monitoring/Stats/PercentageStat.cs new file mode 100644 index 0000000..60bed55 --- /dev/null +++ b/OpenSim/Framework/Monitoring/Stats/PercentageStat.cs | |||
@@ -0,0 +1,88 @@ | |||
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 System.Text; | ||
31 | |||
32 | namespace OpenSim.Framework.Monitoring | ||
33 | { | ||
34 | public class PercentageStat : Stat | ||
35 | { | ||
36 | public long Antecedent { get; set; } | ||
37 | public long Consequent { get; set; } | ||
38 | |||
39 | public override double Value | ||
40 | { | ||
41 | get | ||
42 | { | ||
43 | // Asking for an update here means that the updater cannot access this value without infinite recursion. | ||
44 | // XXX: A slightly messy but simple solution may be to flick a flag so we can tell if this is being | ||
45 | // called by the pull action and just return the value. | ||
46 | if (StatType == StatType.Pull) | ||
47 | PullAction(this); | ||
48 | |||
49 | long c = Consequent; | ||
50 | |||
51 | // Avoid any chance of a multi-threaded divide-by-zero | ||
52 | if (c == 0) | ||
53 | return 0; | ||
54 | |||
55 | return (double)Antecedent / c * 100; | ||
56 | } | ||
57 | |||
58 | set | ||
59 | { | ||
60 | throw new InvalidOperationException("Cannot set value on a PercentageStat"); | ||
61 | } | ||
62 | } | ||
63 | |||
64 | public PercentageStat( | ||
65 | string shortName, | ||
66 | string name, | ||
67 | string description, | ||
68 | string category, | ||
69 | string container, | ||
70 | StatType type, | ||
71 | Action<Stat> pullAction, | ||
72 | StatVerbosity verbosity) | ||
73 | : base(shortName, name, description, "%", category, container, type, pullAction, verbosity) {} | ||
74 | |||
75 | public override string ToConsoleString() | ||
76 | { | ||
77 | StringBuilder sb = new StringBuilder(); | ||
78 | |||
79 | sb.AppendFormat( | ||
80 | "{0}.{1}.{2} : {3:0.##}{4} ({5}/{6})", | ||
81 | Category, Container, ShortName, Value, UnitName, Antecedent, Consequent); | ||
82 | |||
83 | AppendMeasuresOfInterest(sb); | ||
84 | |||
85 | return sb.ToString(); | ||
86 | } | ||
87 | } | ||
88 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/Monitoring/Stats/Stat.cs b/OpenSim/Framework/Monitoring/Stats/Stat.cs new file mode 100644 index 0000000..f91251b --- /dev/null +++ b/OpenSim/Framework/Monitoring/Stats/Stat.cs | |||
@@ -0,0 +1,238 @@ | |||
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 System.Text; | ||
31 | |||
32 | namespace OpenSim.Framework.Monitoring | ||
33 | { | ||
34 | /// <summary> | ||
35 | /// Holds individual statistic details | ||
36 | /// </summary> | ||
37 | public class Stat | ||
38 | { | ||
39 | /// <summary> | ||
40 | /// Category of this stat (e.g. cache, scene, etc). | ||
41 | /// </summary> | ||
42 | public string Category { get; private set; } | ||
43 | |||
44 | /// <summary> | ||
45 | /// Containing name for this stat. | ||
46 | /// FIXME: In the case of a scene, this is currently the scene name (though this leaves | ||
47 | /// us with a to-be-resolved problem of non-unique region names). | ||
48 | /// </summary> | ||
49 | /// <value> | ||
50 | /// The container. | ||
51 | /// </value> | ||
52 | public string Container { get; private set; } | ||
53 | |||
54 | public StatType StatType { get; private set; } | ||
55 | |||
56 | public MeasuresOfInterest MeasuresOfInterest { get; private set; } | ||
57 | |||
58 | /// <summary> | ||
59 | /// Action used to update this stat when the value is requested if it's a pull type. | ||
60 | /// </summary> | ||
61 | public Action<Stat> PullAction { get; private set; } | ||
62 | |||
63 | public StatVerbosity Verbosity { get; private set; } | ||
64 | public string ShortName { get; private set; } | ||
65 | public string Name { get; private set; } | ||
66 | public string Description { get; private set; } | ||
67 | public virtual string UnitName { get; private set; } | ||
68 | |||
69 | public virtual double Value | ||
70 | { | ||
71 | get | ||
72 | { | ||
73 | // Asking for an update here means that the updater cannot access this value without infinite recursion. | ||
74 | // XXX: A slightly messy but simple solution may be to flick a flag so we can tell if this is being | ||
75 | // called by the pull action and just return the value. | ||
76 | if (StatType == StatType.Pull) | ||
77 | PullAction(this); | ||
78 | |||
79 | return m_value; | ||
80 | } | ||
81 | |||
82 | set | ||
83 | { | ||
84 | m_value = value; | ||
85 | } | ||
86 | } | ||
87 | |||
88 | private double m_value; | ||
89 | |||
90 | /// <summary> | ||
91 | /// Historical samples for calculating measures of interest average. | ||
92 | /// </summary> | ||
93 | /// <remarks> | ||
94 | /// Will be null if no measures of interest require samples. | ||
95 | /// </remarks> | ||
96 | private static Queue<double> m_samples; | ||
97 | |||
98 | /// <summary> | ||
99 | /// Maximum number of statistical samples. | ||
100 | /// </summary> | ||
101 | /// <remarks> | ||
102 | /// At the moment this corresponds to 1 minute since the sampling rate is every 2.5 seconds as triggered from | ||
103 | /// the main Watchdog. | ||
104 | /// </remarks> | ||
105 | private static int m_maxSamples = 24; | ||
106 | |||
107 | public Stat( | ||
108 | string shortName, | ||
109 | string name, | ||
110 | string description, | ||
111 | string unitName, | ||
112 | string category, | ||
113 | string container, | ||
114 | StatType type, | ||
115 | Action<Stat> pullAction, | ||
116 | StatVerbosity verbosity) | ||
117 | : this( | ||
118 | shortName, | ||
119 | name, | ||
120 | description, | ||
121 | unitName, | ||
122 | category, | ||
123 | container, | ||
124 | type, | ||
125 | MeasuresOfInterest.None, | ||
126 | pullAction, | ||
127 | verbosity) | ||
128 | { | ||
129 | } | ||
130 | |||
131 | /// <summary> | ||
132 | /// Constructor | ||
133 | /// </summary> | ||
134 | /// <param name='shortName'>Short name for the stat. Must not contain spaces. e.g. "LongFrames"</param> | ||
135 | /// <param name='name'>Human readable name for the stat. e.g. "Long frames"</param> | ||
136 | /// <param name='description'>Description of stat</param> | ||
137 | /// <param name='unitName'> | ||
138 | /// Unit name for the stat. Should be preceeded by a space if the unit name isn't normally appeneded immediately to the value. | ||
139 | /// e.g. " frames" | ||
140 | /// </param> | ||
141 | /// <param name='category'>Category under which this stat should appear, e.g. "scene". Do not capitalize.</param> | ||
142 | /// <param name='container'>Entity to which this stat relates. e.g. scene name if this is a per scene stat.</param> | ||
143 | /// <param name='type'>Push or pull</param> | ||
144 | /// <param name='pullAction'>Pull stats need an action to update the stat on request. Push stats should set null here.</param> | ||
145 | /// <param name='moi'>Measures of interest</param> | ||
146 | /// <param name='verbosity'>Verbosity of stat. Controls whether it will appear in short stat display or only full display.</param> | ||
147 | public Stat( | ||
148 | string shortName, | ||
149 | string name, | ||
150 | string description, | ||
151 | string unitName, | ||
152 | string category, | ||
153 | string container, | ||
154 | StatType type, | ||
155 | MeasuresOfInterest moi, | ||
156 | Action<Stat> pullAction, | ||
157 | StatVerbosity verbosity) | ||
158 | { | ||
159 | if (StatsManager.SubCommands.Contains(category)) | ||
160 | throw new Exception( | ||
161 | string.Format("Stat cannot be in category '{0}' since this is reserved for a subcommand", category)); | ||
162 | |||
163 | ShortName = shortName; | ||
164 | Name = name; | ||
165 | Description = description; | ||
166 | UnitName = unitName; | ||
167 | Category = category; | ||
168 | Container = container; | ||
169 | StatType = type; | ||
170 | |||
171 | if (StatType == StatType.Push && pullAction != null) | ||
172 | throw new Exception("A push stat cannot have a pull action"); | ||
173 | else | ||
174 | PullAction = pullAction; | ||
175 | |||
176 | MeasuresOfInterest = moi; | ||
177 | |||
178 | if ((moi & MeasuresOfInterest.AverageChangeOverTime) == MeasuresOfInterest.AverageChangeOverTime) | ||
179 | m_samples = new Queue<double>(m_maxSamples); | ||
180 | |||
181 | Verbosity = verbosity; | ||
182 | } | ||
183 | |||
184 | /// <summary> | ||
185 | /// Record a value in the sample set. | ||
186 | /// </summary> | ||
187 | /// <remarks> | ||
188 | /// Do not call this if MeasuresOfInterest.None | ||
189 | /// </remarks> | ||
190 | public void RecordValue() | ||
191 | { | ||
192 | double newValue = Value; | ||
193 | |||
194 | lock (m_samples) | ||
195 | { | ||
196 | if (m_samples.Count >= m_maxSamples) | ||
197 | m_samples.Dequeue(); | ||
198 | |||
199 | m_samples.Enqueue(newValue); | ||
200 | } | ||
201 | } | ||
202 | |||
203 | public virtual string ToConsoleString() | ||
204 | { | ||
205 | StringBuilder sb = new StringBuilder(); | ||
206 | sb.AppendFormat("{0}.{1}.{2} : {3}{4}", Category, Container, ShortName, Value, UnitName); | ||
207 | |||
208 | AppendMeasuresOfInterest(sb); | ||
209 | |||
210 | return sb.ToString(); | ||
211 | } | ||
212 | |||
213 | protected void AppendMeasuresOfInterest(StringBuilder sb) | ||
214 | { | ||
215 | if ((MeasuresOfInterest & MeasuresOfInterest.AverageChangeOverTime) | ||
216 | == MeasuresOfInterest.AverageChangeOverTime) | ||
217 | { | ||
218 | double totalChange = 0; | ||
219 | double? lastSample = null; | ||
220 | |||
221 | lock (m_samples) | ||
222 | { | ||
223 | foreach (double s in m_samples) | ||
224 | { | ||
225 | if (lastSample != null) | ||
226 | totalChange += s - (double)lastSample; | ||
227 | |||
228 | lastSample = s; | ||
229 | } | ||
230 | } | ||
231 | |||
232 | int divisor = m_samples.Count <= 1 ? 1 : m_samples.Count - 1; | ||
233 | |||
234 | sb.AppendFormat(", {0:0.##}{1}/s", totalChange / divisor / (Watchdog.WATCHDOG_INTERVAL_MS / 1000), UnitName); | ||
235 | } | ||
236 | } | ||
237 | } | ||
238 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs index d78fa6a..0762b01 100644 --- a/OpenSim/Framework/Monitoring/StatsManager.cs +++ b/OpenSim/Framework/Monitoring/StatsManager.cs | |||
@@ -25,6 +25,10 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Text; | ||
31 | |||
28 | namespace OpenSim.Framework.Monitoring | 32 | namespace OpenSim.Framework.Monitoring |
29 | { | 33 | { |
30 | /// <summary> | 34 | /// <summary> |
@@ -32,6 +36,24 @@ namespace OpenSim.Framework.Monitoring | |||
32 | /// </summary> | 36 | /// </summary> |
33 | public class StatsManager | 37 | public class StatsManager |
34 | { | 38 | { |
39 | // Subcommand used to list other stats. | ||
40 | public const string AllSubCommand = "all"; | ||
41 | |||
42 | // Subcommand used to list other stats. | ||
43 | public const string ListSubCommand = "list"; | ||
44 | |||
45 | // All subcommands | ||
46 | public static HashSet<string> SubCommands = new HashSet<string> { AllSubCommand, ListSubCommand }; | ||
47 | |||
48 | /// <summary> | ||
49 | /// Registered stats categorized by category/container/shortname | ||
50 | /// </summary> | ||
51 | /// <remarks> | ||
52 | /// Do not add or remove directly from this dictionary. | ||
53 | /// </remarks> | ||
54 | public static Dictionary<string, Dictionary<string, Dictionary<string, Stat>>> RegisteredStats | ||
55 | = new Dictionary<string, Dictionary<string, Dictionary<string, Stat>>>(); | ||
56 | |||
35 | private static AssetStatsCollector assetStats; | 57 | private static AssetStatsCollector assetStats; |
36 | private static UserStatsCollector userStats; | 58 | private static UserStatsCollector userStats; |
37 | private static SimExtraStatsCollector simExtraStats = new SimExtraStatsCollector(); | 59 | private static SimExtraStatsCollector simExtraStats = new SimExtraStatsCollector(); |
@@ -40,6 +62,75 @@ namespace OpenSim.Framework.Monitoring | |||
40 | public static UserStatsCollector UserStats { get { return userStats; } } | 62 | public static UserStatsCollector UserStats { get { return userStats; } } |
41 | public static SimExtraStatsCollector SimExtraStats { get { return simExtraStats; } } | 63 | public static SimExtraStatsCollector SimExtraStats { get { return simExtraStats; } } |
42 | 64 | ||
65 | public static void RegisterConsoleCommands(ICommandConsole console) | ||
66 | { | ||
67 | console.Commands.AddCommand( | ||
68 | "General", | ||
69 | false, | ||
70 | "show stats", | ||
71 | "show stats [list|all|<category>]", | ||
72 | "Show statistical information for this server", | ||
73 | "If no final argument is specified then legacy statistics information is currently shown.\n" | ||
74 | + "If list is specified then statistic categories are shown.\n" | ||
75 | + "If all is specified then all registered statistics are shown.\n" | ||
76 | + "If a category name is specified then only statistics from that category are shown.\n" | ||
77 | + "THIS STATS FACILITY IS EXPERIMENTAL AND DOES NOT YET CONTAIN ALL STATS", | ||
78 | HandleShowStatsCommand); | ||
79 | } | ||
80 | |||
81 | public static void HandleShowStatsCommand(string module, string[] cmd) | ||
82 | { | ||
83 | ICommandConsole con = MainConsole.Instance; | ||
84 | |||
85 | if (cmd.Length > 2) | ||
86 | { | ||
87 | var categoryName = cmd[2]; | ||
88 | |||
89 | if (categoryName == AllSubCommand) | ||
90 | { | ||
91 | foreach (var category in RegisteredStats.Values) | ||
92 | { | ||
93 | OutputCategoryStatsToConsole(con, category); | ||
94 | } | ||
95 | } | ||
96 | else if (categoryName == ListSubCommand) | ||
97 | { | ||
98 | con.Output("Statistic categories available are:"); | ||
99 | foreach (string category in RegisteredStats.Keys) | ||
100 | con.OutputFormat(" {0}", category); | ||
101 | } | ||
102 | else | ||
103 | { | ||
104 | Dictionary<string, Dictionary<string, Stat>> category; | ||
105 | if (!RegisteredStats.TryGetValue(categoryName, out category)) | ||
106 | { | ||
107 | con.OutputFormat("No such category as {0}", categoryName); | ||
108 | } | ||
109 | else | ||
110 | { | ||
111 | OutputCategoryStatsToConsole(con, category); | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | else | ||
116 | { | ||
117 | // Legacy | ||
118 | con.Output(SimExtraStats.Report()); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | private static void OutputCategoryStatsToConsole( | ||
123 | ICommandConsole con, Dictionary<string, Dictionary<string, Stat>> category) | ||
124 | { | ||
125 | foreach (var container in category.Values) | ||
126 | { | ||
127 | foreach (Stat stat in container.Values) | ||
128 | { | ||
129 | con.Output(stat.ToConsoleString()); | ||
130 | } | ||
131 | } | ||
132 | } | ||
133 | |||
43 | /// <summary> | 134 | /// <summary> |
44 | /// Start collecting statistics related to assets. | 135 | /// Start collecting statistics related to assets. |
45 | /// Should only be called once. | 136 | /// Should only be called once. |
@@ -61,5 +152,153 @@ namespace OpenSim.Framework.Monitoring | |||
61 | 152 | ||
62 | return userStats; | 153 | return userStats; |
63 | } | 154 | } |
155 | |||
156 | /// <summary> | ||
157 | /// Registers a statistic. | ||
158 | /// </summary> | ||
159 | /// <param name='stat'></param> | ||
160 | /// <returns></returns> | ||
161 | public static bool RegisterStat(Stat stat) | ||
162 | { | ||
163 | Dictionary<string, Dictionary<string, Stat>> category = null, newCategory; | ||
164 | Dictionary<string, Stat> container = null, newContainer; | ||
165 | |||
166 | lock (RegisteredStats) | ||
167 | { | ||
168 | // Stat name is not unique across category/container/shortname key. | ||
169 | // XXX: For now just return false. This is to avoid problems in regression tests where all tests | ||
170 | // in a class are run in the same instance of the VM. | ||
171 | if (TryGetStat(stat, out category, out container)) | ||
172 | return false; | ||
173 | |||
174 | // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed. | ||
175 | // This means that we don't need to lock or copy them on iteration, which will be a much more | ||
176 | // common operation after startup. | ||
177 | if (container != null) | ||
178 | newContainer = new Dictionary<string, Stat>(container); | ||
179 | else | ||
180 | newContainer = new Dictionary<string, Stat>(); | ||
181 | |||
182 | if (category != null) | ||
183 | newCategory = new Dictionary<string, Dictionary<string, Stat>>(category); | ||
184 | else | ||
185 | newCategory = new Dictionary<string, Dictionary<string, Stat>>(); | ||
186 | |||
187 | newContainer[stat.ShortName] = stat; | ||
188 | newCategory[stat.Container] = newContainer; | ||
189 | RegisteredStats[stat.Category] = newCategory; | ||
190 | } | ||
191 | |||
192 | return true; | ||
193 | } | ||
194 | |||
195 | /// <summary> | ||
196 | /// Deregister a statistic | ||
197 | /// </summary>> | ||
198 | /// <param name='stat'></param> | ||
199 | /// <returns></returns | ||
200 | public static bool DeregisterStat(Stat stat) | ||
201 | { | ||
202 | Dictionary<string, Dictionary<string, Stat>> category = null, newCategory; | ||
203 | Dictionary<string, Stat> container = null, newContainer; | ||
204 | |||
205 | lock (RegisteredStats) | ||
206 | { | ||
207 | if (!TryGetStat(stat, out category, out container)) | ||
208 | return false; | ||
209 | |||
210 | newContainer = new Dictionary<string, Stat>(container); | ||
211 | newContainer.Remove(stat.ShortName); | ||
212 | |||
213 | newCategory = new Dictionary<string, Dictionary<string, Stat>>(category); | ||
214 | newCategory.Remove(stat.Container); | ||
215 | |||
216 | newCategory[stat.Container] = newContainer; | ||
217 | RegisteredStats[stat.Category] = newCategory; | ||
218 | |||
219 | return true; | ||
220 | } | ||
221 | } | ||
222 | |||
223 | public static bool TryGetStats(string category, out Dictionary<string, Dictionary<string, Stat>> stats) | ||
224 | { | ||
225 | return RegisteredStats.TryGetValue(category, out stats); | ||
226 | } | ||
227 | |||
228 | public static bool TryGetStat( | ||
229 | Stat stat, | ||
230 | out Dictionary<string, Dictionary<string, Stat>> category, | ||
231 | out Dictionary<string, Stat> container) | ||
232 | { | ||
233 | category = null; | ||
234 | container = null; | ||
235 | |||
236 | lock (RegisteredStats) | ||
237 | { | ||
238 | if (RegisteredStats.TryGetValue(stat.Category, out category)) | ||
239 | { | ||
240 | if (category.TryGetValue(stat.Container, out container)) | ||
241 | { | ||
242 | if (container.ContainsKey(stat.ShortName)) | ||
243 | return true; | ||
244 | } | ||
245 | } | ||
246 | } | ||
247 | |||
248 | return false; | ||
249 | } | ||
250 | |||
251 | public static void RecordStats() | ||
252 | { | ||
253 | lock (RegisteredStats) | ||
254 | { | ||
255 | foreach (Dictionary<string, Dictionary<string, Stat>> category in RegisteredStats.Values) | ||
256 | { | ||
257 | foreach (Dictionary<string, Stat> container in category.Values) | ||
258 | { | ||
259 | foreach (Stat stat in container.Values) | ||
260 | { | ||
261 | if (stat.MeasuresOfInterest != MeasuresOfInterest.None) | ||
262 | stat.RecordValue(); | ||
263 | } | ||
264 | } | ||
265 | } | ||
266 | } | ||
267 | } | ||
268 | } | ||
269 | |||
270 | /// <summary> | ||
271 | /// Stat type. | ||
272 | /// </summary> | ||
273 | /// <remarks> | ||
274 | /// A push stat is one which is continually updated and so it's value can simply by read. | ||
275 | /// A pull stat is one where reading the value triggers a collection method - the stat is not continually updated. | ||
276 | /// </remarks> | ||
277 | public enum StatType | ||
278 | { | ||
279 | Push, | ||
280 | Pull | ||
281 | } | ||
282 | |||
283 | /// <summary> | ||
284 | /// Measures of interest for this stat. | ||
285 | /// </summary> | ||
286 | [Flags] | ||
287 | public enum MeasuresOfInterest | ||
288 | { | ||
289 | None, | ||
290 | AverageChangeOverTime | ||
291 | } | ||
292 | |||
293 | /// <summary> | ||
294 | /// Verbosity of stat. | ||
295 | /// </summary> | ||
296 | /// <remarks> | ||
297 | /// Info will always be displayed. | ||
298 | /// </remarks> | ||
299 | public enum StatVerbosity | ||
300 | { | ||
301 | Debug, | ||
302 | Info | ||
64 | } | 303 | } |
65 | } \ No newline at end of file | 304 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Monitoring/Watchdog.cs b/OpenSim/Framework/Monitoring/Watchdog.cs index b709baa..69d2db5 100644 --- a/OpenSim/Framework/Monitoring/Watchdog.cs +++ b/OpenSim/Framework/Monitoring/Watchdog.cs | |||
@@ -39,7 +39,7 @@ namespace OpenSim.Framework.Monitoring | |||
39 | public static class Watchdog | 39 | public static class Watchdog |
40 | { | 40 | { |
41 | /// <summary>Timer interval in milliseconds for the watchdog timer</summary> | 41 | /// <summary>Timer interval in milliseconds for the watchdog timer</summary> |
42 | const double WATCHDOG_INTERVAL_MS = 2500.0d; | 42 | public const double WATCHDOG_INTERVAL_MS = 2500.0d; |
43 | 43 | ||
44 | /// <summary>Default timeout in milliseconds before a thread is considered dead</summary> | 44 | /// <summary>Default timeout in milliseconds before a thread is considered dead</summary> |
45 | public const int DEFAULT_WATCHDOG_TIMEOUT_MS = 5000; | 45 | public const int DEFAULT_WATCHDOG_TIMEOUT_MS = 5000; |
@@ -89,6 +89,17 @@ namespace OpenSim.Framework.Monitoring | |||
89 | FirstTick = Environment.TickCount & Int32.MaxValue; | 89 | FirstTick = Environment.TickCount & Int32.MaxValue; |
90 | LastTick = FirstTick; | 90 | LastTick = FirstTick; |
91 | } | 91 | } |
92 | |||
93 | public ThreadWatchdogInfo(ThreadWatchdogInfo previousTwi) | ||
94 | { | ||
95 | Thread = previousTwi.Thread; | ||
96 | FirstTick = previousTwi.FirstTick; | ||
97 | LastTick = previousTwi.LastTick; | ||
98 | Timeout = previousTwi.Timeout; | ||
99 | IsTimedOut = previousTwi.IsTimedOut; | ||
100 | AlarmIfTimeout = previousTwi.AlarmIfTimeout; | ||
101 | AlarmMethod = previousTwi.AlarmMethod; | ||
102 | } | ||
92 | } | 103 | } |
93 | 104 | ||
94 | /// <summary> | 105 | /// <summary> |
@@ -220,7 +231,25 @@ namespace OpenSim.Framework.Monitoring | |||
220 | private static bool RemoveThread(int threadID) | 231 | private static bool RemoveThread(int threadID) |
221 | { | 232 | { |
222 | lock (m_threads) | 233 | lock (m_threads) |
223 | return m_threads.Remove(threadID); | 234 | { |
235 | ThreadWatchdogInfo twi; | ||
236 | if (m_threads.TryGetValue(threadID, out twi)) | ||
237 | { | ||
238 | m_log.DebugFormat( | ||
239 | "[WATCHDOG]: Removing thread {0}, ID {1}", twi.Thread.Name, twi.Thread.ManagedThreadId); | ||
240 | |||
241 | m_threads.Remove(threadID); | ||
242 | |||
243 | return true; | ||
244 | } | ||
245 | else | ||
246 | { | ||
247 | m_log.WarnFormat( | ||
248 | "[WATCHDOG]: Requested to remove thread with ID {0} but this is not being monitored", threadID); | ||
249 | |||
250 | return false; | ||
251 | } | ||
252 | } | ||
224 | } | 253 | } |
225 | 254 | ||
226 | public static bool AbortThread(int threadID) | 255 | public static bool AbortThread(int threadID) |
@@ -335,7 +364,9 @@ namespace OpenSim.Framework.Monitoring | |||
335 | if (callbackInfos == null) | 364 | if (callbackInfos == null) |
336 | callbackInfos = new List<ThreadWatchdogInfo>(); | 365 | callbackInfos = new List<ThreadWatchdogInfo>(); |
337 | 366 | ||
338 | callbackInfos.Add(threadInfo); | 367 | // Send a copy of the watchdog info to prevent race conditions where the watchdog |
368 | // thread updates the monitoring info after an alarm has been sent out. | ||
369 | callbackInfos.Add(new ThreadWatchdogInfo(threadInfo)); | ||
339 | } | 370 | } |
340 | } | 371 | } |
341 | } | 372 | } |
@@ -349,6 +380,8 @@ namespace OpenSim.Framework.Monitoring | |||
349 | if (MemoryWatchdog.Enabled) | 380 | if (MemoryWatchdog.Enabled) |
350 | MemoryWatchdog.Update(); | 381 | MemoryWatchdog.Update(); |
351 | 382 | ||
383 | StatsManager.RecordStats(); | ||
384 | |||
352 | m_watchdogTimer.Start(); | 385 | m_watchdogTimer.Start(); |
353 | } | 386 | } |
354 | } | 387 | } |
diff --git a/OpenSim/Framework/PacketPool.cs b/OpenSim/Framework/PacketPool.cs deleted file mode 100644 index 41d17c5..0000000 --- a/OpenSim/Framework/PacketPool.cs +++ /dev/null | |||
@@ -1,247 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using OpenMetaverse; | ||
32 | using OpenMetaverse.Packets; | ||
33 | using log4net; | ||
34 | |||
35 | namespace OpenSim.Framework | ||
36 | { | ||
37 | |||
38 | public sealed class PacketPool | ||
39 | { | ||
40 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
41 | |||
42 | private static readonly PacketPool instance = new PacketPool(); | ||
43 | |||
44 | private bool packetPoolEnabled = true; | ||
45 | private bool dataBlockPoolEnabled = true; | ||
46 | |||
47 | private readonly Dictionary<PacketType, Stack<Packet>> pool = new Dictionary<PacketType, Stack<Packet>>(); | ||
48 | |||
49 | private static Dictionary<Type, Stack<Object>> DataBlocks = | ||
50 | new Dictionary<Type, Stack<Object>>(); | ||
51 | |||
52 | static PacketPool() | ||
53 | { | ||
54 | } | ||
55 | |||
56 | public static PacketPool Instance | ||
57 | { | ||
58 | get { return instance; } | ||
59 | } | ||
60 | |||
61 | public bool RecyclePackets | ||
62 | { | ||
63 | set { packetPoolEnabled = value; } | ||
64 | get { return packetPoolEnabled; } | ||
65 | } | ||
66 | |||
67 | public bool RecycleDataBlocks | ||
68 | { | ||
69 | set { dataBlockPoolEnabled = value; } | ||
70 | get { return dataBlockPoolEnabled; } | ||
71 | } | ||
72 | |||
73 | public Packet GetPacket(PacketType type) | ||
74 | { | ||
75 | Packet packet; | ||
76 | |||
77 | if (!packetPoolEnabled) | ||
78 | return Packet.BuildPacket(type); | ||
79 | |||
80 | lock (pool) | ||
81 | { | ||
82 | if (!pool.ContainsKey(type) || pool[type] == null || (pool[type]).Count == 0) | ||
83 | { | ||
84 | // Creating a new packet if we cannot reuse an old package | ||
85 | packet = Packet.BuildPacket(type); | ||
86 | } | ||
87 | else | ||
88 | { | ||
89 | // Recycle old packages | ||
90 | packet = (pool[type]).Pop(); | ||
91 | } | ||
92 | } | ||
93 | |||
94 | return packet; | ||
95 | } | ||
96 | |||
97 | // private byte[] decoded_header = new byte[10]; | ||
98 | private static PacketType GetType(byte[] bytes) | ||
99 | { | ||
100 | byte[] decoded_header = new byte[10 + 8]; | ||
101 | ushort id; | ||
102 | PacketFrequency freq; | ||
103 | |||
104 | if ((bytes[0] & Helpers.MSG_ZEROCODED) != 0) | ||
105 | { | ||
106 | Helpers.ZeroDecode(bytes, 16, decoded_header); | ||
107 | } | ||
108 | else | ||
109 | { | ||
110 | Buffer.BlockCopy(bytes, 0, decoded_header, 0, 10); | ||
111 | } | ||
112 | |||
113 | if (decoded_header[6] == 0xFF) | ||
114 | { | ||
115 | if (decoded_header[7] == 0xFF) | ||
116 | { | ||
117 | id = (ushort) ((decoded_header[8] << 8) + decoded_header[9]); | ||
118 | freq = PacketFrequency.Low; | ||
119 | } | ||
120 | else | ||
121 | { | ||
122 | id = decoded_header[7]; | ||
123 | freq = PacketFrequency.Medium; | ||
124 | } | ||
125 | } | ||
126 | else | ||
127 | { | ||
128 | id = decoded_header[6]; | ||
129 | freq = PacketFrequency.High; | ||
130 | } | ||
131 | |||
132 | return Packet.GetType(id, freq); | ||
133 | } | ||
134 | |||
135 | public Packet GetPacket(byte[] bytes, ref int packetEnd, byte[] zeroBuffer) | ||
136 | { | ||
137 | PacketType type = GetType(bytes); | ||
138 | |||
139 | Array.Clear(zeroBuffer, 0, zeroBuffer.Length); | ||
140 | |||
141 | int i = 0; | ||
142 | Packet packet = GetPacket(type); | ||
143 | if (packet == null) | ||
144 | m_log.WarnFormat("[PACKETPOOL]: Failed to get packet of type {0}", type); | ||
145 | else | ||
146 | packet.FromBytes(bytes, ref i, ref packetEnd, zeroBuffer); | ||
147 | |||
148 | return packet; | ||
149 | } | ||
150 | |||
151 | /// <summary> | ||
152 | /// Return a packet to the packet pool | ||
153 | /// </summary> | ||
154 | /// <param name="packet"></param> | ||
155 | public void ReturnPacket(Packet packet) | ||
156 | { | ||
157 | if (dataBlockPoolEnabled) | ||
158 | { | ||
159 | switch (packet.Type) | ||
160 | { | ||
161 | case PacketType.ObjectUpdate: | ||
162 | ObjectUpdatePacket oup = (ObjectUpdatePacket)packet; | ||
163 | |||
164 | foreach (ObjectUpdatePacket.ObjectDataBlock oupod in oup.ObjectData) | ||
165 | ReturnDataBlock<ObjectUpdatePacket.ObjectDataBlock>(oupod); | ||
166 | |||
167 | oup.ObjectData = null; | ||
168 | break; | ||
169 | |||
170 | case PacketType.ImprovedTerseObjectUpdate: | ||
171 | ImprovedTerseObjectUpdatePacket itoup = (ImprovedTerseObjectUpdatePacket)packet; | ||
172 | |||
173 | foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock itoupod in itoup.ObjectData) | ||
174 | ReturnDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(itoupod); | ||
175 | |||
176 | itoup.ObjectData = null; | ||
177 | break; | ||
178 | } | ||
179 | } | ||
180 | |||
181 | if (packetPoolEnabled) | ||
182 | { | ||
183 | switch (packet.Type) | ||
184 | { | ||
185 | // List pooling packets here | ||
186 | case PacketType.PacketAck: | ||
187 | case PacketType.ObjectUpdate: | ||
188 | case PacketType.ImprovedTerseObjectUpdate: | ||
189 | lock (pool) | ||
190 | { | ||
191 | PacketType type = packet.Type; | ||
192 | |||
193 | if (!pool.ContainsKey(type)) | ||
194 | { | ||
195 | pool[type] = new Stack<Packet>(); | ||
196 | } | ||
197 | |||
198 | if ((pool[type]).Count < 50) | ||
199 | { | ||
200 | (pool[type]).Push(packet); | ||
201 | } | ||
202 | } | ||
203 | break; | ||
204 | |||
205 | // Other packets wont pool | ||
206 | default: | ||
207 | return; | ||
208 | } | ||
209 | } | ||
210 | } | ||
211 | |||
212 | public static T GetDataBlock<T>() where T: new() | ||
213 | { | ||
214 | lock (DataBlocks) | ||
215 | { | ||
216 | Stack<Object> s; | ||
217 | |||
218 | if (DataBlocks.TryGetValue(typeof(T), out s)) | ||
219 | { | ||
220 | if (s.Count > 0) | ||
221 | return (T)s.Pop(); | ||
222 | } | ||
223 | else | ||
224 | { | ||
225 | DataBlocks[typeof(T)] = new Stack<Object>(); | ||
226 | } | ||
227 | |||
228 | return new T(); | ||
229 | } | ||
230 | } | ||
231 | |||
232 | public static void ReturnDataBlock<T>(T block) where T: new() | ||
233 | { | ||
234 | if (block == null) | ||
235 | return; | ||
236 | |||
237 | lock (DataBlocks) | ||
238 | { | ||
239 | if (!DataBlocks.ContainsKey(typeof(T))) | ||
240 | DataBlocks[typeof(T)] = new Stack<Object>(); | ||
241 | |||
242 | if (DataBlocks[typeof(T)].Count < 50) | ||
243 | DataBlocks[typeof(T)].Push(block); | ||
244 | } | ||
245 | } | ||
246 | } | ||
247 | } | ||
diff --git a/OpenSim/Framework/Pool.cs b/OpenSim/Framework/Pool.cs new file mode 100644 index 0000000..5484f5c --- /dev/null +++ b/OpenSim/Framework/Pool.cs | |||
@@ -0,0 +1,91 @@ | |||
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 | |||
31 | namespace OpenSim.Framework | ||
32 | { | ||
33 | /// <summary> | ||
34 | /// Naive pool implementation. | ||
35 | /// </summary> | ||
36 | /// <remarks> | ||
37 | /// Currently assumes that objects are in a useable state when returned. | ||
38 | /// </remarks> | ||
39 | public class Pool<T> | ||
40 | { | ||
41 | /// <summary> | ||
42 | /// Number of objects in the pool. | ||
43 | /// </summary> | ||
44 | public int Count | ||
45 | { | ||
46 | get | ||
47 | { | ||
48 | lock (m_pool) | ||
49 | return m_pool.Count; | ||
50 | } | ||
51 | } | ||
52 | |||
53 | private Stack<T> m_pool; | ||
54 | |||
55 | /// <summary> | ||
56 | /// Maximum pool size. Beyond this, any returned objects are not pooled. | ||
57 | /// </summary> | ||
58 | private int m_maxPoolSize; | ||
59 | |||
60 | private Func<T> m_createFunction; | ||
61 | |||
62 | public Pool(Func<T> createFunction, int maxSize) | ||
63 | { | ||
64 | m_maxPoolSize = maxSize; | ||
65 | m_createFunction = createFunction; | ||
66 | m_pool = new Stack<T>(m_maxPoolSize); | ||
67 | } | ||
68 | |||
69 | public T GetObject() | ||
70 | { | ||
71 | lock (m_pool) | ||
72 | { | ||
73 | if (m_pool.Count > 0) | ||
74 | return m_pool.Pop(); | ||
75 | else | ||
76 | return m_createFunction(); | ||
77 | } | ||
78 | } | ||
79 | |||
80 | public void ReturnObject(T obj) | ||
81 | { | ||
82 | lock (m_pool) | ||
83 | { | ||
84 | if (m_pool.Count >= m_maxPoolSize) | ||
85 | return; | ||
86 | else | ||
87 | m_pool.Push(obj); | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/RegionFlags.cs b/OpenSim/Framework/RegionFlags.cs new file mode 100644 index 0000000..a3089b0 --- /dev/null +++ b/OpenSim/Framework/RegionFlags.cs | |||
@@ -0,0 +1,53 @@ | |||
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 | |||
30 | namespace OpenSim.Framework | ||
31 | { | ||
32 | /// <summary> | ||
33 | /// Region flags used internally by OpenSimulator to store installation specific information about regions. | ||
34 | /// </summary> | ||
35 | /// <remarks> | ||
36 | /// Don't confuse with OpenMetaverse.RegionFlags which are client facing flags (i.e. they go over the wire). | ||
37 | /// Returned by IGridService.GetRegionFlags() | ||
38 | /// </remarks> | ||
39 | [Flags] | ||
40 | public enum RegionFlags : int | ||
41 | { | ||
42 | DefaultRegion = 1, // Used for new Rez. Random if multiple defined | ||
43 | FallbackRegion = 2, // Regions we redirect to when the destination is down | ||
44 | RegionOnline = 4, // Set when a region comes online, unset when it unregisters and DeleteOnUnregister is false | ||
45 | NoDirectLogin = 8, // Region unavailable for direct logins (by name) | ||
46 | Persistent = 16, // Don't remove on unregister | ||
47 | LockedOut = 32, // Don't allow registration | ||
48 | NoMove = 64, // Don't allow moving this region | ||
49 | Reservation = 128, // This is an inactive reservation | ||
50 | Authenticate = 256, // Require authentication | ||
51 | Hyperlink = 512 // Record represents a HG link | ||
52 | } | ||
53 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index 4bde7be..e7bed6a 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs | |||
@@ -122,10 +122,13 @@ namespace OpenSim.Framework | |||
122 | public UUID lastMapUUID = UUID.Zero; | 122 | public UUID lastMapUUID = UUID.Zero; |
123 | public string lastMapRefresh = "0"; | 123 | public string lastMapRefresh = "0"; |
124 | 124 | ||
125 | private float m_nonphysPrimMin = 0; | ||
125 | private int m_nonphysPrimMax = 0; | 126 | private int m_nonphysPrimMax = 0; |
127 | private float m_physPrimMin = 0; | ||
126 | private int m_physPrimMax = 0; | 128 | private int m_physPrimMax = 0; |
127 | private bool m_clampPrimSize = false; | 129 | private bool m_clampPrimSize = false; |
128 | private int m_objectCapacity = 0; | 130 | private int m_objectCapacity = 0; |
131 | private int m_linksetCapacity = 0; | ||
129 | private int m_agentCapacity = 0; | 132 | private int m_agentCapacity = 0; |
130 | private string m_regionType = String.Empty; | 133 | private string m_regionType = String.Empty; |
131 | private RegionLightShareData m_windlight = new RegionLightShareData(); | 134 | private RegionLightShareData m_windlight = new RegionLightShareData(); |
@@ -287,11 +290,21 @@ namespace OpenSim.Framework | |||
287 | set { m_windlight = value; } | 290 | set { m_windlight = value; } |
288 | } | 291 | } |
289 | 292 | ||
293 | public float NonphysPrimMin | ||
294 | { | ||
295 | get { return m_nonphysPrimMin; } | ||
296 | } | ||
297 | |||
290 | public int NonphysPrimMax | 298 | public int NonphysPrimMax |
291 | { | 299 | { |
292 | get { return m_nonphysPrimMax; } | 300 | get { return m_nonphysPrimMax; } |
293 | } | 301 | } |
294 | 302 | ||
303 | public float PhysPrimMin | ||
304 | { | ||
305 | get { return m_physPrimMin; } | ||
306 | } | ||
307 | |||
295 | public int PhysPrimMax | 308 | public int PhysPrimMax |
296 | { | 309 | { |
297 | get { return m_physPrimMax; } | 310 | get { return m_physPrimMax; } |
@@ -307,6 +320,11 @@ namespace OpenSim.Framework | |||
307 | get { return m_objectCapacity; } | 320 | get { return m_objectCapacity; } |
308 | } | 321 | } |
309 | 322 | ||
323 | public int LinksetCapacity | ||
324 | { | ||
325 | get { return m_linksetCapacity; } | ||
326 | } | ||
327 | |||
310 | public int AgentCapacity | 328 | public int AgentCapacity |
311 | { | 329 | { |
312 | get { return m_agentCapacity; } | 330 | get { return m_agentCapacity; } |
@@ -625,16 +643,31 @@ namespace OpenSim.Framework | |||
625 | m_regionType = config.GetString("RegionType", String.Empty); | 643 | m_regionType = config.GetString("RegionType", String.Empty); |
626 | allKeys.Remove("RegionType"); | 644 | allKeys.Remove("RegionType"); |
627 | 645 | ||
628 | // Prim stuff | 646 | #region Prim stuff |
629 | // | 647 | |
630 | m_nonphysPrimMax = config.GetInt("NonphysicalPrimMax", 0); | 648 | m_nonphysPrimMin = config.GetFloat("NonPhysicalPrimMin", 0); |
631 | allKeys.Remove("NonphysicalPrimMax"); | 649 | allKeys.Remove("NonPhysicalPrimMin"); |
650 | |||
651 | m_nonphysPrimMax = config.GetInt("NonPhysicalPrimMax", 0); | ||
652 | allKeys.Remove("NonPhysicalPrimMax"); | ||
653 | |||
654 | m_physPrimMin = config.GetFloat("PhysicalPrimMin", 0); | ||
655 | allKeys.Remove("PhysicalPrimMin"); | ||
656 | |||
632 | m_physPrimMax = config.GetInt("PhysicalPrimMax", 0); | 657 | m_physPrimMax = config.GetInt("PhysicalPrimMax", 0); |
633 | allKeys.Remove("PhysicalPrimMax"); | 658 | allKeys.Remove("PhysicalPrimMax"); |
659 | |||
634 | m_clampPrimSize = config.GetBoolean("ClampPrimSize", false); | 660 | m_clampPrimSize = config.GetBoolean("ClampPrimSize", false); |
635 | allKeys.Remove("ClampPrimSize"); | 661 | allKeys.Remove("ClampPrimSize"); |
662 | |||
636 | m_objectCapacity = config.GetInt("MaxPrims", 15000); | 663 | m_objectCapacity = config.GetInt("MaxPrims", 15000); |
637 | allKeys.Remove("MaxPrims"); | 664 | allKeys.Remove("MaxPrims"); |
665 | |||
666 | m_linksetCapacity = config.GetInt("LinksetPrims", 0); | ||
667 | allKeys.Remove("LinksetPrims"); | ||
668 | |||
669 | #endregion | ||
670 | |||
638 | m_agentCapacity = config.GetInt("MaxAgents", 100); | 671 | m_agentCapacity = config.GetInt("MaxAgents", 100); |
639 | allKeys.Remove("MaxAgents"); | 672 | allKeys.Remove("MaxAgents"); |
640 | 673 | ||
@@ -673,16 +706,27 @@ namespace OpenSim.Framework | |||
673 | 706 | ||
674 | config.Set("ExternalHostName", m_externalHostName); | 707 | config.Set("ExternalHostName", m_externalHostName); |
675 | 708 | ||
676 | if (m_nonphysPrimMax != 0) | 709 | if (m_nonphysPrimMin > 0) |
710 | config.Set("NonphysicalPrimMax", m_nonphysPrimMin); | ||
711 | |||
712 | if (m_nonphysPrimMax > 0) | ||
677 | config.Set("NonphysicalPrimMax", m_nonphysPrimMax); | 713 | config.Set("NonphysicalPrimMax", m_nonphysPrimMax); |
678 | if (m_physPrimMax != 0) | 714 | |
715 | if (m_physPrimMin > 0) | ||
716 | config.Set("PhysicalPrimMax", m_physPrimMin); | ||
717 | |||
718 | if (m_physPrimMax > 0) | ||
679 | config.Set("PhysicalPrimMax", m_physPrimMax); | 719 | config.Set("PhysicalPrimMax", m_physPrimMax); |
720 | |||
680 | config.Set("ClampPrimSize", m_clampPrimSize.ToString()); | 721 | config.Set("ClampPrimSize", m_clampPrimSize.ToString()); |
681 | 722 | ||
682 | if (m_objectCapacity != 0) | 723 | if (m_objectCapacity > 0) |
683 | config.Set("MaxPrims", m_objectCapacity); | 724 | config.Set("MaxPrims", m_objectCapacity); |
684 | 725 | ||
685 | if (m_agentCapacity != 0) | 726 | if (m_linksetCapacity > 0) |
727 | config.Set("LinksetPrims", m_linksetCapacity); | ||
728 | |||
729 | if (m_agentCapacity > 0) | ||
686 | config.Set("MaxAgents", m_agentCapacity); | 730 | config.Set("MaxAgents", m_agentCapacity); |
687 | 731 | ||
688 | if (ScopeID != UUID.Zero) | 732 | if (ScopeID != UUID.Zero) |
@@ -759,9 +803,15 @@ namespace OpenSim.Framework | |||
759 | configMember.addConfigurationOption("lastmap_refresh", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, | 803 | configMember.addConfigurationOption("lastmap_refresh", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, |
760 | "Last Map Refresh", Util.UnixTimeSinceEpoch().ToString(), true); | 804 | "Last Map Refresh", Util.UnixTimeSinceEpoch().ToString(), true); |
761 | 805 | ||
806 | configMember.addConfigurationOption("nonphysical_prim_min", ConfigurationOption.ConfigurationTypes.TYPE_FLOAT, | ||
807 | "Minimum size for nonphysical prims", m_nonphysPrimMin.ToString(), true); | ||
808 | |||
762 | configMember.addConfigurationOption("nonphysical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | 809 | configMember.addConfigurationOption("nonphysical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, |
763 | "Maximum size for nonphysical prims", m_nonphysPrimMax.ToString(), true); | 810 | "Maximum size for nonphysical prims", m_nonphysPrimMax.ToString(), true); |
764 | 811 | ||
812 | configMember.addConfigurationOption("physical_prim_min", ConfigurationOption.ConfigurationTypes.TYPE_FLOAT, | ||
813 | "Minimum size for nonphysical prims", m_physPrimMin.ToString(), true); | ||
814 | |||
765 | configMember.addConfigurationOption("physical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | 815 | configMember.addConfigurationOption("physical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, |
766 | "Maximum size for physical prims", m_physPrimMax.ToString(), true); | 816 | "Maximum size for physical prims", m_physPrimMax.ToString(), true); |
767 | 817 | ||
@@ -771,6 +821,9 @@ namespace OpenSim.Framework | |||
771 | configMember.addConfigurationOption("object_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | 821 | configMember.addConfigurationOption("object_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, |
772 | "Max objects this sim will hold", m_objectCapacity.ToString(), true); | 822 | "Max objects this sim will hold", m_objectCapacity.ToString(), true); |
773 | 823 | ||
824 | configMember.addConfigurationOption("linkset_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
825 | "Max prims an object will hold", m_linksetCapacity.ToString(), true); | ||
826 | |||
774 | configMember.addConfigurationOption("agent_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | 827 | configMember.addConfigurationOption("agent_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, |
775 | "Max avatars this sim will hold", m_agentCapacity.ToString(), true); | 828 | "Max avatars this sim will hold", m_agentCapacity.ToString(), true); |
776 | 829 | ||
@@ -892,6 +945,9 @@ namespace OpenSim.Framework | |||
892 | case "object_capacity": | 945 | case "object_capacity": |
893 | m_objectCapacity = (int)configuration_result; | 946 | m_objectCapacity = (int)configuration_result; |
894 | break; | 947 | break; |
948 | case "linkset_capacity": | ||
949 | m_linksetCapacity = (int)configuration_result; | ||
950 | break; | ||
895 | case "agent_capacity": | 951 | case "agent_capacity": |
896 | m_agentCapacity = (int)configuration_result; | 952 | m_agentCapacity = (int)configuration_result; |
897 | break; | 953 | break; |
diff --git a/OpenSim/Framework/RegionLoader/Filesystem/Properties/AssemblyInfo.cs b/OpenSim/Framework/RegionLoader/Filesystem/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d670f2f --- /dev/null +++ b/OpenSim/Framework/RegionLoader/Filesystem/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.RegionLoader.Filesystem")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("4ab5c74b-e886-40a1-b67d-a04df285e706")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/RegionLoader/Web/Properties/AssemblyInfo.cs b/OpenSim/Framework/RegionLoader/Web/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7309a12 --- /dev/null +++ b/OpenSim/Framework/RegionLoader/Web/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.RegionLoader.Web")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("985afff8-e7ed-4056-acce-39abf7a43d33")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/Serialization/ArchiveConstants.cs b/OpenSim/Framework/Serialization/ArchiveConstants.cs index 2c5e001..48f1c4f 100644 --- a/OpenSim/Framework/Serialization/ArchiveConstants.cs +++ b/OpenSim/Framework/Serialization/ArchiveConstants.cs | |||
@@ -53,6 +53,11 @@ namespace OpenSim.Framework.Serialization | |||
53 | public const string INVENTORY_PATH = "inventory/"; | 53 | public const string INVENTORY_PATH = "inventory/"; |
54 | 54 | ||
55 | /// <value> | 55 | /// <value> |
56 | /// Path for regions in a multi-region archive | ||
57 | /// </value> | ||
58 | public const string REGIONS_PATH = "regions/"; | ||
59 | |||
60 | /// <value> | ||
56 | /// Path for the prims file | 61 | /// Path for the prims file |
57 | /// </value> | 62 | /// </value> |
58 | public const string OBJECTS_PATH = "objects/"; | 63 | public const string OBJECTS_PATH = "objects/"; |
diff --git a/OpenSim/Framework/Serialization/External/OspResolver.cs b/OpenSim/Framework/Serialization/External/OspResolver.cs index d31d27c..fa7160f 100644 --- a/OpenSim/Framework/Serialization/External/OspResolver.cs +++ b/OpenSim/Framework/Serialization/External/OspResolver.cs | |||
@@ -65,9 +65,14 @@ namespace OpenSim.Framework.Serialization | |||
65 | 65 | ||
66 | UserAccount account = userService.GetUserAccount(UUID.Zero, userId); | 66 | UserAccount account = userService.GetUserAccount(UUID.Zero, userId); |
67 | if (account != null) | 67 | if (account != null) |
68 | { | ||
68 | return MakeOspa(account.FirstName, account.LastName); | 69 | return MakeOspa(account.FirstName, account.LastName); |
70 | } | ||
69 | // else | 71 | // else |
72 | // { | ||
70 | // m_log.WarnFormat("[OSP RESOLVER]: No user account for {0}", userId); | 73 | // m_log.WarnFormat("[OSP RESOLVER]: No user account for {0}", userId); |
74 | // System.Console.WriteLine("[OSP RESOLVER]: No user account for {0}", userId); | ||
75 | // } | ||
71 | 76 | ||
72 | return null; | 77 | return null; |
73 | } | 78 | } |
@@ -79,10 +84,13 @@ namespace OpenSim.Framework.Serialization | |||
79 | /// <returns></returns> | 84 | /// <returns></returns> |
80 | public static string MakeOspa(string firstName, string lastName) | 85 | public static string MakeOspa(string firstName, string lastName) |
81 | { | 86 | { |
82 | // m_log.DebugFormat("[OSP RESOLVER]: Making OSPA for {0} {1}", firstName, lastName); | 87 | string ospa |
88 | = OSPA_PREFIX + OSPA_NAME_KEY + OSPA_PAIR_SEPARATOR + firstName + OSPA_NAME_VALUE_SEPARATOR + lastName; | ||
89 | |||
90 | // m_log.DebugFormat("[OSP RESOLVER]: Made OSPA {0} for {1} {2}", ospa, firstName, lastName); | ||
91 | // System.Console.WriteLine("[OSP RESOLVER]: Made OSPA {0} for {1} {2}", ospa, firstName, lastName); | ||
83 | 92 | ||
84 | return | 93 | return ospa; |
85 | OSPA_PREFIX + OSPA_NAME_KEY + OSPA_PAIR_SEPARATOR + firstName + OSPA_NAME_VALUE_SEPARATOR + lastName; | ||
86 | } | 94 | } |
87 | 95 | ||
88 | /// <summary> | 96 | /// <summary> |
diff --git a/OpenSim/Framework/Serialization/Properties/AssemblyInfo.cs b/OpenSim/Framework/Serialization/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..11efa4b --- /dev/null +++ b/OpenSim/Framework/Serialization/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.Serialization")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("919db41e-4ac0-4f24-9992-81d62c0ee183")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index cf19002..2c21800 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs | |||
@@ -38,6 +38,8 @@ using log4net; | |||
38 | using log4net.Appender; | 38 | using log4net.Appender; |
39 | using log4net.Core; | 39 | using log4net.Core; |
40 | using log4net.Repository; | 40 | using log4net.Repository; |
41 | using OpenMetaverse; | ||
42 | using OpenMetaverse.StructuredData; | ||
41 | using OpenSim.Framework; | 43 | using OpenSim.Framework; |
42 | using OpenSim.Framework.Console; | 44 | using OpenSim.Framework.Console; |
43 | using OpenSim.Framework.Monitoring; | 45 | using OpenSim.Framework.Monitoring; |
@@ -45,16 +47,12 @@ using OpenSim.Framework.Servers; | |||
45 | using OpenSim.Framework.Servers.HttpServer; | 47 | using OpenSim.Framework.Servers.HttpServer; |
46 | using Timer=System.Timers.Timer; | 48 | using Timer=System.Timers.Timer; |
47 | 49 | ||
48 | using OpenMetaverse; | ||
49 | using OpenMetaverse.StructuredData; | ||
50 | |||
51 | |||
52 | namespace OpenSim.Framework.Servers | 50 | namespace OpenSim.Framework.Servers |
53 | { | 51 | { |
54 | /// <summary> | 52 | /// <summary> |
55 | /// Common base for the main OpenSimServers (user, grid, inventory, region, etc) | 53 | /// Common base for the main OpenSimServers (user, grid, inventory, region, etc) |
56 | /// </summary> | 54 | /// </summary> |
57 | public abstract class BaseOpenSimServer | 55 | public abstract class BaseOpenSimServer : ServerBase |
58 | { | 56 | { |
59 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 57 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
60 | 58 | ||
@@ -63,27 +61,6 @@ namespace OpenSim.Framework.Servers | |||
63 | /// server. | 61 | /// server. |
64 | /// </summary> | 62 | /// </summary> |
65 | private Timer m_periodicDiagnosticsTimer = new Timer(60 * 60 * 1000); | 63 | private Timer m_periodicDiagnosticsTimer = new Timer(60 * 60 * 1000); |
66 | |||
67 | protected CommandConsole m_console; | ||
68 | protected OpenSimAppender m_consoleAppender; | ||
69 | protected IAppender m_logFileAppender = null; | ||
70 | |||
71 | /// <summary> | ||
72 | /// Time at which this server was started | ||
73 | /// </summary> | ||
74 | protected DateTime m_startuptime; | ||
75 | |||
76 | /// <summary> | ||
77 | /// Record the initial startup directory for info purposes | ||
78 | /// </summary> | ||
79 | protected string m_startupDirectory = Environment.CurrentDirectory; | ||
80 | |||
81 | /// <summary> | ||
82 | /// Server version information. Usually VersionInfo + information about git commit, operating system, etc. | ||
83 | /// </summary> | ||
84 | protected string m_version; | ||
85 | |||
86 | protected string m_pidFile = String.Empty; | ||
87 | 64 | ||
88 | /// <summary> | 65 | /// <summary> |
89 | /// Random uuid for private data | 66 | /// Random uuid for private data |
@@ -96,35 +73,13 @@ namespace OpenSim.Framework.Servers | |||
96 | get { return m_httpServer; } | 73 | get { return m_httpServer; } |
97 | } | 74 | } |
98 | 75 | ||
99 | /// <summary> | 76 | public BaseOpenSimServer() : base() |
100 | /// Holds the non-viewer statistics collection object for this service/server | ||
101 | /// </summary> | ||
102 | protected IStatsCollector m_stats; | ||
103 | |||
104 | public BaseOpenSimServer() | ||
105 | { | 77 | { |
106 | m_startuptime = DateTime.Now; | ||
107 | m_version = VersionInfo.Version; | ||
108 | |||
109 | // Random uuid for private data | 78 | // Random uuid for private data |
110 | m_osSecret = UUID.Random().ToString(); | 79 | m_osSecret = UUID.Random().ToString(); |
111 | 80 | ||
112 | m_periodicDiagnosticsTimer.Elapsed += new ElapsedEventHandler(LogDiagnostics); | 81 | m_periodicDiagnosticsTimer.Elapsed += new ElapsedEventHandler(LogDiagnostics); |
113 | m_periodicDiagnosticsTimer.Enabled = true; | 82 | m_periodicDiagnosticsTimer.Enabled = true; |
114 | |||
115 | // This thread will go on to become the console listening thread | ||
116 | Thread.CurrentThread.Name = "ConsoleThread"; | ||
117 | |||
118 | ILoggerRepository repository = LogManager.GetRepository(); | ||
119 | IAppender[] appenders = repository.GetAppenders(); | ||
120 | |||
121 | foreach (IAppender appender in appenders) | ||
122 | { | ||
123 | if (appender.Name == "LogFileAppender") | ||
124 | { | ||
125 | m_logFileAppender = appender; | ||
126 | } | ||
127 | } | ||
128 | } | 83 | } |
129 | 84 | ||
130 | /// <summary> | 85 | /// <summary> |
@@ -132,76 +87,46 @@ namespace OpenSim.Framework.Servers | |||
132 | /// </summary> | 87 | /// </summary> |
133 | protected virtual void StartupSpecific() | 88 | protected virtual void StartupSpecific() |
134 | { | 89 | { |
135 | if (m_console != null) | 90 | if (m_console == null) |
136 | { | 91 | return; |
137 | ILoggerRepository repository = LogManager.GetRepository(); | 92 | |
138 | IAppender[] appenders = repository.GetAppenders(); | 93 | RegisterCommonCommands(); |
139 | 94 | ||
140 | foreach (IAppender appender in appenders) | 95 | m_console.Commands.AddCommand("General", false, "quit", |
141 | { | 96 | "quit", |
142 | if (appender.Name == "Console") | 97 | "Quit the application", HandleQuit); |
143 | { | 98 | |
144 | m_consoleAppender = (OpenSimAppender)appender; | 99 | m_console.Commands.AddCommand("General", false, "shutdown", |
145 | break; | 100 | "shutdown", |
146 | } | 101 | "Quit the application", HandleQuit); |
147 | } | 102 | |
148 | 103 | m_console.Commands.AddCommand("General", false, "show threads", | |
149 | if (null == m_consoleAppender) | 104 | "show threads", |
150 | { | 105 | "Show thread status", HandleShow); |
151 | Notice("No appender named Console found (see the log4net config file for this executable)!"); | 106 | |
152 | } | 107 | m_console.Commands.AddCommand("General", false, "show version", |
153 | else | 108 | "show version", |
154 | { | 109 | "Show server version", HandleShow); |
155 | m_consoleAppender.Console = m_console; | 110 | |
156 | 111 | m_console.Commands.AddCommand("General", false, "threads abort", | |
157 | // If there is no threshold set then the threshold is effectively everything. | 112 | "threads abort <thread-id>", |
158 | if (null == m_consoleAppender.Threshold) | 113 | "Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort); |
159 | m_consoleAppender.Threshold = Level.All; | 114 | |
160 | 115 | m_console.Commands.AddCommand("General", false, "threads show", | |
161 | Notice(String.Format("Console log level is {0}", m_consoleAppender.Threshold)); | 116 | "threads show", |
162 | } | 117 | "Show thread status. Synonym for \"show threads\"", |
163 | 118 | (string module, string[] args) => Notice(GetThreadsReport())); | |
164 | m_console.Commands.AddCommand("General", false, "quit", | 119 | |
165 | "quit", | 120 | m_console.Commands.AddCommand("General", false, "force gc", |
166 | "Quit the application", HandleQuit); | 121 | "force gc", |
167 | 122 | "Manually invoke runtime garbage collection. For debugging purposes", | |
168 | m_console.Commands.AddCommand("General", false, "shutdown", | 123 | HandleForceGc); |
169 | "shutdown", | 124 | } |
170 | "Quit the application", HandleQuit); | 125 | |
171 | 126 | private void HandleForceGc(string module, string[] args) | |
172 | m_console.Commands.AddCommand("General", false, "set log level", | 127 | { |
173 | "set log level <level>", | 128 | MainConsole.Instance.Output("Manually invoking runtime garbage collection"); |
174 | "Set the console logging level", HandleLogLevel); | 129 | GC.Collect(); |
175 | |||
176 | m_console.Commands.AddCommand("General", false, "show info", | ||
177 | "show info", | ||
178 | "Show general information about the server", HandleShow); | ||
179 | |||
180 | m_console.Commands.AddCommand("General", false, "show stats", | ||
181 | "show stats", | ||
182 | "Show statistics", HandleShow); | ||
183 | |||
184 | m_console.Commands.AddCommand("General", false, "show threads", | ||
185 | "show threads", | ||
186 | "Show thread status", HandleShow); | ||
187 | |||
188 | m_console.Commands.AddCommand("General", false, "show uptime", | ||
189 | "show uptime", | ||
190 | "Show server uptime", HandleShow); | ||
191 | |||
192 | m_console.Commands.AddCommand("General", false, "show version", | ||
193 | "show version", | ||
194 | "Show server version", HandleShow); | ||
195 | |||
196 | m_console.Commands.AddCommand("General", false, "threads abort", | ||
197 | "threads abort <thread-id>", | ||
198 | "Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort); | ||
199 | |||
200 | m_console.Commands.AddCommand("General", false, "threads show", | ||
201 | "threads show", | ||
202 | "Show thread status. Synonym for \"show threads\"", | ||
203 | (string module, string[] args) => Notice(GetThreadsReport())); | ||
204 | } | ||
205 | } | 130 | } |
206 | 131 | ||
207 | /// <summary> | 132 | /// <summary> |
@@ -226,12 +151,7 @@ namespace OpenSim.Framework.Servers | |||
226 | { | 151 | { |
227 | StringBuilder sb = new StringBuilder("DIAGNOSTICS\n\n"); | 152 | StringBuilder sb = new StringBuilder("DIAGNOSTICS\n\n"); |
228 | sb.Append(GetUptimeReport()); | 153 | sb.Append(GetUptimeReport()); |
229 | 154 | sb.Append(StatsManager.SimExtraStats.Report()); | |
230 | if (m_stats != null) | ||
231 | { | ||
232 | sb.Append(m_stats.Report()); | ||
233 | } | ||
234 | |||
235 | sb.Append(Environment.NewLine); | 155 | sb.Append(Environment.NewLine); |
236 | sb.Append(GetThreadsReport()); | 156 | sb.Append(GetThreadsReport()); |
237 | 157 | ||
@@ -287,26 +207,11 @@ namespace OpenSim.Framework.Servers | |||
287 | } | 207 | } |
288 | 208 | ||
289 | /// <summary> | 209 | /// <summary> |
290 | /// Return a report about the uptime of this server | ||
291 | /// </summary> | ||
292 | /// <returns></returns> | ||
293 | protected string GetUptimeReport() | ||
294 | { | ||
295 | StringBuilder sb = new StringBuilder(String.Format("Time now is {0}\n", DateTime.Now)); | ||
296 | sb.Append(String.Format("Server has been running since {0}, {1}\n", m_startuptime.DayOfWeek, m_startuptime)); | ||
297 | sb.Append(String.Format("That is an elapsed time of {0}\n", DateTime.Now - m_startuptime)); | ||
298 | |||
299 | return sb.ToString(); | ||
300 | } | ||
301 | |||
302 | /// <summary> | ||
303 | /// Performs initialisation of the scene, such as loading configuration from disk. | 210 | /// Performs initialisation of the scene, such as loading configuration from disk. |
304 | /// </summary> | 211 | /// </summary> |
305 | public virtual void Startup() | 212 | public virtual void Startup() |
306 | { | 213 | { |
307 | m_log.Info("[STARTUP]: Beginning startup processing"); | 214 | m_log.Info("[STARTUP]: Beginning startup processing"); |
308 | |||
309 | EnhanceVersionInformation(); | ||
310 | 215 | ||
311 | m_log.Info("[STARTUP]: Careminster version: " + m_version + Environment.NewLine); | 216 | m_log.Info("[STARTUP]: Careminster version: " + m_version + Environment.NewLine); |
312 | // clr version potentially is more confusing than helpful, since it doesn't tell us if we're running under Mono/MS .NET and | 217 | // clr version potentially is more confusing than helpful, since it doesn't tell us if we're running under Mono/MS .NET and |
@@ -343,60 +248,10 @@ namespace OpenSim.Framework.Servers | |||
343 | Shutdown(); | 248 | Shutdown(); |
344 | } | 249 | } |
345 | 250 | ||
346 | private void HandleLogLevel(string module, string[] cmd) | 251 | public override void HandleShow(string module, string[] cmd) |
347 | { | ||
348 | if (null == m_consoleAppender) | ||
349 | { | ||
350 | Notice("No appender named Console found (see the log4net config file for this executable)!"); | ||
351 | return; | ||
352 | } | ||
353 | |||
354 | if (cmd.Length > 3) | ||
355 | { | ||
356 | string rawLevel = cmd[3]; | ||
357 | |||
358 | ILoggerRepository repository = LogManager.GetRepository(); | ||
359 | Level consoleLevel = repository.LevelMap[rawLevel]; | ||
360 | |||
361 | if (consoleLevel != null) | ||
362 | m_consoleAppender.Threshold = consoleLevel; | ||
363 | else | ||
364 | Notice( | ||
365 | String.Format( | ||
366 | "{0} is not a valid logging level. Valid logging levels are ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF", | ||
367 | rawLevel)); | ||
368 | } | ||
369 | |||
370 | Notice(String.Format("Console log level is {0}", m_consoleAppender.Threshold)); | ||
371 | } | ||
372 | |||
373 | /// <summary> | ||
374 | /// Show help information | ||
375 | /// </summary> | ||
376 | /// <param name="helpArgs"></param> | ||
377 | protected virtual void ShowHelp(string[] helpArgs) | ||
378 | { | 252 | { |
379 | Notice(""); | 253 | base.HandleShow(module, cmd); |
380 | |||
381 | if (helpArgs.Length == 0) | ||
382 | { | ||
383 | Notice("set log level [level] - change the console logging level only. For example, off or debug."); | ||
384 | Notice("show info - show server information (e.g. startup path)."); | ||
385 | |||
386 | if (m_stats != null) | ||
387 | Notice("show stats - show statistical information for this server"); | ||
388 | |||
389 | Notice("show threads - list tracked threads"); | ||
390 | Notice("show uptime - show server startup time and uptime."); | ||
391 | Notice("show version - show server version."); | ||
392 | Notice(""); | ||
393 | 254 | ||
394 | return; | ||
395 | } | ||
396 | } | ||
397 | |||
398 | public virtual void HandleShow(string module, string[] cmd) | ||
399 | { | ||
400 | List<string> args = new List<string>(cmd); | 255 | List<string> args = new List<string>(cmd); |
401 | 256 | ||
402 | args.RemoveAt(0); | 257 | args.RemoveAt(0); |
@@ -405,23 +260,10 @@ namespace OpenSim.Framework.Servers | |||
405 | 260 | ||
406 | switch (showParams[0]) | 261 | switch (showParams[0]) |
407 | { | 262 | { |
408 | case "info": | ||
409 | ShowInfo(); | ||
410 | break; | ||
411 | |||
412 | case "stats": | ||
413 | if (m_stats != null) | ||
414 | Notice(m_stats.Report()); | ||
415 | break; | ||
416 | |||
417 | case "threads": | 263 | case "threads": |
418 | Notice(GetThreadsReport()); | 264 | Notice(GetThreadsReport()); |
419 | break; | 265 | break; |
420 | 266 | ||
421 | case "uptime": | ||
422 | Notice(GetUptimeReport()); | ||
423 | break; | ||
424 | |||
425 | case "version": | 267 | case "version": |
426 | Notice(GetVersionText()); | 268 | Notice(GetVersionText()); |
427 | break; | 269 | break; |
@@ -447,165 +289,11 @@ namespace OpenSim.Framework.Servers | |||
447 | MainConsole.Instance.OutputFormat("Aborted thread with id {0}", threadId); | 289 | MainConsole.Instance.OutputFormat("Aborted thread with id {0}", threadId); |
448 | else | 290 | else |
449 | MainConsole.Instance.OutputFormat("ERROR - Thread with id {0} not found in managed threads", threadId); | 291 | MainConsole.Instance.OutputFormat("ERROR - Thread with id {0} not found in managed threads", threadId); |
450 | } | 292 | } |
451 | |||
452 | protected void ShowInfo() | ||
453 | { | ||
454 | Notice(GetVersionText()); | ||
455 | Notice("Startup directory: " + m_startupDirectory); | ||
456 | if (null != m_consoleAppender) | ||
457 | Notice(String.Format("Console log level: {0}", m_consoleAppender.Threshold)); | ||
458 | } | ||
459 | |||
460 | protected string GetVersionText() | ||
461 | { | ||
462 | return String.Format("Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion); | ||
463 | } | ||
464 | |||
465 | /// <summary> | ||
466 | /// Console output is only possible if a console has been established. | ||
467 | /// That is something that cannot be determined within this class. So | ||
468 | /// all attempts to use the console MUST be verified. | ||
469 | /// </summary> | ||
470 | /// <param name="msg"></param> | ||
471 | protected void Notice(string msg) | ||
472 | { | ||
473 | if (m_console != null) | ||
474 | { | ||
475 | m_console.Output(msg); | ||
476 | } | ||
477 | } | ||
478 | |||
479 | /// <summary> | ||
480 | /// Console output is only possible if a console has been established. | ||
481 | /// That is something that cannot be determined within this class. So | ||
482 | /// all attempts to use the console MUST be verified. | ||
483 | /// </summary> | ||
484 | /// <param name="format"></param> | ||
485 | /// <param name="components"></param> | ||
486 | protected void Notice(string format, params string[] components) | ||
487 | { | ||
488 | if (m_console != null) | ||
489 | m_console.OutputFormat(format, components); | ||
490 | } | ||
491 | |||
492 | /// <summary> | ||
493 | /// Enhance the version string with extra information if it's available. | ||
494 | /// </summary> | ||
495 | protected void EnhanceVersionInformation() | ||
496 | { | ||
497 | string buildVersion = string.Empty; | ||
498 | |||
499 | // The subversion information is deprecated and will be removed at a later date | ||
500 | // Add subversion revision information if available | ||
501 | // Try file "svn_revision" in the current directory first, then the .svn info. | ||
502 | // This allows to make the revision available in simulators not running from the source tree. | ||
503 | // FIXME: Making an assumption about the directory we're currently in - we do this all over the place | ||
504 | // elsewhere as well | ||
505 | string gitDir = "../.git/"; | ||
506 | string gitRefPointerPath = gitDir + "HEAD"; | ||
507 | |||
508 | string svnRevisionFileName = "svn_revision"; | ||
509 | string svnFileName = ".svn/entries"; | ||
510 | string manualVersionFileName = ".version"; | ||
511 | string inputLine; | ||
512 | int strcmp; | ||
513 | |||
514 | if (File.Exists(manualVersionFileName)) | ||
515 | { | ||
516 | using (StreamReader CommitFile = File.OpenText(manualVersionFileName)) | ||
517 | buildVersion = CommitFile.ReadLine(); | ||
518 | |||
519 | m_version += buildVersion ?? ""; | ||
520 | } | ||
521 | else if (File.Exists(gitRefPointerPath)) | ||
522 | { | ||
523 | // m_log.DebugFormat("[OPENSIM]: Found {0}", gitRefPointerPath); | ||
524 | |||
525 | string rawPointer = ""; | ||
526 | |||
527 | using (StreamReader pointerFile = File.OpenText(gitRefPointerPath)) | ||
528 | rawPointer = pointerFile.ReadLine(); | ||
529 | |||
530 | // m_log.DebugFormat("[OPENSIM]: rawPointer [{0}]", rawPointer); | ||
531 | |||
532 | Match m = Regex.Match(rawPointer, "^ref: (.+)$"); | ||
533 | |||
534 | if (m.Success) | ||
535 | { | ||
536 | // m_log.DebugFormat("[OPENSIM]: Matched [{0}]", m.Groups[1].Value); | ||
537 | |||
538 | string gitRef = m.Groups[1].Value; | ||
539 | string gitRefPath = gitDir + gitRef; | ||
540 | if (File.Exists(gitRefPath)) | ||
541 | { | ||
542 | // m_log.DebugFormat("[OPENSIM]: Found gitRefPath [{0}]", gitRefPath); | ||
543 | |||
544 | using (StreamReader refFile = File.OpenText(gitRefPath)) | ||
545 | { | ||
546 | string gitHash = refFile.ReadLine(); | ||
547 | m_version += gitHash.Substring(0, 7); | ||
548 | } | ||
549 | } | ||
550 | } | ||
551 | } | ||
552 | else | ||
553 | { | ||
554 | // Remove the else logic when subversion mirror is no longer used | ||
555 | if (File.Exists(svnRevisionFileName)) | ||
556 | { | ||
557 | StreamReader RevisionFile = File.OpenText(svnRevisionFileName); | ||
558 | buildVersion = RevisionFile.ReadLine(); | ||
559 | buildVersion.Trim(); | ||
560 | RevisionFile.Close(); | ||
561 | } | ||
562 | |||
563 | if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName)) | ||
564 | { | ||
565 | StreamReader EntriesFile = File.OpenText(svnFileName); | ||
566 | inputLine = EntriesFile.ReadLine(); | ||
567 | while (inputLine != null) | ||
568 | { | ||
569 | // using the dir svn revision at the top of entries file | ||
570 | strcmp = String.Compare(inputLine, "dir"); | ||
571 | if (strcmp == 0) | ||
572 | { | ||
573 | buildVersion = EntriesFile.ReadLine(); | ||
574 | break; | ||
575 | } | ||
576 | else | ||
577 | { | ||
578 | inputLine = EntriesFile.ReadLine(); | ||
579 | } | ||
580 | } | ||
581 | EntriesFile.Close(); | ||
582 | } | ||
583 | |||
584 | m_version += string.IsNullOrEmpty(buildVersion) ? " " : ("." + buildVersion + " ").Substring(0, 6); | ||
585 | } | ||
586 | } | ||
587 | |||
588 | protected void CreatePIDFile(string path) | ||
589 | { | ||
590 | try | ||
591 | { | ||
592 | string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); | ||
593 | FileStream fs = File.Create(path); | ||
594 | |||
595 | Byte[] buf = Encoding.ASCII.GetBytes(pidstring); | ||
596 | fs.Write(buf, 0, buf.Length); | ||
597 | fs.Close(); | ||
598 | m_pidFile = path; | ||
599 | } | ||
600 | catch (Exception) | ||
601 | { | ||
602 | } | ||
603 | } | ||
604 | 293 | ||
605 | public string osSecret { | 294 | public string osSecret { |
606 | // Secret uuid for the simulator | 295 | // Secret uuid for the simulator |
607 | get { return m_osSecret; } | 296 | get { return m_osSecret; } |
608 | |||
609 | } | 297 | } |
610 | 298 | ||
611 | public string StatReport(IOSHttpRequest httpRequest) | 299 | public string StatReport(IOSHttpRequest httpRequest) |
@@ -613,27 +301,12 @@ namespace OpenSim.Framework.Servers | |||
613 | // If we catch a request for "callback", wrap the response in the value for jsonp | 301 | // If we catch a request for "callback", wrap the response in the value for jsonp |
614 | if (httpRequest.Query.ContainsKey("callback")) | 302 | if (httpRequest.Query.ContainsKey("callback")) |
615 | { | 303 | { |
616 | return httpRequest.Query["callback"].ToString() + "(" + m_stats.XReport((DateTime.Now - m_startuptime).ToString() , m_version) + ");"; | 304 | return httpRequest.Query["callback"].ToString() + "(" + StatsManager.SimExtraStats.XReport((DateTime.Now - m_startuptime).ToString() , m_version) + ");"; |
617 | } | 305 | } |
618 | else | 306 | else |
619 | { | 307 | { |
620 | return m_stats.XReport((DateTime.Now - m_startuptime).ToString() , m_version); | 308 | return StatsManager.SimExtraStats.XReport((DateTime.Now - m_startuptime).ToString() , m_version); |
621 | } | ||
622 | } | ||
623 | |||
624 | protected void RemovePIDFile() | ||
625 | { | ||
626 | if (m_pidFile != String.Empty) | ||
627 | { | ||
628 | try | ||
629 | { | ||
630 | File.Delete(m_pidFile); | ||
631 | m_pidFile = String.Empty; | ||
632 | } | ||
633 | catch (Exception) | ||
634 | { | ||
635 | } | ||
636 | } | 309 | } |
637 | } | 310 | } |
638 | } | 311 | } |
639 | } | 312 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 788a0b9..77fce9e 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | |||
@@ -54,8 +54,23 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
55 | private HttpServerLogWriter httpserverlog = new HttpServerLogWriter(); | 55 | private HttpServerLogWriter httpserverlog = new HttpServerLogWriter(); |
56 | 56 | ||
57 | /// <summary> | ||
58 | /// Gets or sets the debug level. | ||
59 | /// </summary> | ||
60 | /// <value> | ||
61 | /// See MainServer.DebugLevel. | ||
62 | /// </value> | ||
57 | public int DebugLevel { get; set; } | 63 | public int DebugLevel { get; set; } |
58 | 64 | ||
65 | /// <summary> | ||
66 | /// Request number for diagnostic purposes. | ||
67 | /// </summary> | ||
68 | /// <remarks> | ||
69 | /// This is an internal number. In some debug situations an external number may also be supplied in the | ||
70 | /// opensim-request-id header but we are not currently logging this. | ||
71 | /// </remarks> | ||
72 | public int RequestNumber { get; private set; } | ||
73 | |||
59 | private volatile int NotSocketErrors = 0; | 74 | private volatile int NotSocketErrors = 0; |
60 | public volatile bool HTTPDRunning = false; | 75 | public volatile bool HTTPDRunning = false; |
61 | 76 | ||
@@ -67,7 +82,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
67 | protected Dictionary<string, LLSDMethod> m_llsdHandlers = new Dictionary<string, LLSDMethod>(); | 82 | protected Dictionary<string, LLSDMethod> m_llsdHandlers = new Dictionary<string, LLSDMethod>(); |
68 | protected Dictionary<string, IRequestHandler> m_streamHandlers = new Dictionary<string, IRequestHandler>(); | 83 | protected Dictionary<string, IRequestHandler> m_streamHandlers = new Dictionary<string, IRequestHandler>(); |
69 | protected Dictionary<string, GenericHTTPMethod> m_HTTPHandlers = new Dictionary<string, GenericHTTPMethod>(); | 84 | protected Dictionary<string, GenericHTTPMethod> m_HTTPHandlers = new Dictionary<string, GenericHTTPMethod>(); |
70 | protected Dictionary<string, IHttpAgentHandler> m_agentHandlers = new Dictionary<string, IHttpAgentHandler>(); | 85 | // protected Dictionary<string, IHttpAgentHandler> m_agentHandlers = new Dictionary<string, IHttpAgentHandler>(); |
71 | protected Dictionary<string, PollServiceEventArgs> m_pollHandlers = | 86 | protected Dictionary<string, PollServiceEventArgs> m_pollHandlers = |
72 | new Dictionary<string, PollServiceEventArgs>(); | 87 | new Dictionary<string, PollServiceEventArgs>(); |
73 | 88 | ||
@@ -245,29 +260,29 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
245 | return new List<string>(m_pollHandlers.Keys); | 260 | return new List<string>(m_pollHandlers.Keys); |
246 | } | 261 | } |
247 | 262 | ||
248 | // Note that the agent string is provided simply to differentiate | 263 | // // Note that the agent string is provided simply to differentiate |
249 | // the handlers - it is NOT required to be an actual agent header | 264 | // // the handlers - it is NOT required to be an actual agent header |
250 | // value. | 265 | // // value. |
251 | public bool AddAgentHandler(string agent, IHttpAgentHandler handler) | 266 | // public bool AddAgentHandler(string agent, IHttpAgentHandler handler) |
252 | { | 267 | // { |
253 | lock (m_agentHandlers) | 268 | // lock (m_agentHandlers) |
254 | { | 269 | // { |
255 | if (!m_agentHandlers.ContainsKey(agent)) | 270 | // if (!m_agentHandlers.ContainsKey(agent)) |
256 | { | 271 | // { |
257 | m_agentHandlers.Add(agent, handler); | 272 | // m_agentHandlers.Add(agent, handler); |
258 | return true; | 273 | // return true; |
259 | } | 274 | // } |
260 | } | 275 | // } |
261 | 276 | // | |
262 | //must already have a handler for that path so return false | 277 | // //must already have a handler for that path so return false |
263 | return false; | 278 | // return false; |
264 | } | 279 | // } |
265 | 280 | // | |
266 | public List<string> GetAgentHandlerKeys() | 281 | // public List<string> GetAgentHandlerKeys() |
267 | { | 282 | // { |
268 | lock (m_agentHandlers) | 283 | // lock (m_agentHandlers) |
269 | return new List<string>(m_agentHandlers.Keys); | 284 | // return new List<string>(m_agentHandlers.Keys); |
270 | } | 285 | // } |
271 | 286 | ||
272 | public bool AddLLSDHandler(string path, LLSDMethod handler) | 287 | public bool AddLLSDHandler(string path, LLSDMethod handler) |
273 | { | 288 | { |
@@ -296,6 +311,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
296 | 311 | ||
297 | private void OnRequest(object source, RequestEventArgs args) | 312 | private void OnRequest(object source, RequestEventArgs args) |
298 | { | 313 | { |
314 | RequestNumber++; | ||
315 | |||
299 | try | 316 | try |
300 | { | 317 | { |
301 | IHttpClientContext context = (IHttpClientContext)source; | 318 | IHttpClientContext context = (IHttpClientContext)source; |
@@ -406,7 +423,6 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
406 | string requestMethod = request.HttpMethod; | 423 | string requestMethod = request.HttpMethod; |
407 | string uriString = request.RawUrl; | 424 | string uriString = request.RawUrl; |
408 | 425 | ||
409 | // string reqnum = "unknown"; | ||
410 | int requestStartTick = Environment.TickCount; | 426 | int requestStartTick = Environment.TickCount; |
411 | 427 | ||
412 | // Will be adjusted later on. | 428 | // Will be adjusted later on. |
@@ -423,22 +439,22 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
423 | 439 | ||
424 | Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", true); | 440 | Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", true); |
425 | 441 | ||
426 | // This is the REST agent interface. We require an agent to properly identify | 442 | // // This is the REST agent interface. We require an agent to properly identify |
427 | // itself. If the REST handler recognizes the prefix it will attempt to | 443 | // // itself. If the REST handler recognizes the prefix it will attempt to |
428 | // satisfy the request. If it is not recognizable, and no damage has occurred | 444 | // // satisfy the request. If it is not recognizable, and no damage has occurred |
429 | // the request can be passed through to the other handlers. This is a low | 445 | // // the request can be passed through to the other handlers. This is a low |
430 | // probability event; if a request is matched it is normally expected to be | 446 | // // probability event; if a request is matched it is normally expected to be |
431 | // handled | 447 | // // handled |
432 | IHttpAgentHandler agentHandler; | 448 | // IHttpAgentHandler agentHandler; |
433 | 449 | // | |
434 | if (TryGetAgentHandler(request, response, out agentHandler)) | 450 | // if (TryGetAgentHandler(request, response, out agentHandler)) |
435 | { | 451 | // { |
436 | if (HandleAgentRequest(agentHandler, request, response)) | 452 | // if (HandleAgentRequest(agentHandler, request, response)) |
437 | { | 453 | // { |
438 | requestEndTick = Environment.TickCount; | 454 | // requestEndTick = Environment.TickCount; |
439 | return; | 455 | // return; |
440 | } | 456 | // } |
441 | } | 457 | // } |
442 | 458 | ||
443 | //response.KeepAlive = true; | 459 | //response.KeepAlive = true; |
444 | response.SendChunked = false; | 460 | response.SendChunked = false; |
@@ -450,9 +466,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
450 | if (TryGetStreamHandler(handlerKey, out requestHandler)) | 466 | if (TryGetStreamHandler(handlerKey, out requestHandler)) |
451 | { | 467 | { |
452 | if (DebugLevel >= 3) | 468 | if (DebugLevel >= 3) |
453 | m_log.DebugFormat( | 469 | LogIncomingToStreamHandler(request, requestHandler); |
454 | "[BASE HTTP SERVER]: Found stream handler for {0} {1} {2} {3}", | ||
455 | request.HttpMethod, request.Url.PathAndQuery, requestHandler.Name, requestHandler.Description); | ||
456 | 470 | ||
457 | response.ContentType = requestHandler.ContentType; // Lets do this defaulting before in case handler has varying content type. | 471 | response.ContentType = requestHandler.ContentType; // Lets do this defaulting before in case handler has varying content type. |
458 | 472 | ||
@@ -529,11 +543,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
529 | { | 543 | { |
530 | case null: | 544 | case null: |
531 | case "text/html": | 545 | case "text/html": |
532 | |||
533 | if (DebugLevel >= 3) | 546 | if (DebugLevel >= 3) |
534 | m_log.DebugFormat( | 547 | LogIncomingToContentTypeHandler(request); |
535 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
536 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
537 | 548 | ||
538 | buffer = HandleHTTPRequest(request, response); | 549 | buffer = HandleHTTPRequest(request, response); |
539 | break; | 550 | break; |
@@ -541,11 +552,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
541 | case "application/llsd+xml": | 552 | case "application/llsd+xml": |
542 | case "application/xml+llsd": | 553 | case "application/xml+llsd": |
543 | case "application/llsd+json": | 554 | case "application/llsd+json": |
544 | |||
545 | if (DebugLevel >= 3) | 555 | if (DebugLevel >= 3) |
546 | m_log.DebugFormat( | 556 | LogIncomingToContentTypeHandler(request); |
547 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
548 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
549 | 557 | ||
550 | buffer = HandleLLSDRequests(request, response); | 558 | buffer = HandleLLSDRequests(request, response); |
551 | break; | 559 | break; |
@@ -564,9 +572,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
564 | if (DoWeHaveALLSDHandler(request.RawUrl)) | 572 | if (DoWeHaveALLSDHandler(request.RawUrl)) |
565 | { | 573 | { |
566 | if (DebugLevel >= 3) | 574 | if (DebugLevel >= 3) |
567 | m_log.DebugFormat( | 575 | LogIncomingToContentTypeHandler(request); |
568 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
569 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
570 | 576 | ||
571 | buffer = HandleLLSDRequests(request, response); | 577 | buffer = HandleLLSDRequests(request, response); |
572 | } | 578 | } |
@@ -574,18 +580,14 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
574 | else if (DoWeHaveAHTTPHandler(request.RawUrl)) | 580 | else if (DoWeHaveAHTTPHandler(request.RawUrl)) |
575 | { | 581 | { |
576 | if (DebugLevel >= 3) | 582 | if (DebugLevel >= 3) |
577 | m_log.DebugFormat( | 583 | LogIncomingToContentTypeHandler(request); |
578 | "[BASE HTTP SERVER]: Found a {0} content type handler for {1} {2}", | ||
579 | request.ContentType, request.HttpMethod, request.Url.PathAndQuery); | ||
580 | 584 | ||
581 | buffer = HandleHTTPRequest(request, response); | 585 | buffer = HandleHTTPRequest(request, response); |
582 | } | 586 | } |
583 | else | 587 | else |
584 | { | 588 | { |
585 | if (DebugLevel >= 3) | 589 | if (DebugLevel >= 3) |
586 | m_log.DebugFormat( | 590 | LogIncomingToXmlRpcHandler(request); |
587 | "[BASE HTTP SERVER]: Assuming a generic XMLRPC request for {0} {1}", | ||
588 | request.HttpMethod, request.Url.PathAndQuery); | ||
589 | 591 | ||
590 | // generic login request. | 592 | // generic login request. |
591 | buffer = HandleXmlRpcRequests(request, response); | 593 | buffer = HandleXmlRpcRequests(request, response); |
@@ -629,11 +631,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
629 | } | 631 | } |
630 | catch (IOException e) | 632 | catch (IOException e) |
631 | { | 633 | { |
632 | m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); | 634 | m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.StackTrace), e); |
633 | } | 635 | } |
634 | catch (Exception e) | 636 | catch (Exception e) |
635 | { | 637 | { |
636 | m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); | 638 | m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.StackTrace), e); |
637 | SendHTML500(response); | 639 | SendHTML500(response); |
638 | } | 640 | } |
639 | finally | 641 | finally |
@@ -644,17 +646,96 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
644 | if (tickdiff > 3000 && (requestHandler == null || requestHandler.Name == null || requestHandler.Name != "GetTexture")) | 646 | if (tickdiff > 3000 && (requestHandler == null || requestHandler.Name == null || requestHandler.Name != "GetTexture")) |
645 | { | 647 | { |
646 | m_log.InfoFormat( | 648 | m_log.InfoFormat( |
647 | "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} from {4} took {5}ms", | 649 | "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} {4} from {5} took {6}ms", |
650 | RequestNumber, | ||
648 | requestMethod, | 651 | requestMethod, |
649 | uriString, | 652 | uriString, |
650 | requestHandler != null ? requestHandler.Name : "", | 653 | requestHandler != null ? requestHandler.Name : "", |
651 | requestHandler != null ? requestHandler.Description : "", | 654 | requestHandler != null ? requestHandler.Description : "", |
652 | request.RemoteIPEndPoint.ToString(), | 655 | request.RemoteIPEndPoint, |
656 | tickdiff); | ||
657 | } | ||
658 | else if (DebugLevel >= 4) | ||
659 | { | ||
660 | m_log.DebugFormat( | ||
661 | "[BASE HTTP SERVER]: HTTP IN {0} :{1} took {2}ms", | ||
662 | RequestNumber, | ||
663 | Port, | ||
653 | tickdiff); | 664 | tickdiff); |
654 | } | 665 | } |
655 | } | 666 | } |
656 | } | 667 | } |
657 | 668 | ||
669 | private void LogIncomingToStreamHandler(OSHttpRequest request, IRequestHandler requestHandler) | ||
670 | { | ||
671 | m_log.DebugFormat( | ||
672 | "[BASE HTTP SERVER]: HTTP IN {0} :{1} stream handler {2} {3} {4} {5} from {6}", | ||
673 | RequestNumber, | ||
674 | Port, | ||
675 | request.HttpMethod, | ||
676 | request.Url.PathAndQuery, | ||
677 | requestHandler.Name, | ||
678 | requestHandler.Description, | ||
679 | request.RemoteIPEndPoint); | ||
680 | |||
681 | if (DebugLevel >= 5) | ||
682 | LogIncomingInDetail(request); | ||
683 | } | ||
684 | |||
685 | private void LogIncomingToContentTypeHandler(OSHttpRequest request) | ||
686 | { | ||
687 | m_log.DebugFormat( | ||
688 | "[BASE HTTP SERVER]: HTTP IN {0} :{1} {2} content type handler {3} {4} from {5}", | ||
689 | RequestNumber, | ||
690 | Port, | ||
691 | (request.ContentType == null || request.ContentType == "") ? "not set" : request.ContentType, | ||
692 | request.HttpMethod, | ||
693 | request.Url.PathAndQuery, | ||
694 | request.RemoteIPEndPoint); | ||
695 | |||
696 | if (DebugLevel >= 5) | ||
697 | LogIncomingInDetail(request); | ||
698 | } | ||
699 | |||
700 | private void LogIncomingToXmlRpcHandler(OSHttpRequest request) | ||
701 | { | ||
702 | m_log.DebugFormat( | ||
703 | "[BASE HTTP SERVER]: HTTP IN {0} :{1} assumed generic XMLRPC request {2} {3} from {4}", | ||
704 | RequestNumber, | ||
705 | Port, | ||
706 | request.HttpMethod, | ||
707 | request.Url.PathAndQuery, | ||
708 | request.RemoteIPEndPoint); | ||
709 | |||
710 | if (DebugLevel >= 5) | ||
711 | LogIncomingInDetail(request); | ||
712 | } | ||
713 | |||
714 | private void LogIncomingInDetail(OSHttpRequest request) | ||
715 | { | ||
716 | using (StreamReader reader = new StreamReader(Util.Copy(request.InputStream), Encoding.UTF8)) | ||
717 | { | ||
718 | string output; | ||
719 | |||
720 | if (DebugLevel == 5) | ||
721 | { | ||
722 | const int sampleLength = 80; | ||
723 | char[] sampleChars = new char[sampleLength + 3]; | ||
724 | reader.Read(sampleChars, 0, sampleLength); | ||
725 | sampleChars[80] = '.'; | ||
726 | sampleChars[81] = '.'; | ||
727 | sampleChars[82] = '.'; | ||
728 | output = new string(sampleChars); | ||
729 | } | ||
730 | else | ||
731 | { | ||
732 | output = reader.ReadToEnd(); | ||
733 | } | ||
734 | |||
735 | m_log.DebugFormat("[BASE HTTP SERVER]: {0}", output.Replace("\n", @"\n")); | ||
736 | } | ||
737 | } | ||
738 | |||
658 | private bool TryGetStreamHandler(string handlerKey, out IRequestHandler streamHandler) | 739 | private bool TryGetStreamHandler(string handlerKey, out IRequestHandler streamHandler) |
659 | { | 740 | { |
660 | string bestMatch = null; | 741 | string bestMatch = null; |
@@ -747,24 +828,24 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
747 | } | 828 | } |
748 | } | 829 | } |
749 | 830 | ||
750 | private bool TryGetAgentHandler(OSHttpRequest request, OSHttpResponse response, out IHttpAgentHandler agentHandler) | 831 | // private bool TryGetAgentHandler(OSHttpRequest request, OSHttpResponse response, out IHttpAgentHandler agentHandler) |
751 | { | 832 | // { |
752 | agentHandler = null; | 833 | // agentHandler = null; |
753 | 834 | // | |
754 | lock (m_agentHandlers) | 835 | // lock (m_agentHandlers) |
755 | { | 836 | // { |
756 | foreach (IHttpAgentHandler handler in m_agentHandlers.Values) | 837 | // foreach (IHttpAgentHandler handler in m_agentHandlers.Values) |
757 | { | 838 | // { |
758 | if (handler.Match(request, response)) | 839 | // if (handler.Match(request, response)) |
759 | { | 840 | // { |
760 | agentHandler = handler; | 841 | // agentHandler = handler; |
761 | return true; | 842 | // return true; |
762 | } | 843 | // } |
763 | } | 844 | // } |
764 | } | 845 | // } |
765 | 846 | // | |
766 | return false; | 847 | // return false; |
767 | } | 848 | // } |
768 | 849 | ||
769 | /// <summary> | 850 | /// <summary> |
770 | /// Try all the registered xmlrpc handlers when an xmlrpc request is received. | 851 | /// Try all the registered xmlrpc handlers when an xmlrpc request is received. |
@@ -1737,21 +1818,21 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1737 | m_pollHandlers.Remove(path); | 1818 | m_pollHandlers.Remove(path); |
1738 | } | 1819 | } |
1739 | 1820 | ||
1740 | public bool RemoveAgentHandler(string agent, IHttpAgentHandler handler) | 1821 | // public bool RemoveAgentHandler(string agent, IHttpAgentHandler handler) |
1741 | { | 1822 | // { |
1742 | lock (m_agentHandlers) | 1823 | // lock (m_agentHandlers) |
1743 | { | 1824 | // { |
1744 | IHttpAgentHandler foundHandler; | 1825 | // IHttpAgentHandler foundHandler; |
1745 | 1826 | // | |
1746 | if (m_agentHandlers.TryGetValue(agent, out foundHandler) && foundHandler == handler) | 1827 | // if (m_agentHandlers.TryGetValue(agent, out foundHandler) && foundHandler == handler) |
1747 | { | 1828 | // { |
1748 | m_agentHandlers.Remove(agent); | 1829 | // m_agentHandlers.Remove(agent); |
1749 | return true; | 1830 | // return true; |
1750 | } | 1831 | // } |
1751 | } | 1832 | // } |
1752 | 1833 | // | |
1753 | return false; | 1834 | // return false; |
1754 | } | 1835 | // } |
1755 | 1836 | ||
1756 | public void RemoveXmlRPCHandler(string method) | 1837 | public void RemoveXmlRPCHandler(string method) |
1757 | { | 1838 | { |
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs index db58f6f..0bd3aae 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs | |||
@@ -41,10 +41,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
41 | uint Port { get; } | 41 | uint Port { get; } |
42 | bool UseSSL { get; } | 42 | bool UseSSL { get; } |
43 | 43 | ||
44 | // Note that the agent string is provided simply to differentiate | 44 | // // Note that the agent string is provided simply to differentiate |
45 | // the handlers - it is NOT required to be an actual agent header | 45 | // // the handlers - it is NOT required to be an actual agent header |
46 | // value. | 46 | // // value. |
47 | bool AddAgentHandler(string agent, IHttpAgentHandler handler); | 47 | // bool AddAgentHandler(string agent, IHttpAgentHandler handler); |
48 | 48 | ||
49 | /// <summary> | 49 | /// <summary> |
50 | /// Add a handler for an HTTP request. | 50 | /// Add a handler for an HTTP request. |
@@ -106,13 +106,13 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
106 | 106 | ||
107 | bool SetDefaultLLSDHandler(DefaultLLSDMethod handler); | 107 | bool SetDefaultLLSDHandler(DefaultLLSDMethod handler); |
108 | 108 | ||
109 | /// <summary> | 109 | // /// <summary> |
110 | /// Remove the agent if it is registered. | 110 | // /// Remove the agent if it is registered. |
111 | /// </summary> | 111 | // /// </summary> |
112 | /// <param name="agent"></param> | 112 | // /// <param name="agent"></param> |
113 | /// <param name="handler"></param> | 113 | // /// <param name="handler"></param> |
114 | /// <returns></returns> | 114 | // /// <returns></returns> |
115 | bool RemoveAgentHandler(string agent, IHttpAgentHandler handler); | 115 | // bool RemoveAgentHandler(string agent, IHttpAgentHandler handler); |
116 | 116 | ||
117 | /// <summary> | 117 | /// <summary> |
118 | /// Remove an HTTP handler | 118 | /// Remove an HTTP handler |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs index d0a37d0..c19ac32 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs | |||
@@ -53,7 +53,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
53 | Normal = 0, | 53 | Normal = 0, |
54 | LslHttp = 1, | 54 | LslHttp = 1, |
55 | Inventory = 2, | 55 | Inventory = 2, |
56 | Texture = 3 | 56 | Texture = 3, |
57 | Mesh = 4 | ||
57 | } | 58 | } |
58 | 59 | ||
59 | public PollServiceEventArgs( | 60 | public PollServiceEventArgs( |
diff --git a/OpenSim/Framework/Servers/HttpServer/Properties/AssemblyInfo.cs b/OpenSim/Framework/Servers/HttpServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..02ecc25 --- /dev/null +++ b/OpenSim/Framework/Servers/HttpServer/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.Servers.HttpServer")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("c4ea5baa-81c4-4867-a645-1ec360c1f164")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs index 8dc0e3a..ae7d515 100644 --- a/OpenSim/Framework/Servers/MainServer.cs +++ b/OpenSim/Framework/Servers/MainServer.cs | |||
@@ -29,6 +29,7 @@ using System; | |||
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | using System.Net; | 31 | using System.Net; |
32 | using System.Text; | ||
32 | using log4net; | 33 | using log4net; |
33 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Console; | 35 | using OpenSim.Framework.Console; |
@@ -47,9 +48,12 @@ namespace OpenSim.Framework.Servers | |||
47 | /// Control the printing of certain debug messages. | 48 | /// Control the printing of certain debug messages. |
48 | /// </summary> | 49 | /// </summary> |
49 | /// <remarks> | 50 | /// <remarks> |
50 | /// If DebugLevel >= 1, then short warnings are logged when receiving bad input data. | 51 | /// If DebugLevel >= 1 then short warnings are logged when receiving bad input data. |
51 | /// If DebugLevel >= 2, then long warnings are logged when receiving bad input data. | 52 | /// If DebugLevel >= 2 then long warnings are logged when receiving bad input data. |
52 | /// If DebugLevel >= 3, then short notices about all incoming non-poll HTTP requests are logged. | 53 | /// If DebugLevel >= 3 then short notices about all incoming non-poll HTTP requests are logged. |
54 | /// If DebugLevel >= 4 then the time taken to fulfill the request is logged. | ||
55 | /// If DebugLevel >= 5 then the start of the body of incoming non-poll HTTP requests will be logged. | ||
56 | /// If DebugLevel >= 6 then the entire body of incoming non-poll HTTP requests will be logged. | ||
53 | /// </remarks> | 57 | /// </remarks> |
54 | public static int DebugLevel | 58 | public static int DebugLevel |
55 | { | 59 | { |
@@ -101,17 +105,28 @@ namespace OpenSim.Framework.Servers | |||
101 | get { return new Dictionary<uint, BaseHttpServer>(m_Servers); } | 105 | get { return new Dictionary<uint, BaseHttpServer>(m_Servers); } |
102 | } | 106 | } |
103 | 107 | ||
104 | |||
105 | public static void RegisterHttpConsoleCommands(ICommandConsole console) | 108 | public static void RegisterHttpConsoleCommands(ICommandConsole console) |
106 | { | 109 | { |
107 | console.Commands.AddCommand( | 110 | console.Commands.AddCommand( |
108 | "Debug", false, "debug http", "debug http [<level>]", | 111 | "Comms", false, "show http-handlers", |
109 | "Turn on inbound non-poll http request debugging.", | 112 | "show http-handlers", |
110 | "If level <= 0, then no extra logging is done.\n" | 113 | "Show all registered http handlers", HandleShowHttpHandlersCommand); |
111 | + "If level >= 1, then short warnings are logged when receiving bad input data.\n" | 114 | |
112 | + "If level >= 2, then long warnings are logged when receiving bad input data.\n" | 115 | console.Commands.AddCommand( |
113 | + "If level >= 3, then short notices about all incoming non-poll HTTP requests are logged.\n" | 116 | "Debug", false, "debug http", "debug http <in|out|all> [<level>]", |
114 | + "If no level is specified then the current level is returned.", | 117 | "Turn on http request logging.", |
118 | "If in or all and\n" | ||
119 | + " level <= 0 then no extra logging is done.\n" | ||
120 | + " level >= 1 then short warnings are logged when receiving bad input data.\n" | ||
121 | + " level >= 2 then long warnings are logged when receiving bad input data.\n" | ||
122 | + " level >= 3 then short notices about all incoming non-poll HTTP requests are logged.\n" | ||
123 | + " level >= 4 then the time taken to fulfill the request is logged.\n" | ||
124 | + " level >= 5 then a sample from the beginning of the incoming data is logged.\n" | ||
125 | + " level >= 6 then the entire incoming data is logged.\n" | ||
126 | + " no level is specified then the current level is returned.\n\n" | ||
127 | + "If out or all and\n" | ||
128 | + " level >= 3 then short notices about all outgoing requests going through WebUtil are logged.\n" | ||
129 | + " level >= 4 then the time taken to fulfill the request is logged.\n", | ||
115 | HandleDebugHttpCommand); | 130 | HandleDebugHttpCommand); |
116 | } | 131 | } |
117 | 132 | ||
@@ -119,25 +134,120 @@ namespace OpenSim.Framework.Servers | |||
119 | /// Turn on some debugging values for OpenSim. | 134 | /// Turn on some debugging values for OpenSim. |
120 | /// </summary> | 135 | /// </summary> |
121 | /// <param name="args"></param> | 136 | /// <param name="args"></param> |
122 | private static void HandleDebugHttpCommand(string module, string[] args) | 137 | private static void HandleDebugHttpCommand(string module, string[] cmdparams) |
123 | { | 138 | { |
124 | if (args.Length == 3) | 139 | if (cmdparams.Length < 3) |
140 | { | ||
141 | MainConsole.Instance.Output("Usage: debug http <in|out|all> 0..6"); | ||
142 | return; | ||
143 | } | ||
144 | |||
145 | bool inReqs = false; | ||
146 | bool outReqs = false; | ||
147 | bool allReqs = false; | ||
148 | |||
149 | string subCommand = cmdparams[2]; | ||
150 | |||
151 | if (subCommand.ToLower() == "in") | ||
152 | { | ||
153 | inReqs = true; | ||
154 | } | ||
155 | else if (subCommand.ToLower() == "out") | ||
156 | { | ||
157 | outReqs = true; | ||
158 | } | ||
159 | else if (subCommand.ToLower() == "all") | ||
160 | { | ||
161 | allReqs = true; | ||
162 | } | ||
163 | else | ||
125 | { | 164 | { |
165 | MainConsole.Instance.Output("You must specify in, out or all"); | ||
166 | return; | ||
167 | } | ||
168 | |||
169 | if (cmdparams.Length >= 4) | ||
170 | { | ||
171 | string rawNewDebug = cmdparams[3]; | ||
126 | int newDebug; | 172 | int newDebug; |
127 | if (int.TryParse(args[2], out newDebug)) | 173 | |
174 | if (!int.TryParse(rawNewDebug, out newDebug)) | ||
175 | { | ||
176 | MainConsole.Instance.OutputFormat("{0} is not a valid debug level", rawNewDebug); | ||
177 | return; | ||
178 | } | ||
179 | |||
180 | if (newDebug < 0 || newDebug > 6) | ||
181 | { | ||
182 | MainConsole.Instance.OutputFormat("{0} is outside the valid debug level range of 0..6", newDebug); | ||
183 | return; | ||
184 | } | ||
185 | |||
186 | if (allReqs || inReqs) | ||
128 | { | 187 | { |
129 | MainServer.DebugLevel = newDebug; | 188 | MainServer.DebugLevel = newDebug; |
130 | MainConsole.Instance.OutputFormat("Debug http level set to {0}", newDebug); | 189 | MainConsole.Instance.OutputFormat("IN debug level set to {0}", newDebug); |
190 | } | ||
191 | |||
192 | if (allReqs || outReqs) | ||
193 | { | ||
194 | WebUtil.DebugLevel = newDebug; | ||
195 | MainConsole.Instance.OutputFormat("OUT debug level set to {0}", newDebug); | ||
131 | } | 196 | } |
132 | } | 197 | } |
133 | else if (args.Length == 2) | 198 | else |
134 | { | 199 | { |
135 | MainConsole.Instance.OutputFormat("Current debug http level is {0}", MainServer.DebugLevel); | 200 | if (allReqs || inReqs) |
201 | MainConsole.Instance.OutputFormat("Current IN debug level is {0}", MainServer.DebugLevel); | ||
202 | |||
203 | if (allReqs || outReqs) | ||
204 | MainConsole.Instance.OutputFormat("Current OUT debug level is {0}", WebUtil.DebugLevel); | ||
136 | } | 205 | } |
137 | else | 206 | } |
207 | |||
208 | private static void HandleShowHttpHandlersCommand(string module, string[] args) | ||
209 | { | ||
210 | if (args.Length != 2) | ||
211 | { | ||
212 | MainConsole.Instance.Output("Usage: show http-handlers"); | ||
213 | return; | ||
214 | } | ||
215 | |||
216 | StringBuilder handlers = new StringBuilder(); | ||
217 | |||
218 | lock (m_Servers) | ||
138 | { | 219 | { |
139 | MainConsole.Instance.Output("Usage: debug http 0..3"); | 220 | foreach (BaseHttpServer httpServer in m_Servers.Values) |
221 | { | ||
222 | handlers.AppendFormat( | ||
223 | "Registered HTTP Handlers for server at {0}:{1}\n", httpServer.ListenIPAddress, httpServer.Port); | ||
224 | |||
225 | handlers.AppendFormat("* XMLRPC:\n"); | ||
226 | foreach (String s in httpServer.GetXmlRpcHandlerKeys()) | ||
227 | handlers.AppendFormat("\t{0}\n", s); | ||
228 | |||
229 | handlers.AppendFormat("* HTTP:\n"); | ||
230 | List<String> poll = httpServer.GetPollServiceHandlerKeys(); | ||
231 | foreach (String s in httpServer.GetHTTPHandlerKeys()) | ||
232 | handlers.AppendFormat("\t{0} {1}\n", s, (poll.Contains(s) ? "(poll service)" : string.Empty)); | ||
233 | |||
234 | // handlers.AppendFormat("* Agent:\n"); | ||
235 | // foreach (String s in httpServer.GetAgentHandlerKeys()) | ||
236 | // handlers.AppendFormat("\t{0}\n", s); | ||
237 | |||
238 | handlers.AppendFormat("* LLSD:\n"); | ||
239 | foreach (String s in httpServer.GetLLSDHandlerKeys()) | ||
240 | handlers.AppendFormat("\t{0}\n", s); | ||
241 | |||
242 | handlers.AppendFormat("* StreamHandlers ({0}):\n", httpServer.GetStreamHandlerKeys().Count); | ||
243 | foreach (String s in httpServer.GetStreamHandlerKeys()) | ||
244 | handlers.AppendFormat("\t{0}\n", s); | ||
245 | |||
246 | handlers.Append("\n"); | ||
247 | } | ||
140 | } | 248 | } |
249 | |||
250 | MainConsole.Instance.Output(handlers.ToString()); | ||
141 | } | 251 | } |
142 | 252 | ||
143 | /// <summary> | 253 | /// <summary> |
diff --git a/OpenSim/Framework/Servers/Properties/AssemblyInfo.cs b/OpenSim/Framework/Servers/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..021f63c --- /dev/null +++ b/OpenSim/Framework/Servers/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,33 @@ | |||
1 | using System.Reflection; | ||
2 | using System.Runtime.CompilerServices; | ||
3 | using System.Runtime.InteropServices; | ||
4 | |||
5 | // General Information about an assembly is controlled through the following | ||
6 | // set of attributes. Change these attribute values to modify the information | ||
7 | // associated with an assembly. | ||
8 | [assembly: AssemblyTitle("OpenSim.Framework.Servers")] | ||
9 | [assembly: AssemblyDescription("")] | ||
10 | [assembly: AssemblyConfiguration("")] | ||
11 | [assembly: AssemblyCompany("http://opensimulator.org")] | ||
12 | [assembly: AssemblyProduct("OpenSim")] | ||
13 | [assembly: AssemblyCopyright("OpenSimulator developers")] | ||
14 | [assembly: AssemblyTrademark("")] | ||
15 | [assembly: AssemblyCulture("")] | ||
16 | |||
17 | // Setting ComVisible to false makes the types in this assembly not visible | ||
18 | // to COM components. If you need to access a type in this assembly from | ||
19 | // COM, set the ComVisible attribute to true on that type. | ||
20 | [assembly: ComVisible(false)] | ||
21 | |||
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
23 | [assembly: Guid("b48e8b3e-5c5c-4673-b31f-21e13b8e568b")] | ||
24 | |||
25 | // Version information for an assembly consists of the following four values: | ||
26 | // | ||
27 | // Major Version | ||
28 | // Minor Version | ||
29 | // Build Number | ||
30 | // Revision | ||
31 | // | ||
32 | [assembly: AssemblyVersion("0.7.5.*")] | ||
33 | [assembly: AssemblyFileVersion("1.0.0.0")] | ||
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs new file mode 100644 index 0000000..c182a3a --- /dev/null +++ b/OpenSim/Framework/Servers/ServerBase.cs | |||
@@ -0,0 +1,566 @@ | |||
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 System.IO; | ||
31 | using System.Reflection; | ||
32 | using System.Text; | ||
33 | using System.Text.RegularExpressions; | ||
34 | using log4net; | ||
35 | using log4net.Appender; | ||
36 | using log4net.Core; | ||
37 | using log4net.Repository; | ||
38 | using Nini.Config; | ||
39 | using OpenSim.Framework.Console; | ||
40 | |||
41 | namespace OpenSim.Framework.Servers | ||
42 | { | ||
43 | public class ServerBase | ||
44 | { | ||
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | public IConfigSource Config { get; protected set; } | ||
48 | |||
49 | /// <summary> | ||
50 | /// Console to be used for any command line output. Can be null, in which case there should be no output. | ||
51 | /// </summary> | ||
52 | protected ICommandConsole m_console; | ||
53 | |||
54 | protected OpenSimAppender m_consoleAppender; | ||
55 | protected FileAppender m_logFileAppender; | ||
56 | |||
57 | protected DateTime m_startuptime; | ||
58 | protected string m_startupDirectory = Environment.CurrentDirectory; | ||
59 | |||
60 | protected string m_pidFile = String.Empty; | ||
61 | |||
62 | /// <summary> | ||
63 | /// Server version information. Usually VersionInfo + information about git commit, operating system, etc. | ||
64 | /// </summary> | ||
65 | protected string m_version; | ||
66 | |||
67 | public ServerBase() | ||
68 | { | ||
69 | m_startuptime = DateTime.Now; | ||
70 | m_version = VersionInfo.Version; | ||
71 | EnhanceVersionInformation(); | ||
72 | } | ||
73 | |||
74 | protected void CreatePIDFile(string path) | ||
75 | { | ||
76 | try | ||
77 | { | ||
78 | string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); | ||
79 | |||
80 | using (FileStream fs = File.Create(path)) | ||
81 | { | ||
82 | Byte[] buf = Encoding.ASCII.GetBytes(pidstring); | ||
83 | fs.Write(buf, 0, buf.Length); | ||
84 | } | ||
85 | |||
86 | m_pidFile = path; | ||
87 | |||
88 | m_log.InfoFormat("[SERVER BASE]: Created pid file {0}", m_pidFile); | ||
89 | } | ||
90 | catch (Exception e) | ||
91 | { | ||
92 | m_log.Warn(string.Format("[SERVER BASE]: Could not create PID file at {0} ", path), e); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | protected void RemovePIDFile() | ||
97 | { | ||
98 | if (m_pidFile != String.Empty) | ||
99 | { | ||
100 | try | ||
101 | { | ||
102 | File.Delete(m_pidFile); | ||
103 | } | ||
104 | catch (Exception e) | ||
105 | { | ||
106 | m_log.Error(string.Format("[SERVER BASE]: Error whilst removing {0} ", m_pidFile), e); | ||
107 | } | ||
108 | |||
109 | m_pidFile = String.Empty; | ||
110 | } | ||
111 | } | ||
112 | |||
113 | public void RegisterCommonAppenders(IConfig startupConfig) | ||
114 | { | ||
115 | ILoggerRepository repository = LogManager.GetRepository(); | ||
116 | IAppender[] appenders = repository.GetAppenders(); | ||
117 | |||
118 | foreach (IAppender appender in appenders) | ||
119 | { | ||
120 | if (appender.Name == "Console") | ||
121 | { | ||
122 | m_consoleAppender = (OpenSimAppender)appender; | ||
123 | } | ||
124 | else if (appender.Name == "LogFileAppender") | ||
125 | { | ||
126 | m_logFileAppender = (FileAppender)appender; | ||
127 | } | ||
128 | } | ||
129 | |||
130 | if (null == m_consoleAppender) | ||
131 | { | ||
132 | Notice("No appender named Console found (see the log4net config file for this executable)!"); | ||
133 | } | ||
134 | else | ||
135 | { | ||
136 | // FIXME: This should be done through an interface rather than casting. | ||
137 | m_consoleAppender.Console = (ConsoleBase)m_console; | ||
138 | |||
139 | // If there is no threshold set then the threshold is effectively everything. | ||
140 | if (null == m_consoleAppender.Threshold) | ||
141 | m_consoleAppender.Threshold = Level.All; | ||
142 | |||
143 | Notice(String.Format("Console log level is {0}", m_consoleAppender.Threshold)); | ||
144 | } | ||
145 | |||
146 | if (m_logFileAppender != null && startupConfig != null) | ||
147 | { | ||
148 | string cfgFileName = startupConfig.GetString("LogFile", null); | ||
149 | if (cfgFileName != null) | ||
150 | { | ||
151 | m_logFileAppender.File = cfgFileName; | ||
152 | m_logFileAppender.ActivateOptions(); | ||
153 | } | ||
154 | |||
155 | m_log.InfoFormat("[SERVER BASE]: Logging started to file {0}", m_logFileAppender.File); | ||
156 | } | ||
157 | } | ||
158 | |||
159 | /// <summary> | ||
160 | /// Register common commands once m_console has been set if it is going to be set | ||
161 | /// </summary> | ||
162 | public void RegisterCommonCommands() | ||
163 | { | ||
164 | if (m_console == null) | ||
165 | return; | ||
166 | |||
167 | m_console.Commands.AddCommand( | ||
168 | "General", false, "show info", "show info", "Show general information about the server", HandleShow); | ||
169 | |||
170 | m_console.Commands.AddCommand( | ||
171 | "General", false, "show uptime", "show uptime", "Show server uptime", HandleShow); | ||
172 | |||
173 | m_console.Commands.AddCommand( | ||
174 | "General", false, "get log level", "get log level", "Get the current console logging level", | ||
175 | (mod, cmd) => ShowLogLevel()); | ||
176 | |||
177 | m_console.Commands.AddCommand( | ||
178 | "General", false, "set log level", "set log level <level>", | ||
179 | "Set the console logging level for this session.", HandleSetLogLevel); | ||
180 | |||
181 | m_console.Commands.AddCommand( | ||
182 | "General", false, "config set", | ||
183 | "config set <section> <key> <value>", | ||
184 | "Set a config option. In most cases this is not useful since changed parameters are not dynamically reloaded. Neither do changed parameters persist - you will have to change a config file manually and restart.", HandleConfig); | ||
185 | |||
186 | m_console.Commands.AddCommand( | ||
187 | "General", false, "config get", | ||
188 | "config get [<section>] [<key>]", | ||
189 | "Synonym for config show", | ||
190 | HandleConfig); | ||
191 | |||
192 | m_console.Commands.AddCommand( | ||
193 | "General", false, "config show", | ||
194 | "config show [<section>] [<key>]", | ||
195 | "Show config information", | ||
196 | "If neither section nor field are specified, then the whole current configuration is printed." + Environment.NewLine | ||
197 | + "If a section is given but not a field, then all fields in that section are printed.", | ||
198 | HandleConfig); | ||
199 | |||
200 | m_console.Commands.AddCommand( | ||
201 | "General", false, "config save", | ||
202 | "config save <path>", | ||
203 | "Save current configuration to a file at the given path", HandleConfig); | ||
204 | |||
205 | m_console.Commands.AddCommand( | ||
206 | "General", false, "command-script", | ||
207 | "command-script <script>", | ||
208 | "Run a command script from file", HandleScript); | ||
209 | } | ||
210 | |||
211 | public virtual void HandleShow(string module, string[] cmd) | ||
212 | { | ||
213 | List<string> args = new List<string>(cmd); | ||
214 | |||
215 | args.RemoveAt(0); | ||
216 | |||
217 | string[] showParams = args.ToArray(); | ||
218 | |||
219 | switch (showParams[0]) | ||
220 | { | ||
221 | case "info": | ||
222 | ShowInfo(); | ||
223 | break; | ||
224 | |||
225 | case "uptime": | ||
226 | Notice(GetUptimeReport()); | ||
227 | break; | ||
228 | } | ||
229 | } | ||
230 | |||
231 | /// <summary> | ||
232 | /// Change and load configuration file data. | ||
233 | /// </summary> | ||
234 | /// <param name="module"></param> | ||
235 | /// <param name="cmd"></param> | ||
236 | private void HandleConfig(string module, string[] cmd) | ||
237 | { | ||
238 | List<string> args = new List<string>(cmd); | ||
239 | args.RemoveAt(0); | ||
240 | string[] cmdparams = args.ToArray(); | ||
241 | |||
242 | if (cmdparams.Length > 0) | ||
243 | { | ||
244 | string firstParam = cmdparams[0].ToLower(); | ||
245 | |||
246 | switch (firstParam) | ||
247 | { | ||
248 | case "set": | ||
249 | if (cmdparams.Length < 4) | ||
250 | { | ||
251 | Notice("Syntax: config set <section> <key> <value>"); | ||
252 | Notice("Example: config set ScriptEngine.DotNetEngine NumberOfScriptThreads 5"); | ||
253 | } | ||
254 | else | ||
255 | { | ||
256 | IConfig c; | ||
257 | IConfigSource source = new IniConfigSource(); | ||
258 | c = source.AddConfig(cmdparams[1]); | ||
259 | if (c != null) | ||
260 | { | ||
261 | string _value = String.Join(" ", cmdparams, 3, cmdparams.Length - 3); | ||
262 | c.Set(cmdparams[2], _value); | ||
263 | Config.Merge(source); | ||
264 | |||
265 | Notice("In section [{0}], set {1} = {2}", c.Name, cmdparams[2], _value); | ||
266 | } | ||
267 | } | ||
268 | break; | ||
269 | |||
270 | case "get": | ||
271 | case "show": | ||
272 | if (cmdparams.Length == 1) | ||
273 | { | ||
274 | foreach (IConfig config in Config.Configs) | ||
275 | { | ||
276 | Notice("[{0}]", config.Name); | ||
277 | string[] keys = config.GetKeys(); | ||
278 | foreach (string key in keys) | ||
279 | Notice(" {0} = {1}", key, config.GetString(key)); | ||
280 | } | ||
281 | } | ||
282 | else if (cmdparams.Length == 2 || cmdparams.Length == 3) | ||
283 | { | ||
284 | IConfig config = Config.Configs[cmdparams[1]]; | ||
285 | if (config == null) | ||
286 | { | ||
287 | Notice("Section \"{0}\" does not exist.",cmdparams[1]); | ||
288 | break; | ||
289 | } | ||
290 | else | ||
291 | { | ||
292 | if (cmdparams.Length == 2) | ||
293 | { | ||
294 | Notice("[{0}]", config.Name); | ||
295 | foreach (string key in config.GetKeys()) | ||
296 | Notice(" {0} = {1}", key, config.GetString(key)); | ||
297 | } | ||
298 | else | ||
299 | { | ||
300 | Notice( | ||
301 | "config get {0} {1} : {2}", | ||
302 | cmdparams[1], cmdparams[2], config.GetString(cmdparams[2])); | ||
303 | } | ||
304 | } | ||
305 | } | ||
306 | else | ||
307 | { | ||
308 | Notice("Syntax: config {0} [<section>] [<key>]", firstParam); | ||
309 | Notice("Example: config {0} ScriptEngine.DotNetEngine NumberOfScriptThreads", firstParam); | ||
310 | } | ||
311 | |||
312 | break; | ||
313 | |||
314 | case "save": | ||
315 | if (cmdparams.Length < 2) | ||
316 | { | ||
317 | Notice("Syntax: config save <path>"); | ||
318 | return; | ||
319 | } | ||
320 | |||
321 | string path = cmdparams[1]; | ||
322 | Notice("Saving configuration file: {0}", path); | ||
323 | |||
324 | if (Config is IniConfigSource) | ||
325 | { | ||
326 | IniConfigSource iniCon = (IniConfigSource)Config; | ||
327 | iniCon.Save(path); | ||
328 | } | ||
329 | else if (Config is XmlConfigSource) | ||
330 | { | ||
331 | XmlConfigSource xmlCon = (XmlConfigSource)Config; | ||
332 | xmlCon.Save(path); | ||
333 | } | ||
334 | |||
335 | break; | ||
336 | } | ||
337 | } | ||
338 | } | ||
339 | |||
340 | private void HandleSetLogLevel(string module, string[] cmd) | ||
341 | { | ||
342 | if (cmd.Length != 4) | ||
343 | { | ||
344 | Notice("Usage: set log level <level>"); | ||
345 | return; | ||
346 | } | ||
347 | |||
348 | if (null == m_consoleAppender) | ||
349 | { | ||
350 | Notice("No appender named Console found (see the log4net config file for this executable)!"); | ||
351 | return; | ||
352 | } | ||
353 | |||
354 | string rawLevel = cmd[3]; | ||
355 | |||
356 | ILoggerRepository repository = LogManager.GetRepository(); | ||
357 | Level consoleLevel = repository.LevelMap[rawLevel]; | ||
358 | |||
359 | if (consoleLevel != null) | ||
360 | m_consoleAppender.Threshold = consoleLevel; | ||
361 | else | ||
362 | Notice( | ||
363 | "{0} is not a valid logging level. Valid logging levels are ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF", | ||
364 | rawLevel); | ||
365 | |||
366 | ShowLogLevel(); | ||
367 | } | ||
368 | |||
369 | private void ShowLogLevel() | ||
370 | { | ||
371 | Notice("Console log level is {0}", m_consoleAppender.Threshold); | ||
372 | } | ||
373 | |||
374 | protected virtual void HandleScript(string module, string[] parms) | ||
375 | { | ||
376 | if (parms.Length != 2) | ||
377 | { | ||
378 | Notice("Usage: command-script <path-to-script"); | ||
379 | return; | ||
380 | } | ||
381 | |||
382 | RunCommandScript(parms[1]); | ||
383 | } | ||
384 | |||
385 | /// <summary> | ||
386 | /// Run an optional startup list of commands | ||
387 | /// </summary> | ||
388 | /// <param name="fileName"></param> | ||
389 | protected void RunCommandScript(string fileName) | ||
390 | { | ||
391 | if (m_console == null) | ||
392 | return; | ||
393 | |||
394 | if (File.Exists(fileName)) | ||
395 | { | ||
396 | m_log.Info("[SERVER BASE]: Running " + fileName); | ||
397 | |||
398 | using (StreamReader readFile = File.OpenText(fileName)) | ||
399 | { | ||
400 | string currentCommand; | ||
401 | while ((currentCommand = readFile.ReadLine()) != null) | ||
402 | { | ||
403 | currentCommand = currentCommand.Trim(); | ||
404 | if (!(currentCommand == "" | ||
405 | || currentCommand.StartsWith(";") | ||
406 | || currentCommand.StartsWith("//") | ||
407 | || currentCommand.StartsWith("#"))) | ||
408 | { | ||
409 | m_log.Info("[SERVER BASE]: Running '" + currentCommand + "'"); | ||
410 | m_console.RunCommand(currentCommand); | ||
411 | } | ||
412 | } | ||
413 | } | ||
414 | } | ||
415 | } | ||
416 | |||
417 | /// <summary> | ||
418 | /// Return a report about the uptime of this server | ||
419 | /// </summary> | ||
420 | /// <returns></returns> | ||
421 | protected string GetUptimeReport() | ||
422 | { | ||
423 | StringBuilder sb = new StringBuilder(String.Format("Time now is {0}\n", DateTime.Now)); | ||
424 | sb.Append(String.Format("Server has been running since {0}, {1}\n", m_startuptime.DayOfWeek, m_startuptime)); | ||
425 | sb.Append(String.Format("That is an elapsed time of {0}\n", DateTime.Now - m_startuptime)); | ||
426 | |||
427 | return sb.ToString(); | ||
428 | } | ||
429 | |||
430 | protected void ShowInfo() | ||
431 | { | ||
432 | Notice(GetVersionText()); | ||
433 | Notice("Startup directory: " + m_startupDirectory); | ||
434 | if (null != m_consoleAppender) | ||
435 | Notice(String.Format("Console log level: {0}", m_consoleAppender.Threshold)); | ||
436 | } | ||
437 | |||
438 | /// <summary> | ||
439 | /// Enhance the version string with extra information if it's available. | ||
440 | /// </summary> | ||
441 | protected void EnhanceVersionInformation() | ||
442 | { | ||
443 | string buildVersion = string.Empty; | ||
444 | |||
445 | // The subversion information is deprecated and will be removed at a later date | ||
446 | // Add subversion revision information if available | ||
447 | // Try file "svn_revision" in the current directory first, then the .svn info. | ||
448 | // This allows to make the revision available in simulators not running from the source tree. | ||
449 | // FIXME: Making an assumption about the directory we're currently in - we do this all over the place | ||
450 | // elsewhere as well | ||
451 | string gitDir = "../.git/"; | ||
452 | string gitRefPointerPath = gitDir + "HEAD"; | ||
453 | |||
454 | string svnRevisionFileName = "svn_revision"; | ||
455 | string svnFileName = ".svn/entries"; | ||
456 | string manualVersionFileName = ".version"; | ||
457 | string inputLine; | ||
458 | int strcmp; | ||
459 | |||
460 | if (File.Exists(manualVersionFileName)) | ||
461 | { | ||
462 | using (StreamReader CommitFile = File.OpenText(manualVersionFileName)) | ||
463 | buildVersion = CommitFile.ReadLine(); | ||
464 | |||
465 | m_version += buildVersion ?? ""; | ||
466 | } | ||
467 | else if (File.Exists(gitRefPointerPath)) | ||
468 | { | ||
469 | // m_log.DebugFormat("[SERVER BASE]: Found {0}", gitRefPointerPath); | ||
470 | |||
471 | string rawPointer = ""; | ||
472 | |||
473 | using (StreamReader pointerFile = File.OpenText(gitRefPointerPath)) | ||
474 | rawPointer = pointerFile.ReadLine(); | ||
475 | |||
476 | // m_log.DebugFormat("[SERVER BASE]: rawPointer [{0}]", rawPointer); | ||
477 | |||
478 | Match m = Regex.Match(rawPointer, "^ref: (.+)$"); | ||
479 | |||
480 | if (m.Success) | ||
481 | { | ||
482 | // m_log.DebugFormat("[SERVER BASE]: Matched [{0}]", m.Groups[1].Value); | ||
483 | |||
484 | string gitRef = m.Groups[1].Value; | ||
485 | string gitRefPath = gitDir + gitRef; | ||
486 | if (File.Exists(gitRefPath)) | ||
487 | { | ||
488 | // m_log.DebugFormat("[SERVER BASE]: Found gitRefPath [{0}]", gitRefPath); | ||
489 | |||
490 | using (StreamReader refFile = File.OpenText(gitRefPath)) | ||
491 | { | ||
492 | string gitHash = refFile.ReadLine(); | ||
493 | m_version += gitHash.Substring(0, 7); | ||
494 | } | ||
495 | } | ||
496 | } | ||
497 | } | ||
498 | else | ||
499 | { | ||
500 | // Remove the else logic when subversion mirror is no longer used | ||
501 | if (File.Exists(svnRevisionFileName)) | ||
502 | { | ||
503 | StreamReader RevisionFile = File.OpenText(svnRevisionFileName); | ||
504 | buildVersion = RevisionFile.ReadLine(); | ||
505 | buildVersion.Trim(); | ||
506 | RevisionFile.Close(); | ||
507 | } | ||
508 | |||
509 | if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName)) | ||
510 | { | ||
511 | StreamReader EntriesFile = File.OpenText(svnFileName); | ||
512 | inputLine = EntriesFile.ReadLine(); | ||
513 | while (inputLine != null) | ||
514 | { | ||
515 | // using the dir svn revision at the top of entries file | ||
516 | strcmp = String.Compare(inputLine, "dir"); | ||
517 | if (strcmp == 0) | ||
518 | { | ||
519 | buildVersion = EntriesFile.ReadLine(); | ||
520 | break; | ||
521 | } | ||
522 | else | ||
523 | { | ||
524 | inputLine = EntriesFile.ReadLine(); | ||
525 | } | ||
526 | } | ||
527 | EntriesFile.Close(); | ||
528 | } | ||
529 | |||
530 | m_version += string.IsNullOrEmpty(buildVersion) ? " " : ("." + buildVersion + " ").Substring(0, 6); | ||
531 | } | ||
532 | } | ||
533 | |||
534 | protected string GetVersionText() | ||
535 | { | ||
536 | return String.Format("Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion); | ||
537 | } | ||
538 | |||
539 | /// <summary> | ||
540 | /// Console output is only possible if a console has been established. | ||
541 | /// That is something that cannot be determined within this class. So | ||
542 | /// all attempts to use the console MUST be verified. | ||
543 | /// </summary> | ||
544 | /// <param name="msg"></param> | ||
545 | protected void Notice(string msg) | ||
546 | { | ||
547 | if (m_console != null) | ||
548 | { | ||
549 | m_console.Output(msg); | ||
550 | } | ||
551 | } | ||
552 | |||
553 | /// <summary> | ||
554 | /// Console output is only possible if a console has been established. | ||
555 | /// That is something that cannot be determined within this class. So | ||
556 | /// all attempts to use the console MUST be verified. | ||
557 | /// </summary> | ||
558 | /// <param name="format"></param> | ||
559 | /// <param name="components"></param> | ||
560 | protected void Notice(string format, params object[] components) | ||
561 | { | ||
562 | if (m_console != null) | ||
563 | m_console.OutputFormat(format, components); | ||
564 | } | ||
565 | } | ||
566 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index 016a174..bb094ed 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs | |||
@@ -29,7 +29,7 @@ namespace OpenSim | |||
29 | { | 29 | { |
30 | public class VersionInfo | 30 | public class VersionInfo |
31 | { | 31 | { |
32 | private const string VERSION_NUMBER = "0.7.4CM"; | 32 | private const string VERSION_NUMBER = "0.7.5CM"; |
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 |
diff --git a/OpenSim/Framework/TaskInventoryDictionary.cs b/OpenSim/Framework/TaskInventoryDictionary.cs index 4d07746..62ecbd1 100644 --- a/OpenSim/Framework/TaskInventoryDictionary.cs +++ b/OpenSim/Framework/TaskInventoryDictionary.cs | |||
@@ -39,10 +39,12 @@ using OpenMetaverse; | |||
39 | namespace OpenSim.Framework | 39 | namespace OpenSim.Framework |
40 | { | 40 | { |
41 | /// <summary> | 41 | /// <summary> |
42 | /// A dictionary for task inventory. | 42 | /// A dictionary containing task inventory items. Indexed by item UUID. |
43 | /// </summary> | 43 | /// </summary> |
44 | /// <remarks> | ||
44 | /// This class is not thread safe. Callers must synchronize on Dictionary methods or Clone() this object before | 45 | /// This class is not thread safe. Callers must synchronize on Dictionary methods or Clone() this object before |
45 | /// iterating over it. | 46 | /// iterating over it. |
47 | /// </remarks> | ||
46 | public class TaskInventoryDictionary : Dictionary<UUID, TaskInventoryItem>, | 48 | public class TaskInventoryDictionary : Dictionary<UUID, TaskInventoryItem>, |
47 | ICloneable, IXmlSerializable | 49 | ICloneable, IXmlSerializable |
48 | { | 50 | { |
diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index fb818ee..574ee56 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs | |||
@@ -73,9 +73,6 @@ namespace OpenSim.Framework | |||
73 | 73 | ||
74 | private bool _ownerChanged = false; | 74 | private bool _ownerChanged = false; |
75 | 75 | ||
76 | // This used ONLY during copy. It can't be relied on at other times! | ||
77 | private bool _scriptRunning = true; | ||
78 | |||
79 | public UUID AssetID { | 76 | public UUID AssetID { |
80 | get { | 77 | get { |
81 | return _assetID; | 78 | return _assetID; |
@@ -353,14 +350,13 @@ namespace OpenSim.Framework | |||
353 | } | 350 | } |
354 | } | 351 | } |
355 | 352 | ||
356 | public bool ScriptRunning { | 353 | /// <summary> |
357 | get { | 354 | /// This used ONLY during copy. It can't be relied on at other times! |
358 | return _scriptRunning; | 355 | /// </summary> |
359 | } | 356 | /// <remarks> |
360 | set { | 357 | /// For true script running status, use IEntityInventory.TryGetScriptInstanceRunning() for now. |
361 | _scriptRunning = value; | 358 | /// </remarks> |
362 | } | 359 | public bool ScriptRunning { get; set; } |
363 | } | ||
364 | 360 | ||
365 | // See ICloneable | 361 | // See ICloneable |
366 | 362 | ||
@@ -388,6 +384,7 @@ namespace OpenSim.Framework | |||
388 | 384 | ||
389 | public TaskInventoryItem() | 385 | public TaskInventoryItem() |
390 | { | 386 | { |
387 | ScriptRunning = true; | ||
391 | CreationDate = (uint)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; | 388 | CreationDate = (uint)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; |
392 | } | 389 | } |
393 | } | 390 | } |
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 384f716..e76a37b 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -546,6 +546,19 @@ namespace OpenSim.Framework | |||
546 | } | 546 | } |
547 | 547 | ||
548 | /// <summary> | 548 | /// <summary> |
549 | /// Determines whether a point is inside a bounding box. | ||
550 | /// </summary> | ||
551 | /// <param name='v'></param> | ||
552 | /// <param name='min'></param> | ||
553 | /// <param name='max'></param> | ||
554 | /// <returns></returns> | ||
555 | public static bool IsInsideBox(Vector3 v, Vector3 min, Vector3 max) | ||
556 | { | ||
557 | return v.X >= min.X & v.Y >= min.Y && v.Z >= min.Z | ||
558 | && v.X <= max.X && v.Y <= max.Y && v.Z <= max.Z; | ||
559 | } | ||
560 | |||
561 | /// <summary> | ||
549 | /// Are the co-ordinates of the new region visible from the old region? | 562 | /// Are the co-ordinates of the new region visible from the old region? |
550 | /// </summary> | 563 | /// </summary> |
551 | /// <param name="oldx">Old region x-coord</param> | 564 | /// <param name="oldx">Old region x-coord</param> |
@@ -862,6 +875,12 @@ namespace OpenSim.Framework | |||
862 | return Math.Min(Math.Max(x, min), max); | 875 | return Math.Min(Math.Max(x, min), max); |
863 | } | 876 | } |
864 | 877 | ||
878 | public static Vector3 Clip(Vector3 vec, float min, float max) | ||
879 | { | ||
880 | return new Vector3(Clip(vec.X, min, max), Clip(vec.Y, min, max), | ||
881 | Clip(vec.Z, min, max)); | ||
882 | } | ||
883 | |||
865 | /// <summary> | 884 | /// <summary> |
866 | /// Convert an UUID to a raw uuid string. Right now this is a string without hyphens. | 885 | /// Convert an UUID to a raw uuid string. Right now this is a string without hyphens. |
867 | /// </summary> | 886 | /// </summary> |
@@ -1013,6 +1032,38 @@ namespace OpenSim.Framework | |||
1013 | } | 1032 | } |
1014 | } | 1033 | } |
1015 | 1034 | ||
1035 | /// <summary> | ||
1036 | /// Copy data from one stream to another, leaving the read position of both streams at the beginning. | ||
1037 | /// </summary> | ||
1038 | /// <param name='inputStream'> | ||
1039 | /// Input stream. Must be seekable. | ||
1040 | /// </param> | ||
1041 | /// <exception cref='ArgumentException'> | ||
1042 | /// Thrown if the input stream is not seekable. | ||
1043 | /// </exception> | ||
1044 | public static Stream Copy(Stream inputStream) | ||
1045 | { | ||
1046 | if (!inputStream.CanSeek) | ||
1047 | throw new ArgumentException("Util.Copy(Stream inputStream) must receive an inputStream that can seek"); | ||
1048 | |||
1049 | const int readSize = 256; | ||
1050 | byte[] buffer = new byte[readSize]; | ||
1051 | MemoryStream ms = new MemoryStream(); | ||
1052 | |||
1053 | int count = inputStream.Read(buffer, 0, readSize); | ||
1054 | |||
1055 | while (count > 0) | ||
1056 | { | ||
1057 | ms.Write(buffer, 0, count); | ||
1058 | count = inputStream.Read(buffer, 0, readSize); | ||
1059 | } | ||
1060 | |||
1061 | ms.Position = 0; | ||
1062 | inputStream.Position = 0; | ||
1063 | |||
1064 | return ms; | ||
1065 | } | ||
1066 | |||
1016 | public static XmlRpcResponse XmlRpcCommand(string url, string methodName, params object[] args) | 1067 | public static XmlRpcResponse XmlRpcCommand(string url, string methodName, params object[] args) |
1017 | { | 1068 | { |
1018 | return SendXmlRpcCommand(url, methodName, args); | 1069 | return SendXmlRpcCommand(url, methodName, args); |
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index 30a8c28..b85d93d 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs | |||
@@ -54,9 +54,17 @@ namespace OpenSim.Framework | |||
54 | MethodBase.GetCurrentMethod().DeclaringType); | 54 | MethodBase.GetCurrentMethod().DeclaringType); |
55 | 55 | ||
56 | /// <summary> | 56 | /// <summary> |
57 | /// Control the printing of certain debug messages. | ||
58 | /// </summary> | ||
59 | /// <remarks> | ||
60 | /// If DebugLevel >= 3 then short notices about outgoing HTTP requests are logged. | ||
61 | /// </remarks> | ||
62 | public static int DebugLevel { get; set; } | ||
63 | |||
64 | /// <summary> | ||
57 | /// Request number for diagnostic purposes. | 65 | /// Request number for diagnostic purposes. |
58 | /// </summary> | 66 | /// </summary> |
59 | public static int RequestNumber = 0; | 67 | public static int RequestNumber { get; internal set; } |
60 | 68 | ||
61 | /// <summary> | 69 | /// <summary> |
62 | /// this is the header field used to communicate the local request id | 70 | /// this is the header field used to communicate the local request id |
@@ -146,7 +154,11 @@ namespace OpenSim.Framework | |||
146 | private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) | 154 | private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) |
147 | { | 155 | { |
148 | int reqnum = RequestNumber++; | 156 | int reqnum = RequestNumber++; |
149 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | 157 | |
158 | if (DebugLevel >= 3) | ||
159 | m_log.DebugFormat( | ||
160 | "[WEB UTIL]: HTTP OUT {0} ServiceOSD {1} {2} (timeout {3}, compressed {4})", | ||
161 | reqnum, method, url, timeout, compressed); | ||
150 | 162 | ||
151 | string errorMessage = "unknown error"; | 163 | string errorMessage = "unknown error"; |
152 | int tickstart = Util.EnvironmentTickCount(); | 164 | int tickstart = Util.EnvironmentTickCount(); |
@@ -230,7 +242,7 @@ namespace OpenSim.Framework | |||
230 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | 242 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
231 | if (tickdiff > LongCallTime) | 243 | if (tickdiff > LongCallTime) |
232 | m_log.InfoFormat( | 244 | m_log.InfoFormat( |
233 | "[OSD REQUEST]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", | 245 | "[WEB UTIL]: Slow ServiceOSD request {0} {1} {2} took {3}ms, {4}ms writing, {5}", |
234 | reqnum, | 246 | reqnum, |
235 | method, | 247 | method, |
236 | url, | 248 | url, |
@@ -239,10 +251,14 @@ namespace OpenSim.Framework | |||
239 | strBuffer != null | 251 | strBuffer != null |
240 | ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) | 252 | ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) |
241 | : ""); | 253 | : ""); |
254 | else if (DebugLevel >= 4) | ||
255 | m_log.DebugFormat( | ||
256 | "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", | ||
257 | reqnum, tickdiff, tickdata); | ||
242 | } | 258 | } |
243 | 259 | ||
244 | m_log.DebugFormat( | 260 | m_log.DebugFormat( |
245 | "[WEB UTIL]: <{0}> osd request for {1}, method {2} FAILED: {3}", reqnum, url, method, errorMessage); | 261 | "[WEB UTIL]: ServiceOSD request {0} {1} {2} FAILED: {3}", reqnum, url, method, errorMessage); |
246 | 262 | ||
247 | return ErrorResponseMap(errorMessage); | 263 | return ErrorResponseMap(errorMessage); |
248 | } | 264 | } |
@@ -318,7 +334,11 @@ namespace OpenSim.Framework | |||
318 | { | 334 | { |
319 | int reqnum = RequestNumber++; | 335 | int reqnum = RequestNumber++; |
320 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; | 336 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; |
321 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); | 337 | |
338 | if (DebugLevel >= 3) | ||
339 | m_log.DebugFormat( | ||
340 | "[WEB UTIL]: HTTP OUT {0} ServiceForm {1} {2} (timeout {3})", | ||
341 | reqnum, method, url, timeout); | ||
322 | 342 | ||
323 | string errorMessage = "unknown error"; | 343 | string errorMessage = "unknown error"; |
324 | int tickstart = Util.EnvironmentTickCount(); | 344 | int tickstart = Util.EnvironmentTickCount(); |
@@ -381,7 +401,7 @@ namespace OpenSim.Framework | |||
381 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | 401 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
382 | if (tickdiff > LongCallTime) | 402 | if (tickdiff > LongCallTime) |
383 | m_log.InfoFormat( | 403 | m_log.InfoFormat( |
384 | "[SERVICE FORM]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", | 404 | "[WEB UTIL]: Slow ServiceForm request {0} {1} {2} took {3}ms, {4}ms writing, {5}", |
385 | reqnum, | 405 | reqnum, |
386 | method, | 406 | method, |
387 | url, | 407 | url, |
@@ -390,9 +410,13 @@ namespace OpenSim.Framework | |||
390 | queryString != null | 410 | queryString != null |
391 | ? (queryString.Length > MaxRequestDiagLength) ? queryString.Remove(MaxRequestDiagLength) : queryString | 411 | ? (queryString.Length > MaxRequestDiagLength) ? queryString.Remove(MaxRequestDiagLength) : queryString |
392 | : ""); | 412 | : ""); |
413 | else if (DebugLevel >= 4) | ||
414 | m_log.DebugFormat( | ||
415 | "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", | ||
416 | reqnum, tickdiff, tickdata); | ||
393 | } | 417 | } |
394 | 418 | ||
395 | m_log.WarnFormat("[SERVICE FORM]: <{0}> form request to {1} failed: {2}", reqnum, url, errorMessage); | 419 | m_log.WarnFormat("[WEB UTIL]: ServiceForm request {0} {1} {2} failed: {2}", reqnum, method, url, errorMessage); |
396 | 420 | ||
397 | return ErrorResponseMap(errorMessage); | 421 | return ErrorResponseMap(errorMessage); |
398 | } | 422 | } |
@@ -644,7 +668,6 @@ namespace OpenSim.Framework | |||
644 | /// <returns></returns> | 668 | /// <returns></returns> |
645 | public static string[] GetPreferredImageTypes(string accept) | 669 | public static string[] GetPreferredImageTypes(string accept) |
646 | { | 670 | { |
647 | |||
648 | if (accept == null || accept == string.Empty) | 671 | if (accept == null || accept == string.Empty) |
649 | return new string[0]; | 672 | return new string[0]; |
650 | 673 | ||
@@ -703,14 +726,16 @@ namespace OpenSim.Framework | |||
703 | int maxConnections) | 726 | int maxConnections) |
704 | { | 727 | { |
705 | int reqnum = WebUtil.RequestNumber++; | 728 | int reqnum = WebUtil.RequestNumber++; |
706 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | 729 | |
730 | if (WebUtil.DebugLevel >= 3) | ||
731 | m_log.DebugFormat( | ||
732 | "[WEB UTIL]: HTTP OUT {0} AsynchronousRequestObject {1} {2}", | ||
733 | reqnum, verb, requestUrl); | ||
707 | 734 | ||
708 | int tickstart = Util.EnvironmentTickCount(); | 735 | int tickstart = Util.EnvironmentTickCount(); |
709 | // int tickdata = 0; | 736 | // int tickdata = 0; |
710 | int tickdiff = 0; | 737 | int tickdiff = 0; |
711 | 738 | ||
712 | // m_log.DebugFormat("[ASYNC REQUEST]: Starting {0} {1}", verb, requestUrl); | ||
713 | |||
714 | Type type = typeof(TRequest); | 739 | Type type = typeof(TRequest); |
715 | 740 | ||
716 | WebRequest request = WebRequest.Create(requestUrl); | 741 | WebRequest request = WebRequest.Create(requestUrl); |
@@ -868,7 +893,7 @@ namespace OpenSim.Framework | |||
868 | } | 893 | } |
869 | 894 | ||
870 | m_log.InfoFormat( | 895 | m_log.InfoFormat( |
871 | "[ASYNC REQUEST]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", | 896 | "[ASYNC REQUEST]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", |
872 | reqnum, | 897 | reqnum, |
873 | verb, | 898 | verb, |
874 | requestUrl, | 899 | requestUrl, |
@@ -883,6 +908,12 @@ namespace OpenSim.Framework | |||
883 | requestUrl, | 908 | requestUrl, |
884 | tickdiff); | 909 | tickdiff); |
885 | } | 910 | } |
911 | else if (WebUtil.DebugLevel >= 4) | ||
912 | { | ||
913 | m_log.DebugFormat( | ||
914 | "[WEB UTIL]: HTTP OUT {0} took {1}ms", | ||
915 | reqnum, tickdiff); | ||
916 | } | ||
886 | } | 917 | } |
887 | } | 918 | } |
888 | 919 | ||
@@ -903,7 +934,11 @@ namespace OpenSim.Framework | |||
903 | public static string MakeRequest(string verb, string requestUrl, string obj) | 934 | public static string MakeRequest(string verb, string requestUrl, string obj) |
904 | { | 935 | { |
905 | int reqnum = WebUtil.RequestNumber++; | 936 | int reqnum = WebUtil.RequestNumber++; |
906 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | 937 | |
938 | if (WebUtil.DebugLevel >= 3) | ||
939 | m_log.DebugFormat( | ||
940 | "[WEB UTIL]: HTTP OUT {0} SynchronousRestForms {1} {2}", | ||
941 | reqnum, verb, requestUrl); | ||
907 | 942 | ||
908 | int tickstart = Util.EnvironmentTickCount(); | 943 | int tickstart = Util.EnvironmentTickCount(); |
909 | int tickdata = 0; | 944 | int tickdata = 0; |
@@ -990,7 +1025,7 @@ namespace OpenSim.Framework | |||
990 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | 1025 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
991 | if (tickdiff > WebUtil.LongCallTime) | 1026 | if (tickdiff > WebUtil.LongCallTime) |
992 | m_log.InfoFormat( | 1027 | m_log.InfoFormat( |
993 | "[FORMS]: Slow request to <{0}> {1} {2} took {3}ms {4}ms writing {5}", | 1028 | "[FORMS]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", |
994 | reqnum, | 1029 | reqnum, |
995 | verb, | 1030 | verb, |
996 | requestUrl, | 1031 | requestUrl, |
@@ -998,6 +1033,10 @@ namespace OpenSim.Framework | |||
998 | tickset, | 1033 | tickset, |
999 | tickdata, | 1034 | tickdata, |
1000 | obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); | 1035 | obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); |
1036 | else if (WebUtil.DebugLevel >= 4) | ||
1037 | m_log.DebugFormat( | ||
1038 | "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", | ||
1039 | reqnum, tickdiff, tickdata); | ||
1001 | 1040 | ||
1002 | return respstring; | 1041 | return respstring; |
1003 | } | 1042 | } |
@@ -1032,7 +1071,11 @@ namespace OpenSim.Framework | |||
1032 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout, int maxConnections) | 1071 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout, int maxConnections) |
1033 | { | 1072 | { |
1034 | int reqnum = WebUtil.RequestNumber++; | 1073 | int reqnum = WebUtil.RequestNumber++; |
1035 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | 1074 | |
1075 | if (WebUtil.DebugLevel >= 3) | ||
1076 | m_log.DebugFormat( | ||
1077 | "[WEB UTIL]: HTTP OUT {0} SynchronousRestObject {1} {2}", | ||
1078 | reqnum, verb, requestUrl); | ||
1036 | 1079 | ||
1037 | int tickstart = Util.EnvironmentTickCount(); | 1080 | int tickstart = Util.EnvironmentTickCount(); |
1038 | int tickdata = 0; | 1081 | int tickdata = 0; |
@@ -1151,7 +1194,7 @@ namespace OpenSim.Framework | |||
1151 | } | 1194 | } |
1152 | 1195 | ||
1153 | m_log.InfoFormat( | 1196 | m_log.InfoFormat( |
1154 | "[SynchronousRestObjectRequester]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", | 1197 | "[SynchronousRestObjectRequester]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", |
1155 | reqnum, | 1198 | reqnum, |
1156 | verb, | 1199 | verb, |
1157 | requestUrl, | 1200 | requestUrl, |
@@ -1159,6 +1202,12 @@ namespace OpenSim.Framework | |||
1159 | tickdata, | 1202 | tickdata, |
1160 | originalRequest); | 1203 | originalRequest); |
1161 | } | 1204 | } |
1205 | else if (WebUtil.DebugLevel >= 4) | ||
1206 | { | ||
1207 | m_log.DebugFormat( | ||
1208 | "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", | ||
1209 | reqnum, tickdiff, tickdata); | ||
1210 | } | ||
1162 | 1211 | ||
1163 | return deserial; | 1212 | return deserial; |
1164 | } | 1213 | } |