diff options
Diffstat (limited to 'OpenSim/Framework')
151 files changed, 6548 insertions, 2604 deletions
diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 0d053e4..5a9eeb5 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs | |||
@@ -77,7 +77,7 @@ namespace OpenSim.Framework | |||
77 | public bool child; | 77 | public bool child; |
78 | 78 | ||
79 | /// <summary> | 79 | /// <summary> |
80 | /// Number given to the client when they log-in that they provide | 80 | /// Number given to the client when they log-in that they provide |
81 | /// as credentials to the UDP server | 81 | /// as credentials to the UDP server |
82 | /// </summary> | 82 | /// </summary> |
83 | public uint circuitcode; | 83 | public uint circuitcode; |
@@ -184,7 +184,7 @@ namespace OpenSim.Framework | |||
184 | /// Pack AgentCircuitData into an OSDMap for transmission over LLSD XML or LLSD json | 184 | /// Pack AgentCircuitData into an OSDMap for transmission over LLSD XML or LLSD json |
185 | /// </summary> | 185 | /// </summary> |
186 | /// <returns>map of the agent circuit data</returns> | 186 | /// <returns>map of the agent circuit data</returns> |
187 | public OSDMap PackAgentCircuitData() | 187 | public OSDMap PackAgentCircuitData(EntityTransferContext ctx) |
188 | { | 188 | { |
189 | OSDMap args = new OSDMap(); | 189 | OSDMap args = new OSDMap(); |
190 | args["agent_id"] = OSD.FromUUID(AgentID); | 190 | args["agent_id"] = OSD.FromUUID(AgentID); |
@@ -224,7 +224,7 @@ namespace OpenSim.Framework | |||
224 | { | 224 | { |
225 | args["appearance_serial"] = OSD.FromInteger(Appearance.Serial); | 225 | args["appearance_serial"] = OSD.FromInteger(Appearance.Serial); |
226 | 226 | ||
227 | OSDMap appmap = Appearance.Pack(); | 227 | OSDMap appmap = Appearance.Pack(ctx); |
228 | args["packed_appearance"] = appmap; | 228 | args["packed_appearance"] = appmap; |
229 | } | 229 | } |
230 | 230 | ||
@@ -328,7 +328,7 @@ namespace OpenSim.Framework | |||
328 | Vector3.TryParse(args["start_pos"].AsString(), out startpos); | 328 | Vector3.TryParse(args["start_pos"].AsString(), out startpos); |
329 | 329 | ||
330 | //m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos); | 330 | //m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos); |
331 | 331 | ||
332 | try | 332 | try |
333 | { | 333 | { |
334 | // Unpack various appearance elements | 334 | // Unpack various appearance elements |
@@ -353,7 +353,7 @@ namespace OpenSim.Framework | |||
353 | { | 353 | { |
354 | m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}",e.Message); | 354 | m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}",e.Message); |
355 | } | 355 | } |
356 | 356 | ||
357 | ServiceURLs = new Dictionary<string, object>(); | 357 | ServiceURLs = new Dictionary<string, object>(); |
358 | // Try parse the new way, OSDMap | 358 | // Try parse the new way, OSDMap |
359 | if (args.ContainsKey("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map) | 359 | if (args.ContainsKey("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map) |
diff --git a/OpenSim/Framework/AgentUpdateArgs.cs b/OpenSim/Framework/AgentUpdateArgs.cs index 660bc32..f04d692 100644 --- a/OpenSim/Framework/AgentUpdateArgs.cs +++ b/OpenSim/Framework/AgentUpdateArgs.cs | |||
@@ -81,6 +81,8 @@ namespace OpenSim.Framework | |||
81 | 81 | ||
82 | public Vector3 ClientAgentPosition; | 82 | public Vector3 ClientAgentPosition; |
83 | public bool UseClientAgentPosition; | 83 | public bool UseClientAgentPosition; |
84 | public bool NeedsCameraCollision; | ||
85 | public uint lastpacketSequence; | ||
84 | 86 | ||
85 | public AgentUpdateArgs() | 87 | public AgentUpdateArgs() |
86 | { | 88 | { |
diff --git a/OpenSim/Framework/AnimationSet.cs b/OpenSim/Framework/AnimationSet.cs new file mode 100644 index 0000000..8753088 --- /dev/null +++ b/OpenSim/Framework/AnimationSet.cs | |||
@@ -0,0 +1,186 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using OpenMetaverse; | ||
31 | |||
32 | namespace OpenSim.Framework | ||
33 | { | ||
34 | // public delegate bool AnimationSetValidator(UUID animID); | ||
35 | public delegate uint AnimationSetValidator(UUID animID); | ||
36 | |||
37 | public class AnimationSet | ||
38 | { | ||
39 | private bool m_parseError = false; | ||
40 | |||
41 | public const uint createBasePermitions = (uint)(PermissionMask.All); // no export ? | ||
42 | public const uint createNextPermitions = (uint)(PermissionMask.Copy | PermissionMask.Modify); | ||
43 | |||
44 | public const uint allowedBasePermitions = (uint)(PermissionMask.Copy | PermissionMask.Modify); | ||
45 | public const uint allowedNextPermitions = 0; | ||
46 | |||
47 | public static void setCreateItemPermitions(InventoryItemBase it) | ||
48 | { | ||
49 | if (it == null) | ||
50 | return; | ||
51 | |||
52 | it.BasePermissions = createBasePermitions; | ||
53 | it.CurrentPermissions = createBasePermitions; | ||
54 | // it.GroupPermissions &= allowedPermitions; | ||
55 | it.NextPermissions = createNextPermitions; | ||
56 | // it.EveryOnePermissions &= allowedPermitions; | ||
57 | it.GroupPermissions = 0; | ||
58 | it.EveryOnePermissions = 0; | ||
59 | } | ||
60 | |||
61 | public static void enforceItemPermitions(InventoryItemBase it, bool IsCreator) | ||
62 | { | ||
63 | if (it == null) | ||
64 | return; | ||
65 | |||
66 | uint bp; | ||
67 | uint np; | ||
68 | |||
69 | if (IsCreator) | ||
70 | { | ||
71 | bp = createBasePermitions; | ||
72 | np = createNextPermitions; | ||
73 | } | ||
74 | else | ||
75 | { | ||
76 | bp = allowedBasePermitions; | ||
77 | np = allowedNextPermitions; | ||
78 | } | ||
79 | |||
80 | it.BasePermissions &= bp; | ||
81 | it.CurrentPermissions &= bp; | ||
82 | // it.GroupPermissions &= allowedPermitions; | ||
83 | it.NextPermissions &= np; | ||
84 | // it.EveryOnePermissions &= allowedPermitions; | ||
85 | it.GroupPermissions = 0; | ||
86 | it.EveryOnePermissions = 0; | ||
87 | } | ||
88 | |||
89 | public int AnimationCount { get; private set; } | ||
90 | private Dictionary<string, KeyValuePair<string, UUID>> m_animations = new Dictionary<string, KeyValuePair<string, UUID>>(); | ||
91 | |||
92 | public UUID GetAnimation(string index) | ||
93 | { | ||
94 | KeyValuePair<string, UUID> val; | ||
95 | if (m_animations.TryGetValue(index, out val)) | ||
96 | return val.Value; | ||
97 | |||
98 | return UUID.Zero; | ||
99 | } | ||
100 | |||
101 | public string GetAnimationName(string index) | ||
102 | { | ||
103 | KeyValuePair<string, UUID> val; | ||
104 | if (m_animations.TryGetValue(index, out val)) | ||
105 | return val.Key; | ||
106 | |||
107 | return String.Empty; | ||
108 | } | ||
109 | |||
110 | public void SetAnimation(string index, string name, UUID anim) | ||
111 | { | ||
112 | if (anim == UUID.Zero) | ||
113 | { | ||
114 | m_animations.Remove(index); | ||
115 | return; | ||
116 | } | ||
117 | |||
118 | m_animations[index] = new KeyValuePair<string, UUID>(name, anim); | ||
119 | } | ||
120 | |||
121 | public AnimationSet(Byte[] data) | ||
122 | { | ||
123 | string assetData = System.Text.Encoding.ASCII.GetString(data); | ||
124 | Console.WriteLine("--------------------"); | ||
125 | Console.WriteLine("AnimationSet length {0} bytes", assetData.Length); | ||
126 | Console.WriteLine(assetData); | ||
127 | Console.WriteLine("--------------------"); | ||
128 | } | ||
129 | |||
130 | public Byte[] ToBytes() | ||
131 | { | ||
132 | // If there was an error parsing the input, we give back an | ||
133 | // empty set rather than the original data. | ||
134 | if (m_parseError) | ||
135 | { | ||
136 | string dummy = "version 1\ncount 0\n"; | ||
137 | return System.Text.Encoding.ASCII.GetBytes(dummy); | ||
138 | } | ||
139 | |||
140 | string assetData = String.Format("version 1\ncount {0}\n", m_animations.Count); | ||
141 | foreach (KeyValuePair<string, KeyValuePair<string, UUID>> kvp in m_animations) | ||
142 | assetData += String.Format("{0} {1} {2}\n", kvp.Key, kvp.Value.Value.ToString(), kvp.Value.Key); | ||
143 | return System.Text.Encoding.ASCII.GetBytes(assetData); | ||
144 | } | ||
145 | /* | ||
146 | public bool Validate(AnimationSetValidator val) | ||
147 | { | ||
148 | if (m_parseError) | ||
149 | return false; | ||
150 | |||
151 | List<string> badAnims = new List<string>(); | ||
152 | |||
153 | bool allOk = true; | ||
154 | foreach (KeyValuePair<string, KeyValuePair<string, UUID>> kvp in m_animations) | ||
155 | { | ||
156 | if (!val(kvp.Value.Value)) | ||
157 | { | ||
158 | allOk = false; | ||
159 | badAnims.Add(kvp.Key); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | foreach (string idx in badAnims) | ||
164 | m_animations.Remove(idx); | ||
165 | |||
166 | return allOk; | ||
167 | } | ||
168 | */ | ||
169 | public uint Validate(AnimationSetValidator val) | ||
170 | { | ||
171 | if (m_parseError) | ||
172 | return 0; | ||
173 | |||
174 | uint ret = 0x7fffffff; | ||
175 | uint t; | ||
176 | foreach (KeyValuePair<string, KeyValuePair<string, UUID>> kvp in m_animations) | ||
177 | { | ||
178 | t = val(kvp.Value.Value); | ||
179 | if (t == 0) | ||
180 | return 0; | ||
181 | ret &= t; | ||
182 | } | ||
183 | return ret; | ||
184 | } | ||
185 | } | ||
186 | } | ||
diff --git a/OpenSim/Framework/AssemblyInfo.cs b/OpenSim/Framework/AssemblyInfo.cs index a797424..c4835be 100644 --- a/OpenSim/Framework/AssemblyInfo.cs +++ b/OpenSim/Framework/AssemblyInfo.cs | |||
@@ -59,4 +59,4 @@ using System.Runtime.InteropServices; | |||
59 | // Revision | 59 | // Revision |
60 | // | 60 | // |
61 | 61 | ||
62 | [assembly : AssemblyVersion("0.8.2.*")] | 62 | [assembly : AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] |
diff --git a/OpenSim/Framework/AssetBase.cs b/OpenSim/Framework/AssetBase.cs index 2f04d2e..88edf2f 100644 --- a/OpenSim/Framework/AssetBase.cs +++ b/OpenSim/Framework/AssetBase.cs | |||
@@ -63,6 +63,8 @@ namespace OpenSim.Framework | |||
63 | /// </summary> | 63 | /// </summary> |
64 | private AssetMetadata m_metadata; | 64 | private AssetMetadata m_metadata; |
65 | 65 | ||
66 | private int m_uploadAttempts; | ||
67 | |||
66 | // This is needed for .NET serialization!!! | 68 | // This is needed for .NET serialization!!! |
67 | // Do NOT "Optimize" away! | 69 | // Do NOT "Optimize" away! |
68 | public AssetBase() | 70 | public AssetBase() |
@@ -110,7 +112,7 @@ namespace OpenSim.Framework | |||
110 | { | 112 | { |
111 | get | 113 | get |
112 | { | 114 | { |
113 | return | 115 | return |
114 | IsTextualAsset && ( | 116 | IsTextualAsset && ( |
115 | Type != (sbyte)AssetType.Notecard | 117 | Type != (sbyte)AssetType.Notecard |
116 | && Type != (sbyte)AssetType.CallingCard | 118 | && Type != (sbyte)AssetType.CallingCard |
@@ -135,7 +137,7 @@ namespace OpenSim.Framework | |||
135 | { | 137 | { |
136 | get | 138 | get |
137 | { | 139 | { |
138 | return | 140 | return |
139 | (Type == (sbyte)AssetType.Animation || | 141 | (Type == (sbyte)AssetType.Animation || |
140 | Type == (sbyte)AssetType.Gesture || | 142 | Type == (sbyte)AssetType.Gesture || |
141 | Type == (sbyte)AssetType.Simstate || | 143 | Type == (sbyte)AssetType.Simstate || |
@@ -148,11 +150,12 @@ namespace OpenSim.Framework | |||
148 | Type == (sbyte)AssetType.Folder || | 150 | Type == (sbyte)AssetType.Folder || |
149 | Type == (sbyte)AssetType.ImageJPEG || | 151 | Type == (sbyte)AssetType.ImageJPEG || |
150 | Type == (sbyte)AssetType.ImageTGA || | 152 | Type == (sbyte)AssetType.ImageTGA || |
151 | Type == (sbyte)AssetType.LSLBytecode); | 153 | Type == (sbyte)AssetType.Mesh || |
154 | Type == (sbyte) AssetType.LSLBytecode); | ||
152 | } | 155 | } |
153 | } | 156 | } |
154 | 157 | ||
155 | public virtual byte[] Data | 158 | public byte[] Data |
156 | { | 159 | { |
157 | get { return m_data; } | 160 | get { return m_data; } |
158 | set { m_data = value; } | 161 | set { m_data = value; } |
@@ -197,6 +200,12 @@ namespace OpenSim.Framework | |||
197 | set { m_metadata.Type = value; } | 200 | set { m_metadata.Type = value; } |
198 | } | 201 | } |
199 | 202 | ||
203 | public int UploadAttempts | ||
204 | { | ||
205 | get { return m_uploadAttempts; } | ||
206 | set { m_uploadAttempts = value; } | ||
207 | } | ||
208 | |||
200 | /// <summary> | 209 | /// <summary> |
201 | /// Is this a region only asset, or does this exist on the asset server also | 210 | /// Is this a region only asset, or does this exist on the asset server also |
202 | /// </summary> | 211 | /// </summary> |
@@ -273,7 +282,7 @@ namespace OpenSim.Framework | |||
273 | 282 | ||
274 | return m_id; | 283 | return m_id; |
275 | } | 284 | } |
276 | 285 | ||
277 | set | 286 | set |
278 | { | 287 | { |
279 | UUID uuid = UUID.Zero; | 288 | UUID uuid = UUID.Zero; |
diff --git a/OpenSim/Framework/AssetLoader/Filesystem/Properties/AssemblyInfo.cs b/OpenSim/Framework/AssetLoader/Filesystem/Properties/AssemblyInfo.cs index 76df564..b6ea077 100644 --- a/OpenSim/Framework/AssetLoader/Filesystem/Properties/AssemblyInfo.cs +++ b/OpenSim/Framework/AssetLoader/Filesystem/Properties/AssemblyInfo.cs | |||
@@ -2,7 +2,7 @@ | |||
2 | using System.Runtime.CompilerServices; | 2 | using System.Runtime.CompilerServices; |
3 | using System.Runtime.InteropServices; | 3 | using System.Runtime.InteropServices; |
4 | 4 | ||
5 | // General Information about an assembly is controlled through the following | 5 | // General Information about an assembly is controlled through the following |
6 | // set of attributes. Change these attribute values to modify the information | 6 | // set of attributes. Change these attribute values to modify the information |
7 | // associated with an assembly. | 7 | // associated with an assembly. |
8 | [assembly: AssemblyTitle("OpenSim.Framework.AssetLoader.Filesystem")] | 8 | [assembly: AssemblyTitle("OpenSim.Framework.AssetLoader.Filesystem")] |
@@ -14,8 +14,8 @@ using System.Runtime.InteropServices; | |||
14 | [assembly: AssemblyTrademark("")] | 14 | [assembly: AssemblyTrademark("")] |
15 | [assembly: AssemblyCulture("")] | 15 | [assembly: AssemblyCulture("")] |
16 | 16 | ||
17 | // Setting ComVisible to false makes the types in this assembly not visible | 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 | 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. | 19 | // COM, set the ComVisible attribute to true on that type. |
20 | [assembly: ComVisible(false)] | 20 | [assembly: ComVisible(false)] |
21 | 21 | ||
@@ -25,9 +25,9 @@ using System.Runtime.InteropServices; | |||
25 | // Version information for an assembly consists of the following four values: | 25 | // Version information for an assembly consists of the following four values: |
26 | // | 26 | // |
27 | // Major Version | 27 | // Major Version |
28 | // Minor Version | 28 | // Minor Version |
29 | // Build Number | 29 | // Build Number |
30 | // Revision | 30 | // Revision |
31 | // | 31 | // |
32 | [assembly: AssemblyVersion("0.8.3.*")] | 32 | [assembly: AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] |
33 | 33 | ||
diff --git a/OpenSim/Framework/AssetRequestToClient.cs b/OpenSim/Framework/AssetRequestToClient.cs index d602c1f..3dfbb91 100644 --- a/OpenSim/Framework/AssetRequestToClient.cs +++ b/OpenSim/Framework/AssetRequestToClient.cs | |||
@@ -31,10 +31,10 @@ namespace OpenSim.Framework | |||
31 | { | 31 | { |
32 | /// <summary> | 32 | /// <summary> |
33 | /// This class was created to refactor OutPacket out of AssetCache | 33 | /// This class was created to refactor OutPacket out of AssetCache |
34 | /// There is a conflict between | 34 | /// There is a conflict between |
35 | /// OpenSim.Framework.Communications.Cache.AssetRequest and OpenSim.Framework.AssetRequest | 35 | /// OpenSim.Framework.Communications.Cache.AssetRequest and OpenSim.Framework.AssetRequest |
36 | /// and unifying them results in a prebuild chicken and egg problem with OpenSim.Framework requiring | 36 | /// and unifying them results in a prebuild chicken and egg problem with OpenSim.Framework requiring |
37 | /// OpenSim.Framework.Communications.Cache while OpenSim.Framework.Communications.Cache | 37 | /// OpenSim.Framework.Communications.Cache while OpenSim.Framework.Communications.Cache |
38 | /// requiring OpenSim.Framework | 38 | /// requiring OpenSim.Framework |
39 | /// </summary> | 39 | /// </summary> |
40 | public class AssetRequestToClient | 40 | public class AssetRequestToClient |
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 26dd5df..77a7621 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -53,7 +53,11 @@ namespace OpenSim.Framework | |||
53 | // should be only used as initial default value ( V1 viewers ) | 53 | // should be only used as initial default value ( V1 viewers ) |
54 | public readonly static int VISUALPARAM_COUNT = 218; | 54 | public readonly static int VISUALPARAM_COUNT = 218; |
55 | 55 | ||
56 | public readonly static int TEXTURE_COUNT = 21; | 56 | // public readonly static int TEXTURE_COUNT = 21 |
57 | // 21 bad, make it be updated as libovm gets update | ||
58 | // also keeping in sync with it | ||
59 | public readonly static int TEXTURE_COUNT = Primitive.TextureEntry.MAX_FACES; | ||
60 | |||
57 | public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; | 61 | public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; |
58 | 62 | ||
59 | protected int m_serial = 0; | 63 | protected int m_serial = 0; |
@@ -69,8 +73,6 @@ namespace OpenSim.Framework | |||
69 | protected WearableCacheItem[] m_cacheitems; | 73 | protected WearableCacheItem[] m_cacheitems; |
70 | protected bool m_cacheItemsDirty = true; | 74 | protected bool m_cacheItemsDirty = true; |
71 | 75 | ||
72 | |||
73 | public bool PackLegacyWearables {get; set; } | ||
74 | public virtual int Serial | 76 | public virtual int Serial |
75 | { | 77 | { |
76 | get { return m_serial; } | 78 | get { return m_serial; } |
@@ -119,7 +121,7 @@ namespace OpenSim.Framework | |||
119 | get { return m_avatarHeight; } | 121 | get { return m_avatarHeight; } |
120 | set { m_avatarHeight = value; } | 122 | set { m_avatarHeight = value; } |
121 | } | 123 | } |
122 | 124 | ||
123 | public virtual WearableCacheItem[] WearableCacheItems | 125 | public virtual WearableCacheItem[] WearableCacheItems |
124 | { | 126 | { |
125 | get { return m_cacheitems; } | 127 | get { return m_cacheitems; } |
@@ -135,7 +137,7 @@ namespace OpenSim.Framework | |||
135 | public AvatarAppearance() | 137 | public AvatarAppearance() |
136 | { | 138 | { |
137 | // m_log.WarnFormat("[AVATAR APPEARANCE]: create empty appearance"); | 139 | // m_log.WarnFormat("[AVATAR APPEARANCE]: create empty appearance"); |
138 | PackLegacyWearables = false; | 140 | |
139 | m_serial = 0; | 141 | m_serial = 0; |
140 | SetDefaultWearables(); | 142 | SetDefaultWearables(); |
141 | SetDefaultTexture(); | 143 | SetDefaultTexture(); |
@@ -181,11 +183,16 @@ namespace OpenSim.Framework | |||
181 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); | 183 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); |
182 | } | 184 | } |
183 | 185 | ||
184 | public AvatarAppearance(AvatarAppearance appearance) : this(appearance, true) | 186 | public AvatarAppearance(AvatarAppearance appearance): this(appearance, true,true) |
185 | { | 187 | { |
186 | } | 188 | } |
187 | 189 | ||
188 | public AvatarAppearance(AvatarAppearance appearance, bool copyWearables) | 190 | public AvatarAppearance(AvatarAppearance appearance, bool copyWearables) |
191 | : this(appearance, copyWearables, true) | ||
192 | { | ||
193 | } | ||
194 | |||
195 | public AvatarAppearance(AvatarAppearance appearance, bool copyWearables, bool copyBaked) | ||
189 | { | 196 | { |
190 | // m_log.WarnFormat("[AVATAR APPEARANCE] create from an existing appearance"); | 197 | // m_log.WarnFormat("[AVATAR APPEARANCE] create from an existing appearance"); |
191 | 198 | ||
@@ -204,24 +211,29 @@ namespace OpenSim.Framework | |||
204 | 211 | ||
205 | m_serial = appearance.Serial; | 212 | m_serial = appearance.Serial; |
206 | 213 | ||
207 | m_wearables = new AvatarWearable[AvatarWearable.MAX_WEARABLES]; | ||
208 | for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) | ||
209 | m_wearables[i] = new AvatarWearable(); | ||
210 | |||
211 | if (copyWearables && (appearance.Wearables != null)) | 214 | if (copyWearables && (appearance.Wearables != null)) |
212 | { | 215 | { |
213 | int len = appearance.Wearables.Length; | 216 | m_wearables = new AvatarWearable[appearance.Wearables.Length]; |
214 | if(len > AvatarWearable.MAX_WEARABLES) | 217 | for (int i = 0; i < appearance.Wearables.Length; i++) |
215 | len = AvatarWearable.MAX_WEARABLES; | 218 | { |
216 | for (int i = 0; i < len; i++) | 219 | m_wearables[i] = new AvatarWearable(); |
217 | SetWearable(i,appearance.Wearables[i]); | 220 | AvatarWearable wearable = appearance.Wearables[i]; |
221 | for (int j = 0; j < wearable.Count; j++) | ||
222 | m_wearables[i].Add(wearable[j].ItemID, wearable[j].AssetID); | ||
223 | } | ||
218 | } | 224 | } |
225 | else | ||
226 | ClearWearables(); | ||
219 | 227 | ||
220 | m_texture = null; | 228 | m_texture = null; |
221 | if (appearance.Texture != null) | 229 | if (appearance.Texture != null) |
222 | { | 230 | { |
223 | byte[] tbytes = appearance.Texture.GetBytes(); | 231 | byte[] tbytes = appearance.Texture.GetBytes(); |
224 | m_texture = new Primitive.TextureEntry(tbytes,0,tbytes.Length); | 232 | m_texture = new Primitive.TextureEntry(tbytes,0,tbytes.Length); |
233 | if (copyBaked && appearance.m_cacheitems != null) | ||
234 | m_cacheitems = (WearableCacheItem[])appearance.m_cacheitems.Clone(); | ||
235 | else | ||
236 | m_cacheitems = null; | ||
225 | } | 237 | } |
226 | 238 | ||
227 | m_visualparams = null; | 239 | m_visualparams = null; |
@@ -239,9 +251,17 @@ namespace OpenSim.Framework | |||
239 | 251 | ||
240 | public void GetAssetsFrom(AvatarAppearance app) | 252 | public void GetAssetsFrom(AvatarAppearance app) |
241 | { | 253 | { |
242 | for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) | 254 | int len = m_wearables.Length; |
255 | if(len > app.m_wearables.Length) | ||
256 | len = app.m_wearables.Length; | ||
257 | |||
258 | for (int i = 0; i < len; i++) | ||
243 | { | 259 | { |
244 | for (int j = 0; j < m_wearables[i].Count; j++) | 260 | int count = m_wearables[i].Count; |
261 | if(count > app.m_wearables[i].Count) | ||
262 | count = app.m_wearables[i].Count; | ||
263 | |||
264 | for (int j = 0; j < count; j++) | ||
245 | { | 265 | { |
246 | UUID itemID = m_wearables[i][j].ItemID; | 266 | UUID itemID = m_wearables[i][j].ItemID; |
247 | UUID assetID = app.Wearables[i].GetAsset(itemID); | 267 | UUID assetID = app.Wearables[i].GetAsset(itemID); |
@@ -254,8 +274,8 @@ namespace OpenSim.Framework | |||
254 | 274 | ||
255 | public void ClearWearables() | 275 | public void ClearWearables() |
256 | { | 276 | { |
257 | m_wearables = new AvatarWearable[AvatarWearable.MAX_WEARABLES]; | 277 | m_wearables = new AvatarWearable[AvatarWearable.LEGACY_VERSION_MAX_WEARABLES]; |
258 | for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) | 278 | for (int i = 0; i < AvatarWearable.LEGACY_VERSION_MAX_WEARABLES; i++) |
259 | m_wearables[i] = new AvatarWearable(); | 279 | m_wearables[i] = new AvatarWearable(); |
260 | } | 280 | } |
261 | 281 | ||
@@ -271,18 +291,18 @@ namespace OpenSim.Framework | |||
271 | public virtual void ResetAppearance() | 291 | public virtual void ResetAppearance() |
272 | { | 292 | { |
273 | // m_log.WarnFormat("[AVATAR APPEARANCE]: Reset appearance"); | 293 | // m_log.WarnFormat("[AVATAR APPEARANCE]: Reset appearance"); |
274 | 294 | ||
275 | m_serial = 0; | 295 | m_serial = 0; |
276 | 296 | ||
277 | SetDefaultTexture(); | 297 | SetDefaultTexture(); |
278 | 298 | ||
279 | //for (int i = 0; i < BAKE_INDICES.Length; i++) | 299 | //for (int i = 0; i < BAKE_INDICES.Length; i++) |
280 | // { | 300 | // { |
281 | // int idx = BAKE_INDICES[i]; | 301 | // int idx = BAKE_INDICES[i]; |
282 | // m_texture.FaceTextures[idx].TextureID = UUID.Zero; | 302 | // m_texture.FaceTextures[idx].TextureID = UUID.Zero; |
283 | // } | 303 | // } |
284 | } | 304 | } |
285 | 305 | ||
286 | protected virtual void SetDefaultParams() | 306 | protected virtual void SetDefaultParams() |
287 | { | 307 | { |
288 | m_visualparams = new byte[] { 33,61,85,23,58,127,63,85,63,42,0,85,63,36,85,95,153,63,34,0,63,109,88,132,63,136,81,85,103,136,127,0,150,150,150,127,0,0,0,0,0,127,0,0,255,127,114,127,99,63,127,140,127,127,0,0,0,191,0,104,0,0,0,0,0,0,0,0,0,145,216,133,0,127,0,127,170,0,0,127,127,109,85,127,127,63,85,42,150,150,150,150,150,150,150,25,150,150,150,0,127,0,0,144,85,127,132,127,85,0,127,127,127,127,127,127,59,127,85,127,127,106,47,79,127,127,204,2,141,66,0,0,127,127,0,0,0,0,127,0,159,0,0,178,127,36,85,131,127,127,127,153,95,0,140,75,27,127,127,0,150,150,198,0,0,63,30,127,165,209,198,127,127,153,204,51,51,255,255,255,204,0,255,150,150,150,150,150,150,150,150,150,150,0,150,150,150,150,150,0,127,127,150,150,150,150,150,150,150,150,0,0,150,51,132,150,150,150 }; | 308 | m_visualparams = new byte[] { 33,61,85,23,58,127,63,85,63,42,0,85,63,36,85,95,153,63,34,0,63,109,88,132,63,136,81,85,103,136,127,0,150,150,150,127,0,0,0,0,0,127,0,0,255,127,114,127,99,63,127,140,127,127,0,0,0,191,0,104,0,0,0,0,0,0,0,0,0,145,216,133,0,127,0,127,170,0,0,127,127,109,85,127,127,63,85,42,150,150,150,150,150,150,150,25,150,150,150,0,127,0,0,144,85,127,132,127,85,0,127,127,127,127,127,127,59,127,85,127,127,106,47,79,127,127,204,2,141,66,0,0,127,127,0,0,0,0,127,0,159,0,0,178,127,36,85,131,127,127,127,153,95,0,140,75,27,127,127,0,150,150,198,0,0,63,30,127,165,209,198,127,127,153,204,51,51,255,255,255,204,0,255,150,150,150,150,150,150,150,150,150,150,0,150,150,150,150,150,0,127,127,150,150,150,150,150,150,150,150,0,0,150,51,132,150,150,150 }; |
@@ -299,14 +319,14 @@ namespace OpenSim.Framework | |||
299 | public virtual void ResetBakedTextures() | 319 | public virtual void ResetBakedTextures() |
300 | { | 320 | { |
301 | SetDefaultTexture(); | 321 | SetDefaultTexture(); |
302 | 322 | ||
303 | //for (int i = 0; i < BAKE_INDICES.Length; i++) | 323 | //for (int i = 0; i < BAKE_INDICES.Length; i++) |
304 | // { | 324 | // { |
305 | // int idx = BAKE_INDICES[i]; | 325 | // int idx = BAKE_INDICES[i]; |
306 | // m_texture.FaceTextures[idx].TextureID = UUID.Zero; | 326 | // m_texture.FaceTextures[idx].TextureID = UUID.Zero; |
307 | // } | 327 | // } |
308 | } | 328 | } |
309 | 329 | ||
310 | protected virtual void SetDefaultTexture() | 330 | protected virtual void SetDefaultTexture() |
311 | { | 331 | { |
312 | m_texture = new Primitive.TextureEntry(new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE)); | 332 | m_texture = new Primitive.TextureEntry(new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE)); |
@@ -351,7 +371,7 @@ namespace OpenSim.Framework | |||
351 | } | 371 | } |
352 | 372 | ||
353 | m_texture = textureEntry; | 373 | m_texture = textureEntry; |
354 | 374 | ||
355 | return changed; | 375 | return changed; |
356 | } | 376 | } |
357 | 377 | ||
@@ -462,12 +482,16 @@ namespace OpenSim.Framework | |||
462 | // DEBUG ON | 482 | // DEBUG ON |
463 | // m_log.WarnFormat("[AVATARAPPEARANCE] set wearable {0} --> {1}:{2}",wearableId,wearable.ItemID,wearable.AssetID); | 483 | // m_log.WarnFormat("[AVATARAPPEARANCE] set wearable {0} --> {1}:{2}",wearableId,wearable.ItemID,wearable.AssetID); |
464 | // DEBUG OFF | 484 | // DEBUG OFF |
485 | if (wearableId >= m_wearables.Length) | ||
486 | { | ||
487 | int currentLength = m_wearables.Length; | ||
488 | Array.Resize(ref m_wearables, wearableId + 1); | ||
489 | for (int i = currentLength ; i < m_wearables.Length ; i++) | ||
490 | m_wearables[i] = new AvatarWearable(); | ||
491 | } | ||
465 | m_wearables[wearableId].Clear(); | 492 | m_wearables[wearableId].Clear(); |
466 | int count = wearable.Count; | 493 | for (int i = 0; i < wearable.Count; i++) |
467 | if (count > AvatarWearable.MAX_WEARABLES) | 494 | m_wearables[wearableId].Add(wearable[i].ItemID, wearable[i].AssetID); |
468 | count = AvatarWearable.MAX_WEARABLES; | ||
469 | for (int i = 0; i < count; i++) | ||
470 | m_wearables[wearableId].Add(wearable[i].ItemID, wearable[i].AssetID); | ||
471 | } | 495 | } |
472 | 496 | ||
473 | // DEBUG ON | 497 | // DEBUG ON |
@@ -507,14 +531,14 @@ namespace OpenSim.Framework | |||
507 | { | 531 | { |
508 | lock (m_attachments) | 532 | lock (m_attachments) |
509 | { | 533 | { |
510 | List<AvatarAttachment> alist = new List<AvatarAttachment>(); | 534 | List<AvatarAttachment> alist = new List<AvatarAttachment>(); |
511 | foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) | 535 | foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) |
512 | { | 536 | { |
513 | foreach (AvatarAttachment attach in kvp.Value) | 537 | foreach (AvatarAttachment attach in kvp.Value) |
514 | alist.Add(new AvatarAttachment(attach)); | 538 | alist.Add(new AvatarAttachment(attach)); |
515 | } | 539 | } |
516 | return alist; | 540 | return alist; |
517 | } | 541 | } |
518 | } | 542 | } |
519 | 543 | ||
520 | internal void AppendAttachment(AvatarAttachment attach) | 544 | internal void AppendAttachment(AvatarAttachment attach) |
@@ -527,7 +551,7 @@ namespace OpenSim.Framework | |||
527 | { | 551 | { |
528 | if (!m_attachments.ContainsKey(attach.AttachPoint)) | 552 | if (!m_attachments.ContainsKey(attach.AttachPoint)) |
529 | m_attachments[attach.AttachPoint] = new List<AvatarAttachment>(); | 553 | m_attachments[attach.AttachPoint] = new List<AvatarAttachment>(); |
530 | 554 | ||
531 | foreach (AvatarAttachment prev in m_attachments[attach.AttachPoint]) | 555 | foreach (AvatarAttachment prev in m_attachments[attach.AttachPoint]) |
532 | { | 556 | { |
533 | if (prev.ItemID == attach.ItemID) | 557 | if (prev.ItemID == attach.ItemID) |
@@ -584,7 +608,7 @@ namespace OpenSim.Framework | |||
584 | m_attachments.Remove(attachpoint); | 608 | m_attachments.Remove(attachpoint); |
585 | return true; | 609 | return true; |
586 | } | 610 | } |
587 | 611 | ||
588 | return false; | 612 | return false; |
589 | } | 613 | } |
590 | 614 | ||
@@ -598,13 +622,13 @@ namespace OpenSim.Framework | |||
598 | if (existingAttachment != null) | 622 | if (existingAttachment != null) |
599 | { | 623 | { |
600 | // m_log.DebugFormat( | 624 | // m_log.DebugFormat( |
601 | // "[AVATAR APPEARANCE]: Found existing attachment for {0}, asset {1} at point {2}", | 625 | // "[AVATAR APPEARANCE]: Found existing attachment for {0}, asset {1} at point {2}", |
602 | // existingAttachment.ItemID, existingAttachment.AssetID, existingAttachment.AttachPoint); | 626 | // existingAttachment.ItemID, existingAttachment.AssetID, existingAttachment.AttachPoint); |
603 | 627 | ||
604 | if (existingAttachment.AssetID != UUID.Zero && existingAttachment.AttachPoint == (attachpoint & 0x7F)) | 628 | if (existingAttachment.AssetID != UUID.Zero && existingAttachment.AttachPoint == (attachpoint & 0x7F)) |
605 | { | 629 | { |
606 | m_log.DebugFormat( | 630 | m_log.DebugFormat( |
607 | "[AVATAR APPEARANCE]: Ignoring attempt to attach an already attached item {0} at point {1}", | 631 | "[AVATAR APPEARANCE]: Ignoring attempt to attach an already attached item {0} at point {1}", |
608 | item, attachpoint); | 632 | item, attachpoint); |
609 | 633 | ||
610 | return false; | 634 | return false; |
@@ -616,7 +640,7 @@ namespace OpenSim.Framework | |||
616 | DetachAttachment(existingAttachment.ItemID); | 640 | DetachAttachment(existingAttachment.ItemID); |
617 | } | 641 | } |
618 | } | 642 | } |
619 | 643 | ||
620 | // check if this is an append or a replace, 0x80 marks it as an append | 644 | // check if this is an append or a replace, 0x80 marks it as an append |
621 | if ((attachpoint & 0x80) > 0) | 645 | if ((attachpoint & 0x80) > 0) |
622 | { | 646 | { |
@@ -677,16 +701,16 @@ namespace OpenSim.Framework | |||
677 | if (index >= 0) | 701 | if (index >= 0) |
678 | { | 702 | { |
679 | // m_log.DebugFormat( | 703 | // m_log.DebugFormat( |
680 | // "[AVATAR APPEARANCE]: Detaching attachment {0}, index {1}, point {2}", | 704 | // "[AVATAR APPEARANCE]: Detaching attachment {0}, index {1}, point {2}", |
681 | // m_attachments[kvp.Key][index].ItemID, index, m_attachments[kvp.Key][index].AttachPoint); | 705 | // m_attachments[kvp.Key][index].ItemID, index, m_attachments[kvp.Key][index].AttachPoint); |
682 | 706 | ||
683 | // Remove it from the list of attachments at that attach point | 707 | // Remove it from the list of attachments at that attach point |
684 | m_attachments[kvp.Key].RemoveAt(index); | 708 | m_attachments[kvp.Key].RemoveAt(index); |
685 | 709 | ||
686 | // And remove the list if there are no more attachments here | 710 | // And remove the list if there are no more attachments here |
687 | if (m_attachments[kvp.Key].Count == 0) | 711 | if (m_attachments[kvp.Key].Count == 0) |
688 | m_attachments.Remove(kvp.Key); | 712 | m_attachments.Remove(kvp.Key); |
689 | 713 | ||
690 | return true; | 714 | return true; |
691 | } | 715 | } |
692 | } | 716 | } |
@@ -706,7 +730,7 @@ namespace OpenSim.Framework | |||
706 | /// <summary> | 730 | /// <summary> |
707 | /// Create an OSDMap from the appearance data | 731 | /// Create an OSDMap from the appearance data |
708 | /// </summary> | 732 | /// </summary> |
709 | public OSDMap Pack() | 733 | public OSDMap Pack(EntityTransferContext ctx) |
710 | { | 734 | { |
711 | OSDMap data = new OSDMap(); | 735 | OSDMap data = new OSDMap(); |
712 | 736 | ||
@@ -714,16 +738,22 @@ namespace OpenSim.Framework | |||
714 | data["height"] = OSD.FromReal(m_avatarHeight); | 738 | data["height"] = OSD.FromReal(m_avatarHeight); |
715 | 739 | ||
716 | // Wearables | 740 | // Wearables |
741 | // | ||
742 | // This will send as many or as few wearables as we have, unless a count | ||
743 | // is given. Used for legacy (pre 0.4) versions. | ||
744 | int count = ctx.WearablesCount; | ||
745 | if (ctx.WearablesCount == -1) | ||
746 | count = m_wearables.Length; | ||
747 | OSDArray wears = new OSDArray(count); | ||
748 | for (int i = 0; i < count; i++) | ||
749 | { | ||
750 | AvatarWearable dummyWearable = new AvatarWearable(); | ||
717 | 751 | ||
718 | int wearsCount; | 752 | if (i < m_wearables.Length) |
719 | if(PackLegacyWearables) | 753 | wears.Add(m_wearables[i].Pack()); |
720 | wearsCount = AvatarWearable.LEGACY_VERSION_MAX_WEARABLES; | 754 | else |
721 | else | 755 | wears.Add(dummyWearable.Pack()); |
722 | wearsCount = AvatarWearable.MAX_WEARABLES; | 756 | } |
723 | |||
724 | OSDArray wears = new OSDArray(wearsCount); | ||
725 | for (int i = 0; i < wearsCount; i++) | ||
726 | wears.Add(m_wearables[i].Pack()); | ||
727 | data["wearables"] = wears; | 757 | data["wearables"] = wears; |
728 | 758 | ||
729 | // Avatar Textures | 759 | // Avatar Textures |
@@ -737,6 +767,13 @@ namespace OpenSim.Framework | |||
737 | } | 767 | } |
738 | data["textures"] = textures; | 768 | data["textures"] = textures; |
739 | 769 | ||
770 | if (m_cacheitems != null) | ||
771 | { | ||
772 | OSDArray baked = WearableCacheItem.BakedToOSD(m_cacheitems); | ||
773 | if (baked != null) | ||
774 | data["bakedcache"] = baked; | ||
775 | } | ||
776 | |||
740 | // Visual Parameters | 777 | // Visual Parameters |
741 | OSDBinary visualparams = new OSDBinary(m_visualparams); | 778 | OSDBinary visualparams = new OSDBinary(m_visualparams); |
742 | data["visualparams"] = visualparams; | 779 | data["visualparams"] = visualparams; |
@@ -774,8 +811,8 @@ namespace OpenSim.Framework | |||
774 | OSDArray wears = (OSDArray)(data["wearables"]); | 811 | OSDArray wears = (OSDArray)(data["wearables"]); |
775 | 812 | ||
776 | int count = wears.Count; | 813 | int count = wears.Count; |
777 | if (count > AvatarWearable.MAX_WEARABLES) | 814 | |
778 | count = AvatarWearable.MAX_WEARABLES; | 815 | m_wearables = new AvatarWearable[count]; |
779 | 816 | ||
780 | for (int i = 0; i < count; i++) | 817 | for (int i = 0; i < count; i++) |
781 | m_wearables[i] = new AvatarWearable((OSDArray)wears[i]); | 818 | m_wearables[i] = new AvatarWearable((OSDArray)wears[i]); |
@@ -803,6 +840,12 @@ namespace OpenSim.Framework | |||
803 | m_log.Warn("[AVATAR APPEARANCE]: failed to unpack textures"); | 840 | m_log.Warn("[AVATAR APPEARANCE]: failed to unpack textures"); |
804 | } | 841 | } |
805 | 842 | ||
843 | if ((data != null) && (data["bakedcache"] != null) && (data["bakedcache"]).Type == OSDType.Array) | ||
844 | { | ||
845 | OSDArray bakedOSDArray = (OSDArray)(data["bakedcache"]); | ||
846 | m_cacheitems = WearableCacheItem.BakedFromOSD(bakedOSDArray); | ||
847 | } | ||
848 | |||
806 | // Visual Parameters | 849 | // Visual Parameters |
807 | SetDefaultParams(); | 850 | SetDefaultParams(); |
808 | if ((data != null) && (data["visualparams"] != null)) | 851 | if ((data != null) && (data["visualparams"] != null)) |
@@ -824,7 +867,7 @@ namespace OpenSim.Framework | |||
824 | { | 867 | { |
825 | AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]); | 868 | AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]); |
826 | AppendAttachment(att); | 869 | AppendAttachment(att); |
827 | 870 | ||
828 | // m_log.DebugFormat( | 871 | // m_log.DebugFormat( |
829 | // "[AVATAR APPEARANCE]: Unpacked attachment itemID {0}, assetID {1}, point {2}", | 872 | // "[AVATAR APPEARANCE]: Unpacked attachment itemID {0}, assetID {1}, point {2}", |
830 | // att.ItemID, att.AssetID, att.AttachPoint); | 873 | // att.ItemID, att.AssetID, att.AttachPoint); |
@@ -1601,14 +1644,14 @@ namespace OpenSim.Framework | |||
1601 | SHAPE_EYELID_INNER_CORNER_UP = 214, | 1644 | SHAPE_EYELID_INNER_CORNER_UP = 214, |
1602 | SKIRT_SKIRT_RED = 215, | 1645 | SKIRT_SKIRT_RED = 215, |
1603 | SKIRT_SKIRT_GREEN = 216, | 1646 | SKIRT_SKIRT_GREEN = 216, |
1604 | SKIRT_SKIRT_BLUE = 217, | 1647 | SKIRT_SKIRT_BLUE = 217, |
1605 | 1648 | ||
1606 | /// <summary> | 1649 | /// <summary> |
1607 | /// Avatar Physics section. These are 0 type visual params which get transmitted. | 1650 | /// Avatar Physics section. These are 0 type visual params which get transmitted. |
1608 | /// </summary> | 1651 | /// </summary> |
1609 | 1652 | ||
1610 | /// <summary> | 1653 | /// <summary> |
1611 | /// Breast Part 1 | 1654 | /// Breast Part 1 |
1612 | /// </summary> | 1655 | /// </summary> |
1613 | BREAST_PHYSICS_MASS = 218, | 1656 | BREAST_PHYSICS_MASS = 218, |
1614 | BREAST_PHYSICS_GRAVITY = 219, | 1657 | BREAST_PHYSICS_GRAVITY = 219, |
@@ -1652,7 +1695,12 @@ namespace OpenSim.Framework | |||
1652 | BREAST_PHYSICS_LEFTRIGHT_MAX_EFFECT = 247, | 1695 | BREAST_PHYSICS_LEFTRIGHT_MAX_EFFECT = 247, |
1653 | BREAST_PHYSICS_LEFTRIGHT_SPRING= 248, | 1696 | BREAST_PHYSICS_LEFTRIGHT_SPRING= 248, |
1654 | BREAST_PHYSICS_LEFTRIGHT_GAIN = 249, | 1697 | BREAST_PHYSICS_LEFTRIGHT_GAIN = 249, |
1655 | BREAST_PHYSICS_LEFTRIGHT_DAMPING = 250 | 1698 | BREAST_PHYSICS_LEFTRIGHT_DAMPING = 250, |
1699 | |||
1700 | // Ubit: 07/96/2013 new parameters | ||
1701 | _APPEARANCEMESSAGE_VERSION = 251, //ID 11000 | ||
1702 | |||
1703 | SHAPE_HOVER = 252, //ID 11001 | ||
1656 | } | 1704 | } |
1657 | #endregion | 1705 | #endregion |
1658 | } | 1706 | } |
diff --git a/OpenSim/Framework/AvatarWearable.cs b/OpenSim/Framework/AvatarWearable.cs index e7615f2..0e8f960 100644 --- a/OpenSim/Framework/AvatarWearable.cs +++ b/OpenSim/Framework/AvatarWearable.cs | |||
@@ -62,12 +62,16 @@ namespace OpenSim.Framework | |||
62 | public static readonly int UNDERSHIRT = 10; | 62 | public static readonly int UNDERSHIRT = 10; |
63 | public static readonly int UNDERPANTS = 11; | 63 | public static readonly int UNDERPANTS = 11; |
64 | public static readonly int SKIRT = 12; | 64 | public static readonly int SKIRT = 12; |
65 | |||
66 | public static readonly int MAX_BASICWEARABLES = 13; | ||
67 | |||
65 | public static readonly int ALPHA = 13; | 68 | public static readonly int ALPHA = 13; |
66 | public static readonly int TATTOO = 14; | 69 | public static readonly int TATTOO = 14; |
67 | 70 | ||
68 | public static readonly int LEGACY_VERSION_MAX_WEARABLES = 15; | 71 | public static readonly int LEGACY_VERSION_MAX_WEARABLES = 15; |
69 | public static readonly int PHYSICS = 15; | 72 | // public static readonly int PHYSICS = 15; |
70 | public static readonly int MAX_WEARABLES = 16; | 73 | // public static int MAX_WEARABLES = 16; |
74 | |||
71 | 75 | ||
72 | public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); | 76 | public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); |
73 | public static readonly UUID DEFAULT_BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); | 77 | public static readonly UUID DEFAULT_BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); |
@@ -78,6 +82,9 @@ namespace OpenSim.Framework | |||
78 | public static readonly UUID DEFAULT_SKIN_ITEM = new UUID("77c41e39-38f9-f75a-024e-585989bfabc9"); | 82 | public static readonly UUID DEFAULT_SKIN_ITEM = new UUID("77c41e39-38f9-f75a-024e-585989bfabc9"); |
79 | public static readonly UUID DEFAULT_SKIN_ASSET = new UUID("77c41e39-38f9-f75a-024e-585989bbabbb"); | 83 | public static readonly UUID DEFAULT_SKIN_ASSET = new UUID("77c41e39-38f9-f75a-024e-585989bbabbb"); |
80 | 84 | ||
85 | public static readonly UUID DEFAULT_EYES_ITEM = new UUID("cdc31054-eed8-4021-994f-4e0c6e861b50"); | ||
86 | public static readonly UUID DEFAULT_EYES_ASSET = new UUID("4bb6fa4d-1cd2-498a-a84c-95c1a0e745a7"); | ||
87 | |||
81 | public static readonly UUID DEFAULT_SHIRT_ITEM = new UUID("77c41e39-38f9-f75a-0000-585989bf0000"); | 88 | public static readonly UUID DEFAULT_SHIRT_ITEM = new UUID("77c41e39-38f9-f75a-0000-585989bf0000"); |
82 | public static readonly UUID DEFAULT_SHIRT_ASSET = new UUID("00000000-38f9-1111-024e-222222111110"); | 89 | public static readonly UUID DEFAULT_SHIRT_ASSET = new UUID("00000000-38f9-1111-024e-222222111110"); |
83 | 90 | ||
@@ -89,7 +96,7 @@ namespace OpenSim.Framework | |||
89 | 96 | ||
90 | // public static readonly UUID DEFAULT_TATTOO_ITEM = new UUID("c47e22bd-3021-4ba4-82aa-2b5cb34d35e1"); | 97 | // public static readonly UUID DEFAULT_TATTOO_ITEM = new UUID("c47e22bd-3021-4ba4-82aa-2b5cb34d35e1"); |
91 | // public static readonly UUID DEFAULT_TATTOO_ASSET = new UUID("00000000-0000-2222-3333-100000001007"); | 98 | // public static readonly UUID DEFAULT_TATTOO_ASSET = new UUID("00000000-0000-2222-3333-100000001007"); |
92 | 99 | ||
93 | protected Dictionary<UUID, UUID> m_items = new Dictionary<UUID, UUID>(); | 100 | protected Dictionary<UUID, UUID> m_items = new Dictionary<UUID, UUID>(); |
94 | protected List<UUID> m_ids = new List<UUID>(); | 101 | protected List<UUID> m_ids = new List<UUID>(); |
95 | 102 | ||
@@ -221,33 +228,40 @@ namespace OpenSim.Framework | |||
221 | { | 228 | { |
222 | get | 229 | get |
223 | { | 230 | { |
224 | AvatarWearable[] defaultWearables = new AvatarWearable[MAX_WEARABLES]; //should be 15 of these | 231 | // We use the legacy count here because this is just a fallback anyway |
225 | for (int i = 0; i < MAX_WEARABLES; i++) | 232 | AvatarWearable[] defaultWearables = new AvatarWearable[LEGACY_VERSION_MAX_WEARABLES]; |
233 | for (int i = 0; i < LEGACY_VERSION_MAX_WEARABLES; i++) | ||
226 | { | 234 | { |
227 | defaultWearables[i] = new AvatarWearable(); | 235 | defaultWearables[i] = new AvatarWearable(); |
228 | } | 236 | } |
229 | 237 | ||
230 | // Body | 238 | // Body |
231 | defaultWearables[BODY].Add(DEFAULT_BODY_ITEM, DEFAULT_BODY_ASSET); | 239 | defaultWearables[BODY].Add(DEFAULT_BODY_ITEM, DEFAULT_BODY_ASSET); |
232 | 240 | ||
233 | // Hair | 241 | // Hair |
234 | defaultWearables[HAIR].Add(DEFAULT_HAIR_ITEM, DEFAULT_HAIR_ASSET); | 242 | defaultWearables[HAIR].Add(DEFAULT_HAIR_ITEM, DEFAULT_HAIR_ASSET); |
235 | 243 | ||
236 | // Skin | 244 | // Skin |
237 | defaultWearables[SKIN].Add(DEFAULT_SKIN_ITEM, DEFAULT_SKIN_ASSET); | 245 | defaultWearables[SKIN].Add(DEFAULT_SKIN_ITEM, DEFAULT_SKIN_ASSET); |
238 | 246 | ||
247 | // Eyes | ||
248 | defaultWearables[EYES].Add(DEFAULT_EYES_ITEM, DEFAULT_EYES_ASSET); | ||
249 | |||
239 | // Shirt | 250 | // Shirt |
240 | defaultWearables[SHIRT].Add(DEFAULT_SHIRT_ITEM, DEFAULT_SHIRT_ASSET); | 251 | defaultWearables[SHIRT].Add(DEFAULT_SHIRT_ITEM, DEFAULT_SHIRT_ASSET); |
241 | 252 | ||
242 | // Pants | 253 | // Pants |
243 | defaultWearables[PANTS].Add(DEFAULT_PANTS_ITEM, DEFAULT_PANTS_ASSET); | 254 | defaultWearables[PANTS].Add(DEFAULT_PANTS_ITEM, DEFAULT_PANTS_ASSET); |
244 | 255 | ||
245 | // // Alpha | 256 | // // Alpha |
246 | // defaultWearables[ALPHA].Add(DEFAULT_ALPHA_ITEM, DEFAULT_ALPHA_ASSET); | 257 | // defaultWearables[ALPHA].Add(DEFAULT_ALPHA_ITEM, DEFAULT_ALPHA_ASSET); |
247 | 258 | ||
248 | // // Tattoo | 259 | // // Tattoo |
249 | // defaultWearables[TATTOO].Add(DEFAULT_TATTOO_ITEM, DEFAULT_TATTOO_ASSET); | 260 | // defaultWearables[TATTOO].Add(DEFAULT_TATTOO_ITEM, DEFAULT_TATTOO_ASSET); |
250 | 261 | ||
262 | // // Physics | ||
263 | // defaultWearables[PHYSICS].Add(DEFAULT_TATTOO_ITEM, DEFAULT_TATTOO_ASSET); | ||
264 | |||
251 | return defaultWearables; | 265 | return defaultWearables; |
252 | } | 266 | } |
253 | } | 267 | } |
diff --git a/OpenSim/Framework/BasicDOSProtector.cs b/OpenSim/Framework/BasicDOSProtector.cs index 89bfa94..f1ff18f 100644 --- a/OpenSim/Framework/BasicDOSProtector.cs +++ b/OpenSim/Framework/BasicDOSProtector.cs | |||
@@ -31,7 +31,7 @@ using log4net; | |||
31 | 31 | ||
32 | namespace OpenSim.Framework | 32 | namespace OpenSim.Framework |
33 | { | 33 | { |
34 | 34 | ||
35 | public class BasicDOSProtector | 35 | public class BasicDOSProtector |
36 | { | 36 | { |
37 | public enum ThrottleAction | 37 | public enum ThrottleAction |
@@ -43,7 +43,7 @@ namespace OpenSim.Framework | |||
43 | private readonly BasicDosProtectorOptions _options; | 43 | private readonly BasicDosProtectorOptions _options; |
44 | private readonly Dictionary<string, CircularBuffer<int>> _deeperInspection; // per client request checker | 44 | private readonly Dictionary<string, CircularBuffer<int>> _deeperInspection; // per client request checker |
45 | private readonly Dictionary<string, int> _tempBlocked; // blocked list | 45 | private readonly Dictionary<string, int> _tempBlocked; // blocked list |
46 | private readonly Dictionary<string, int> _sessions; | 46 | private readonly Dictionary<string, int> _sessions; |
47 | private readonly System.Timers.Timer _forgetTimer; // Cleanup timer | 47 | private readonly System.Timers.Timer _forgetTimer; // Cleanup timer |
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
49 | private readonly System.Threading.ReaderWriterLockSlim _blockLockSlim = new System.Threading.ReaderWriterLockSlim(); | 49 | private readonly System.Threading.ReaderWriterLockSlim _blockLockSlim = new System.Threading.ReaderWriterLockSlim(); |
@@ -133,7 +133,7 @@ namespace OpenSim.Framework | |||
133 | else | 133 | else |
134 | throw new System.Security.SecurityException("Throttled"); | 134 | throw new System.Security.SecurityException("Throttled"); |
135 | } | 135 | } |
136 | 136 | ||
137 | _blockLockSlim.ExitReadLock(); | 137 | _blockLockSlim.ExitReadLock(); |
138 | 138 | ||
139 | lock (_generalRequestTimes) | 139 | lock (_generalRequestTimes) |
@@ -169,10 +169,10 @@ namespace OpenSim.Framework | |||
169 | _blockLockSlim.ExitWriteLock(); | 169 | _blockLockSlim.ExitWriteLock(); |
170 | 170 | ||
171 | } | 171 | } |
172 | 172 | ||
173 | 173 | ||
174 | } | 174 | } |
175 | else | 175 | else |
176 | ProcessConcurrency(key, endpoint); | 176 | ProcessConcurrency(key, endpoint); |
177 | } | 177 | } |
178 | if (_generalRequestTimes.Size == _generalRequestTimes.Capacity && | 178 | if (_generalRequestTimes.Size == _generalRequestTimes.Capacity && |
@@ -194,7 +194,7 @@ namespace OpenSim.Framework | |||
194 | _sessionLockSlim.EnterWriteLock(); | 194 | _sessionLockSlim.EnterWriteLock(); |
195 | if (_sessions.ContainsKey(key)) | 195 | if (_sessions.ContainsKey(key)) |
196 | _sessions[key] = _sessions[key] + 1; | 196 | _sessions[key] = _sessions[key] + 1; |
197 | else | 197 | else |
198 | _sessions.Add(key,1); | 198 | _sessions.Add(key,1); |
199 | _sessionLockSlim.ExitWriteLock(); | 199 | _sessionLockSlim.ExitWriteLock(); |
200 | } | 200 | } |
@@ -209,7 +209,7 @@ namespace OpenSim.Framework | |||
209 | } | 209 | } |
210 | else | 210 | else |
211 | _sessions.Add(key, 1); | 211 | _sessions.Add(key, 1); |
212 | 212 | ||
213 | _sessionLockSlim.ExitWriteLock(); | 213 | _sessionLockSlim.ExitWriteLock(); |
214 | } | 214 | } |
215 | 215 | ||
diff --git a/OpenSim/Framework/BlockingQueue.cs b/OpenSim/Framework/BlockingQueue.cs index d11ad11..2461049 100644 --- a/OpenSim/Framework/BlockingQueue.cs +++ b/OpenSim/Framework/BlockingQueue.cs | |||
@@ -65,7 +65,7 @@ namespace OpenSim.Framework | |||
65 | 65 | ||
66 | if (m_pqueue.Count > 0) | 66 | if (m_pqueue.Count > 0) |
67 | return m_pqueue.Dequeue(); | 67 | return m_pqueue.Dequeue(); |
68 | 68 | ||
69 | if (m_queue.Count > 0) | 69 | if (m_queue.Count > 0) |
70 | return m_queue.Dequeue(); | 70 | return m_queue.Dequeue(); |
71 | return default(T); | 71 | return default(T); |
@@ -76,10 +76,10 @@ namespace OpenSim.Framework | |||
76 | { | 76 | { |
77 | lock (m_queueSync) | 77 | lock (m_queueSync) |
78 | { | 78 | { |
79 | bool success = true; | 79 | if (m_queue.Count < 1 && m_pqueue.Count < 1) |
80 | while (m_queue.Count < 1 && m_pqueue.Count < 1 && success) | ||
81 | { | 80 | { |
82 | success = Monitor.Wait(m_queueSync, msTimeout); | 81 | if(!Monitor.Wait(m_queueSync, msTimeout)) |
82 | return default(T); | ||
83 | } | 83 | } |
84 | 84 | ||
85 | if (m_pqueue.Count > 0) | 85 | if (m_pqueue.Count > 0) |
diff --git a/OpenSim/Framework/Cache.cs b/OpenSim/Framework/Cache.cs index 31cab4a..3ca85d7 100644 --- a/OpenSim/Framework/Cache.cs +++ b/OpenSim/Framework/Cache.cs | |||
@@ -89,14 +89,14 @@ namespace OpenSim.Framework | |||
89 | public CacheItemBase(string index) | 89 | public CacheItemBase(string index) |
90 | { | 90 | { |
91 | uuid = index; | 91 | uuid = index; |
92 | entered = DateTime.Now; | 92 | entered = DateTime.UtcNow; |
93 | lastUsed = entered; | 93 | lastUsed = entered; |
94 | } | 94 | } |
95 | 95 | ||
96 | public CacheItemBase(string index, DateTime ttl) | 96 | public CacheItemBase(string index, DateTime ttl) |
97 | { | 97 | { |
98 | uuid = index; | 98 | uuid = index; |
99 | entered = DateTime.Now; | 99 | entered = DateTime.UtcNow; |
100 | lastUsed = entered; | 100 | lastUsed = entered; |
101 | expires = ttl; | 101 | expires = ttl; |
102 | } | 102 | } |
@@ -215,6 +215,8 @@ namespace OpenSim.Framework | |||
215 | private CacheFlags m_Flags = 0; | 215 | private CacheFlags m_Flags = 0; |
216 | private int m_Size = 1024; | 216 | private int m_Size = 1024; |
217 | private TimeSpan m_DefaultTTL = new TimeSpan(0); | 217 | private TimeSpan m_DefaultTTL = new TimeSpan(0); |
218 | private DateTime m_nextExpire; | ||
219 | private TimeSpan m_expiresTime = new TimeSpan(0,0,30); | ||
218 | public ExpireDelegate OnExpire; | 220 | public ExpireDelegate OnExpire; |
219 | 221 | ||
220 | // Comparison interfaces | 222 | // Comparison interfaces |
@@ -233,6 +235,21 @@ namespace OpenSim.Framework | |||
233 | return(a.lastUsed.CompareTo(b.lastUsed)); | 235 | return(a.lastUsed.CompareTo(b.lastUsed)); |
234 | } | 236 | } |
235 | } | 237 | } |
238 | // same as above, reverse order | ||
239 | private class SortLRUrev : IComparer<CacheItemBase> | ||
240 | { | ||
241 | public int Compare(CacheItemBase a, CacheItemBase b) | ||
242 | { | ||
243 | if (a == null && b == null) | ||
244 | return 0; | ||
245 | if (a == null) | ||
246 | return -1; | ||
247 | if (b == null) | ||
248 | return 1; | ||
249 | |||
250 | return(b.lastUsed.CompareTo(a.lastUsed)); | ||
251 | } | ||
252 | } | ||
236 | 253 | ||
237 | // Convenience constructors | 254 | // Convenience constructors |
238 | // | 255 | // |
@@ -241,6 +258,8 @@ namespace OpenSim.Framework | |||
241 | m_Strategy = CacheStrategy.Balanced; | 258 | m_Strategy = CacheStrategy.Balanced; |
242 | m_Medium = CacheMedium.Memory; | 259 | m_Medium = CacheMedium.Memory; |
243 | m_Flags = 0; | 260 | m_Flags = 0; |
261 | m_nextExpire = DateTime.UtcNow + m_expiresTime; | ||
262 | m_Strategy = CacheStrategy.Aggressive; | ||
244 | } | 263 | } |
245 | 264 | ||
246 | public Cache(CacheMedium medium) : | 265 | public Cache(CacheMedium medium) : |
@@ -295,19 +314,23 @@ namespace OpenSim.Framework | |||
295 | { | 314 | { |
296 | lock (m_Index) | 315 | lock (m_Index) |
297 | { | 316 | { |
298 | if (Count <= Size) | 317 | int target = newSize; |
299 | return; | 318 | if(m_Strategy == CacheStrategy.Aggressive) |
319 | target = (int)(newSize * 0.9); | ||
300 | 320 | ||
301 | m_Index.Sort(new SortLRU()); | 321 | if(Count > target) |
302 | m_Index.Reverse(); | 322 | { |
323 | m_Index.Sort(new SortLRUrev()); | ||
303 | 324 | ||
304 | m_Index.RemoveRange(newSize, Count - newSize); | 325 | m_Index.RemoveRange(newSize, Count - target); |
305 | m_Size = newSize; | ||
306 | 326 | ||
307 | m_Lookup.Clear(); | 327 | m_Lookup.Clear(); |
328 | |||
329 | foreach (CacheItemBase item in m_Index) | ||
330 | m_Lookup[item.uuid] = item; | ||
331 | } | ||
332 | m_Size = newSize; | ||
308 | 333 | ||
309 | foreach (CacheItemBase item in m_Index) | ||
310 | m_Lookup[item.uuid] = item; | ||
311 | } | 334 | } |
312 | } | 335 | } |
313 | 336 | ||
@@ -333,10 +356,10 @@ namespace OpenSim.Framework | |||
333 | Expire(true); | 356 | Expire(true); |
334 | return null; | 357 | return null; |
335 | } | 358 | } |
336 | 359 | ||
337 | item.hits++; | 360 | item.hits++; |
338 | item.lastUsed = DateTime.Now; | 361 | item.lastUsed = DateTime.UtcNow; |
339 | 362 | ||
340 | Expire(true); | 363 | Expire(true); |
341 | } | 364 | } |
342 | 365 | ||
@@ -361,14 +384,15 @@ namespace OpenSim.Framework | |||
361 | // | 384 | // |
362 | public virtual Object Get(string index, FetchDelegate fetch) | 385 | public virtual Object Get(string index, FetchDelegate fetch) |
363 | { | 386 | { |
364 | Object item = Get(index); | 387 | CacheItemBase item = GetItem(index); |
365 | if (item != null) | 388 | if (item != null) |
366 | return item; | 389 | return item.Retrieve(); |
367 | 390 | ||
368 | Object data = fetch(index); | 391 | Object data = fetch(index); |
392 | |||
369 | if (data == null) | 393 | if (data == null) |
370 | { | 394 | { |
371 | if ((m_Flags & CacheFlags.CacheMissing) != 0) | 395 | if((m_Flags & CacheFlags.CacheMissing) != 0) |
372 | { | 396 | { |
373 | lock (m_Index) | 397 | lock (m_Index) |
374 | { | 398 | { |
@@ -384,7 +408,6 @@ namespace OpenSim.Framework | |||
384 | } | 408 | } |
385 | 409 | ||
386 | Store(index, data); | 410 | Store(index, data); |
387 | |||
388 | return data; | 411 | return data; |
389 | } | 412 | } |
390 | 413 | ||
@@ -442,9 +465,9 @@ namespace OpenSim.Framework | |||
442 | item = GetItem(index); | 465 | item = GetItem(index); |
443 | 466 | ||
444 | item.hits++; | 467 | item.hits++; |
445 | item.lastUsed = DateTime.Now; | 468 | item.lastUsed = DateTime.UtcNow; |
446 | if (m_DefaultTTL.Ticks != 0) | 469 | if (m_DefaultTTL.Ticks != 0) |
447 | item.expires = DateTime.Now + m_DefaultTTL; | 470 | item.expires = DateTime.UtcNow + m_DefaultTTL; |
448 | 471 | ||
449 | item.Store(data); | 472 | item.Store(data); |
450 | } | 473 | } |
@@ -455,7 +478,7 @@ namespace OpenSim.Framework | |||
455 | parameters); | 478 | parameters); |
456 | 479 | ||
457 | if (m_DefaultTTL.Ticks != 0) | 480 | if (m_DefaultTTL.Ticks != 0) |
458 | item.expires = DateTime.Now + m_DefaultTTL; | 481 | item.expires = DateTime.UtcNow + m_DefaultTTL; |
459 | 482 | ||
460 | m_Index.Add(item); | 483 | m_Index.Add(item); |
461 | m_Lookup[index] = item; | 484 | m_Lookup[index] = item; |
@@ -476,10 +499,14 @@ namespace OpenSim.Framework | |||
476 | if (getting && (m_Strategy == CacheStrategy.Aggressive)) | 499 | if (getting && (m_Strategy == CacheStrategy.Aggressive)) |
477 | return; | 500 | return; |
478 | 501 | ||
502 | DateTime now = DateTime.UtcNow; | ||
503 | if(now < m_nextExpire) | ||
504 | return; | ||
505 | |||
506 | m_nextExpire = now + m_expiresTime; | ||
507 | |||
479 | if (m_DefaultTTL.Ticks != 0) | 508 | if (m_DefaultTTL.Ticks != 0) |
480 | { | 509 | { |
481 | DateTime now= DateTime.Now; | ||
482 | |||
483 | foreach (CacheItemBase item in new List<CacheItemBase>(m_Index)) | 510 | foreach (CacheItemBase item in new List<CacheItemBase>(m_Index)) |
484 | { | 511 | { |
485 | if (item.expires.Ticks == 0 || | 512 | if (item.expires.Ticks == 0 || |
@@ -494,15 +521,13 @@ namespace OpenSim.Framework | |||
494 | switch (m_Strategy) | 521 | switch (m_Strategy) |
495 | { | 522 | { |
496 | case CacheStrategy.Aggressive: | 523 | case CacheStrategy.Aggressive: |
497 | if (Count < Size) | 524 | int target = (int)((float)Size * 0.9); |
525 | if (Count < target) // Cover ridiculous cache sizes | ||
498 | return; | 526 | return; |
499 | 527 | ||
500 | m_Index.Sort(new SortLRU()); | 528 | target = (int)((float)Size * 0.8); |
501 | m_Index.Reverse(); | ||
502 | 529 | ||
503 | int target = (int)((float)Size * 0.9); | 530 | m_Index.Sort(new SortLRUrev()); |
504 | if (target == Count) // Cover ridiculous cache sizes | ||
505 | return; | ||
506 | 531 | ||
507 | ExpireDelegate doExpire = OnExpire; | 532 | ExpireDelegate doExpire = OnExpire; |
508 | 533 | ||
diff --git a/OpenSim/Framework/CapsUtil.cs b/OpenSim/Framework/CapsUtil.cs index 4baf505..020f6e2 100644 --- a/OpenSim/Framework/CapsUtil.cs +++ b/OpenSim/Framework/CapsUtil.cs | |||
@@ -43,7 +43,7 @@ namespace OpenSim.Framework | |||
43 | { | 43 | { |
44 | return "CAPS/" + capsObjectPath + "0000/"; | 44 | return "CAPS/" + capsObjectPath + "0000/"; |
45 | } | 45 | } |
46 | 46 | ||
47 | /// <summary> | 47 | /// <summary> |
48 | /// Get a random CAPS object path component that will be used as the identifying part of all future CAPS requests | 48 | /// Get a random CAPS object path component that will be used as the identifying part of all future CAPS requests |
49 | /// </summary> | 49 | /// </summary> |
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index 1504f21..ee5007a 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs | |||
@@ -61,8 +61,8 @@ namespace OpenSim.Framework | |||
61 | { | 61 | { |
62 | UUID AgentID { get; set; } | 62 | UUID AgentID { get; set; } |
63 | 63 | ||
64 | OSDMap Pack(); | 64 | OSDMap Pack(EntityTransferContext ctx); |
65 | void Unpack(OSDMap map, IScene scene); | 65 | void Unpack(OSDMap map, IScene scene, EntityTransferContext ctx); |
66 | } | 66 | } |
67 | 67 | ||
68 | /// <summary> | 68 | /// <summary> |
@@ -89,13 +89,16 @@ namespace OpenSim.Framework | |||
89 | public Vector3 AtAxis; | 89 | public Vector3 AtAxis; |
90 | public Vector3 LeftAxis; | 90 | public Vector3 LeftAxis; |
91 | public Vector3 UpAxis; | 91 | public Vector3 UpAxis; |
92 | //public int GodLevel; | ||
93 | public OSD GodData = null; | ||
92 | public bool ChangedGrid; | 94 | public bool ChangedGrid; |
93 | 95 | ||
94 | // This probably shouldn't be here | 96 | // This probably shouldn't be here |
95 | public byte[] Throttles; | 97 | public byte[] Throttles; |
96 | 98 | ||
99 | public Dictionary<ulong, string> ChildrenCapSeeds = null; | ||
97 | 100 | ||
98 | public OSDMap Pack() | 101 | public OSDMap Pack(EntityTransferContext ctx) |
99 | { | 102 | { |
100 | OSDMap args = new OSDMap(); | 103 | OSDMap args = new OSDMap(); |
101 | args["message_type"] = OSD.FromString("AgentPosition"); | 104 | args["message_type"] = OSD.FromString("AgentPosition"); |
@@ -115,14 +118,37 @@ namespace OpenSim.Framework | |||
115 | 118 | ||
116 | args["far"] = OSD.FromReal(Far); | 119 | args["far"] = OSD.FromReal(Far); |
117 | args["changed_grid"] = OSD.FromBoolean(ChangedGrid); | 120 | args["changed_grid"] = OSD.FromBoolean(ChangedGrid); |
121 | //args["god_level"] = OSD.FromString(GodLevel.ToString()); | ||
122 | if(GodData != null) | ||
123 | { | ||
124 | args["god_data"] = GodData; | ||
125 | OSDMap g = (OSDMap)GodData; | ||
126 | // Set legacy value | ||
127 | // TODO: remove after 0.9 is superseded | ||
128 | if (g.ContainsKey("ViewerUiIsGod")) | ||
129 | args["god_level"] = g["ViewerUiIsGod"].AsBoolean() ? 200 : 0; | ||
130 | } | ||
118 | 131 | ||
119 | if ((Throttles != null) && (Throttles.Length > 0)) | 132 | if ((Throttles != null) && (Throttles.Length > 0)) |
120 | args["throttles"] = OSD.FromBinary(Throttles); | 133 | args["throttles"] = OSD.FromBinary(Throttles); |
121 | 134 | ||
135 | if (ChildrenCapSeeds != null && ChildrenCapSeeds.Count > 0) | ||
136 | { | ||
137 | OSDArray childrenSeeds = new OSDArray(ChildrenCapSeeds.Count); | ||
138 | foreach (KeyValuePair<ulong, string> kvp in ChildrenCapSeeds) | ||
139 | { | ||
140 | OSDMap pair = new OSDMap(); | ||
141 | pair["handle"] = OSD.FromString(kvp.Key.ToString()); | ||
142 | pair["seed"] = OSD.FromString(kvp.Value); | ||
143 | childrenSeeds.Add(pair); | ||
144 | } | ||
145 | args["children_seeds"] = childrenSeeds; | ||
146 | } | ||
147 | |||
122 | return args; | 148 | return args; |
123 | } | 149 | } |
124 | 150 | ||
125 | public void Unpack(OSDMap args, IScene scene) | 151 | public void Unpack(OSDMap args, IScene scene, EntityTransferContext ctx) |
126 | { | 152 | { |
127 | if (args.ContainsKey("region_handle")) | 153 | if (args.ContainsKey("region_handle")) |
128 | UInt64.TryParse(args["region_handle"].AsString(), out RegionHandle); | 154 | UInt64.TryParse(args["region_handle"].AsString(), out RegionHandle); |
@@ -160,11 +186,40 @@ namespace OpenSim.Framework | |||
160 | if (args["changed_grid"] != null) | 186 | if (args["changed_grid"] != null) |
161 | ChangedGrid = args["changed_grid"].AsBoolean(); | 187 | ChangedGrid = args["changed_grid"].AsBoolean(); |
162 | 188 | ||
189 | //if (args["god_level"] != null) | ||
190 | // Int32.TryParse(args["god_level"].AsString(), out GodLevel); | ||
191 | if (args.ContainsKey("god_data") && args["god_data"] != null) | ||
192 | GodData = args["god_data"]; | ||
193 | |||
163 | if (args["far"] != null) | 194 | if (args["far"] != null) |
164 | Far = (float)(args["far"].AsReal()); | 195 | Far = (float)(args["far"].AsReal()); |
165 | 196 | ||
166 | if (args["throttles"] != null) | 197 | if (args["throttles"] != null) |
167 | Throttles = args["throttles"].AsBinary(); | 198 | Throttles = args["throttles"].AsBinary(); |
199 | |||
200 | if (args.ContainsKey("children_seeds") && (args["children_seeds"] != null) && | ||
201 | (args["children_seeds"].Type == OSDType.Array)) | ||
202 | { | ||
203 | OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]); | ||
204 | ChildrenCapSeeds = new Dictionary<ulong, string>(); | ||
205 | foreach (OSD o in childrenSeeds) | ||
206 | { | ||
207 | if (o.Type == OSDType.Map) | ||
208 | { | ||
209 | ulong handle = 0; | ||
210 | string seed = ""; | ||
211 | OSDMap pair = (OSDMap)o; | ||
212 | if (pair["handle"] != null) | ||
213 | if (!UInt64.TryParse(pair["handle"].AsString(), out handle)) | ||
214 | continue; | ||
215 | if (pair["seed"] != null) | ||
216 | seed = pair["seed"].AsString(); | ||
217 | if (!ChildrenCapSeeds.ContainsKey(handle)) | ||
218 | ChildrenCapSeeds.Add(handle, seed); | ||
219 | } | ||
220 | } | ||
221 | } | ||
222 | |||
168 | } | 223 | } |
169 | 224 | ||
170 | /// <summary> | 225 | /// <summary> |
@@ -294,7 +349,7 @@ namespace OpenSim.Framework | |||
294 | public Vector3 UpAxis; | 349 | public Vector3 UpAxis; |
295 | 350 | ||
296 | /// <summary> | 351 | /// <summary> |
297 | /// Signal on a V2 teleport that Scene.IncomingChildAgentDataUpdate(AgentData ad) should wait for the | 352 | /// Signal on a V2 teleport that Scene.IncomingChildAgentDataUpdate(AgentData ad) should wait for the |
298 | /// scene presence to become root (triggered when the viewer sends a CompleteAgentMovement UDP packet after | 353 | /// scene presence to become root (triggered when the viewer sends a CompleteAgentMovement UDP packet after |
299 | /// establishing the connection triggered by it's receipt of a TeleportFinish EQ message). | 354 | /// establishing the connection triggered by it's receipt of a TeleportFinish EQ message). |
300 | /// </summary> | 355 | /// </summary> |
@@ -310,18 +365,24 @@ namespace OpenSim.Framework | |||
310 | public Quaternion BodyRotation; | 365 | public Quaternion BodyRotation; |
311 | public uint ControlFlags; | 366 | public uint ControlFlags; |
312 | public float EnergyLevel; | 367 | public float EnergyLevel; |
313 | public Byte GodLevel; | 368 | public OSD GodData = null; |
369 | //public Byte GodLevel; | ||
314 | public bool AlwaysRun; | 370 | public bool AlwaysRun; |
315 | public UUID PreyAgent; | 371 | public UUID PreyAgent; |
316 | public Byte AgentAccess; | 372 | public Byte AgentAccess; |
317 | public UUID ActiveGroupID; | 373 | public UUID ActiveGroupID; |
374 | public string ActiveGroupName; | ||
375 | public string ActiveGroupTitle = null; | ||
376 | public UUID agentCOF; | ||
377 | public byte CrossingFlags; | ||
378 | public byte CrossExtraFlags; | ||
318 | 379 | ||
319 | public AgentGroupData[] Groups; | 380 | public Dictionary<ulong, string> ChildrenCapSeeds = null; |
320 | public Animation[] Anims; | 381 | public Animation[] Anims; |
321 | public Animation DefaultAnim = null; | 382 | public Animation DefaultAnim = null; |
322 | public Animation AnimState = null; | 383 | public Animation AnimState = null; |
384 | public Byte MotionState = 0; | ||
323 | 385 | ||
324 | public UUID GranterID; | ||
325 | public UUID ParentPart; | 386 | public UUID ParentPart; |
326 | public Vector3 SitOffset; | 387 | public Vector3 SitOffset; |
327 | 388 | ||
@@ -334,12 +395,6 @@ namespace OpenSim.Framework | |||
334 | MethodBase.GetCurrentMethod().DeclaringType); | 395 | MethodBase.GetCurrentMethod().DeclaringType); |
335 | // DEBUG OFF | 396 | // DEBUG OFF |
336 | 397 | ||
337 | /* | ||
338 | public byte[] AgentTextures; | ||
339 | public byte[] VisualParams; | ||
340 | public UUID[] Wearables; | ||
341 | public AvatarAttachment[] Attachments; | ||
342 | */ | ||
343 | // Scripted | 398 | // Scripted |
344 | public ControllerData[] Controllers; | 399 | public ControllerData[] Controllers; |
345 | 400 | ||
@@ -349,7 +404,9 @@ namespace OpenSim.Framework | |||
349 | public List<ISceneObject> AttachmentObjects; | 404 | public List<ISceneObject> AttachmentObjects; |
350 | public List<string> AttachmentObjectStates; | 405 | public List<string> AttachmentObjectStates; |
351 | 406 | ||
352 | public virtual OSDMap Pack() | 407 | public Dictionary<string, UUID> MovementAnimationOverRides = new Dictionary<string, UUID>(); |
408 | |||
409 | public virtual OSDMap Pack(EntityTransferContext ctx) | ||
353 | { | 410 | { |
354 | // m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data"); | 411 | // m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data"); |
355 | 412 | ||
@@ -384,19 +441,39 @@ namespace OpenSim.Framework | |||
384 | args["control_flags"] = OSD.FromString(ControlFlags.ToString()); | 441 | args["control_flags"] = OSD.FromString(ControlFlags.ToString()); |
385 | 442 | ||
386 | args["energy_level"] = OSD.FromReal(EnergyLevel); | 443 | args["energy_level"] = OSD.FromReal(EnergyLevel); |
387 | args["god_level"] = OSD.FromString(GodLevel.ToString()); | 444 | //args["god_level"] = OSD.FromString(GodLevel.ToString()); |
445 | if(GodData != null) | ||
446 | { | ||
447 | args["god_data"] = GodData; | ||
448 | OSDMap g = (OSDMap)GodData; | ||
449 | if (g.ContainsKey("ViewerUiIsGod")) | ||
450 | args["god_level"] = g["ViewerUiIsGod"].AsBoolean() ? 200 : 0;; | ||
451 | } | ||
388 | args["always_run"] = OSD.FromBoolean(AlwaysRun); | 452 | args["always_run"] = OSD.FromBoolean(AlwaysRun); |
389 | args["prey_agent"] = OSD.FromUUID(PreyAgent); | 453 | args["prey_agent"] = OSD.FromUUID(PreyAgent); |
390 | args["agent_access"] = OSD.FromString(AgentAccess.ToString()); | 454 | args["agent_access"] = OSD.FromString(AgentAccess.ToString()); |
391 | 455 | ||
456 | args["agent_cof"] = OSD.FromUUID(agentCOF); | ||
457 | args["crossingflags"] = OSD.FromInteger(CrossingFlags); | ||
458 | if(CrossingFlags != 0) | ||
459 | args["crossExtraFlags"] = OSD.FromInteger(CrossExtraFlags); | ||
460 | |||
392 | args["active_group_id"] = OSD.FromUUID(ActiveGroupID); | 461 | args["active_group_id"] = OSD.FromUUID(ActiveGroupID); |
393 | 462 | args["active_group_name"] = OSD.FromString(ActiveGroupName); | |
394 | if ((Groups != null) && (Groups.Length > 0)) | 463 | if(ActiveGroupTitle != null) |
464 | args["active_group_title"] = OSD.FromString(ActiveGroupTitle); | ||
465 | |||
466 | if (ChildrenCapSeeds != null && ChildrenCapSeeds.Count > 0) | ||
395 | { | 467 | { |
396 | OSDArray groups = new OSDArray(Groups.Length); | 468 | OSDArray childrenSeeds = new OSDArray(ChildrenCapSeeds.Count); |
397 | foreach (AgentGroupData agd in Groups) | 469 | foreach (KeyValuePair<ulong, string> kvp in ChildrenCapSeeds) |
398 | groups.Add(agd.PackUpdateMessage()); | 470 | { |
399 | args["groups"] = groups; | 471 | OSDMap pair = new OSDMap(); |
472 | pair["handle"] = OSD.FromString(kvp.Key.ToString()); | ||
473 | pair["seed"] = OSD.FromString(kvp.Value); | ||
474 | childrenSeeds.Add(pair); | ||
475 | } | ||
476 | args["children_seeds"] = childrenSeeds; | ||
400 | } | 477 | } |
401 | 478 | ||
402 | if ((Anims != null) && (Anims.Length > 0)) | 479 | if ((Anims != null) && (Anims.Length > 0)) |
@@ -417,57 +494,28 @@ namespace OpenSim.Framework | |||
417 | args["animation_state"] = AnimState.PackUpdateMessage(); | 494 | args["animation_state"] = AnimState.PackUpdateMessage(); |
418 | } | 495 | } |
419 | 496 | ||
420 | if (Appearance != null) | 497 | if (MovementAnimationOverRides.Count > 0) |
421 | args["packed_appearance"] = Appearance.Pack(); | ||
422 | |||
423 | //if ((AgentTextures != null) && (AgentTextures.Length > 0)) | ||
424 | //{ | ||
425 | // OSDArray textures = new OSDArray(AgentTextures.Length); | ||
426 | // foreach (UUID uuid in AgentTextures) | ||
427 | // textures.Add(OSD.FromUUID(uuid)); | ||
428 | // args["agent_textures"] = textures; | ||
429 | //} | ||
430 | |||
431 | // The code to pack textures, visuals, wearables and attachments | ||
432 | // should be removed; packed appearance contains the full appearance | ||
433 | // This is retained for backward compatibility only | ||
434 | if (Appearance.Texture != null) | ||
435 | { | 498 | { |
436 | byte[] rawtextures = Appearance.Texture.GetBytes(); | 499 | OSDArray AOs = new OSDArray(MovementAnimationOverRides.Count); |
437 | args["texture_entry"] = OSD.FromBinary(rawtextures); | 500 | { |
501 | foreach (KeyValuePair<string, UUID> kvp in MovementAnimationOverRides) | ||
502 | { | ||
503 | OSDMap ao = new OSDMap(2); | ||
504 | ao["state"] = OSD.FromString(kvp.Key); | ||
505 | ao["uuid"] = OSD.FromUUID(kvp.Value); | ||
506 | AOs.Add(ao); | ||
507 | } | ||
508 | } | ||
509 | args["movementAO"] = AOs; | ||
438 | } | 510 | } |
439 | 511 | ||
440 | if ((Appearance.VisualParams != null) && (Appearance.VisualParams.Length > 0)) | 512 | if (MotionState != 0) |
441 | args["visual_params"] = OSD.FromBinary(Appearance.VisualParams); | ||
442 | |||
443 | // We might not pass this in all cases... | ||
444 | if ((Appearance.Wearables != null) && (Appearance.Wearables.Length > 0)) | ||
445 | { | 513 | { |
446 | int wearsCount; | 514 | args["motion_state"] = OSD.FromInteger(MotionState); |
447 | if(Appearance.PackLegacyWearables) | ||
448 | wearsCount = AvatarWearable.LEGACY_VERSION_MAX_WEARABLES; | ||
449 | else | ||
450 | wearsCount = AvatarWearable.MAX_WEARABLES; | ||
451 | |||
452 | if(wearsCount > Appearance.Wearables.Length) | ||
453 | wearsCount = Appearance.Wearables.Length; | ||
454 | |||
455 | OSDArray wears = new OSDArray(wearsCount); | ||
456 | for(int i = 0; i < wearsCount ; i++) | ||
457 | wears.Add(Appearance.Wearables[i].Pack()); | ||
458 | |||
459 | args["wearables"] = wears; | ||
460 | } | 515 | } |
461 | 516 | ||
462 | List<AvatarAttachment> attachments = Appearance.GetAttachments(); | 517 | if (Appearance != null) |
463 | if ((attachments != null) && (attachments.Count > 0)) | 518 | args["packed_appearance"] = Appearance.Pack(ctx); |
464 | { | ||
465 | OSDArray attachs = new OSDArray(attachments.Count); | ||
466 | foreach (AvatarAttachment att in attachments) | ||
467 | attachs.Add(att.Pack()); | ||
468 | args["attachments"] = attachs; | ||
469 | } | ||
470 | // End of code to remove | ||
471 | 519 | ||
472 | if ((Controllers != null) && (Controllers.Length > 0)) | 520 | if ((Controllers != null) && (Controllers.Length > 0)) |
473 | { | 521 | { |
@@ -516,7 +564,7 @@ namespace OpenSim.Framework | |||
516 | /// Avoiding reflection makes it painful to write, but that's the price! | 564 | /// Avoiding reflection makes it painful to write, but that's the price! |
517 | /// </summary> | 565 | /// </summary> |
518 | /// <param name="hash"></param> | 566 | /// <param name="hash"></param> |
519 | public virtual void Unpack(OSDMap args, IScene scene) | 567 | public virtual void Unpack(OSDMap args, IScene scene, EntityTransferContext ctx) |
520 | { | 568 | { |
521 | //m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Unpack data"); | 569 | //m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Unpack data"); |
522 | 570 | ||
@@ -580,8 +628,11 @@ namespace OpenSim.Framework | |||
580 | if (args["energy_level"] != null) | 628 | if (args["energy_level"] != null) |
581 | EnergyLevel = (float)(args["energy_level"].AsReal()); | 629 | EnergyLevel = (float)(args["energy_level"].AsReal()); |
582 | 630 | ||
583 | if (args["god_level"] != null) | 631 | //if (args["god_level"] != null) |
584 | Byte.TryParse(args["god_level"].AsString(), out GodLevel); | 632 | // Byte.TryParse(args["god_level"].AsString(), out GodLevel); |
633 | |||
634 | if (args.ContainsKey("god_data") && args["god_data"] != null) | ||
635 | GodData = args["god_data"]; | ||
585 | 636 | ||
586 | if (args["always_run"] != null) | 637 | if (args["always_run"] != null) |
587 | AlwaysRun = args["always_run"].AsBoolean(); | 638 | AlwaysRun = args["always_run"].AsBoolean(); |
@@ -592,19 +643,46 @@ namespace OpenSim.Framework | |||
592 | if (args["agent_access"] != null) | 643 | if (args["agent_access"] != null) |
593 | Byte.TryParse(args["agent_access"].AsString(), out AgentAccess); | 644 | Byte.TryParse(args["agent_access"].AsString(), out AgentAccess); |
594 | 645 | ||
595 | if (args["active_group_id"] != null) | 646 | if (args.ContainsKey("agent_cof") && args["agent_cof"] != null) |
647 | agentCOF = args["agent_cof"].AsUUID(); | ||
648 | |||
649 | if (args.ContainsKey("crossingflags") && args["crossingflags"] != null) | ||
650 | CrossingFlags = (byte)args["crossingflags"].AsInteger(); | ||
651 | |||
652 | if(CrossingFlags != 0) | ||
653 | { | ||
654 | if (args.ContainsKey("crossExtraFlags") && args["crossExtraFlags"] != null) | ||
655 | CrossExtraFlags = (byte)args["crossExtraFlags"].AsInteger(); | ||
656 | } | ||
657 | |||
658 | if (args.ContainsKey("active_group_id") && args["active_group_id"] != null) | ||
596 | ActiveGroupID = args["active_group_id"].AsUUID(); | 659 | ActiveGroupID = args["active_group_id"].AsUUID(); |
597 | 660 | ||
598 | if ((args["groups"] != null) && (args["groups"]).Type == OSDType.Array) | 661 | if (args.ContainsKey("active_group_name") && args["active_group_name"] != null) |
662 | ActiveGroupName = args["active_group_name"].AsString(); | ||
663 | |||
664 | if(args.ContainsKey("active_group_title") && args["active_group_title"] != null) | ||
665 | ActiveGroupTitle = args["active_group_title"].AsString(); | ||
666 | |||
667 | if (args.ContainsKey("children_seeds") && (args["children_seeds"] != null) && | ||
668 | (args["children_seeds"].Type == OSDType.Array)) | ||
599 | { | 669 | { |
600 | OSDArray groups = (OSDArray)(args["groups"]); | 670 | OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]); |
601 | Groups = new AgentGroupData[groups.Count]; | 671 | ChildrenCapSeeds = new Dictionary<ulong, string>(); |
602 | int i = 0; | 672 | foreach (OSD o in childrenSeeds) |
603 | foreach (OSD o in groups) | ||
604 | { | 673 | { |
605 | if (o.Type == OSDType.Map) | 674 | if (o.Type == OSDType.Map) |
606 | { | 675 | { |
607 | Groups[i++] = new AgentGroupData((OSDMap)o); | 676 | ulong handle = 0; |
677 | string seed = ""; | ||
678 | OSDMap pair = (OSDMap)o; | ||
679 | if (pair["handle"] != null) | ||
680 | if (!UInt64.TryParse(pair["handle"].AsString(), out handle)) | ||
681 | continue; | ||
682 | if (pair["seed"] != null) | ||
683 | seed = pair["seed"].AsString(); | ||
684 | if (!ChildrenCapSeeds.ContainsKey(handle)) | ||
685 | ChildrenCapSeeds.Add(handle, seed); | ||
608 | } | 686 | } |
609 | } | 687 | } |
610 | } | 688 | } |
@@ -647,6 +725,28 @@ namespace OpenSim.Framework | |||
647 | } | 725 | } |
648 | } | 726 | } |
649 | 727 | ||
728 | MovementAnimationOverRides.Clear(); | ||
729 | |||
730 | if (args["movementAO"] != null && args["movementAO"].Type == OSDType.Array) | ||
731 | { | ||
732 | OSDArray AOs = (OSDArray)(args["movementAO"]); | ||
733 | int count = AOs.Count; | ||
734 | |||
735 | for (int i = 0; i < count; i++) | ||
736 | { | ||
737 | OSDMap ao = (OSDMap)AOs[i]; | ||
738 | if (ao["state"] != null && ao["uuid"] != null) | ||
739 | { | ||
740 | string state = ao["state"].AsString(); | ||
741 | UUID id = ao["uuid"].AsUUID(); | ||
742 | MovementAnimationOverRides[state] = id; | ||
743 | } | ||
744 | } | ||
745 | } | ||
746 | |||
747 | if (args.ContainsKey("motion_state")) | ||
748 | MotionState = (byte)args["motion_state"].AsInteger(); | ||
749 | |||
650 | //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) | 750 | //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) |
651 | //{ | 751 | //{ |
652 | // OSDArray textures = (OSDArray)(args["agent_textures"]); | 752 | // OSDArray textures = (OSDArray)(args["agent_textures"]); |
@@ -656,58 +756,67 @@ namespace OpenSim.Framework | |||
656 | // AgentTextures[i++] = o.AsUUID(); | 756 | // AgentTextures[i++] = o.AsUUID(); |
657 | //} | 757 | //} |
658 | 758 | ||
659 | Appearance = new AvatarAppearance(); | ||
660 | 759 | ||
661 | // The code to unpack textures, visuals, wearables and attachments | 760 | // packed_appearence should contain all appearance information |
662 | // should be removed; packed appearance contains the full appearance | 761 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) |
663 | // This is retained for backward compatibility only | ||
664 | if (args["texture_entry"] != null) | ||
665 | { | 762 | { |
666 | byte[] rawtextures = args["texture_entry"].AsBinary(); | 763 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] got packed appearance"); |
667 | Primitive.TextureEntry textures = new Primitive.TextureEntry(rawtextures,0,rawtextures.Length); | 764 | Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]); |
668 | Appearance.SetTextureEntries(textures); | ||
669 | } | 765 | } |
766 | else | ||
767 | { | ||
768 | // if missing try the old pack method | ||
769 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance, checking old method"); | ||
670 | 770 | ||
671 | if (args["visual_params"] != null) | 771 | Appearance = new AvatarAppearance(); |
672 | Appearance.SetVisualParams(args["visual_params"].AsBinary()); | ||
673 | 772 | ||
674 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) | 773 | // The code to unpack textures, visuals, wearables and attachments |
675 | { | 774 | // should be removed; packed appearance contains the full appearance |
676 | OSDArray wears = (OSDArray)(args["wearables"]); | 775 | // This is retained for backward compatibility only |
776 | if (args["texture_entry"] != null) | ||
777 | { | ||
778 | byte[] rawtextures = args["texture_entry"].AsBinary(); | ||
779 | Primitive.TextureEntry textures = new Primitive.TextureEntry(rawtextures, 0, rawtextures.Length); | ||
780 | Appearance.SetTextureEntries(textures); | ||
781 | } | ||
677 | 782 | ||
678 | int count = wears.Count; | 783 | if (args["visual_params"] != null) |
679 | if (count > AvatarWearable.MAX_WEARABLES) | 784 | Appearance.SetVisualParams(args["visual_params"].AsBinary()); |
680 | count = AvatarWearable.MAX_WEARABLES; | ||
681 | 785 | ||
682 | for (int i = 0; i < count / 2; i++) | 786 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) |
683 | { | 787 | { |
684 | AvatarWearable awear = new AvatarWearable((OSDArray)wears[i]); | 788 | OSDArray wears = (OSDArray)(args["wearables"]); |
685 | Appearance.SetWearable(i,awear); | 789 | |
790 | for (int i = 0; i < wears.Count / 2; i++) | ||
791 | { | ||
792 | AvatarWearable awear = new AvatarWearable((OSDArray)wears[i]); | ||
793 | Appearance.SetWearable(i, awear); | ||
794 | } | ||
686 | } | 795 | } |
687 | } | ||
688 | 796 | ||
689 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) | 797 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) |
690 | { | ||
691 | OSDArray attachs = (OSDArray)(args["attachments"]); | ||
692 | foreach (OSD o in attachs) | ||
693 | { | 798 | { |
694 | if (o.Type == OSDType.Map) | 799 | OSDArray attachs = (OSDArray)(args["attachments"]); |
800 | foreach (OSD o in attachs) | ||
695 | { | 801 | { |
696 | // We know all of these must end up as attachments so we | 802 | if (o.Type == OSDType.Map) |
697 | // append rather than replace to ensure multiple attachments | 803 | { |
698 | // per point continues to work | 804 | // We know all of these must end up as attachments so we |
699 | // m_log.DebugFormat("[CHILDAGENTDATAUPDATE]: Appending attachments for {0}", AgentID); | 805 | // append rather than replace to ensure multiple attachments |
700 | Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); | 806 | // per point continues to work |
807 | // m_log.DebugFormat("[CHILDAGENTDATAUPDATE]: Appending attachments for {0}", AgentID); | ||
808 | Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); | ||
809 | } | ||
701 | } | 810 | } |
702 | } | 811 | } |
812 | // end of code to remove | ||
703 | } | 813 | } |
704 | // end of code to remove | 814 | /* moved above |
705 | |||
706 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) | 815 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) |
707 | Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]); | 816 | Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]); |
708 | else | 817 | else |
709 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance"); | 818 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance"); |
710 | 819 | */ | |
711 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) | 820 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) |
712 | { | 821 | { |
713 | OSDArray controls = (OSDArray)(args["controllers"]); | 822 | OSDArray controls = (OSDArray)(args["controllers"]); |
@@ -771,14 +880,14 @@ namespace OpenSim.Framework | |||
771 | 880 | ||
772 | public class CompleteAgentData : AgentData | 881 | public class CompleteAgentData : AgentData |
773 | { | 882 | { |
774 | public override OSDMap Pack() | 883 | public override OSDMap Pack(EntityTransferContext ctx) |
775 | { | 884 | { |
776 | return base.Pack(); | 885 | return base.Pack(ctx); |
777 | } | 886 | } |
778 | 887 | ||
779 | public override void Unpack(OSDMap map, IScene scene) | 888 | public override void Unpack(OSDMap map, IScene scene, EntityTransferContext ctx) |
780 | { | 889 | { |
781 | base.Unpack(map, scene); | 890 | base.Unpack(map, scene, ctx); |
782 | } | 891 | } |
783 | } | 892 | } |
784 | } | 893 | } |
diff --git a/OpenSim/Framework/CircularBuffer.cs b/OpenSim/Framework/CircularBuffer.cs index e919337..e101938 100644 --- a/OpenSim/Framework/CircularBuffer.cs +++ b/OpenSim/Framework/CircularBuffer.cs | |||
@@ -1,21 +1,21 @@ | |||
1 | /* | 1 | /* |
2 | Copyright (c) 2012, Alex Regueiro | 2 | Copyright (c) 2012, Alex Regueiro |
3 | All rights reserved. | 3 | All rights reserved. |
4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the |
5 | following conditions are met: | 5 | following conditions are met: |
6 | 6 | ||
7 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. | 7 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. |
8 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer | 8 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer |
9 | in the documentation and/or other materials provided with the distribution. | 9 | in the documentation and/or other materials provided with the distribution. |
10 | 10 | ||
11 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 11 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
12 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 12 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
13 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, | 13 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
14 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | 14 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, |
15 | OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 15 | OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
16 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 16 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
17 | POSSIBILITY OF SUCH DAMAGE. | 17 | POSSIBILITY OF SUCH DAMAGE. |
18 | */ | 18 | */ |
19 | using System; | 19 | using System; |
20 | using System.Collections; | 20 | using System.Collections; |
21 | using System.Collections.Generic; | 21 | using System.Collections.Generic; |
diff --git a/OpenSim/Framework/Client/IClientIPEndpoint.cs b/OpenSim/Framework/Client/IClientIPEndpoint.cs index 2b99bf0..2194616 100644 --- a/OpenSim/Framework/Client/IClientIPEndpoint.cs +++ b/OpenSim/Framework/Client/IClientIPEndpoint.cs | |||
@@ -34,6 +34,6 @@ namespace OpenSim.Framework.Client | |||
34 | { | 34 | { |
35 | public interface IClientIPEndpoint | 35 | public interface IClientIPEndpoint |
36 | { | 36 | { |
37 | IPAddress EndPoint { get; } | 37 | IPEndPoint RemoteEndPoint { get; } |
38 | } | 38 | } |
39 | } | 39 | } |
diff --git a/OpenSim/Framework/ClientInfo.cs b/OpenSim/Framework/ClientInfo.cs index 98e4465..a1ca9bc 100644 --- a/OpenSim/Framework/ClientInfo.cs +++ b/OpenSim/Framework/ClientInfo.cs | |||
@@ -36,14 +36,8 @@ namespace OpenSim.Framework | |||
36 | public readonly DateTime StartedTime = DateTime.Now; | 36 | public readonly DateTime StartedTime = DateTime.Now; |
37 | public AgentCircuitData agentcircuit = null; | 37 | public AgentCircuitData agentcircuit = null; |
38 | 38 | ||
39 | public Dictionary<uint, byte[]> needAck; | ||
40 | |||
41 | public List<byte[]> out_packets = new List<byte[]>(); | ||
42 | public Dictionary<uint, uint> pendingAcks = new Dictionary<uint,uint>(); | ||
43 | public EndPoint proxyEP; | 39 | public EndPoint proxyEP; |
44 | 40 | ||
45 | public uint sequence; | ||
46 | public byte[] usecircuit; | ||
47 | public EndPoint userEP; | 41 | public EndPoint userEP; |
48 | 42 | ||
49 | public int resendThrottle; | 43 | public int resendThrottle; |
@@ -59,9 +53,5 @@ namespace OpenSim.Framework | |||
59 | public int targetThrottle; | 53 | public int targetThrottle; |
60 | 54 | ||
61 | public int maxThrottle; | 55 | public int maxThrottle; |
62 | |||
63 | public Dictionary<string, int> SyncRequests = new Dictionary<string,int>(); | ||
64 | public Dictionary<string, int> AsyncRequests = new Dictionary<string,int>(); | ||
65 | public Dictionary<string, int> GenericRequests = new Dictionary<string,int>(); | ||
66 | } | 56 | } |
67 | } | 57 | } |
diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs index baff2f4..45c54e4 100644 --- a/OpenSim/Framework/ClientManager.cs +++ b/OpenSim/Framework/ClientManager.cs | |||
@@ -27,10 +27,8 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | ||
31 | using System.Net; | 30 | using System.Net; |
32 | using OpenMetaverse; | 31 | using OpenMetaverse; |
33 | using OpenMetaverse.Packets; | ||
34 | 32 | ||
35 | namespace OpenSim.Framework | 33 | namespace OpenSim.Framework |
36 | { | 34 | { |
@@ -76,20 +74,16 @@ namespace OpenSim.Framework | |||
76 | { | 74 | { |
77 | lock (m_syncRoot) | 75 | lock (m_syncRoot) |
78 | { | 76 | { |
79 | if (m_dict1.ContainsKey(value.AgentId) || m_dict2.ContainsKey(value.RemoteEndPoint)) | 77 | // allow self healing |
80 | return false; | 78 | // if (m_dict1.ContainsKey(value.AgentId) || m_dict2.ContainsKey(value.RemoteEndPoint)) |
79 | // return false; | ||
81 | 80 | ||
82 | m_dict1[value.AgentId] = value; | 81 | m_dict1[value.AgentId] = value; |
83 | m_dict2[value.RemoteEndPoint] = value; | 82 | m_dict2[value.RemoteEndPoint] = value; |
84 | 83 | ||
85 | IClientAPI[] oldArray = m_array; | 84 | // dict1 is the master |
86 | int oldLength = oldArray.Length; | 85 | IClientAPI[] newArray = new IClientAPI[m_dict1.Count]; |
87 | 86 | m_dict1.Values.CopyTo(newArray, 0); | |
88 | IClientAPI[] newArray = new IClientAPI[oldLength + 1]; | ||
89 | for (int i = 0; i < oldLength; i++) | ||
90 | newArray[i] = oldArray[i]; | ||
91 | newArray[oldLength] = value; | ||
92 | |||
93 | m_array = newArray; | 87 | m_array = newArray; |
94 | } | 88 | } |
95 | 89 | ||
@@ -112,22 +106,12 @@ namespace OpenSim.Framework | |||
112 | m_dict1.Remove(key); | 106 | m_dict1.Remove(key); |
113 | m_dict2.Remove(value.RemoteEndPoint); | 107 | m_dict2.Remove(value.RemoteEndPoint); |
114 | 108 | ||
115 | IClientAPI[] oldArray = m_array; | 109 | IClientAPI[] newArray = new IClientAPI[m_dict1.Count]; |
116 | int oldLength = oldArray.Length; | 110 | m_dict1.Values.CopyTo(newArray, 0); |
117 | |||
118 | IClientAPI[] newArray = new IClientAPI[oldLength - 1]; | ||
119 | int j = 0; | ||
120 | for (int i = 0; i < oldLength; i++) | ||
121 | { | ||
122 | if (oldArray[i] != value) | ||
123 | newArray[j++] = oldArray[i]; | ||
124 | } | ||
125 | |||
126 | m_array = newArray; | 111 | m_array = newArray; |
127 | return true; | 112 | return true; |
128 | } | 113 | } |
129 | } | 114 | } |
130 | |||
131 | return false; | 115 | return false; |
132 | } | 116 | } |
133 | 117 | ||
@@ -197,25 +181,11 @@ namespace OpenSim.Framework | |||
197 | } | 181 | } |
198 | 182 | ||
199 | /// <summary> | 183 | /// <summary> |
200 | /// Performs a given task in parallel for each of the elements in the | ||
201 | /// collection | ||
202 | /// </summary> | ||
203 | /// <param name="action">Action to perform on each element</param> | ||
204 | public void ForEach(Action<IClientAPI> action) | ||
205 | { | ||
206 | IClientAPI[] localArray = m_array; | ||
207 | Parallel.For(0, localArray.Length, | ||
208 | delegate(int i) | ||
209 | { action(localArray[i]); } | ||
210 | ); | ||
211 | } | ||
212 | |||
213 | /// <summary> | ||
214 | /// Performs a given task synchronously for each of the elements in | 184 | /// Performs a given task synchronously for each of the elements in |
215 | /// the collection | 185 | /// the collection |
216 | /// </summary> | 186 | /// </summary> |
217 | /// <param name="action">Action to perform on each element</param> | 187 | /// <param name="action">Action to perform on each element</param> |
218 | public void ForEachSync(Action<IClientAPI> action) | 188 | public void ForEach(Action<IClientAPI> action) |
219 | { | 189 | { |
220 | IClientAPI[] localArray = m_array; | 190 | IClientAPI[] localArray = m_array; |
221 | for (int i = 0; i < localArray.Length; i++) | 191 | for (int i = 0; i < localArray.Length; i++) |
diff --git a/OpenSim/Framework/CnmMemoryCache.cs b/OpenSim/Framework/CnmMemoryCache.cs index 92af331..f996cb0 100644 --- a/OpenSim/Framework/CnmMemoryCache.cs +++ b/OpenSim/Framework/CnmMemoryCache.cs | |||
@@ -36,14 +36,14 @@ namespace OpenSim.Framework | |||
36 | /// Cenome memory based cache to store key/value pairs (elements) limited time and/or limited size. | 36 | /// Cenome memory based cache to store key/value pairs (elements) limited time and/or limited size. |
37 | /// </summary> | 37 | /// </summary> |
38 | /// <typeparam name="TKey"> | 38 | /// <typeparam name="TKey"> |
39 | /// The type of keys in the cache. | 39 | /// The type of keys in the cache. |
40 | /// </typeparam> | 40 | /// </typeparam> |
41 | /// <typeparam name="TValue"> | 41 | /// <typeparam name="TValue"> |
42 | /// The type of values in the dictionary. | 42 | /// The type of values in the dictionary. |
43 | /// </typeparam> | 43 | /// </typeparam> |
44 | /// <remarks> | 44 | /// <remarks> |
45 | /// <para> | 45 | /// <para> |
46 | /// Cenome memory cache stores elements to hash table generations. When new element is being added to cache, and new size would exceed | 46 | /// Cenome memory cache stores elements to hash table generations. When new element is being added to cache, and new size would exceed |
47 | /// maximal allowed size or maximal amount of allowed element count, then elements in oldest generation are deleted. Last access time | 47 | /// maximal allowed size or maximal amount of allowed element count, then elements in oldest generation are deleted. Last access time |
48 | /// is also tracked in generation level - thus it is possible that some elements are staying in cache far beyond their expiration time. | 48 | /// is also tracked in generation level - thus it is possible that some elements are staying in cache far beyond their expiration time. |
49 | /// If elements in older generations are accessed through <see cref="TryGetValue"/> method, they are moved to newest generation. | 49 | /// If elements in older generations are accessed through <see cref="TryGetValue"/> method, they are moved to newest generation. |
@@ -176,7 +176,7 @@ namespace OpenSim.Framework | |||
176 | } | 176 | } |
177 | 177 | ||
178 | /// <summary> | 178 | /// <summary> |
179 | /// Initializes a new instance of the <see cref="CnmMemoryCache{TKey,TValue}"/> class. | 179 | /// Initializes a new instance of the <see cref="CnmMemoryCache{TKey,TValue}"/> class. |
180 | /// </summary> | 180 | /// </summary> |
181 | /// <param name="maximalSize"> | 181 | /// <param name="maximalSize"> |
182 | /// Maximal cache size. | 182 | /// Maximal cache size. |
@@ -201,7 +201,7 @@ namespace OpenSim.Framework | |||
201 | } | 201 | } |
202 | 202 | ||
203 | /// <summary> | 203 | /// <summary> |
204 | /// Initializes a new instance of the <see cref="CnmMemoryCache{TKey,TValue}"/> class. | 204 | /// Initializes a new instance of the <see cref="CnmMemoryCache{TKey,TValue}"/> class. |
205 | /// </summary> | 205 | /// </summary> |
206 | /// <param name="maximalSize"> | 206 | /// <param name="maximalSize"> |
207 | /// Maximal cache size. | 207 | /// Maximal cache size. |
@@ -218,7 +218,7 @@ namespace OpenSim.Framework | |||
218 | } | 218 | } |
219 | 219 | ||
220 | /// <summary> | 220 | /// <summary> |
221 | /// Initializes a new instance of the <see cref="CnmMemoryCache{TKey,TValue}"/> class. | 221 | /// Initializes a new instance of the <see cref="CnmMemoryCache{TKey,TValue}"/> class. |
222 | /// </summary> | 222 | /// </summary> |
223 | /// <param name="maximalSize"> | 223 | /// <param name="maximalSize"> |
224 | /// Maximal cache size. | 224 | /// Maximal cache size. |
@@ -336,7 +336,7 @@ namespace OpenSim.Framework | |||
336 | /// </summary> | 336 | /// </summary> |
337 | private void CheckExpired() | 337 | private void CheckExpired() |
338 | { | 338 | { |
339 | // Do this only one in every m_operationsBetweenTimeChecks | 339 | // Do this only one in every m_operationsBetweenTimeChecks |
340 | // Fetching time is using several millisecons - it is better not to do all time. | 340 | // Fetching time is using several millisecons - it is better not to do all time. |
341 | m_operationsBetweenTimeChecks--; | 341 | m_operationsBetweenTimeChecks--; |
342 | if (m_operationsBetweenTimeChecks <= 0) | 342 | if (m_operationsBetweenTimeChecks <= 0) |
@@ -394,7 +394,7 @@ namespace OpenSim.Framework | |||
394 | new IEnumerator<KeyValuePair<TKey, TValue>>[2]; | 394 | new IEnumerator<KeyValuePair<TKey, TValue>>[2]; |
395 | 395 | ||
396 | /// <summary> | 396 | /// <summary> |
397 | /// Initializes a new instance of the <see cref="Enumerator"/> class. | 397 | /// Initializes a new instance of the <see cref="Enumerator"/> class. |
398 | /// </summary> | 398 | /// </summary> |
399 | /// <param name="cache"> | 399 | /// <param name="cache"> |
400 | /// The cache. | 400 | /// The cache. |
@@ -456,7 +456,7 @@ namespace OpenSim.Framework | |||
456 | /// <see langword="true"/>if the enumerator was successfully advanced to the next element; <see langword="false"/> if the enumerator has passed the end of the collection. | 456 | /// <see langword="true"/>if the enumerator was successfully advanced to the next element; <see langword="false"/> if the enumerator has passed the end of the collection. |
457 | /// </returns> | 457 | /// </returns> |
458 | /// <exception cref="T:System.InvalidOperationException"> | 458 | /// <exception cref="T:System.InvalidOperationException"> |
459 | /// The collection was modified after the enumerator was created. | 459 | /// The collection was modified after the enumerator was created. |
460 | /// </exception> | 460 | /// </exception> |
461 | /// <filterpriority>2</filterpriority> | 461 | /// <filterpriority>2</filterpriority> |
462 | public bool MoveNext() | 462 | public bool MoveNext() |
@@ -479,7 +479,7 @@ namespace OpenSim.Framework | |||
479 | /// Sets the enumerator to its initial position, which is before the first element in the collection. | 479 | /// Sets the enumerator to its initial position, which is before the first element in the collection. |
480 | /// </summary> | 480 | /// </summary> |
481 | /// <exception cref="T:System.InvalidOperationException"> | 481 | /// <exception cref="T:System.InvalidOperationException"> |
482 | /// The collection was modified after the enumerator was created. | 482 | /// The collection was modified after the enumerator was created. |
483 | /// </exception> | 483 | /// </exception> |
484 | /// <filterpriority>2</filterpriority> | 484 | /// <filterpriority>2</filterpriority> |
485 | public void Reset() | 485 | public void Reset() |
@@ -548,7 +548,7 @@ namespace OpenSim.Framework | |||
548 | private DateTime m_expirationTime1; | 548 | private DateTime m_expirationTime1; |
549 | 549 | ||
550 | /// <summary> | 550 | /// <summary> |
551 | /// Index to first free element. | 551 | /// Index to first free element. |
552 | /// </summary> | 552 | /// </summary> |
553 | private int m_firstFreeElement; | 553 | private int m_firstFreeElement; |
554 | 554 | ||
@@ -681,8 +681,8 @@ namespace OpenSim.Framework | |||
681 | /// Next element in chain. | 681 | /// Next element in chain. |
682 | /// </summary> | 682 | /// </summary> |
683 | /// <remarks> | 683 | /// <remarks> |
684 | /// When element have value (something is stored to it), this is index of | 684 | /// When element have value (something is stored to it), this is index of |
685 | /// next element with same bucket index. When element is free, this | 685 | /// next element with same bucket index. When element is free, this |
686 | /// is index of next element in free element's list. | 686 | /// is index of next element in free element's list. |
687 | /// </remarks> | 687 | /// </remarks> |
688 | public int Next; | 688 | public int Next; |
@@ -696,7 +696,7 @@ namespace OpenSim.Framework | |||
696 | public long Size; | 696 | public long Size; |
697 | 697 | ||
698 | /// <summary> | 698 | /// <summary> |
699 | /// Element's value. | 699 | /// Element's value. |
700 | /// </summary> | 700 | /// </summary> |
701 | /// <remarks> | 701 | /// <remarks> |
702 | /// It is possible that this value is <see langword="null"/> even when element | 702 | /// It is possible that this value is <see langword="null"/> even when element |
@@ -812,7 +812,7 @@ namespace OpenSim.Framework | |||
812 | /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. | 812 | /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. |
813 | /// </returns> | 813 | /// </returns> |
814 | /// <exception cref="InvalidOperationException"> | 814 | /// <exception cref="InvalidOperationException"> |
815 | /// The collection was modified after the enumerator was created. | 815 | /// The collection was modified after the enumerator was created. |
816 | /// </exception> | 816 | /// </exception> |
817 | public bool MoveNext() | 817 | public bool MoveNext() |
818 | { | 818 | { |
@@ -841,7 +841,7 @@ namespace OpenSim.Framework | |||
841 | /// Sets the enumerator to its initial position, which is before the first element in the collection. | 841 | /// Sets the enumerator to its initial position, which is before the first element in the collection. |
842 | /// </summary> | 842 | /// </summary> |
843 | /// <exception cref="InvalidOperationException"> | 843 | /// <exception cref="InvalidOperationException"> |
844 | /// The collection was modified after the enumerator was created. | 844 | /// The collection was modified after the enumerator was created. |
845 | /// </exception> | 845 | /// </exception> |
846 | /// <filterpriority>2</filterpriority> | 846 | /// <filterpriority>2</filterpriority> |
847 | public void Reset() | 847 | public void Reset() |
@@ -931,7 +931,7 @@ namespace OpenSim.Framework | |||
931 | /// The key to locate in the <see cref="IGeneration"/>. | 931 | /// The key to locate in the <see cref="IGeneration"/>. |
932 | /// </param> | 932 | /// </param> |
933 | /// <returns> | 933 | /// <returns> |
934 | /// <see langword="true"/>if the <see cref="IGeneration"/> contains an element with the <see cref="key"/>; | 934 | /// <see langword="true"/>if the <see cref="IGeneration"/> contains an element with the <see cref="key"/>; |
935 | /// otherwise <see langword="false"/>. | 935 | /// otherwise <see langword="false"/>. |
936 | /// </returns> | 936 | /// </returns> |
937 | public bool Contains(int bucketIndex, TKey key) | 937 | public bool Contains(int bucketIndex, TKey key) |
@@ -1014,7 +1014,7 @@ namespace OpenSim.Framework | |||
1014 | /// </returns> | 1014 | /// </returns> |
1015 | /// <remarks> | 1015 | /// <remarks> |
1016 | /// <para> | 1016 | /// <para> |
1017 | /// If element was already existing in generation and new element size fits to collection limits, | 1017 | /// If element was already existing in generation and new element size fits to collection limits, |
1018 | /// then it's value is replaced with new one and size information is updated. If element didn't | 1018 | /// then it's value is replaced with new one and size information is updated. If element didn't |
1019 | /// exists in generation before, then generation must have empty space for a new element and | 1019 | /// exists in generation before, then generation must have empty space for a new element and |
1020 | /// size must fit generation's limits, before element is added to generation. | 1020 | /// size must fit generation's limits, before element is added to generation. |
@@ -1070,7 +1070,7 @@ namespace OpenSim.Framework | |||
1070 | if (Size - m_elements[ elementIndex ].Size + size > m_cache.m_generationMaxSize) | 1070 | if (Size - m_elements[ elementIndex ].Size + size > m_cache.m_generationMaxSize) |
1071 | { | 1071 | { |
1072 | // Generation is full | 1072 | // Generation is full |
1073 | // Remove existing element, because generation is going to be recycled to | 1073 | // Remove existing element, because generation is going to be recycled to |
1074 | // old generation and element is stored to new generation | 1074 | // old generation and element is stored to new generation |
1075 | RemoveElement(bucketIndex, elementIndex, previousIndex); | 1075 | RemoveElement(bucketIndex, elementIndex, previousIndex); |
1076 | return false; | 1076 | return false; |
@@ -1110,12 +1110,12 @@ namespace OpenSim.Framework | |||
1110 | /// <remarks> | 1110 | /// <remarks> |
1111 | /// <para> | 1111 | /// <para> |
1112 | /// If element is not found from generation then <paramref name="value"/> and <paramref name="size"/> | 1112 | /// If element is not found from generation then <paramref name="value"/> and <paramref name="size"/> |
1113 | /// are set to default value (default(TValue) and 0). | 1113 | /// are set to default value (default(TValue) and 0). |
1114 | /// </para> | 1114 | /// </para> |
1115 | /// </remarks> | 1115 | /// </remarks> |
1116 | public bool TryGetValue(int bucketIndex, TKey key, out TValue value, out long size) | 1116 | public bool TryGetValue(int bucketIndex, TKey key, out TValue value, out long size) |
1117 | { | 1117 | { |
1118 | // Find entry index, | 1118 | // Find entry index, |
1119 | int previousIndex; | 1119 | int previousIndex; |
1120 | int elementIndex = FindElementIndex(bucketIndex, key, m_newGeneration, out previousIndex); | 1120 | int elementIndex = FindElementIndex(bucketIndex, key, m_newGeneration, out previousIndex); |
1121 | if (elementIndex == -1) | 1121 | if (elementIndex == -1) |
@@ -1166,7 +1166,7 @@ namespace OpenSim.Framework | |||
1166 | /// </para> | 1166 | /// </para> |
1167 | /// <para> | 1167 | /// <para> |
1168 | /// There are two kind generations: "new generation" and "old generation(s)". All new elements | 1168 | /// There are two kind generations: "new generation" and "old generation(s)". All new elements |
1169 | /// are added to "new generation". | 1169 | /// are added to "new generation". |
1170 | /// </para> | 1170 | /// </para> |
1171 | /// </remarks> | 1171 | /// </remarks> |
1172 | protected interface IGeneration : IEnumerable<KeyValuePair<TKey, TValue>> | 1172 | protected interface IGeneration : IEnumerable<KeyValuePair<TKey, TValue>> |
@@ -1211,7 +1211,7 @@ namespace OpenSim.Framework | |||
1211 | /// The key to locate in the <see cref="IGeneration"/>. | 1211 | /// The key to locate in the <see cref="IGeneration"/>. |
1212 | /// </param> | 1212 | /// </param> |
1213 | /// <returns> | 1213 | /// <returns> |
1214 | /// <see langword="true"/>if the <see cref="IGeneration"/> contains an element with the <see cref="key"/>; | 1214 | /// <see langword="true"/>if the <see cref="IGeneration"/> contains an element with the <see cref="key"/>; |
1215 | /// otherwise <see langword="false"/>. | 1215 | /// otherwise <see langword="false"/>. |
1216 | /// </returns> | 1216 | /// </returns> |
1217 | bool Contains(int bucketIndex, TKey key); | 1217 | bool Contains(int bucketIndex, TKey key); |
@@ -1259,7 +1259,7 @@ namespace OpenSim.Framework | |||
1259 | /// </returns> | 1259 | /// </returns> |
1260 | /// <remarks> | 1260 | /// <remarks> |
1261 | /// <para> | 1261 | /// <para> |
1262 | /// If element was already existing in generation and new element size fits to collection limits, | 1262 | /// If element was already existing in generation and new element size fits to collection limits, |
1263 | /// then it's value is replaced with new one and size information is updated. If element didn't | 1263 | /// then it's value is replaced with new one and size information is updated. If element didn't |
1264 | /// exists in generation before, then generation must have empty space for a new element and | 1264 | /// exists in generation before, then generation must have empty space for a new element and |
1265 | /// size must fit generation's limits, before element is added to generation. | 1265 | /// size must fit generation's limits, before element is added to generation. |
@@ -1288,7 +1288,7 @@ namespace OpenSim.Framework | |||
1288 | /// <remarks> | 1288 | /// <remarks> |
1289 | /// <para> | 1289 | /// <para> |
1290 | /// If element is not found from generation then <paramref name="value"/> and <paramref name="size"/> | 1290 | /// If element is not found from generation then <paramref name="value"/> and <paramref name="size"/> |
1291 | /// are set to default value (default(TValue) and 0). | 1291 | /// are set to default value (default(TValue) and 0). |
1292 | /// </para> | 1292 | /// </para> |
1293 | /// </remarks> | 1293 | /// </remarks> |
1294 | bool TryGetValue(int bucketIndex, TKey key, out TValue value, out long size); | 1294 | bool TryGetValue(int bucketIndex, TKey key, out TValue value, out long size); |
@@ -1303,8 +1303,8 @@ namespace OpenSim.Framework | |||
1303 | /// </summary> | 1303 | /// </summary> |
1304 | /// <remarks> | 1304 | /// <remarks> |
1305 | /// <para> | 1305 | /// <para> |
1306 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 1306 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
1307 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 1307 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
1308 | /// </para> | 1308 | /// </para> |
1309 | /// </remarks> | 1309 | /// </remarks> |
1310 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> | 1310 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> |
@@ -1324,13 +1324,13 @@ namespace OpenSim.Framework | |||
1324 | /// </value> | 1324 | /// </value> |
1325 | /// <remarks> | 1325 | /// <remarks> |
1326 | /// <para> | 1326 | /// <para> |
1327 | /// When element has been stored in <see cref="ICnmCache{TKey,TValue}"/> longer than <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> | 1327 | /// When element has been stored in <see cref="ICnmCache{TKey,TValue}"/> longer than <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> |
1328 | /// and it is not accessed through <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> method or element's value is | 1328 | /// and it is not accessed through <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> method or element's value is |
1329 | /// not replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method, then it is automatically removed from the | 1329 | /// not replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method, then it is automatically removed from the |
1330 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 1330 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
1331 | /// </para> | 1331 | /// </para> |
1332 | /// <para> | 1332 | /// <para> |
1333 | /// It is possible that <see cref="ICnmCache{TKey,TValue}"/> implementation removes element before it's expiration time, | 1333 | /// It is possible that <see cref="ICnmCache{TKey,TValue}"/> implementation removes element before it's expiration time, |
1334 | /// because total size or count of elements stored to cache is larger than <see cref="ICnmCache{TKey,TValue}.MaxSize"/> or <see cref="ICnmCache{TKey,TValue}.MaxCount"/>. | 1334 | /// because total size or count of elements stored to cache is larger than <see cref="ICnmCache{TKey,TValue}.MaxSize"/> or <see cref="ICnmCache{TKey,TValue}.MaxCount"/>. |
1335 | /// </para> | 1335 | /// </para> |
1336 | /// <para> | 1336 | /// <para> |
@@ -1375,17 +1375,17 @@ namespace OpenSim.Framework | |||
1375 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting count of elements. | 1375 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting count of elements. |
1376 | /// </summary> | 1376 | /// </summary> |
1377 | /// <value> | 1377 | /// <value> |
1378 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> count of elements is limited; | 1378 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> count of elements is limited; |
1379 | /// otherwise, <see langword="false"/>. | 1379 | /// otherwise, <see langword="false"/>. |
1380 | /// </value> | 1380 | /// </value> |
1381 | /// <remarks> | 1381 | /// <remarks> |
1382 | /// <para> | 1382 | /// <para> |
1383 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 1383 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
1384 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 1384 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
1385 | /// </para> | 1385 | /// </para> |
1386 | /// </remarks> | 1386 | /// </remarks> |
1387 | /// <seealso cref="ICnmCache{TKey,TValue}.Count"/> | 1387 | /// <seealso cref="ICnmCache{TKey,TValue}.Count"/> |
1388 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> | 1388 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> |
1389 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> | 1389 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> |
1390 | /// <seealso cref="ICnmCache{TKey,TValue}.IsTimeLimited"/> | 1390 | /// <seealso cref="ICnmCache{TKey,TValue}.IsTimeLimited"/> |
1391 | public bool IsCountLimited | 1391 | public bool IsCountLimited |
@@ -1397,13 +1397,13 @@ namespace OpenSim.Framework | |||
1397 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting size of elements. | 1397 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting size of elements. |
1398 | /// </summary> | 1398 | /// </summary> |
1399 | /// <value> | 1399 | /// <value> |
1400 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> total size of elements is limited; | 1400 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> total size of elements is limited; |
1401 | /// otherwise, <see langword="false"/>. | 1401 | /// otherwise, <see langword="false"/>. |
1402 | /// </value> | 1402 | /// </value> |
1403 | /// <remarks> | 1403 | /// <remarks> |
1404 | /// <para> | 1404 | /// <para> |
1405 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 1405 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
1406 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 1406 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
1407 | /// </para> | 1407 | /// </para> |
1408 | /// </remarks> | 1408 | /// </remarks> |
1409 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> | 1409 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> |
@@ -1420,12 +1420,12 @@ namespace OpenSim.Framework | |||
1420 | /// Gets a value indicating whether or not access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe). | 1420 | /// Gets a value indicating whether or not access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe). |
1421 | /// </summary> | 1421 | /// </summary> |
1422 | /// <value> | 1422 | /// <value> |
1423 | /// <see langword="true"/> if access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe); | 1423 | /// <see langword="true"/> if access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe); |
1424 | /// otherwise, <see langword="false"/>. | 1424 | /// otherwise, <see langword="false"/>. |
1425 | /// </value> | 1425 | /// </value> |
1426 | /// <remarks> | 1426 | /// <remarks> |
1427 | /// <para> | 1427 | /// <para> |
1428 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/> object, use | 1428 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/> object, use |
1429 | /// <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> in <see cref="CnmSynchronizedCache{TKey,TValue}"/> class | 1429 | /// <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> in <see cref="CnmSynchronizedCache{TKey,TValue}"/> class |
1430 | /// to retrieve synchronized wrapper for <see cref="ICnmCache{TKey,TValue}"/> object. | 1430 | /// to retrieve synchronized wrapper for <see cref="ICnmCache{TKey,TValue}"/> object. |
1431 | /// </para> | 1431 | /// </para> |
@@ -1441,13 +1441,13 @@ namespace OpenSim.Framework | |||
1441 | /// Gets a value indicating whether elements stored to <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time. | 1441 | /// Gets a value indicating whether elements stored to <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time. |
1442 | /// </summary> | 1442 | /// </summary> |
1443 | /// <value> | 1443 | /// <value> |
1444 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> has a fixed total size of elements; | 1444 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> has a fixed total size of elements; |
1445 | /// otherwise, <see langword="false"/>. | 1445 | /// otherwise, <see langword="false"/>. |
1446 | /// </value> | 1446 | /// </value> |
1447 | /// <remarks> | 1447 | /// <remarks> |
1448 | /// If <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time and element is not accessed through <see cref="ICnmCache{TKey,TValue}.Set"/> | 1448 | /// If <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time and element is not accessed through <see cref="ICnmCache{TKey,TValue}.Set"/> |
1449 | /// or <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> methods in <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> , then element is automatically removed from | 1449 | /// or <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> methods in <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> , then element is automatically removed from |
1450 | /// the cache. Depending on implementation of the <see cref="ICnmCache{TKey,TValue}"/>, some of the elements may | 1450 | /// the cache. Depending on implementation of the <see cref="ICnmCache{TKey,TValue}"/>, some of the elements may |
1451 | /// stay longer in cache. | 1451 | /// stay longer in cache. |
1452 | /// </remarks> | 1452 | /// </remarks> |
1453 | /// <seealso cref="ICnmCache{TKey,TValue}.ExpirationTime"/> | 1453 | /// <seealso cref="ICnmCache{TKey,TValue}.ExpirationTime"/> |
@@ -1463,13 +1463,13 @@ namespace OpenSim.Framework | |||
1463 | /// Gets or sets maximal allowed count of elements that can be stored to <see cref="ICnmCache{TKey,TValue}"/>. | 1463 | /// Gets or sets maximal allowed count of elements that can be stored to <see cref="ICnmCache{TKey,TValue}"/>. |
1464 | /// </summary> | 1464 | /// </summary> |
1465 | /// <value> | 1465 | /// <value> |
1466 | /// <see cref="int.MaxValue"/>, if <see cref="ICnmCache{TKey,TValue}"/> is not limited by count of elements; | 1466 | /// <see cref="int.MaxValue"/>, if <see cref="ICnmCache{TKey,TValue}"/> is not limited by count of elements; |
1467 | /// otherwise maximal allowed count of elements. | 1467 | /// otherwise maximal allowed count of elements. |
1468 | /// </value> | 1468 | /// </value> |
1469 | /// <remarks> | 1469 | /// <remarks> |
1470 | /// <para> | 1470 | /// <para> |
1471 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 1471 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
1472 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 1472 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
1473 | /// </para> | 1473 | /// </para> |
1474 | /// </remarks> | 1474 | /// </remarks> |
1475 | public int MaxCount | 1475 | public int MaxCount |
@@ -1496,7 +1496,7 @@ namespace OpenSim.Framework | |||
1496 | /// </value> | 1496 | /// </value> |
1497 | /// <remarks> | 1497 | /// <remarks> |
1498 | /// <para> | 1498 | /// <para> |
1499 | /// If element's size is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is | 1499 | /// If element's size is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is |
1500 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>. | 1500 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>. |
1501 | /// </para> | 1501 | /// </para> |
1502 | /// </remarks> | 1502 | /// </remarks> |
@@ -1522,8 +1522,8 @@ namespace OpenSim.Framework | |||
1522 | /// Normally size is total bytes used by elements in the cache. But it can be any other suitable unit of measure. | 1522 | /// Normally size is total bytes used by elements in the cache. But it can be any other suitable unit of measure. |
1523 | /// </para> | 1523 | /// </para> |
1524 | /// <para> | 1524 | /// <para> |
1525 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 1525 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
1526 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 1526 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
1527 | /// </para> | 1527 | /// </para> |
1528 | /// </remarks> | 1528 | /// </remarks> |
1529 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> | 1529 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> |
@@ -1556,11 +1556,11 @@ namespace OpenSim.Framework | |||
1556 | /// Normally bytes, but can be any suitable unit of measure. | 1556 | /// Normally bytes, but can be any suitable unit of measure. |
1557 | /// </para> | 1557 | /// </para> |
1558 | /// <para> | 1558 | /// <para> |
1559 | /// Element's size is given when element is added or replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method. | 1559 | /// Element's size is given when element is added or replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method. |
1560 | /// </para> | 1560 | /// </para> |
1561 | /// <para> | 1561 | /// <para> |
1562 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 1562 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
1563 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 1563 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
1564 | /// </para> | 1564 | /// </para> |
1565 | /// </remarks> | 1565 | /// </remarks> |
1566 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> | 1566 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> |
@@ -1581,8 +1581,8 @@ namespace OpenSim.Framework | |||
1581 | /// </value> | 1581 | /// </value> |
1582 | /// <remarks> | 1582 | /// <remarks> |
1583 | /// <para> | 1583 | /// <para> |
1584 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/>, use <see cref="CnmSynchronizedCache{TKey,TValue}"/> | 1584 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/>, use <see cref="CnmSynchronizedCache{TKey,TValue}"/> |
1585 | /// method <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> to retrieve synchronized wrapper interface to | 1585 | /// method <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> to retrieve synchronized wrapper interface to |
1586 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 1586 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
1587 | /// </para> | 1587 | /// </para> |
1588 | /// </remarks> | 1588 | /// </remarks> |
@@ -1735,7 +1735,7 @@ namespace OpenSim.Framework | |||
1735 | } | 1735 | } |
1736 | 1736 | ||
1737 | /// <summary> | 1737 | /// <summary> |
1738 | /// Add or replace an element with the provided <paramref name="key"/>, <paramref name="value"/> and <paramref name="size"/> to | 1738 | /// Add or replace an element with the provided <paramref name="key"/>, <paramref name="value"/> and <paramref name="size"/> to |
1739 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 1739 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
1740 | /// </summary> | 1740 | /// </summary> |
1741 | /// <param name="key"> | 1741 | /// <param name="key"> |
@@ -1748,7 +1748,7 @@ namespace OpenSim.Framework | |||
1748 | /// The element's size. Normally bytes, but can be any suitable unit of measure. | 1748 | /// The element's size. Normally bytes, but can be any suitable unit of measure. |
1749 | /// </param> | 1749 | /// </param> |
1750 | /// <returns> | 1750 | /// <returns> |
1751 | /// <see langword="true"/>if element has been added successfully to the <see cref="ICnmCache{TKey,TValue}"/>; | 1751 | /// <see langword="true"/>if element has been added successfully to the <see cref="ICnmCache{TKey,TValue}"/>; |
1752 | /// otherwise <see langword="false"/>. | 1752 | /// otherwise <see langword="false"/>. |
1753 | /// </returns> | 1753 | /// </returns> |
1754 | /// <exception cref="ArgumentNullException"> | 1754 | /// <exception cref="ArgumentNullException"> |
@@ -1759,17 +1759,17 @@ namespace OpenSim.Framework | |||
1759 | /// </exception> | 1759 | /// </exception> |
1760 | /// <remarks> | 1760 | /// <remarks> |
1761 | /// <para> | 1761 | /// <para> |
1762 | /// If element's <paramref name="size"/> is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is | 1762 | /// If element's <paramref name="size"/> is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is |
1763 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>, however - possible older element is | 1763 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>, however - possible older element is |
1764 | /// removed from the <see cref="ICnmCache{TKey,TValue}"/>. | 1764 | /// removed from the <see cref="ICnmCache{TKey,TValue}"/>. |
1765 | /// </para> | 1765 | /// </para> |
1766 | /// <para> | 1766 | /// <para> |
1767 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 1767 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
1768 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. | 1768 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. |
1769 | /// </para> | 1769 | /// </para> |
1770 | /// <para> | 1770 | /// <para> |
1771 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 1771 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
1772 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. | 1772 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. |
1773 | /// </para> | 1773 | /// </para> |
1774 | /// </remarks> | 1774 | /// </remarks> |
1775 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> | 1775 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> |
@@ -1809,15 +1809,15 @@ namespace OpenSim.Framework | |||
1809 | /// Gets the <paramref name="value"/> associated with the specified <paramref name="key"/>. | 1809 | /// Gets the <paramref name="value"/> associated with the specified <paramref name="key"/>. |
1810 | /// </summary> | 1810 | /// </summary> |
1811 | /// <returns> | 1811 | /// <returns> |
1812 | /// <see langword="true"/>if the <see cref="ICnmCache{TKey,TValue}"/> contains an element with | 1812 | /// <see langword="true"/>if the <see cref="ICnmCache{TKey,TValue}"/> contains an element with |
1813 | /// the specified key; otherwise, <see langword="false"/>. | 1813 | /// the specified key; otherwise, <see langword="false"/>. |
1814 | /// </returns> | 1814 | /// </returns> |
1815 | /// <param name="key"> | 1815 | /// <param name="key"> |
1816 | /// The key whose <paramref name="value"/> to get. | 1816 | /// The key whose <paramref name="value"/> to get. |
1817 | /// </param> | 1817 | /// </param> |
1818 | /// <param name="value"> | 1818 | /// <param name="value"> |
1819 | /// When this method returns, the value associated with the specified <paramref name="key"/>, | 1819 | /// When this method returns, the value associated with the specified <paramref name="key"/>, |
1820 | /// if the <paramref name="key"/> is found; otherwise, the | 1820 | /// if the <paramref name="key"/> is found; otherwise, the |
1821 | /// default value for the type of the <paramref name="value"/> parameter. This parameter is passed uninitialized. | 1821 | /// default value for the type of the <paramref name="value"/> parameter. This parameter is passed uninitialized. |
1822 | /// </param> | 1822 | /// </param> |
1823 | /// <exception cref="ArgumentNullException"> | 1823 | /// <exception cref="ArgumentNullException"> |
diff --git a/OpenSim/Framework/CnmSynchronizedCache.cs b/OpenSim/Framework/CnmSynchronizedCache.cs index 2bafbe9..b33f4f7 100644 --- a/OpenSim/Framework/CnmSynchronizedCache.cs +++ b/OpenSim/Framework/CnmSynchronizedCache.cs | |||
@@ -36,10 +36,10 @@ namespace OpenSim.Framework | |||
36 | /// Synchronized Cenome cache wrapper. | 36 | /// Synchronized Cenome cache wrapper. |
37 | /// </summary> | 37 | /// </summary> |
38 | /// <typeparam name="TKey"> | 38 | /// <typeparam name="TKey"> |
39 | /// The type of keys in the cache. | 39 | /// The type of keys in the cache. |
40 | /// </typeparam> | 40 | /// </typeparam> |
41 | /// <typeparam name="TValue"> | 41 | /// <typeparam name="TValue"> |
42 | /// The type of values in the cache. | 42 | /// The type of values in the cache. |
43 | /// </typeparam> | 43 | /// </typeparam> |
44 | /// <remarks> | 44 | /// <remarks> |
45 | /// <para> | 45 | /// <para> |
@@ -60,7 +60,7 @@ namespace OpenSim.Framework | |||
60 | private readonly object m_syncRoot; | 60 | private readonly object m_syncRoot; |
61 | 61 | ||
62 | /// <summary> | 62 | /// <summary> |
63 | /// Initializes a new instance of the <see cref="CnmSynchronizedCache{TKey,TValue}"/> class. | 63 | /// Initializes a new instance of the <see cref="CnmSynchronizedCache{TKey,TValue}"/> class. |
64 | /// Initializes a new instance of the <see cref="CnmSynchronizedCache{TKey,TValue}"/> class. | 64 | /// Initializes a new instance of the <see cref="CnmSynchronizedCache{TKey,TValue}"/> class. |
65 | /// </summary> | 65 | /// </summary> |
66 | /// <param name="cache"> | 66 | /// <param name="cache"> |
@@ -73,13 +73,13 @@ namespace OpenSim.Framework | |||
73 | } | 73 | } |
74 | 74 | ||
75 | /// <summary> | 75 | /// <summary> |
76 | /// Returns a <see cref="ICnmCache{TKey,TValue}"/> wrapper that is synchronized (thread safe). | 76 | /// Returns a <see cref="ICnmCache{TKey,TValue}"/> wrapper that is synchronized (thread safe). |
77 | /// </summary> | 77 | /// </summary> |
78 | /// <param name="cache"> | 78 | /// <param name="cache"> |
79 | /// The <see cref="ICnmCache{TKey,TValue}"/> to synchronize. | 79 | /// The <see cref="ICnmCache{TKey,TValue}"/> to synchronize. |
80 | /// </param> | 80 | /// </param> |
81 | /// <returns> | 81 | /// <returns> |
82 | /// A <see cref="ICnmCache{TKey,TValue}"/> wrapper that is synchronized (thread safe). | 82 | /// A <see cref="ICnmCache{TKey,TValue}"/> wrapper that is synchronized (thread safe). |
83 | /// </returns> | 83 | /// </returns> |
84 | /// <exception cref="ArgumentNullException"> | 84 | /// <exception cref="ArgumentNullException"> |
85 | /// <paramref name="cache"/>is null. | 85 | /// <paramref name="cache"/>is null. |
@@ -125,7 +125,7 @@ namespace OpenSim.Framework | |||
125 | } | 125 | } |
126 | 126 | ||
127 | /// <summary> | 127 | /// <summary> |
128 | /// Finalizes an instance of the <see cref="SynchronizedEnumerator"/> class. | 128 | /// Finalizes an instance of the <see cref="SynchronizedEnumerator"/> class. |
129 | /// </summary> | 129 | /// </summary> |
130 | ~SynchronizedEnumerator() | 130 | ~SynchronizedEnumerator() |
131 | { | 131 | { |
@@ -184,7 +184,7 @@ namespace OpenSim.Framework | |||
184 | /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. | 184 | /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. |
185 | /// </returns> | 185 | /// </returns> |
186 | /// <exception cref="InvalidOperationException"> | 186 | /// <exception cref="InvalidOperationException"> |
187 | /// The collection was modified after the enumerator was created. | 187 | /// The collection was modified after the enumerator was created. |
188 | /// </exception> | 188 | /// </exception> |
189 | public bool MoveNext() | 189 | public bool MoveNext() |
190 | { | 190 | { |
@@ -195,7 +195,7 @@ namespace OpenSim.Framework | |||
195 | /// Sets the enumerator to its initial position, which is before the first element in the collection. | 195 | /// Sets the enumerator to its initial position, which is before the first element in the collection. |
196 | /// </summary> | 196 | /// </summary> |
197 | /// <exception cref="InvalidOperationException"> | 197 | /// <exception cref="InvalidOperationException"> |
198 | /// The collection was modified after the enumerator was created. | 198 | /// The collection was modified after the enumerator was created. |
199 | /// </exception> | 199 | /// </exception> |
200 | public void Reset() | 200 | public void Reset() |
201 | { | 201 | { |
@@ -214,8 +214,8 @@ namespace OpenSim.Framework | |||
214 | /// </summary> | 214 | /// </summary> |
215 | /// <remarks> | 215 | /// <remarks> |
216 | /// <para> | 216 | /// <para> |
217 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 217 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
218 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 218 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
219 | /// </para> | 219 | /// </para> |
220 | /// </remarks> | 220 | /// </remarks> |
221 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> | 221 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> |
@@ -241,13 +241,13 @@ namespace OpenSim.Framework | |||
241 | /// </value> | 241 | /// </value> |
242 | /// <remarks> | 242 | /// <remarks> |
243 | /// <para> | 243 | /// <para> |
244 | /// When element has been stored in <see cref="ICnmCache{TKey,TValue}"/> longer than <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> | 244 | /// When element has been stored in <see cref="ICnmCache{TKey,TValue}"/> longer than <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> |
245 | /// and it is not accessed through <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> method or element's value is | 245 | /// and it is not accessed through <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> method or element's value is |
246 | /// not replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method, then it is automatically removed from the | 246 | /// not replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method, then it is automatically removed from the |
247 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 247 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
248 | /// </para> | 248 | /// </para> |
249 | /// <para> | 249 | /// <para> |
250 | /// It is possible that <see cref="ICnmCache{TKey,TValue}"/> implementation removes element before it's expiration time, | 250 | /// It is possible that <see cref="ICnmCache{TKey,TValue}"/> implementation removes element before it's expiration time, |
251 | /// because total size or count of elements stored to cache is larger than <see cref="ICnmCache{TKey,TValue}.MaxSize"/> or <see cref="ICnmCache{TKey,TValue}.MaxCount"/>. | 251 | /// because total size or count of elements stored to cache is larger than <see cref="ICnmCache{TKey,TValue}.MaxSize"/> or <see cref="ICnmCache{TKey,TValue}.MaxCount"/>. |
252 | /// </para> | 252 | /// </para> |
253 | /// <para> | 253 | /// <para> |
@@ -291,17 +291,17 @@ namespace OpenSim.Framework | |||
291 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting count of elements. | 291 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting count of elements. |
292 | /// </summary> | 292 | /// </summary> |
293 | /// <value> | 293 | /// <value> |
294 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> count of elements is limited; | 294 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> count of elements is limited; |
295 | /// otherwise, <see langword="false"/>. | 295 | /// otherwise, <see langword="false"/>. |
296 | /// </value> | 296 | /// </value> |
297 | /// <remarks> | 297 | /// <remarks> |
298 | /// <para> | 298 | /// <para> |
299 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 299 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
300 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 300 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
301 | /// </para> | 301 | /// </para> |
302 | /// </remarks> | 302 | /// </remarks> |
303 | /// <seealso cref="ICnmCache{TKey,TValue}.Count"/> | 303 | /// <seealso cref="ICnmCache{TKey,TValue}.Count"/> |
304 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> | 304 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxCount"/> |
305 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> | 305 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> |
306 | /// <seealso cref="ICnmCache{TKey,TValue}.IsTimeLimited"/> | 306 | /// <seealso cref="ICnmCache{TKey,TValue}.IsTimeLimited"/> |
307 | public bool IsCountLimited | 307 | public bool IsCountLimited |
@@ -319,13 +319,13 @@ namespace OpenSim.Framework | |||
319 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting size of elements. | 319 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting size of elements. |
320 | /// </summary> | 320 | /// </summary> |
321 | /// <value> | 321 | /// <value> |
322 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> total size of elements is limited; | 322 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> total size of elements is limited; |
323 | /// otherwise, <see langword="false"/>. | 323 | /// otherwise, <see langword="false"/>. |
324 | /// </value> | 324 | /// </value> |
325 | /// <remarks> | 325 | /// <remarks> |
326 | /// <para> | 326 | /// <para> |
327 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 327 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
328 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 328 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
329 | /// </para> | 329 | /// </para> |
330 | /// </remarks> | 330 | /// </remarks> |
331 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> | 331 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> |
@@ -348,12 +348,12 @@ namespace OpenSim.Framework | |||
348 | /// Gets a value indicating whether or not access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe). | 348 | /// Gets a value indicating whether or not access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe). |
349 | /// </summary> | 349 | /// </summary> |
350 | /// <value> | 350 | /// <value> |
351 | /// <see langword="true"/> if access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe); | 351 | /// <see langword="true"/> if access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe); |
352 | /// otherwise, <see langword="false"/>. | 352 | /// otherwise, <see langword="false"/>. |
353 | /// </value> | 353 | /// </value> |
354 | /// <remarks> | 354 | /// <remarks> |
355 | /// <para> | 355 | /// <para> |
356 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/> object, use | 356 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/> object, use |
357 | /// <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> in <see cref="CnmSynchronizedCache{TKey,TValue}"/> class | 357 | /// <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> in <see cref="CnmSynchronizedCache{TKey,TValue}"/> class |
358 | /// to retrieve synchronized wrapper for <see cref="ICnmCache{TKey,TValue}"/> object. | 358 | /// to retrieve synchronized wrapper for <see cref="ICnmCache{TKey,TValue}"/> object. |
359 | /// </para> | 359 | /// </para> |
@@ -369,13 +369,13 @@ namespace OpenSim.Framework | |||
369 | /// Gets a value indicating whether elements stored to <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time. | 369 | /// Gets a value indicating whether elements stored to <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time. |
370 | /// </summary> | 370 | /// </summary> |
371 | /// <value> | 371 | /// <value> |
372 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> has a fixed total size of elements; | 372 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> has a fixed total size of elements; |
373 | /// otherwise, <see langword="false"/>. | 373 | /// otherwise, <see langword="false"/>. |
374 | /// </value> | 374 | /// </value> |
375 | /// <remarks> | 375 | /// <remarks> |
376 | /// If <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time and element is not accessed through <see cref="ICnmCache{TKey,TValue}.Set"/> | 376 | /// If <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time and element is not accessed through <see cref="ICnmCache{TKey,TValue}.Set"/> |
377 | /// or <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> methods in <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> , then element is automatically removed from | 377 | /// or <see cref="ICnmCache{TKey,TValue}.TryGetValue"/> methods in <see cref="ICnmCache{TKey,TValue}.ExpirationTime"/> , then element is automatically removed from |
378 | /// the cache. Depending on implementation of the <see cref="ICnmCache{TKey,TValue}"/>, some of the elements may | 378 | /// the cache. Depending on implementation of the <see cref="ICnmCache{TKey,TValue}"/>, some of the elements may |
379 | /// stay longer in cache. | 379 | /// stay longer in cache. |
380 | /// </remarks> | 380 | /// </remarks> |
381 | /// <seealso cref="ICnmCache{TKey,TValue}.ExpirationTime"/> | 381 | /// <seealso cref="ICnmCache{TKey,TValue}.ExpirationTime"/> |
@@ -397,13 +397,13 @@ namespace OpenSim.Framework | |||
397 | /// Gets or sets maximal allowed count of elements that can be stored to <see cref="ICnmCache{TKey,TValue}"/>. | 397 | /// Gets or sets maximal allowed count of elements that can be stored to <see cref="ICnmCache{TKey,TValue}"/>. |
398 | /// </summary> | 398 | /// </summary> |
399 | /// <value> | 399 | /// <value> |
400 | /// <see cref="int.MaxValue"/>, if <see cref="ICnmCache{TKey,TValue}"/> is not limited by count of elements; | 400 | /// <see cref="int.MaxValue"/>, if <see cref="ICnmCache{TKey,TValue}"/> is not limited by count of elements; |
401 | /// otherwise maximal allowed count of elements. | 401 | /// otherwise maximal allowed count of elements. |
402 | /// </value> | 402 | /// </value> |
403 | /// <remarks> | 403 | /// <remarks> |
404 | /// <para> | 404 | /// <para> |
405 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 405 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
406 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 406 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
407 | /// </para> | 407 | /// </para> |
408 | /// </remarks> | 408 | /// </remarks> |
409 | public int MaxCount | 409 | public int MaxCount |
@@ -433,7 +433,7 @@ namespace OpenSim.Framework | |||
433 | /// </value> | 433 | /// </value> |
434 | /// <remarks> | 434 | /// <remarks> |
435 | /// <para> | 435 | /// <para> |
436 | /// If element's size is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is | 436 | /// If element's size is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is |
437 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>. | 437 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>. |
438 | /// </para> | 438 | /// </para> |
439 | /// </remarks> | 439 | /// </remarks> |
@@ -463,8 +463,8 @@ namespace OpenSim.Framework | |||
463 | /// Normally size is total bytes used by elements in the cache. But it can be any other suitable unit of measure. | 463 | /// Normally size is total bytes used by elements in the cache. But it can be any other suitable unit of measure. |
464 | /// </para> | 464 | /// </para> |
465 | /// <para> | 465 | /// <para> |
466 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 466 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
467 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 467 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
468 | /// </para> | 468 | /// </para> |
469 | /// </remarks> | 469 | /// </remarks> |
470 | /// <exception cref="ArgumentOutOfRangeException">value is less than 0.</exception> | 470 | /// <exception cref="ArgumentOutOfRangeException">value is less than 0.</exception> |
@@ -501,11 +501,11 @@ namespace OpenSim.Framework | |||
501 | /// Normally bytes, but can be any suitable unit of measure. | 501 | /// Normally bytes, but can be any suitable unit of measure. |
502 | /// </para> | 502 | /// </para> |
503 | /// <para> | 503 | /// <para> |
504 | /// Element's size is given when element is added or replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method. | 504 | /// Element's size is given when element is added or replaced by <see cref="ICnmCache{TKey,TValue}.Set"/> method. |
505 | /// </para> | 505 | /// </para> |
506 | /// <para> | 506 | /// <para> |
507 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 507 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
508 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 508 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
509 | /// </para> | 509 | /// </para> |
510 | /// </remarks> | 510 | /// </remarks> |
511 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> | 511 | /// <seealso cref="ICnmCache{TKey,TValue}.MaxElementSize"/> |
@@ -532,8 +532,8 @@ namespace OpenSim.Framework | |||
532 | /// </value> | 532 | /// </value> |
533 | /// <remarks> | 533 | /// <remarks> |
534 | /// <para> | 534 | /// <para> |
535 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/>, use <see cref="CnmSynchronizedCache{TKey,TValue}"/> | 535 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/>, use <see cref="CnmSynchronizedCache{TKey,TValue}"/> |
536 | /// method <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> to retrieve synchronized wrapper interface to | 536 | /// method <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> to retrieve synchronized wrapper interface to |
537 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 537 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
538 | /// </para> | 538 | /// </para> |
539 | /// </remarks> | 539 | /// </remarks> |
@@ -647,7 +647,7 @@ namespace OpenSim.Framework | |||
647 | } | 647 | } |
648 | 648 | ||
649 | /// <summary> | 649 | /// <summary> |
650 | /// Add or replace an element with the provided <paramref name="key"/>, <paramref name="value"/> and <paramref name="size"/> to | 650 | /// Add or replace an element with the provided <paramref name="key"/>, <paramref name="value"/> and <paramref name="size"/> to |
651 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 651 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
652 | /// </summary> | 652 | /// </summary> |
653 | /// <param name="key"> | 653 | /// <param name="key"> |
@@ -660,7 +660,7 @@ namespace OpenSim.Framework | |||
660 | /// The element's size. Normally bytes, but can be any suitable unit of measure. | 660 | /// The element's size. Normally bytes, but can be any suitable unit of measure. |
661 | /// </param> | 661 | /// </param> |
662 | /// <returns> | 662 | /// <returns> |
663 | /// <see langword="true"/>if element has been added successfully to the <see cref="ICnmCache{TKey,TValue}"/>; | 663 | /// <see langword="true"/>if element has been added successfully to the <see cref="ICnmCache{TKey,TValue}"/>; |
664 | /// otherwise <see langword="false"/>. | 664 | /// otherwise <see langword="false"/>. |
665 | /// </returns> | 665 | /// </returns> |
666 | /// <exception cref="ArgumentNullException"> | 666 | /// <exception cref="ArgumentNullException"> |
@@ -671,17 +671,17 @@ namespace OpenSim.Framework | |||
671 | /// </exception> | 671 | /// </exception> |
672 | /// <remarks> | 672 | /// <remarks> |
673 | /// <para> | 673 | /// <para> |
674 | /// If element's <paramref name="size"/> is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is | 674 | /// If element's <paramref name="size"/> is larger than <see cref="ICnmCache{TKey,TValue}.MaxElementSize"/>, then element is |
675 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>, however - possible older element is | 675 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>, however - possible older element is |
676 | /// removed from the <see cref="ICnmCache{TKey,TValue}"/>. | 676 | /// removed from the <see cref="ICnmCache{TKey,TValue}"/>. |
677 | /// </para> | 677 | /// </para> |
678 | /// <para> | 678 | /// <para> |
679 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 679 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
680 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. | 680 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. |
681 | /// </para> | 681 | /// </para> |
682 | /// <para> | 682 | /// <para> |
683 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 683 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
684 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. | 684 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. |
685 | /// </para> | 685 | /// </para> |
686 | /// </remarks> | 686 | /// </remarks> |
687 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> | 687 | /// <seealso cref="ICnmCache{TKey,TValue}.IsSizeLimited"/> |
@@ -703,15 +703,15 @@ namespace OpenSim.Framework | |||
703 | /// Gets the <paramref name="value"/> associated with the specified <paramref name="key"/>. | 703 | /// Gets the <paramref name="value"/> associated with the specified <paramref name="key"/>. |
704 | /// </summary> | 704 | /// </summary> |
705 | /// <returns> | 705 | /// <returns> |
706 | /// <see langword="true"/>if the <see cref="ICnmCache{TKey,TValue}"/> contains an element with | 706 | /// <see langword="true"/>if the <see cref="ICnmCache{TKey,TValue}"/> contains an element with |
707 | /// the specified key; otherwise, <see langword="false"/>. | 707 | /// the specified key; otherwise, <see langword="false"/>. |
708 | /// </returns> | 708 | /// </returns> |
709 | /// <param name="key"> | 709 | /// <param name="key"> |
710 | /// The key whose <paramref name="value"/> to get. | 710 | /// The key whose <paramref name="value"/> to get. |
711 | /// </param> | 711 | /// </param> |
712 | /// <param name="value"> | 712 | /// <param name="value"> |
713 | /// When this method returns, the value associated with the specified <paramref name="key"/>, | 713 | /// When this method returns, the value associated with the specified <paramref name="key"/>, |
714 | /// if the <paramref name="key"/> is found; otherwise, the | 714 | /// if the <paramref name="key"/> is found; otherwise, the |
715 | /// default value for the type of the <paramref name="value"/> parameter. This parameter is passed uninitialized. | 715 | /// default value for the type of the <paramref name="value"/> parameter. This parameter is passed uninitialized. |
716 | /// </param> | 716 | /// </param> |
717 | /// <exception cref="ArgumentNullException"> | 717 | /// <exception cref="ArgumentNullException"> |
diff --git a/OpenSim/Framework/ColliderData.cs b/OpenSim/Framework/ColliderData.cs index 1b7b682..00013e1 100644 --- a/OpenSim/Framework/ColliderData.cs +++ b/OpenSim/Framework/ColliderData.cs | |||
@@ -42,6 +42,7 @@ namespace OpenSim.Framework | |||
42 | public Vector3 velVector = Vector3.Zero; | 42 | public Vector3 velVector = Vector3.Zero; |
43 | public string nameStr = String.Empty; | 43 | public string nameStr = String.Empty; |
44 | public int colliderType = 0; | 44 | public int colliderType = 0; |
45 | public int linkNumber; | ||
45 | } | 46 | } |
46 | 47 | ||
47 | public class ColliderArgs : EventArgs | 48 | public class ColliderArgs : EventArgs |
diff --git a/OpenSim/Framework/ConfigurationMember.cs b/OpenSim/Framework/ConfigurationMember.cs new file mode 100644 index 0000000..7afa68a --- /dev/null +++ b/OpenSim/Framework/ConfigurationMember.cs | |||
@@ -0,0 +1,530 @@ | |||
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.Globalization; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Xml; | ||
34 | using log4net; | ||
35 | using OpenMetaverse; | ||
36 | //using OpenSim.Framework.Console; | ||
37 | |||
38 | namespace OpenSim.Framework | ||
39 | { | ||
40 | public class ConfigurationMember | ||
41 | { | ||
42 | #region Delegates | ||
43 | |||
44 | public delegate bool ConfigurationOptionResult(string configuration_key, object configuration_result); | ||
45 | |||
46 | public delegate void ConfigurationOptionsLoad(); | ||
47 | |||
48 | #endregion | ||
49 | |||
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
51 | private int cE = 0; | ||
52 | |||
53 | private string configurationDescription = String.Empty; | ||
54 | private string configurationFilename = String.Empty; | ||
55 | private XmlNode configurationFromXMLNode = null; | ||
56 | private List<ConfigurationOption> configurationOptions = new List<ConfigurationOption>(); | ||
57 | private IGenericConfig configurationPlugin = null; | ||
58 | |||
59 | /// <summary> | ||
60 | /// This is the default configuration DLL loaded | ||
61 | /// </summary> | ||
62 | private string configurationPluginFilename = "OpenSim.Framework.Configuration.XML.dll"; | ||
63 | |||
64 | private ConfigurationOptionsLoad loadFunction; | ||
65 | private ConfigurationOptionResult resultFunction; | ||
66 | |||
67 | private bool useConsoleToPromptOnError = true; | ||
68 | |||
69 | public ConfigurationMember(string configuration_filename, string configuration_description, | ||
70 | ConfigurationOptionsLoad load_function, ConfigurationOptionResult result_function, bool use_console_to_prompt_on_error) | ||
71 | { | ||
72 | configurationFilename = configuration_filename; | ||
73 | configurationDescription = configuration_description; | ||
74 | loadFunction = load_function; | ||
75 | resultFunction = result_function; | ||
76 | useConsoleToPromptOnError = use_console_to_prompt_on_error; | ||
77 | } | ||
78 | |||
79 | public ConfigurationMember(XmlNode configuration_xml, string configuration_description, | ||
80 | ConfigurationOptionsLoad load_function, ConfigurationOptionResult result_function, bool use_console_to_prompt_on_error) | ||
81 | { | ||
82 | configurationFilename = String.Empty; | ||
83 | configurationFromXMLNode = configuration_xml; | ||
84 | configurationDescription = configuration_description; | ||
85 | loadFunction = load_function; | ||
86 | resultFunction = result_function; | ||
87 | useConsoleToPromptOnError = use_console_to_prompt_on_error; | ||
88 | } | ||
89 | |||
90 | public void setConfigurationFilename(string filename) | ||
91 | { | ||
92 | configurationFilename = filename; | ||
93 | } | ||
94 | |||
95 | public void setConfigurationDescription(string desc) | ||
96 | { | ||
97 | configurationDescription = desc; | ||
98 | } | ||
99 | |||
100 | public void setConfigurationResultFunction(ConfigurationOptionResult result) | ||
101 | { | ||
102 | resultFunction = result; | ||
103 | } | ||
104 | |||
105 | public void forceConfigurationPluginLibrary(string dll_filename) | ||
106 | { | ||
107 | configurationPluginFilename = dll_filename; | ||
108 | } | ||
109 | |||
110 | private void checkAndAddConfigOption(ConfigurationOption option) | ||
111 | { | ||
112 | if ((option.configurationKey != String.Empty && option.configurationQuestion != String.Empty) || | ||
113 | (option.configurationKey != String.Empty && option.configurationUseDefaultNoPrompt)) | ||
114 | { | ||
115 | if (!configurationOptions.Contains(option)) | ||
116 | { | ||
117 | configurationOptions.Add(option); | ||
118 | } | ||
119 | } | ||
120 | else | ||
121 | { | ||
122 | m_log.Info( | ||
123 | "Required fields for adding a configuration option is invalid. Will not add this option (" + | ||
124 | option.configurationKey + ")"); | ||
125 | } | ||
126 | } | ||
127 | |||
128 | public void addConfigurationOption(string configuration_key, | ||
129 | ConfigurationOption.ConfigurationTypes configuration_type, | ||
130 | string configuration_question, string configuration_default, | ||
131 | bool use_default_no_prompt) | ||
132 | { | ||
133 | ConfigurationOption configOption = new ConfigurationOption(); | ||
134 | configOption.configurationKey = configuration_key; | ||
135 | configOption.configurationQuestion = configuration_question; | ||
136 | configOption.configurationDefault = configuration_default; | ||
137 | configOption.configurationType = configuration_type; | ||
138 | configOption.configurationUseDefaultNoPrompt = use_default_no_prompt; | ||
139 | configOption.shouldIBeAsked = null; //Assumes true, I can ask whenever | ||
140 | checkAndAddConfigOption(configOption); | ||
141 | } | ||
142 | |||
143 | public void addConfigurationOption(string configuration_key, | ||
144 | ConfigurationOption.ConfigurationTypes configuration_type, | ||
145 | string configuration_question, string configuration_default, | ||
146 | bool use_default_no_prompt, | ||
147 | ConfigurationOption.ConfigurationOptionShouldBeAsked shouldIBeAskedDelegate) | ||
148 | { | ||
149 | ConfigurationOption configOption = new ConfigurationOption(); | ||
150 | configOption.configurationKey = configuration_key; | ||
151 | configOption.configurationQuestion = configuration_question; | ||
152 | configOption.configurationDefault = configuration_default; | ||
153 | configOption.configurationType = configuration_type; | ||
154 | configOption.configurationUseDefaultNoPrompt = use_default_no_prompt; | ||
155 | configOption.shouldIBeAsked = shouldIBeAskedDelegate; | ||
156 | checkAndAddConfigOption(configOption); | ||
157 | } | ||
158 | |||
159 | // TEMP - REMOVE | ||
160 | public void performConfigurationRetrieve() | ||
161 | { | ||
162 | if (cE > 1) | ||
163 | m_log.Error("READING CONFIGURATION COUT: " + cE.ToString()); | ||
164 | |||
165 | |||
166 | configurationPlugin = LoadConfigDll(configurationPluginFilename); | ||
167 | configurationOptions.Clear(); | ||
168 | if (loadFunction == null) | ||
169 | { | ||
170 | m_log.Error("Load Function for '" + configurationDescription + | ||
171 | "' is null. Refusing to run configuration."); | ||
172 | return; | ||
173 | } | ||
174 | |||
175 | if (resultFunction == null) | ||
176 | { | ||
177 | m_log.Error("Result Function for '" + configurationDescription + | ||
178 | "' is null. Refusing to run configuration."); | ||
179 | return; | ||
180 | } | ||
181 | |||
182 | //m_log.Debug("[CONFIG]: Calling Configuration Load Function..."); | ||
183 | loadFunction(); | ||
184 | |||
185 | if (configurationOptions.Count <= 0) | ||
186 | { | ||
187 | m_log.Error("[CONFIG]: No configuration options were specified for '" + configurationOptions + | ||
188 | "'. Refusing to continue configuration."); | ||
189 | return; | ||
190 | } | ||
191 | |||
192 | bool useFile = true; | ||
193 | if (configurationPlugin == null) | ||
194 | { | ||
195 | m_log.Error("[CONFIG]: Configuration Plugin NOT LOADED!"); | ||
196 | return; | ||
197 | } | ||
198 | |||
199 | if (configurationFilename.Trim() != String.Empty) | ||
200 | { | ||
201 | configurationPlugin.SetFileName(configurationFilename); | ||
202 | try | ||
203 | { | ||
204 | configurationPlugin.LoadData(); | ||
205 | useFile = true; | ||
206 | } | ||
207 | catch (XmlException e) | ||
208 | { | ||
209 | m_log.WarnFormat("[CONFIG] Not using {0}: {1}", | ||
210 | configurationFilename, | ||
211 | e.Message.ToString()); | ||
212 | //m_log.Error("Error loading " + configurationFilename + ": " + e.ToString()); | ||
213 | useFile = false; | ||
214 | } | ||
215 | } | ||
216 | else | ||
217 | { | ||
218 | if (configurationFromXMLNode != null) | ||
219 | { | ||
220 | m_log.Info("Loading from XML Node, will not save to the file"); | ||
221 | configurationPlugin.LoadDataFromString(configurationFromXMLNode.OuterXml); | ||
222 | } | ||
223 | |||
224 | m_log.Info("XML Configuration Filename is not valid; will not save to the file."); | ||
225 | useFile = false; | ||
226 | } | ||
227 | |||
228 | foreach (ConfigurationOption configOption in configurationOptions) | ||
229 | { | ||
230 | bool convertSuccess = false; | ||
231 | object return_result = null; | ||
232 | string errorMessage = String.Empty; | ||
233 | bool ignoreNextFromConfig = false; | ||
234 | while (convertSuccess == false) | ||
235 | { | ||
236 | string console_result = String.Empty; | ||
237 | string attribute = null; | ||
238 | if (useFile || configurationFromXMLNode != null) | ||
239 | { | ||
240 | if (!ignoreNextFromConfig) | ||
241 | { | ||
242 | attribute = configurationPlugin.GetAttribute(configOption.configurationKey); | ||
243 | } | ||
244 | else | ||
245 | { | ||
246 | ignoreNextFromConfig = false; | ||
247 | } | ||
248 | } | ||
249 | |||
250 | if (attribute == null) | ||
251 | { | ||
252 | if (configOption.configurationUseDefaultNoPrompt || useConsoleToPromptOnError == false) | ||
253 | { | ||
254 | console_result = configOption.configurationDefault; | ||
255 | } | ||
256 | else | ||
257 | { | ||
258 | if ((configOption.shouldIBeAsked != null && | ||
259 | configOption.shouldIBeAsked(configOption.configurationKey)) || | ||
260 | configOption.shouldIBeAsked == null) | ||
261 | { | ||
262 | if (configurationDescription.Trim() != String.Empty) | ||
263 | { | ||
264 | console_result = | ||
265 | MainConsole.Instance.CmdPrompt( | ||
266 | configurationDescription + ": " + configOption.configurationQuestion, | ||
267 | configOption.configurationDefault); | ||
268 | } | ||
269 | else | ||
270 | { | ||
271 | console_result = | ||
272 | MainConsole.Instance.CmdPrompt(configOption.configurationQuestion, | ||
273 | configOption.configurationDefault); | ||
274 | } | ||
275 | } | ||
276 | else | ||
277 | { | ||
278 | //Dont Ask! Just use default | ||
279 | console_result = configOption.configurationDefault; | ||
280 | } | ||
281 | } | ||
282 | } | ||
283 | else | ||
284 | { | ||
285 | console_result = attribute; | ||
286 | } | ||
287 | |||
288 | // if the first character is a "$", assume it's the name | ||
289 | // of an environment variable and substitute with the value of that variable | ||
290 | if (console_result.StartsWith("$")) | ||
291 | console_result = Environment.GetEnvironmentVariable(console_result.Substring(1)); | ||
292 | |||
293 | switch (configOption.configurationType) | ||
294 | { | ||
295 | case ConfigurationOption.ConfigurationTypes.TYPE_STRING: | ||
296 | return_result = console_result; | ||
297 | convertSuccess = true; | ||
298 | break; | ||
299 | case ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY: | ||
300 | if (console_result.Length > 0) | ||
301 | { | ||
302 | return_result = console_result; | ||
303 | convertSuccess = true; | ||
304 | } | ||
305 | errorMessage = "a string that is not empty"; | ||
306 | break; | ||
307 | case ConfigurationOption.ConfigurationTypes.TYPE_BOOLEAN: | ||
308 | bool boolResult; | ||
309 | if (Boolean.TryParse(console_result, out boolResult)) | ||
310 | { | ||
311 | convertSuccess = true; | ||
312 | return_result = boolResult; | ||
313 | } | ||
314 | errorMessage = "'true' or 'false' (Boolean)"; | ||
315 | break; | ||
316 | case ConfigurationOption.ConfigurationTypes.TYPE_BYTE: | ||
317 | byte byteResult; | ||
318 | if (Byte.TryParse(console_result, out byteResult)) | ||
319 | { | ||
320 | convertSuccess = true; | ||
321 | return_result = byteResult; | ||
322 | } | ||
323 | errorMessage = "a byte (Byte)"; | ||
324 | break; | ||
325 | case ConfigurationOption.ConfigurationTypes.TYPE_CHARACTER: | ||
326 | char charResult; | ||
327 | if (Char.TryParse(console_result, out charResult)) | ||
328 | { | ||
329 | convertSuccess = true; | ||
330 | return_result = charResult; | ||
331 | } | ||
332 | errorMessage = "a character (Char)"; | ||
333 | break; | ||
334 | case ConfigurationOption.ConfigurationTypes.TYPE_INT16: | ||
335 | short shortResult; | ||
336 | if (Int16.TryParse(console_result, out shortResult)) | ||
337 | { | ||
338 | convertSuccess = true; | ||
339 | return_result = shortResult; | ||
340 | } | ||
341 | errorMessage = "a signed 32 bit integer (short)"; | ||
342 | break; | ||
343 | case ConfigurationOption.ConfigurationTypes.TYPE_INT32: | ||
344 | int intResult; | ||
345 | if (Int32.TryParse(console_result, out intResult)) | ||
346 | { | ||
347 | convertSuccess = true; | ||
348 | return_result = intResult; | ||
349 | } | ||
350 | errorMessage = "a signed 32 bit integer (int)"; | ||
351 | break; | ||
352 | case ConfigurationOption.ConfigurationTypes.TYPE_INT64: | ||
353 | long longResult; | ||
354 | if (Int64.TryParse(console_result, out longResult)) | ||
355 | { | ||
356 | convertSuccess = true; | ||
357 | return_result = longResult; | ||
358 | } | ||
359 | errorMessage = "a signed 32 bit integer (long)"; | ||
360 | break; | ||
361 | case ConfigurationOption.ConfigurationTypes.TYPE_IP_ADDRESS: | ||
362 | IPAddress ipAddressResult; | ||
363 | if (IPAddress.TryParse(console_result, out ipAddressResult)) | ||
364 | { | ||
365 | convertSuccess = true; | ||
366 | return_result = ipAddressResult; | ||
367 | } | ||
368 | errorMessage = "an IP Address (IPAddress)"; | ||
369 | break; | ||
370 | case ConfigurationOption.ConfigurationTypes.TYPE_UUID: | ||
371 | UUID uuidResult; | ||
372 | if (UUID.TryParse(console_result, out uuidResult)) | ||
373 | { | ||
374 | convertSuccess = true; | ||
375 | return_result = uuidResult; | ||
376 | } | ||
377 | errorMessage = "a UUID (UUID)"; | ||
378 | break; | ||
379 | case ConfigurationOption.ConfigurationTypes.TYPE_UUID_NULL_FREE: | ||
380 | UUID uuidResult2; | ||
381 | if (UUID.TryParse(console_result, out uuidResult2)) | ||
382 | { | ||
383 | convertSuccess = true; | ||
384 | |||
385 | if (uuidResult2 == UUID.Zero) | ||
386 | uuidResult2 = UUID.Random(); | ||
387 | |||
388 | return_result = uuidResult2; | ||
389 | } | ||
390 | errorMessage = "a non-null UUID (UUID)"; | ||
391 | break; | ||
392 | case ConfigurationOption.ConfigurationTypes.TYPE_Vector3: | ||
393 | Vector3 vectorResult; | ||
394 | if (Vector3.TryParse(console_result, out vectorResult)) | ||
395 | { | ||
396 | convertSuccess = true; | ||
397 | return_result = vectorResult; | ||
398 | } | ||
399 | errorMessage = "a vector (Vector3)"; | ||
400 | break; | ||
401 | case ConfigurationOption.ConfigurationTypes.TYPE_UINT16: | ||
402 | ushort ushortResult; | ||
403 | if (UInt16.TryParse(console_result, out ushortResult)) | ||
404 | { | ||
405 | convertSuccess = true; | ||
406 | return_result = ushortResult; | ||
407 | } | ||
408 | errorMessage = "an unsigned 16 bit integer (ushort)"; | ||
409 | break; | ||
410 | case ConfigurationOption.ConfigurationTypes.TYPE_UINT32: | ||
411 | uint uintResult; | ||
412 | if (UInt32.TryParse(console_result, out uintResult)) | ||
413 | { | ||
414 | convertSuccess = true; | ||
415 | return_result = uintResult; | ||
416 | } | ||
417 | errorMessage = "an unsigned 32 bit integer (uint)"; | ||
418 | break; | ||
419 | case ConfigurationOption.ConfigurationTypes.TYPE_UINT64: | ||
420 | ulong ulongResult; | ||
421 | if (UInt64.TryParse(console_result, out ulongResult)) | ||
422 | { | ||
423 | convertSuccess = true; | ||
424 | return_result = ulongResult; | ||
425 | } | ||
426 | errorMessage = "an unsigned 64 bit integer (ulong)"; | ||
427 | break; | ||
428 | case ConfigurationOption.ConfigurationTypes.TYPE_FLOAT: | ||
429 | float floatResult; | ||
430 | if ( | ||
431 | float.TryParse(console_result, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, Culture.NumberFormatInfo, | ||
432 | out floatResult)) | ||
433 | { | ||
434 | convertSuccess = true; | ||
435 | return_result = floatResult; | ||
436 | } | ||
437 | errorMessage = "a single-precision floating point number (float)"; | ||
438 | break; | ||
439 | case ConfigurationOption.ConfigurationTypes.TYPE_DOUBLE: | ||
440 | double doubleResult; | ||
441 | if ( | ||
442 | Double.TryParse(console_result, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, Culture.NumberFormatInfo, | ||
443 | out doubleResult)) | ||
444 | { | ||
445 | convertSuccess = true; | ||
446 | return_result = doubleResult; | ||
447 | } | ||
448 | errorMessage = "an double-precision floating point number (double)"; | ||
449 | break; | ||
450 | } | ||
451 | |||
452 | if (convertSuccess) | ||
453 | { | ||
454 | if (useFile) | ||
455 | { | ||
456 | configurationPlugin.SetAttribute(configOption.configurationKey, console_result); | ||
457 | } | ||
458 | |||
459 | if (!resultFunction(configOption.configurationKey, return_result)) | ||
460 | { | ||
461 | m_log.Info( | ||
462 | "The handler for the last configuration option denied that input, please try again."); | ||
463 | convertSuccess = false; | ||
464 | ignoreNextFromConfig = true; | ||
465 | } | ||
466 | } | ||
467 | else | ||
468 | { | ||
469 | if (configOption.configurationUseDefaultNoPrompt) | ||
470 | { | ||
471 | m_log.Error(string.Format( | ||
472 | "[CONFIG]: [{3}]:[{1}] is not valid default for parameter [{0}].\nThe configuration result must be parsable to {2}.\n", | ||
473 | configOption.configurationKey, console_result, errorMessage, | ||
474 | configurationFilename)); | ||
475 | convertSuccess = true; | ||
476 | } | ||
477 | else | ||
478 | { | ||
479 | m_log.Warn(string.Format( | ||
480 | "[CONFIG]: [{3}]:[{1}] is not a valid value [{0}].\nThe configuration result must be parsable to {2}.\n", | ||
481 | configOption.configurationKey, console_result, errorMessage, | ||
482 | configurationFilename)); | ||
483 | ignoreNextFromConfig = true; | ||
484 | } | ||
485 | } | ||
486 | } | ||
487 | } | ||
488 | |||
489 | if (useFile) | ||
490 | { | ||
491 | configurationPlugin.Commit(); | ||
492 | configurationPlugin.Close(); | ||
493 | } | ||
494 | } | ||
495 | |||
496 | private static IGenericConfig LoadConfigDll(string dllName) | ||
497 | { | ||
498 | Assembly pluginAssembly = Assembly.LoadFrom(dllName); | ||
499 | IGenericConfig plug = null; | ||
500 | |||
501 | foreach (Type pluginType in pluginAssembly.GetTypes()) | ||
502 | { | ||
503 | if (pluginType.IsPublic) | ||
504 | { | ||
505 | if (!pluginType.IsAbstract) | ||
506 | { | ||
507 | Type typeInterface = pluginType.GetInterface("IGenericConfig", true); | ||
508 | |||
509 | if (typeInterface != null) | ||
510 | { | ||
511 | plug = | ||
512 | (IGenericConfig) Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); | ||
513 | } | ||
514 | } | ||
515 | } | ||
516 | } | ||
517 | |||
518 | pluginAssembly = null; | ||
519 | return plug; | ||
520 | } | ||
521 | |||
522 | public void forceSetConfigurationOption(string configuration_key, string configuration_value) | ||
523 | { | ||
524 | configurationPlugin.LoadData(); | ||
525 | configurationPlugin.SetAttribute(configuration_key, configuration_value); | ||
526 | configurationPlugin.Commit(); | ||
527 | configurationPlugin.Close(); | ||
528 | } | ||
529 | } | ||
530 | } | ||
diff --git a/OpenSim/Framework/Console/AssemblyInfo.cs b/OpenSim/Framework/Console/AssemblyInfo.cs index 67af471..c53d92b 100644 --- a/OpenSim/Framework/Console/AssemblyInfo.cs +++ b/OpenSim/Framework/Console/AssemblyInfo.cs | |||
@@ -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.8.2.*")] | 58 | [assembly : AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] |
diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index 0f68afe..52360b4 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs | |||
@@ -52,27 +52,27 @@ namespace OpenSim.Framework.Console | |||
52 | /// The module from which this command comes | 52 | /// The module from which this command comes |
53 | /// </value> | 53 | /// </value> |
54 | public string module; | 54 | public string module; |
55 | 55 | ||
56 | /// <value> | 56 | /// <value> |
57 | /// Whether the module is shared | 57 | /// Whether the module is shared |
58 | /// </value> | 58 | /// </value> |
59 | public bool shared; | 59 | public bool shared; |
60 | 60 | ||
61 | /// <value> | 61 | /// <value> |
62 | /// Very short BNF description | 62 | /// Very short BNF description |
63 | /// </value> | 63 | /// </value> |
64 | public string help_text; | 64 | public string help_text; |
65 | 65 | ||
66 | /// <value> | 66 | /// <value> |
67 | /// Longer one line help text | 67 | /// Longer one line help text |
68 | /// </value> | 68 | /// </value> |
69 | public string long_help; | 69 | public string long_help; |
70 | 70 | ||
71 | /// <value> | 71 | /// <value> |
72 | /// Full descriptive help for this command | 72 | /// Full descriptive help for this command |
73 | /// </value> | 73 | /// </value> |
74 | public string descriptive_help; | 74 | public string descriptive_help; |
75 | 75 | ||
76 | /// <value> | 76 | /// <value> |
77 | /// The method to invoke for this command | 77 | /// The method to invoke for this command |
78 | /// </value> | 78 | /// </value> |
@@ -83,8 +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 all' to get a list of all commands, | 86 | = @"For more information, type 'help all' to get a list of all commands, |
87 | or type help <item>' where <item> is one of the following:"; | 87 | or type help <item>' where <item> is one of the following:"; |
88 | 88 | ||
89 | /// <value> | 89 | /// <value> |
90 | /// Commands organized by keyword in a tree | 90 | /// Commands organized by keyword in a tree |
@@ -106,7 +106,7 @@ namespace OpenSim.Framework.Console | |||
106 | { | 106 | { |
107 | List<string> help = new List<string>(); | 107 | List<string> help = new List<string>(); |
108 | List<string> helpParts = new List<string>(cmd); | 108 | List<string> helpParts = new List<string>(cmd); |
109 | 109 | ||
110 | // Remove initial help keyword | 110 | // Remove initial help keyword |
111 | helpParts.RemoveAt(0); | 111 | helpParts.RemoveAt(0); |
112 | 112 | ||
@@ -154,7 +154,7 @@ namespace OpenSim.Framework.Console | |||
154 | 154 | ||
155 | return help; | 155 | return help; |
156 | } | 156 | } |
157 | 157 | ||
158 | /// <summary> | 158 | /// <summary> |
159 | /// See if we can find the requested command in order to display longer help | 159 | /// See if we can find the requested command in order to display longer help |
160 | /// </summary> | 160 | /// </summary> |
@@ -171,23 +171,23 @@ namespace OpenSim.Framework.Console | |||
171 | help.Insert(0, ItemHelpText); | 171 | help.Insert(0, ItemHelpText); |
172 | return help; | 172 | return help; |
173 | } | 173 | } |
174 | 174 | ||
175 | Dictionary<string, object> dict = tree; | 175 | Dictionary<string, object> dict = tree; |
176 | while (helpParts.Count > 0) | 176 | while (helpParts.Count > 0) |
177 | { | 177 | { |
178 | string helpPart = helpParts[0]; | 178 | string helpPart = helpParts[0]; |
179 | 179 | ||
180 | if (!dict.ContainsKey(helpPart)) | 180 | if (!dict.ContainsKey(helpPart)) |
181 | break; | 181 | break; |
182 | 182 | ||
183 | //m_log.Debug("Found {0}", helpParts[0]); | 183 | //m_log.Debug("Found {0}", helpParts[0]); |
184 | 184 | ||
185 | if (dict[helpPart] is Dictionary<string, Object>) | 185 | if (dict[helpPart] is Dictionary<string, Object>) |
186 | dict = (Dictionary<string, object>)dict[helpPart]; | 186 | dict = (Dictionary<string, object>)dict[helpPart]; |
187 | 187 | ||
188 | helpParts.RemoveAt(0); | 188 | helpParts.RemoveAt(0); |
189 | } | 189 | } |
190 | 190 | ||
191 | // There was a command for the given help string | 191 | // There was a command for the given help string |
192 | if (dict.ContainsKey(String.Empty)) | 192 | if (dict.ContainsKey(String.Empty)) |
193 | { | 193 | { |
@@ -200,14 +200,14 @@ namespace OpenSim.Framework.Console | |||
200 | // If we do have some descriptive help then insert a spacing line before for readability. | 200 | // If we do have some descriptive help then insert a spacing line before for readability. |
201 | if (descriptiveHelp != string.Empty) | 201 | if (descriptiveHelp != string.Empty) |
202 | help.Add(string.Empty); | 202 | help.Add(string.Empty); |
203 | 203 | ||
204 | help.Add(commandInfo.descriptive_help); | 204 | help.Add(commandInfo.descriptive_help); |
205 | } | 205 | } |
206 | else | 206 | else |
207 | { | 207 | { |
208 | help.Add(string.Format("No help is available for {0}", originalHelpRequest)); | 208 | help.Add(string.Format("No help is available for {0}", originalHelpRequest)); |
209 | } | 209 | } |
210 | 210 | ||
211 | return help; | 211 | return help; |
212 | } | 212 | } |
213 | 213 | ||
@@ -268,7 +268,7 @@ namespace OpenSim.Framework.Console | |||
268 | // } | 268 | // } |
269 | // return result; | 269 | // return result; |
270 | // } | 270 | // } |
271 | 271 | ||
272 | /// <summary> | 272 | /// <summary> |
273 | /// Add a command to those which can be invoked from the console. | 273 | /// Add a command to those which can be invoked from the console. |
274 | /// </summary> | 274 | /// </summary> |
@@ -299,7 +299,7 @@ namespace OpenSim.Framework.Console | |||
299 | string[] parts = Parser.Parse(command); | 299 | string[] parts = Parser.Parse(command); |
300 | 300 | ||
301 | Dictionary<string, Object> current = tree; | 301 | Dictionary<string, Object> current = tree; |
302 | 302 | ||
303 | foreach (string part in parts) | 303 | foreach (string part in parts) |
304 | { | 304 | { |
305 | if (current.ContainsKey(part)) | 305 | if (current.ContainsKey(part)) |
@@ -326,7 +326,7 @@ namespace OpenSim.Framework.Console | |||
326 | 326 | ||
327 | return; | 327 | return; |
328 | } | 328 | } |
329 | 329 | ||
330 | info = new CommandInfo(); | 330 | info = new CommandInfo(); |
331 | info.module = module; | 331 | info.module = module; |
332 | info.shared = shared; | 332 | info.shared = shared; |
@@ -471,7 +471,7 @@ namespace OpenSim.Framework.Console | |||
471 | 471 | ||
472 | return null; | 472 | return null; |
473 | } | 473 | } |
474 | 474 | ||
475 | public bool HasCommand(string command) | 475 | public bool HasCommand(string command) |
476 | { | 476 | { |
477 | string[] result; | 477 | string[] result; |
diff --git a/OpenSim/Framework/Console/ConsoleBase.cs b/OpenSim/Framework/Console/ConsoleBase.cs index 2d8e723..64cddea 100644..100755 --- a/OpenSim/Framework/Console/ConsoleBase.cs +++ b/OpenSim/Framework/Console/ConsoleBase.cs | |||
@@ -67,7 +67,7 @@ namespace OpenSim.Framework.Console | |||
67 | { | 67 | { |
68 | System.Console.WriteLine(text); | 68 | System.Console.WriteLine(text); |
69 | } | 69 | } |
70 | 70 | ||
71 | public virtual void OutputFormat(string format, params object[] components) | 71 | public virtual void OutputFormat(string format, params object[] components) |
72 | { | 72 | { |
73 | Output(string.Format(format, components)); | 73 | Output(string.Format(format, components)); |
@@ -86,7 +86,7 @@ namespace OpenSim.Framework.Console | |||
86 | 86 | ||
87 | return ret; | 87 | return ret; |
88 | } | 88 | } |
89 | 89 | ||
90 | public string CmdPrompt(string p, List<char> excludedCharacters) | 90 | public string CmdPrompt(string p, List<char> excludedCharacters) |
91 | { | 91 | { |
92 | bool itisdone = false; | 92 | bool itisdone = false; |
@@ -95,7 +95,7 @@ namespace OpenSim.Framework.Console | |||
95 | { | 95 | { |
96 | itisdone = true; | 96 | itisdone = true; |
97 | ret = CmdPrompt(p); | 97 | ret = CmdPrompt(p); |
98 | 98 | ||
99 | foreach (char c in excludedCharacters) | 99 | foreach (char c in excludedCharacters) |
100 | { | 100 | { |
101 | if (ret.Contains(c.ToString())) | 101 | if (ret.Contains(c.ToString())) |
@@ -117,7 +117,7 @@ namespace OpenSim.Framework.Console | |||
117 | { | 117 | { |
118 | itisdone = true; | 118 | itisdone = true; |
119 | ret = CmdPrompt(p, def); | 119 | ret = CmdPrompt(p, def); |
120 | 120 | ||
121 | if (ret == String.Empty) | 121 | if (ret == String.Empty) |
122 | { | 122 | { |
123 | ret = def; | 123 | ret = def; |
diff --git a/OpenSim/Framework/Console/ConsolePluginCommand.cs b/OpenSim/Framework/Console/ConsolePluginCommand.cs index f4d3687..f4d3687 100644..100755 --- a/OpenSim/Framework/Console/ConsolePluginCommand.cs +++ b/OpenSim/Framework/Console/ConsolePluginCommand.cs | |||
diff --git a/OpenSim/Framework/Console/ConsoleUtil.cs b/OpenSim/Framework/Console/ConsoleUtil.cs index 44f6dc1..bfa05a2 100644 --- a/OpenSim/Framework/Console/ConsoleUtil.cs +++ b/OpenSim/Framework/Console/ConsoleUtil.cs | |||
@@ -40,7 +40,7 @@ namespace OpenSim.Framework.Console | |||
40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
41 | 41 | ||
42 | public const int LocalIdNotFound = 0; | 42 | public const int LocalIdNotFound = 0; |
43 | 43 | ||
44 | /// <summary> | 44 | /// <summary> |
45 | /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section | 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. | 46 | /// rather than in each help summary. |
@@ -57,10 +57,10 @@ namespace OpenSim.Framework.Console | |||
57 | show object pos ,20,20 to ,40,40 | 57 | show object pos ,20,20 to ,40,40 |
58 | delete object pos ,,30 to ,,~ | 58 | delete object pos ,,30 to ,,~ |
59 | show object pos ,,-~ to ,,30"; | 59 | show object pos ,,-~ to ,,30"; |
60 | 60 | ||
61 | public const string MinRawConsoleVectorValue = "-~"; | 61 | public const string MinRawConsoleVectorValue = "-~"; |
62 | public const string MaxRawConsoleVectorValue = "~"; | 62 | public const string MaxRawConsoleVectorValue = "~"; |
63 | 63 | ||
64 | public const string VectorSeparator = ","; | 64 | public const string VectorSeparator = ","; |
65 | public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray(); | 65 | public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray(); |
66 | 66 | ||
@@ -81,7 +81,7 @@ namespace OpenSim.Framework.Console | |||
81 | 81 | ||
82 | return true; | 82 | return true; |
83 | } | 83 | } |
84 | 84 | ||
85 | /// <summary> | 85 | /// <summary> |
86 | /// Try to parse a console UUID from the console. | 86 | /// Try to parse a console UUID from the console. |
87 | /// </summary> | 87 | /// </summary> |
@@ -101,7 +101,7 @@ namespace OpenSim.Framework.Console | |||
101 | 101 | ||
102 | return false; | 102 | return false; |
103 | } | 103 | } |
104 | 104 | ||
105 | return true; | 105 | return true; |
106 | } | 106 | } |
107 | 107 | ||
@@ -259,7 +259,7 @@ namespace OpenSim.Framework.Console | |||
259 | 259 | ||
260 | return false; | 260 | return false; |
261 | } | 261 | } |
262 | 262 | ||
263 | /// <summary> | 263 | /// <summary> |
264 | /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 | 264 | /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 |
265 | /// </summary> | 265 | /// </summary> |
@@ -270,7 +270,7 @@ namespace OpenSim.Framework.Console | |||
270 | { | 270 | { |
271 | return TryParseConsoleVector(rawConsoleVector, c => float.MinValue.ToString(), out vector); | 271 | return TryParseConsoleVector(rawConsoleVector, c => float.MinValue.ToString(), out vector); |
272 | } | 272 | } |
273 | 273 | ||
274 | /// <summary> | 274 | /// <summary> |
275 | /// Convert a maximum vector input from the console to an OpenMetaverse.Vector3 | 275 | /// Convert a maximum vector input from the console to an OpenMetaverse.Vector3 |
276 | /// </summary> | 276 | /// </summary> |
@@ -281,7 +281,7 @@ namespace OpenSim.Framework.Console | |||
281 | { | 281 | { |
282 | return TryParseConsoleVector(rawConsoleVector, c => float.MaxValue.ToString(), out vector); | 282 | return TryParseConsoleVector(rawConsoleVector, c => float.MaxValue.ToString(), out vector); |
283 | } | 283 | } |
284 | 284 | ||
285 | /// <summary> | 285 | /// <summary> |
286 | /// Convert a vector input from the console to an OpenMetaverse.Vector3 | 286 | /// Convert a vector input from the console to an OpenMetaverse.Vector3 |
287 | /// </summary> | 287 | /// </summary> |
@@ -354,10 +354,10 @@ namespace OpenSim.Framework.Console | |||
354 | string rawConsoleVector, int dimensions, Func<string, string> blankComponentFunc) | 354 | string rawConsoleVector, int dimensions, Func<string, string> blankComponentFunc) |
355 | { | 355 | { |
356 | List<string> components = rawConsoleVector.Split(VectorSeparatorChars).ToList(); | 356 | List<string> components = rawConsoleVector.Split(VectorSeparatorChars).ToList(); |
357 | 357 | ||
358 | if (components.Count < 1 || components.Count > dimensions) | 358 | if (components.Count < 1 || components.Count > dimensions) |
359 | return null; | 359 | return null; |
360 | 360 | ||
361 | if (components.Count < dimensions) | 361 | if (components.Count < dimensions) |
362 | { | 362 | { |
363 | if (blankComponentFunc == null) | 363 | if (blankComponentFunc == null) |
@@ -380,7 +380,7 @@ namespace OpenSim.Framework.Console | |||
380 | else | 380 | else |
381 | return c; | 381 | return c; |
382 | }); | 382 | }); |
383 | 383 | ||
384 | return string.Join(VectorSeparator, cookedComponents.ToArray()); | 384 | return string.Join(VectorSeparator, cookedComponents.ToArray()); |
385 | } | 385 | } |
386 | } | 386 | } |
diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index d8f8ecc..73f0323 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs | |||
@@ -51,7 +51,7 @@ namespace OpenSim.Framework.Console | |||
51 | private const string LOGLEVEL_NONE = "(none)"; | 51 | private const string LOGLEVEL_NONE = "(none)"; |
52 | 52 | ||
53 | // Used to extract categories for colourization. | 53 | // Used to extract categories for colourization. |
54 | private Regex m_categoryRegex | 54 | private Regex m_categoryRegex |
55 | = new Regex( | 55 | = new Regex( |
56 | @"^(?<Front>.*?)\[(?<Category>[^\]]+)\]:?(?<End>.*)", RegexOptions.Singleline | RegexOptions.Compiled); | 56 | @"^(?<Front>.*?)\[(?<Category>[^\]]+)\]:?(?<End>.*)", RegexOptions.Singleline | RegexOptions.Compiled); |
57 | 57 | ||
@@ -97,7 +97,7 @@ namespace OpenSim.Framework.Console | |||
97 | 97 | ||
98 | string m_historyFile = startupConfig.GetString("ConsoleHistoryFile", "OpenSimConsoleHistory.txt"); | 98 | string m_historyFile = startupConfig.GetString("ConsoleHistoryFile", "OpenSimConsoleHistory.txt"); |
99 | int m_historySize = startupConfig.GetInt("ConsoleHistoryFileLines", 100); | 99 | int m_historySize = startupConfig.GetInt("ConsoleHistoryFileLines", 100); |
100 | m_historyPath = Path.GetFullPath(Path.Combine("../caches", m_historyFile)); | 100 | m_historyPath = Path.GetFullPath(Path.Combine(Util.configDir(), m_historyFile)); |
101 | m_log.InfoFormat("[LOCAL CONSOLE]: Persistent command line history is Enabled, up to {0} lines from file {1}", m_historySize, m_historyPath); | 101 | m_log.InfoFormat("[LOCAL CONSOLE]: Persistent command line history is Enabled, up to {0} lines from file {1}", m_historySize, m_historyPath); |
102 | 102 | ||
103 | if (File.Exists(m_historyPath)) | 103 | if (File.Exists(m_historyPath)) |
@@ -167,15 +167,15 @@ namespace OpenSim.Framework.Console | |||
167 | { | 167 | { |
168 | System.Console.CursorLeft = 0; | 168 | System.Console.CursorLeft = 0; |
169 | } | 169 | } |
170 | else | 170 | else |
171 | { | 171 | { |
172 | int bufferWidth = System.Console.BufferWidth; | 172 | int bufferWidth = System.Console.BufferWidth; |
173 | 173 | ||
174 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) | 174 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) |
175 | if (bufferWidth > 0 && left >= bufferWidth) | 175 | if (bufferWidth > 0 && left >= bufferWidth) |
176 | System.Console.CursorLeft = bufferWidth - 1; | 176 | System.Console.CursorLeft = bufferWidth - 1; |
177 | } | 177 | } |
178 | 178 | ||
179 | if (top < 0) | 179 | if (top < 0) |
180 | { | 180 | { |
181 | top = 0; | 181 | top = 0; |
@@ -183,7 +183,7 @@ namespace OpenSim.Framework.Console | |||
183 | else | 183 | else |
184 | { | 184 | { |
185 | int bufferHeight = System.Console.BufferHeight; | 185 | int bufferHeight = System.Console.BufferHeight; |
186 | 186 | ||
187 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) | 187 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) |
188 | if (bufferHeight > 0 && top >= bufferHeight) | 188 | if (bufferHeight > 0 && top >= bufferHeight) |
189 | top = bufferHeight - 1; | 189 | top = bufferHeight - 1; |
@@ -216,14 +216,14 @@ namespace OpenSim.Framework.Console | |||
216 | { | 216 | { |
217 | System.Console.CursorTop = 0; | 217 | System.Console.CursorTop = 0; |
218 | } | 218 | } |
219 | else | 219 | else |
220 | { | 220 | { |
221 | int bufferHeight = System.Console.BufferHeight; | 221 | int bufferHeight = System.Console.BufferHeight; |
222 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) | 222 | // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) |
223 | if (bufferHeight > 0 && top >= bufferHeight) | 223 | if (bufferHeight > 0 && top >= bufferHeight) |
224 | System.Console.CursorTop = bufferHeight - 1; | 224 | System.Console.CursorTop = bufferHeight - 1; |
225 | } | 225 | } |
226 | 226 | ||
227 | if (left < 0) | 227 | if (left < 0) |
228 | { | 228 | { |
229 | left = 0; | 229 | left = 0; |
@@ -339,7 +339,7 @@ namespace OpenSim.Framework.Console | |||
339 | string outText = text; | 339 | string outText = text; |
340 | 340 | ||
341 | if (level != LOGLEVEL_NONE) | 341 | if (level != LOGLEVEL_NONE) |
342 | { | 342 | { |
343 | MatchCollection matches = m_categoryRegex.Matches(text); | 343 | MatchCollection matches = m_categoryRegex.Matches(text); |
344 | 344 | ||
345 | if (matches.Count == 1) | 345 | if (matches.Count == 1) |
@@ -364,7 +364,7 @@ namespace OpenSim.Framework.Console | |||
364 | WriteColorText(ConsoleColor.Yellow, outText); | 364 | WriteColorText(ConsoleColor.Yellow, outText); |
365 | else | 365 | else |
366 | System.Console.Write(outText); | 366 | System.Console.Write(outText); |
367 | 367 | ||
368 | System.Console.WriteLine(); | 368 | System.Console.WriteLine(); |
369 | } | 369 | } |
370 | 370 | ||
@@ -551,7 +551,7 @@ namespace OpenSim.Framework.Console | |||
551 | } | 551 | } |
552 | 552 | ||
553 | string commandLine = m_commandLine.ToString(); | 553 | string commandLine = m_commandLine.ToString(); |
554 | 554 | ||
555 | if (isCommand) | 555 | if (isCommand) |
556 | { | 556 | { |
557 | string[] cmd = Commands.Resolve(Parser.Parse(commandLine)); | 557 | string[] cmd = Commands.Resolve(Parser.Parse(commandLine)); |
@@ -573,7 +573,7 @@ namespace OpenSim.Framework.Console | |||
573 | // If we're not echoing to screen (e.g. a password) then we probably don't want it in history | 573 | // If we're not echoing to screen (e.g. a password) then we probably don't want it in history |
574 | if (m_echo && commandLine != "") | 574 | if (m_echo && commandLine != "") |
575 | AddToHistory(commandLine); | 575 | AddToHistory(commandLine); |
576 | 576 | ||
577 | return commandLine; | 577 | return commandLine; |
578 | default: | 578 | default: |
579 | break; | 579 | break; |
diff --git a/OpenSim/Framework/Console/MockConsole.cs b/OpenSim/Framework/Console/MockConsole.cs index 1a142df..e1ff720 100644 --- a/OpenSim/Framework/Console/MockConsole.cs +++ b/OpenSim/Framework/Console/MockConsole.cs | |||
@@ -35,7 +35,7 @@ namespace OpenSim.Framework.Console | |||
35 | { | 35 | { |
36 | /// <summary> | 36 | /// <summary> |
37 | /// This is a Fake console that's used when setting up the Scene in Unit Tests | 37 | /// This is a Fake console that's used when setting up the Scene in Unit Tests |
38 | /// Don't use this except for Unit Testing or you're in for a world of hurt when the | 38 | /// Don't use this except for Unit Testing or you're in for a world of hurt when the |
39 | /// sim gets to ReadLine | 39 | /// sim gets to ReadLine |
40 | /// </summary> | 40 | /// </summary> |
41 | public class MockConsole : ICommandConsole | 41 | public class MockConsole : ICommandConsole |
@@ -56,7 +56,7 @@ namespace OpenSim.Framework.Console | |||
56 | 56 | ||
57 | public string ReadLine(string p, bool isCommand, bool e) { return ""; } | 57 | public string ReadLine(string p, bool isCommand, bool e) { return ""; } |
58 | 58 | ||
59 | public object ConsoleScene { | 59 | public object ConsoleScene { |
60 | get { return null; } | 60 | get { return null; } |
61 | set {} | 61 | set {} |
62 | } | 62 | } |
diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs index 8ad7b0d..f59c902 100644 --- a/OpenSim/Framework/Console/RemoteConsole.cs +++ b/OpenSim/Framework/Console/RemoteConsole.cs | |||
@@ -34,6 +34,7 @@ using System.Reflection; | |||
34 | using System.Text; | 34 | using System.Text; |
35 | using System.Text.RegularExpressions; | 35 | using System.Text.RegularExpressions; |
36 | using System.Threading; | 36 | using System.Threading; |
37 | using System.Timers; | ||
37 | using OpenMetaverse; | 38 | using OpenMetaverse; |
38 | using Nini.Config; | 39 | using Nini.Config; |
39 | using OpenSim.Framework.Servers.HttpServer; | 40 | using OpenSim.Framework.Servers.HttpServer; |
@@ -41,51 +42,147 @@ using log4net; | |||
41 | 42 | ||
42 | namespace OpenSim.Framework.Console | 43 | namespace OpenSim.Framework.Console |
43 | { | 44 | { |
44 | public class ConsoleConnection | ||
45 | { | ||
46 | public int last; | ||
47 | public long lastLineSeen; | ||
48 | public bool newConnection = true; | ||
49 | } | ||
50 | |||
51 | // A console that uses REST interfaces | 45 | // A console that uses REST interfaces |
52 | // | 46 | // |
53 | public class RemoteConsole : CommandConsole | 47 | public class RemoteConsole : CommandConsole |
54 | { | 48 | { |
55 | private IHttpServer m_Server = null; | 49 | // Connection specific data, indexed by a session ID |
56 | private IConfigSource m_Config = null; | 50 | // we create when a client connects. |
57 | 51 | protected class ConsoleConnection | |
58 | private List<string> m_Scrollback = new List<string>(); | 52 | { |
59 | private ManualResetEvent m_DataEvent = new ManualResetEvent(false); | 53 | // Last activity from the client |
60 | private List<string> m_InputData = new List<string>(); | 54 | public int last; |
61 | private long m_LineNumber = 0; | 55 | |
62 | private Dictionary<UUID, ConsoleConnection> m_Connections = | 56 | // Last line of scrollback posted to this client |
57 | public long lastLineSeen; | ||
58 | |||
59 | // True if this is a new connection, e.g. has never | ||
60 | // displayed a prompt to the user. | ||
61 | public bool newConnection = true; | ||
62 | } | ||
63 | |||
64 | // A line in the scrollback buffer. | ||
65 | protected class ScrollbackEntry | ||
66 | { | ||
67 | // The line number of this entry | ||
68 | public long lineNumber; | ||
69 | |||
70 | // The text to send to the client | ||
71 | public string text; | ||
72 | |||
73 | // The level this should be logged as. Omitted for | ||
74 | // prompts and input echo. | ||
75 | public string level; | ||
76 | |||
77 | // True if the text above is a prompt, e.g. the | ||
78 | // client should turn on the cursor / accept input | ||
79 | public bool isPrompt; | ||
80 | |||
81 | // True if the requested input is a command. A | ||
82 | // client may offer help or validate input if | ||
83 | // this is set. If false, input should be sent | ||
84 | // as typed. | ||
85 | public bool isCommand; | ||
86 | |||
87 | // True if this text represents a line of text that | ||
88 | // was input in response to a prompt. A client should | ||
89 | // turn off the cursor and refrain from sending commands | ||
90 | // until a new prompt is received. | ||
91 | public bool isInput; | ||
92 | } | ||
93 | |||
94 | // Data that is relevant to all connections | ||
95 | |||
96 | // The scrollback buffer | ||
97 | protected List<ScrollbackEntry> m_Scrollback = new List<ScrollbackEntry>(); | ||
98 | |||
99 | // Monotonously incrementing line number. This may eventually | ||
100 | // wrap. No provision is made for that case because 64 bits | ||
101 | // is a long, long time. | ||
102 | protected long m_lineNumber = 0; | ||
103 | |||
104 | // These two variables allow us to send the correct | ||
105 | // information about the prompt status to the client, | ||
106 | // irrespective of what may have run off the top of the | ||
107 | // scrollback buffer; | ||
108 | protected bool m_expectingInput = false; | ||
109 | protected bool m_expectingCommand = true; | ||
110 | protected string m_lastPromptUsed; | ||
111 | |||
112 | // This is the list of things received from clients. | ||
113 | // Note: Race conditions can happen. If a client sends | ||
114 | // something while nothing is expected, it will be | ||
115 | // intepreted as input to the next prompt. For | ||
116 | // commands this is largely correct. For other prompts, | ||
117 | // YMMV. | ||
118 | // TODO: Find a better way to fix this | ||
119 | protected List<string> m_InputData = new List<string>(); | ||
120 | |||
121 | // Event to allow ReadLine to wait synchronously even though | ||
122 | // everthing else is asynchronous here. | ||
123 | protected ManualResetEvent m_DataEvent = new ManualResetEvent(false); | ||
124 | |||
125 | // The list of sessions we maintain. Unlike other console types, | ||
126 | // multiple users on the same console are explicitly allowed. | ||
127 | protected Dictionary<UUID, ConsoleConnection> m_Connections = | ||
63 | new Dictionary<UUID, ConsoleConnection>(); | 128 | new Dictionary<UUID, ConsoleConnection>(); |
64 | private string m_UserName = String.Empty; | 129 | |
65 | private string m_Password = String.Empty; | 130 | // Timer to control expiration of sessions that have been |
66 | private string m_AllowedOrigin = String.Empty; | 131 | // disconnected. |
132 | protected System.Timers.Timer m_expireTimer = new System.Timers.Timer(5000); | ||
133 | |||
134 | // The less interesting stuff that makes the actual server | ||
135 | // work. | ||
136 | protected IHttpServer m_Server = null; | ||
137 | protected IConfigSource m_Config = null; | ||
138 | |||
139 | protected string m_UserName = String.Empty; | ||
140 | protected string m_Password = String.Empty; | ||
141 | protected string m_AllowedOrigin = String.Empty; | ||
142 | |||
67 | 143 | ||
68 | public RemoteConsole(string defaultPrompt) : base(defaultPrompt) | 144 | public RemoteConsole(string defaultPrompt) : base(defaultPrompt) |
69 | { | 145 | { |
146 | // There is something wrong with this architecture. | ||
147 | // A prompt is sent on every single input, so why have this? | ||
148 | // TODO: Investigate and fix. | ||
149 | m_lastPromptUsed = defaultPrompt; | ||
150 | |||
151 | // Start expiration of sesssions. | ||
152 | m_expireTimer.Elapsed += DoExpire; | ||
153 | m_expireTimer.Start(); | ||
70 | } | 154 | } |
71 | 155 | ||
72 | public void ReadConfig(IConfigSource config) | 156 | public void ReadConfig(IConfigSource config) |
73 | { | 157 | { |
74 | m_Config = config; | 158 | m_Config = config; |
75 | 159 | ||
160 | // We're pulling this from the 'Network' section for legacy | ||
161 | // compatibility. However, this is so essentially insecure | ||
162 | // that TLS and client certs should be used instead of | ||
163 | // a username / password. | ||
76 | IConfig netConfig = m_Config.Configs["Network"]; | 164 | IConfig netConfig = m_Config.Configs["Network"]; |
165 | |||
77 | if (netConfig == null) | 166 | if (netConfig == null) |
78 | return; | 167 | return; |
79 | 168 | ||
169 | // Get the username and password. | ||
80 | m_UserName = netConfig.GetString("ConsoleUser", String.Empty); | 170 | m_UserName = netConfig.GetString("ConsoleUser", String.Empty); |
81 | m_Password = netConfig.GetString("ConsolePass", String.Empty); | 171 | m_Password = netConfig.GetString("ConsolePass", String.Empty); |
172 | |||
173 | // Woefully underdocumented, this is what makes javascript | ||
174 | // console clients work. Set to "*" for anywhere or (better) | ||
175 | // to specific addresses. | ||
82 | m_AllowedOrigin = netConfig.GetString("ConsoleAllowedOrigin", String.Empty); | 176 | m_AllowedOrigin = netConfig.GetString("ConsoleAllowedOrigin", String.Empty); |
83 | } | 177 | } |
84 | 178 | ||
85 | public void SetServer(IHttpServer server) | 179 | public void SetServer(IHttpServer server) |
86 | { | 180 | { |
181 | // This is called by the framework to give us the server | ||
182 | // instance (means: port) to work with. | ||
87 | m_Server = server; | 183 | m_Server = server; |
88 | 184 | ||
185 | // Add our handlers | ||
89 | m_Server.AddHTTPHandler("/StartSession/", HandleHttpStartSession); | 186 | m_Server.AddHTTPHandler("/StartSession/", HandleHttpStartSession); |
90 | m_Server.AddHTTPHandler("/CloseSession/", HandleHttpCloseSession); | 187 | m_Server.AddHTTPHandler("/CloseSession/", HandleHttpCloseSession); |
91 | m_Server.AddHTTPHandler("/SessionCommand/", HandleHttpSessionCommand); | 188 | m_Server.AddHTTPHandler("/SessionCommand/", HandleHttpSessionCommand); |
@@ -93,38 +190,84 @@ namespace OpenSim.Framework.Console | |||
93 | 190 | ||
94 | public override void Output(string text, string level) | 191 | public override void Output(string text, string level) |
95 | { | 192 | { |
193 | Output(text, level, false, false, false); | ||
194 | } | ||
195 | |||
196 | protected void Output(string text, string level, bool isPrompt, bool isCommand, bool isInput) | ||
197 | { | ||
198 | // Increment the line number. It was 0 and they start at 1 | ||
199 | // so we need to pre-increment. | ||
200 | m_lineNumber++; | ||
201 | |||
202 | // Create and populate the new entry. | ||
203 | ScrollbackEntry newEntry = new ScrollbackEntry(); | ||
204 | |||
205 | newEntry.lineNumber = m_lineNumber; | ||
206 | newEntry.text = text; | ||
207 | newEntry.level = level; | ||
208 | newEntry.isPrompt = isPrompt; | ||
209 | newEntry.isCommand = isCommand; | ||
210 | newEntry.isInput = isInput; | ||
211 | |||
212 | // Add a line to the scrollback. In some cases, that may not | ||
213 | // actually be a line of text. | ||
96 | lock (m_Scrollback) | 214 | lock (m_Scrollback) |
97 | { | 215 | { |
216 | // Prune the scrollback to the length se send as connect | ||
217 | // burst to give the user some context. | ||
98 | while (m_Scrollback.Count >= 1000) | 218 | while (m_Scrollback.Count >= 1000) |
99 | m_Scrollback.RemoveAt(0); | 219 | m_Scrollback.RemoveAt(0); |
100 | m_LineNumber++; | 220 | |
101 | m_Scrollback.Add(String.Format("{0}", m_LineNumber)+":"+level+":"+text); | 221 | m_Scrollback.Add(newEntry); |
102 | } | 222 | } |
223 | |||
224 | // Let the rest of the system know we have output something. | ||
103 | FireOnOutput(text.Trim()); | 225 | FireOnOutput(text.Trim()); |
226 | |||
227 | // Also display it for debugging. | ||
104 | System.Console.WriteLine(text.Trim()); | 228 | System.Console.WriteLine(text.Trim()); |
105 | } | 229 | } |
106 | 230 | ||
107 | public override void Output(string text) | 231 | public override void Output(string text) |
108 | { | 232 | { |
109 | Output(text, "normal"); | 233 | // Output plain (non-logging style) text. |
234 | Output(text, String.Empty, false, false, false); | ||
110 | } | 235 | } |
111 | 236 | ||
112 | public override string ReadLine(string p, bool isCommand, bool e) | 237 | public override string ReadLine(string p, bool isCommand, bool e) |
113 | { | 238 | { |
239 | // Output the prompt an prepare to wait. This | ||
240 | // is called on a dedicated console thread and | ||
241 | // needs to be synchronous. Old architecture but | ||
242 | // not worth upgrading. | ||
114 | if (isCommand) | 243 | if (isCommand) |
115 | Output("+++"+p); | 244 | { |
245 | m_expectingInput = true; | ||
246 | m_expectingCommand = true; | ||
247 | Output(p, String.Empty, true, true, false); | ||
248 | m_lastPromptUsed = p; | ||
249 | } | ||
116 | else | 250 | else |
117 | Output("-++"+p); | 251 | { |
252 | m_expectingInput = true; | ||
253 | Output(p, String.Empty, true, false, false); | ||
254 | } | ||
118 | 255 | ||
256 | |||
257 | // Here is where we wait for the user to input something. | ||
119 | m_DataEvent.WaitOne(); | 258 | m_DataEvent.WaitOne(); |
120 | 259 | ||
121 | string cmdinput; | 260 | string cmdinput; |
122 | 261 | ||
262 | // Check for empty input. Read input if not empty. | ||
123 | lock (m_InputData) | 263 | lock (m_InputData) |
124 | { | 264 | { |
125 | if (m_InputData.Count == 0) | 265 | if (m_InputData.Count == 0) |
126 | { | 266 | { |
127 | m_DataEvent.Reset(); | 267 | m_DataEvent.Reset(); |
268 | m_expectingInput = false; | ||
269 | m_expectingCommand = false; | ||
270 | |||
128 | return ""; | 271 | return ""; |
129 | } | 272 | } |
130 | 273 | ||
@@ -135,8 +278,19 @@ namespace OpenSim.Framework.Console | |||
135 | 278 | ||
136 | } | 279 | } |
137 | 280 | ||
281 | m_expectingInput = false; | ||
282 | m_expectingCommand = false; | ||
283 | |||
284 | // Echo to all the other users what we have done. This | ||
285 | // will also go to ourselves. | ||
286 | Output (cmdinput, String.Empty, false, false, true); | ||
287 | |||
288 | // If this is a command, we need to resolve and execute it. | ||
138 | if (isCommand) | 289 | if (isCommand) |
139 | { | 290 | { |
291 | // This call will actually execute the command and create | ||
292 | // any output associated with it. The core just gets an | ||
293 | // empty string so it will call again immediately. | ||
140 | string[] cmd = Commands.Resolve(Parser.Parse(cmdinput)); | 294 | string[] cmd = Commands.Resolve(Parser.Parse(cmdinput)); |
141 | 295 | ||
142 | if (cmd.Length != 0) | 296 | if (cmd.Length != 0) |
@@ -151,18 +305,23 @@ namespace OpenSim.Framework.Console | |||
151 | return String.Empty; | 305 | return String.Empty; |
152 | } | 306 | } |
153 | } | 307 | } |
308 | |||
309 | // Return the raw input string if not a command. | ||
154 | return cmdinput; | 310 | return cmdinput; |
155 | } | 311 | } |
156 | 312 | ||
157 | private Hashtable CheckOrigin(Hashtable result) | 313 | // Very simplistic static access control header. |
314 | protected Hashtable CheckOrigin(Hashtable result) | ||
158 | { | 315 | { |
159 | if (!string.IsNullOrEmpty(m_AllowedOrigin)) | 316 | if (!string.IsNullOrEmpty(m_AllowedOrigin)) |
160 | result["access_control_allow_origin"] = m_AllowedOrigin; | 317 | result["access_control_allow_origin"] = m_AllowedOrigin; |
318 | |||
161 | return result; | 319 | return result; |
162 | } | 320 | } |
321 | |||
163 | /* TODO: Figure out how PollServiceHTTPHandler can access the request headers | 322 | /* TODO: Figure out how PollServiceHTTPHandler can access the request headers |
164 | * in order to use m_AllowedOrigin as a regular expression | 323 | * in order to use m_AllowedOrigin as a regular expression |
165 | private Hashtable CheckOrigin(Hashtable headers, Hashtable result) | 324 | protected Hashtable CheckOrigin(Hashtable headers, Hashtable result) |
166 | { | 325 | { |
167 | if (!string.IsNullOrEmpty(m_AllowedOrigin)) | 326 | if (!string.IsNullOrEmpty(m_AllowedOrigin)) |
168 | { | 327 | { |
@@ -177,18 +336,23 @@ namespace OpenSim.Framework.Console | |||
177 | } | 336 | } |
178 | */ | 337 | */ |
179 | 338 | ||
180 | private void DoExpire() | 339 | protected void DoExpire(Object sender, ElapsedEventArgs e) |
181 | { | 340 | { |
341 | // Iterate the list of console connections and find those we | ||
342 | // haven't heard from for longer then the longpoll interval. | ||
343 | // Remove them. | ||
182 | List<UUID> expired = new List<UUID>(); | 344 | List<UUID> expired = new List<UUID>(); |
183 | 345 | ||
184 | lock (m_Connections) | 346 | lock (m_Connections) |
185 | { | 347 | { |
348 | // Mark the expired ones | ||
186 | foreach (KeyValuePair<UUID, ConsoleConnection> kvp in m_Connections) | 349 | foreach (KeyValuePair<UUID, ConsoleConnection> kvp in m_Connections) |
187 | { | 350 | { |
188 | if (System.Environment.TickCount - kvp.Value.last > 500000) | 351 | if (System.Environment.TickCount - kvp.Value.last > 500000) |
189 | expired.Add(kvp.Key); | 352 | expired.Add(kvp.Key); |
190 | } | 353 | } |
191 | 354 | ||
355 | // Delete them | ||
192 | foreach (UUID id in expired) | 356 | foreach (UUID id in expired) |
193 | { | 357 | { |
194 | m_Connections.Remove(id); | 358 | m_Connections.Remove(id); |
@@ -197,10 +361,10 @@ namespace OpenSim.Framework.Console | |||
197 | } | 361 | } |
198 | } | 362 | } |
199 | 363 | ||
200 | private Hashtable HandleHttpStartSession(Hashtable request) | 364 | // Start a new session. |
365 | protected Hashtable HandleHttpStartSession(Hashtable request) | ||
201 | { | 366 | { |
202 | DoExpire(); | 367 | // The login is in the form of a http form post |
203 | |||
204 | Hashtable post = DecodePostString(request["body"].ToString()); | 368 | Hashtable post = DecodePostString(request["body"].ToString()); |
205 | Hashtable reply = new Hashtable(); | 369 | Hashtable reply = new Hashtable(); |
206 | 370 | ||
@@ -208,6 +372,7 @@ namespace OpenSim.Framework.Console | |||
208 | reply["int_response_code"] = 401; | 372 | reply["int_response_code"] = 401; |
209 | reply["content_type"] = "text/plain"; | 373 | reply["content_type"] = "text/plain"; |
210 | 374 | ||
375 | // Check user name and password | ||
211 | if (m_UserName == String.Empty) | 376 | if (m_UserName == String.Empty) |
212 | return reply; | 377 | return reply; |
213 | 378 | ||
@@ -220,22 +385,28 @@ namespace OpenSim.Framework.Console | |||
220 | return reply; | 385 | return reply; |
221 | } | 386 | } |
222 | 387 | ||
388 | // Set up the new console connection record | ||
223 | ConsoleConnection c = new ConsoleConnection(); | 389 | ConsoleConnection c = new ConsoleConnection(); |
224 | c.last = System.Environment.TickCount; | 390 | c.last = System.Environment.TickCount; |
225 | c.lastLineSeen = 0; | 391 | c.lastLineSeen = 0; |
226 | 392 | ||
393 | // Assign session ID | ||
227 | UUID sessionID = UUID.Random(); | 394 | UUID sessionID = UUID.Random(); |
228 | 395 | ||
396 | // Add connection to list. | ||
229 | lock (m_Connections) | 397 | lock (m_Connections) |
230 | { | 398 | { |
231 | m_Connections[sessionID] = c; | 399 | m_Connections[sessionID] = c; |
232 | } | 400 | } |
233 | 401 | ||
402 | // This call is a CAP. The URL is the authentication. | ||
234 | string uri = "/ReadResponses/" + sessionID.ToString() + "/"; | 403 | string uri = "/ReadResponses/" + sessionID.ToString() + "/"; |
235 | 404 | ||
236 | m_Server.AddPollServiceHTTPHandler( | 405 | m_Server.AddPollServiceHTTPHandler( |
237 | uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, sessionID,25000)); // 25 secs timeout | 406 | uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, sessionID,25000)); // 25 secs timeout |
238 | 407 | ||
408 | // Our reply is an XML document. | ||
409 | // TODO: Change this to Linq.Xml | ||
239 | XmlDocument xmldoc = new XmlDocument(); | 410 | XmlDocument xmldoc = new XmlDocument(); |
240 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, | 411 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, |
241 | "", ""); | 412 | "", ""); |
@@ -252,12 +423,13 @@ namespace OpenSim.Framework.Console | |||
252 | rootElement.AppendChild(id); | 423 | rootElement.AppendChild(id); |
253 | 424 | ||
254 | XmlElement prompt = xmldoc.CreateElement("", "Prompt", ""); | 425 | XmlElement prompt = xmldoc.CreateElement("", "Prompt", ""); |
255 | prompt.AppendChild(xmldoc.CreateTextNode(DefaultPrompt)); | 426 | prompt.AppendChild(xmldoc.CreateTextNode(m_lastPromptUsed)); |
256 | 427 | ||
257 | rootElement.AppendChild(prompt); | 428 | rootElement.AppendChild(prompt); |
258 | 429 | ||
259 | rootElement.AppendChild(MainConsole.Instance.Commands.GetXml(xmldoc)); | 430 | rootElement.AppendChild(MainConsole.Instance.Commands.GetXml(xmldoc)); |
260 | 431 | ||
432 | // Set up the response and check origin | ||
261 | reply["str_response_string"] = xmldoc.InnerXml; | 433 | reply["str_response_string"] = xmldoc.InnerXml; |
262 | reply["int_response_code"] = 200; | 434 | reply["int_response_code"] = 200; |
263 | reply["content_type"] = "text/xml"; | 435 | reply["content_type"] = "text/xml"; |
@@ -266,10 +438,9 @@ namespace OpenSim.Framework.Console | |||
266 | return reply; | 438 | return reply; |
267 | } | 439 | } |
268 | 440 | ||
269 | private Hashtable HandleHttpCloseSession(Hashtable request) | 441 | // Client closes session. Clean up. |
442 | protected Hashtable HandleHttpCloseSession(Hashtable request) | ||
270 | { | 443 | { |
271 | DoExpire(); | ||
272 | |||
273 | Hashtable post = DecodePostString(request["body"].ToString()); | 444 | Hashtable post = DecodePostString(request["body"].ToString()); |
274 | Hashtable reply = new Hashtable(); | 445 | Hashtable reply = new Hashtable(); |
275 | 446 | ||
@@ -316,10 +487,9 @@ namespace OpenSim.Framework.Console | |||
316 | return reply; | 487 | return reply; |
317 | } | 488 | } |
318 | 489 | ||
319 | private Hashtable HandleHttpSessionCommand(Hashtable request) | 490 | // Command received from the client. |
491 | protected Hashtable HandleHttpSessionCommand(Hashtable request) | ||
320 | { | 492 | { |
321 | DoExpire(); | ||
322 | |||
323 | Hashtable post = DecodePostString(request["body"].ToString()); | 493 | Hashtable post = DecodePostString(request["body"].ToString()); |
324 | Hashtable reply = new Hashtable(); | 494 | Hashtable reply = new Hashtable(); |
325 | 495 | ||
@@ -327,6 +497,7 @@ namespace OpenSim.Framework.Console | |||
327 | reply["int_response_code"] = 404; | 497 | reply["int_response_code"] = 404; |
328 | reply["content_type"] = "text/plain"; | 498 | reply["content_type"] = "text/plain"; |
329 | 499 | ||
500 | // Check the ID | ||
330 | if (post["ID"] == null) | 501 | if (post["ID"] == null) |
331 | return reply; | 502 | return reply; |
332 | 503 | ||
@@ -334,21 +505,25 @@ namespace OpenSim.Framework.Console | |||
334 | if (!UUID.TryParse(post["ID"].ToString(), out id)) | 505 | if (!UUID.TryParse(post["ID"].ToString(), out id)) |
335 | return reply; | 506 | return reply; |
336 | 507 | ||
508 | // Find the connection for that ID. | ||
337 | lock (m_Connections) | 509 | lock (m_Connections) |
338 | { | 510 | { |
339 | if (!m_Connections.ContainsKey(id)) | 511 | if (!m_Connections.ContainsKey(id)) |
340 | return reply; | 512 | return reply; |
341 | } | 513 | } |
342 | 514 | ||
515 | // Empty post. Just error out. | ||
343 | if (post["COMMAND"] == null) | 516 | if (post["COMMAND"] == null) |
344 | return reply; | 517 | return reply; |
345 | 518 | ||
519 | // Place the input data in the buffer. | ||
346 | lock (m_InputData) | 520 | lock (m_InputData) |
347 | { | 521 | { |
348 | m_DataEvent.Set(); | 522 | m_DataEvent.Set(); |
349 | m_InputData.Add(post["COMMAND"].ToString()); | 523 | m_InputData.Add(post["COMMAND"].ToString()); |
350 | } | 524 | } |
351 | 525 | ||
526 | // Create the XML reply document. | ||
352 | XmlDocument xmldoc = new XmlDocument(); | 527 | XmlDocument xmldoc = new XmlDocument(); |
353 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, | 528 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, |
354 | "", ""); | 529 | "", ""); |
@@ -372,7 +547,8 @@ namespace OpenSim.Framework.Console | |||
372 | return reply; | 547 | return reply; |
373 | } | 548 | } |
374 | 549 | ||
375 | private Hashtable DecodePostString(string data) | 550 | // Decode a HTTP form post to a Hashtable |
551 | protected Hashtable DecodePostString(string data) | ||
376 | { | 552 | { |
377 | Hashtable result = new Hashtable(); | 553 | Hashtable result = new Hashtable(); |
378 | 554 | ||
@@ -389,13 +565,14 @@ namespace OpenSim.Framework.Console | |||
389 | 565 | ||
390 | if (elems.Length > 1) | 566 | if (elems.Length > 1) |
391 | value = System.Web.HttpUtility.UrlDecode(elems[1]); | 567 | value = System.Web.HttpUtility.UrlDecode(elems[1]); |
392 | 568 | ||
393 | result[name] = value; | 569 | result[name] = value; |
394 | } | 570 | } |
395 | 571 | ||
396 | return result; | 572 | return result; |
397 | } | 573 | } |
398 | 574 | ||
575 | // Close the CAP receiver for the responses for a given client. | ||
399 | public void CloseConnection(UUID id) | 576 | public void CloseConnection(UUID id) |
400 | { | 577 | { |
401 | try | 578 | try |
@@ -409,7 +586,9 @@ namespace OpenSim.Framework.Console | |||
409 | } | 586 | } |
410 | } | 587 | } |
411 | 588 | ||
412 | private bool HasEvents(UUID RequestID, UUID sessionID) | 589 | // Check if there is anything to send. Return true if this client has |
590 | // lines pending. | ||
591 | protected bool HasEvents(UUID RequestID, UUID sessionID) | ||
413 | { | 592 | { |
414 | ConsoleConnection c = null; | 593 | ConsoleConnection c = null; |
415 | 594 | ||
@@ -420,13 +599,15 @@ namespace OpenSim.Framework.Console | |||
420 | c = m_Connections[sessionID]; | 599 | c = m_Connections[sessionID]; |
421 | } | 600 | } |
422 | c.last = System.Environment.TickCount; | 601 | c.last = System.Environment.TickCount; |
423 | if (c.lastLineSeen < m_LineNumber) | 602 | if (c.lastLineSeen < m_lineNumber) |
424 | return true; | 603 | return true; |
425 | return false; | 604 | return false; |
426 | } | 605 | } |
427 | 606 | ||
428 | private Hashtable GetEvents(UUID RequestID, UUID sessionID) | 607 | // Send all pending output to the client. |
608 | protected Hashtable GetEvents(UUID RequestID, UUID sessionID) | ||
429 | { | 609 | { |
610 | // Find the connection that goes with this client. | ||
430 | ConsoleConnection c = null; | 611 | ConsoleConnection c = null; |
431 | 612 | ||
432 | lock (m_Connections) | 613 | lock (m_Connections) |
@@ -435,12 +616,15 @@ namespace OpenSim.Framework.Console | |||
435 | return NoEvents(RequestID, UUID.Zero); | 616 | return NoEvents(RequestID, UUID.Zero); |
436 | c = m_Connections[sessionID]; | 617 | c = m_Connections[sessionID]; |
437 | } | 618 | } |
619 | |||
620 | // If we have nothing to send, send the no events response. | ||
438 | c.last = System.Environment.TickCount; | 621 | c.last = System.Environment.TickCount; |
439 | if (c.lastLineSeen >= m_LineNumber) | 622 | if (c.lastLineSeen >= m_lineNumber) |
440 | return NoEvents(RequestID, UUID.Zero); | 623 | return NoEvents(RequestID, UUID.Zero); |
441 | 624 | ||
442 | Hashtable result = new Hashtable(); | 625 | Hashtable result = new Hashtable(); |
443 | 626 | ||
627 | // Create the response document. | ||
444 | XmlDocument xmldoc = new XmlDocument(); | 628 | XmlDocument xmldoc = new XmlDocument(); |
445 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, | 629 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, |
446 | "", ""); | 630 | "", ""); |
@@ -449,30 +633,53 @@ namespace OpenSim.Framework.Console | |||
449 | XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession", | 633 | XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession", |
450 | ""); | 634 | ""); |
451 | 635 | ||
452 | if (c.newConnection) | 636 | //if (c.newConnection) |
453 | { | 637 | //{ |
454 | c.newConnection = false; | 638 | // c.newConnection = false; |
455 | Output("+++" + DefaultPrompt); | 639 | // Output("+++" + DefaultPrompt); |
456 | } | 640 | //} |
457 | 641 | ||
458 | lock (m_Scrollback) | 642 | lock (m_Scrollback) |
459 | { | 643 | { |
460 | long startLine = m_LineNumber - m_Scrollback.Count; | 644 | long startLine = m_lineNumber - m_Scrollback.Count; |
461 | long sendStart = startLine; | 645 | long sendStart = startLine; |
462 | if (sendStart < c.lastLineSeen) | 646 | if (sendStart < c.lastLineSeen) |
463 | sendStart = c.lastLineSeen; | 647 | sendStart = c.lastLineSeen; |
464 | 648 | ||
465 | for (long i = sendStart ; i < m_LineNumber ; i++) | 649 | for (long i = sendStart ; i < m_lineNumber ; i++) |
466 | { | 650 | { |
651 | ScrollbackEntry e = m_Scrollback[(int)(i - startLine)]; | ||
652 | |||
467 | XmlElement res = xmldoc.CreateElement("", "Line", ""); | 653 | XmlElement res = xmldoc.CreateElement("", "Line", ""); |
468 | long line = i + 1; | 654 | res.SetAttribute("Number", e.lineNumber.ToString()); |
469 | res.SetAttribute("Number", line.ToString()); | 655 | res.SetAttribute("Level", e.level); |
470 | res.AppendChild(xmldoc.CreateTextNode(m_Scrollback[(int)(i - startLine)])); | 656 | // Don't include these for the scrollback, we'll send the |
657 | // real state later. | ||
658 | if (!c.newConnection) | ||
659 | { | ||
660 | res.SetAttribute("Prompt", e.isPrompt ? "true" : "false"); | ||
661 | res.SetAttribute("Command", e.isCommand ? "true" : "false"); | ||
662 | res.SetAttribute("Input", e.isInput ? "true" : "false"); | ||
663 | } | ||
664 | else if (i == m_lineNumber - 1) // Last line for a new connection | ||
665 | { | ||
666 | res.SetAttribute("Prompt", m_expectingInput ? "true" : "false"); | ||
667 | res.SetAttribute("Command", m_expectingCommand ? "true" : "false"); | ||
668 | res.SetAttribute("Input", (!m_expectingInput) ? "true" : "false"); | ||
669 | } | ||
670 | else | ||
671 | { | ||
672 | res.SetAttribute("Input", e.isInput ? "true" : "false"); | ||
673 | } | ||
674 | |||
675 | res.AppendChild(xmldoc.CreateTextNode(e.text)); | ||
471 | 676 | ||
472 | rootElement.AppendChild(res); | 677 | rootElement.AppendChild(res); |
473 | } | 678 | } |
474 | } | 679 | } |
475 | c.lastLineSeen = m_LineNumber; | 680 | |
681 | c.lastLineSeen = m_lineNumber; | ||
682 | c.newConnection = false; | ||
476 | 683 | ||
477 | xmldoc.AppendChild(rootElement); | 684 | xmldoc.AppendChild(rootElement); |
478 | 685 | ||
@@ -486,7 +693,9 @@ namespace OpenSim.Framework.Console | |||
486 | return result; | 693 | return result; |
487 | } | 694 | } |
488 | 695 | ||
489 | private Hashtable NoEvents(UUID RequestID, UUID id) | 696 | // This is really just a no-op. It generates what is sent |
697 | // to the client if the poll times out without any events. | ||
698 | protected Hashtable NoEvents(UUID RequestID, UUID id) | ||
490 | { | 699 | { |
491 | Hashtable result = new Hashtable(); | 700 | Hashtable result = new Hashtable(); |
492 | 701 | ||
diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs index 48478b4..209c991 100644 --- a/OpenSim/Framework/Constants.cs +++ b/OpenSim/Framework/Constants.cs | |||
@@ -34,7 +34,7 @@ namespace OpenSim.Framework | |||
34 | // DO NOT USE THIS FOR ANY NEW CODE. Use Scene.RegionInfo.RegionSize[XYZ] as a region might not | 34 | // DO NOT USE THIS FOR ANY NEW CODE. Use Scene.RegionInfo.RegionSize[XYZ] as a region might not |
35 | // be the legacy region size. | 35 | // be the legacy region size. |
36 | public const uint RegionSize = 256; | 36 | public const uint RegionSize = 256; |
37 | public const uint RegionHeight = 16384; | 37 | public const uint RegionHeight = 4096; |
38 | // This could be a parameters but, really, a region of greater than this is pretty unmanageable | 38 | // This could be a parameters but, really, a region of greater than this is pretty unmanageable |
39 | public const uint MaximumRegionSize = 8192; | 39 | public const uint MaximumRegionSize = 8192; |
40 | 40 | ||
@@ -46,12 +46,20 @@ namespace OpenSim.Framework | |||
46 | 46 | ||
47 | public enum EstateAccessCodex : uint | 47 | public enum EstateAccessCodex : uint |
48 | { | 48 | { |
49 | AccessOptions = 1, | 49 | AllowedAccess = 1, |
50 | AllowedGroups = 2, | 50 | AllowedGroups = 2, |
51 | EstateBans = 4, | 51 | EstateBans = 4, |
52 | EstateManagers = 8 | 52 | EstateManagers = 8 |
53 | } | 53 | } |
54 | 54 | ||
55 | public enum EstateAccessLimits : int | ||
56 | { | ||
57 | AllowedAccess = 500, | ||
58 | AllowedGroups = 63, | ||
59 | EstateBans = 500, | ||
60 | EstateManagers = 10 | ||
61 | } | ||
62 | |||
55 | [Flags]public enum TeleportFlags : uint | 63 | [Flags]public enum TeleportFlags : uint |
56 | { | 64 | { |
57 | /// <summary>No flags set, or teleport failed</summary> | 65 | /// <summary>No flags set, or teleport failed</summary> |
diff --git a/OpenSim/Framework/Crc32.cs b/OpenSim/Framework/Crc32.cs new file mode 100644 index 0000000..7ad1566 --- /dev/null +++ b/OpenSim/Framework/Crc32.cs | |||
@@ -0,0 +1,139 @@ | |||
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.Security.Cryptography; | ||
30 | |||
31 | namespace OpenSim.Framework | ||
32 | { | ||
33 | // this is more generic than openmetaverse CRC32 | ||
34 | |||
35 | public class Crc32 : HashAlgorithm | ||
36 | { | ||
37 | public const UInt32 DefaultPolynomial = 0xedb88320; | ||
38 | public const UInt32 DefaultSeed = 0xffffffff; | ||
39 | |||
40 | private UInt32 hash; | ||
41 | private UInt32 seed; | ||
42 | private UInt32[] table; | ||
43 | private static UInt32[] defaultTable; | ||
44 | |||
45 | public Crc32() | ||
46 | { | ||
47 | table = InitializeTable(DefaultPolynomial); | ||
48 | seed = DefaultSeed; | ||
49 | Initialize(); | ||
50 | } | ||
51 | |||
52 | public Crc32(UInt32 polynomial, UInt32 seed) | ||
53 | { | ||
54 | table = InitializeTable(polynomial); | ||
55 | this.seed = seed; | ||
56 | Initialize(); | ||
57 | } | ||
58 | |||
59 | public override void Initialize() | ||
60 | { | ||
61 | hash = seed; | ||
62 | } | ||
63 | |||
64 | protected override void HashCore(byte[] buffer, int start, int length) | ||
65 | { | ||
66 | hash = CalculateHash(table, hash, buffer, start, length); | ||
67 | } | ||
68 | |||
69 | protected override byte[] HashFinal() | ||
70 | { | ||
71 | byte[] hashBuffer = UInt32ToBigEndianBytes(~hash); | ||
72 | this.HashValue = hashBuffer; | ||
73 | return hashBuffer; | ||
74 | } | ||
75 | |||
76 | public override int HashSize | ||
77 | { | ||
78 | get { return 32; } | ||
79 | } | ||
80 | |||
81 | public static UInt32 Compute(byte[] buffer) | ||
82 | { | ||
83 | return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length); | ||
84 | } | ||
85 | |||
86 | public static UInt32 Compute(UInt32 seed, byte[] buffer) | ||
87 | { | ||
88 | return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length); | ||
89 | } | ||
90 | |||
91 | public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer) | ||
92 | { | ||
93 | return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length); | ||
94 | } | ||
95 | |||
96 | private static UInt32[] InitializeTable(UInt32 polynomial) | ||
97 | { | ||
98 | if (polynomial == DefaultPolynomial && defaultTable != null) | ||
99 | return defaultTable; | ||
100 | |||
101 | UInt32[] createTable = new UInt32[256]; | ||
102 | for (int i = 0; i < 256; i++) | ||
103 | { | ||
104 | UInt32 entry = (UInt32)i; | ||
105 | for (int j = 0; j < 8; j++) | ||
106 | if ((entry & 1) == 1) | ||
107 | entry = (entry >> 1) ^ polynomial; | ||
108 | else | ||
109 | entry = entry >> 1; | ||
110 | createTable[i] = entry; | ||
111 | } | ||
112 | |||
113 | if (polynomial == DefaultPolynomial) | ||
114 | defaultTable = createTable; | ||
115 | |||
116 | return createTable; | ||
117 | } | ||
118 | |||
119 | private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size) | ||
120 | { | ||
121 | UInt32 crc = seed; | ||
122 | for (int i = start; i < size; i++) | ||
123 | unchecked | ||
124 | { | ||
125 | crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff]; | ||
126 | } | ||
127 | return crc; | ||
128 | } | ||
129 | |||
130 | private byte[] UInt32ToBigEndianBytes(UInt32 x) | ||
131 | { | ||
132 | return new byte[] { | ||
133 | (byte)((x >> 24) & 0xff), | ||
134 | (byte)((x >> 16) & 0xff), | ||
135 | (byte)((x >> 8) & 0xff), | ||
136 | (byte)(x & 0xff) }; | ||
137 | } | ||
138 | } | ||
139 | } | ||
diff --git a/OpenSim/Framework/CustomTypes.cs b/OpenSim/Framework/CustomTypes.cs new file mode 100644 index 0000000..d109c26 --- /dev/null +++ b/OpenSim/Framework/CustomTypes.cs | |||
@@ -0,0 +1,43 @@ | |||
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 | public enum CustomAssetType : sbyte | ||
33 | { | ||
34 | CustomTypeBase = 0x60, | ||
35 | AnimationSet = 0x60, | ||
36 | } | ||
37 | |||
38 | public enum CustomInventoryType : sbyte | ||
39 | { | ||
40 | CustomTypeBase = 0x60, | ||
41 | AnimationSet = 0x60, | ||
42 | } | ||
43 | } | ||
diff --git a/OpenSim/Framework/DAMap.cs b/OpenSim/Framework/DAMap.cs index 4995a92..1915fa5 100644 --- a/OpenSim/Framework/DAMap.cs +++ b/OpenSim/Framework/DAMap.cs | |||
@@ -63,9 +63,9 @@ namespace OpenSim.Framework | |||
63 | { | 63 | { |
64 | get { return m_map; } | 64 | get { return m_map; } |
65 | set { m_map = value; } | 65 | set { m_map = value; } |
66 | } | 66 | } |
67 | 67 | ||
68 | public XmlSchema GetSchema() { return null; } | 68 | public XmlSchema GetSchema() { return null; } |
69 | 69 | ||
70 | public static DAMap FromXml(string rawXml) | 70 | public static DAMap FromXml(string rawXml) |
71 | { | 71 | { |
@@ -73,19 +73,19 @@ namespace OpenSim.Framework | |||
73 | map.ReadXml(rawXml); | 73 | map.ReadXml(rawXml); |
74 | return map; | 74 | return map; |
75 | } | 75 | } |
76 | 76 | ||
77 | public void ReadXml(XmlReader reader) | 77 | public void ReadXml(XmlReader reader) |
78 | { | 78 | { |
79 | ReadXml(reader.ReadInnerXml()); | 79 | ReadXml(reader.ReadInnerXml()); |
80 | } | 80 | } |
81 | 81 | ||
82 | public void ReadXml(string rawXml) | 82 | public void ReadXml(string rawXml) |
83 | { | 83 | { |
84 | // System.Console.WriteLine("Trying to deserialize [{0}]", rawXml); | 84 | // System.Console.WriteLine("Trying to deserialize [{0}]", rawXml); |
85 | 85 | ||
86 | lock (this) | 86 | lock (this) |
87 | { | 87 | { |
88 | m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml); | 88 | m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml); |
89 | SanitiseMap(this); | 89 | SanitiseMap(this); |
90 | } | 90 | } |
91 | } | 91 | } |
@@ -104,7 +104,7 @@ namespace OpenSim.Framework | |||
104 | public void CopyFrom(DAMap other) | 104 | public void CopyFrom(DAMap other) |
105 | { | 105 | { |
106 | // Deep copy | 106 | // Deep copy |
107 | 107 | ||
108 | string data = null; | 108 | string data = null; |
109 | lock (other) | 109 | lock (other) |
110 | { | 110 | { |
@@ -113,7 +113,7 @@ namespace OpenSim.Framework | |||
113 | data = OSDParser.SerializeLLSDXmlString(other.m_map); | 113 | data = OSDParser.SerializeLLSDXmlString(other.m_map); |
114 | } | 114 | } |
115 | } | 115 | } |
116 | 116 | ||
117 | lock (this) | 117 | lock (this) |
118 | { | 118 | { |
119 | if (data == null) | 119 | if (data == null) |
@@ -185,9 +185,9 @@ namespace OpenSim.Framework | |||
185 | /// <summary> | 185 | /// <summary> |
186 | /// Get the number of stores. | 186 | /// Get the number of stores. |
187 | /// </summary> | 187 | /// </summary> |
188 | public int CountStores | 188 | public int CountStores |
189 | { | 189 | { |
190 | get | 190 | get |
191 | { | 191 | { |
192 | int count = 0; | 192 | int count = 0; |
193 | 193 | ||
@@ -263,8 +263,8 @@ namespace OpenSim.Framework | |||
263 | throw new Exception("Minimum namespace length is " + MIN_NAMESPACE_LENGTH); | 263 | throw new Exception("Minimum namespace length is " + MIN_NAMESPACE_LENGTH); |
264 | } | 264 | } |
265 | 265 | ||
266 | public bool ContainsStore(string ns, string storeName) | 266 | public bool ContainsStore(string ns, string storeName) |
267 | { | 267 | { |
268 | OSD namespaceOsd; | 268 | OSD namespaceOsd; |
269 | 269 | ||
270 | lock (this) | 270 | lock (this) |
@@ -276,7 +276,7 @@ namespace OpenSim.Framework | |||
276 | } | 276 | } |
277 | 277 | ||
278 | return false; | 278 | return false; |
279 | } | 279 | } |
280 | 280 | ||
281 | public bool TryGetStore(string ns, string storeName, out OSDMap store) | 281 | public bool TryGetStore(string ns, string storeName, out OSDMap store) |
282 | { | 282 | { |
@@ -297,17 +297,17 @@ namespace OpenSim.Framework | |||
297 | 297 | ||
298 | store = null; | 298 | store = null; |
299 | return false; | 299 | return false; |
300 | } | 300 | } |
301 | 301 | ||
302 | public void Clear() | 302 | public void Clear() |
303 | { | 303 | { |
304 | lock (this) | 304 | lock (this) |
305 | m_map.Clear(); | 305 | m_map.Clear(); |
306 | } | 306 | } |
307 | 307 | ||
308 | public bool RemoveStore(string ns, string storeName) | 308 | public bool RemoveStore(string ns, string storeName) |
309 | { | 309 | { |
310 | OSD namespaceOsd; | 310 | OSD namespaceOsd; |
311 | 311 | ||
312 | lock (this) | 312 | lock (this) |
313 | { | 313 | { |
@@ -323,6 +323,6 @@ namespace OpenSim.Framework | |||
323 | } | 323 | } |
324 | 324 | ||
325 | return false; | 325 | return false; |
326 | } | 326 | } |
327 | } | 327 | } |
328 | } \ No newline at end of file | 328 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/DOMap.cs b/OpenSim/Framework/DOMap.cs index f5b650b..033cbf9 100644 --- a/OpenSim/Framework/DOMap.cs +++ b/OpenSim/Framework/DOMap.cs | |||
@@ -47,7 +47,7 @@ namespace OpenSim.Framework | |||
47 | public class DOMap | 47 | public class DOMap |
48 | { | 48 | { |
49 | private IDictionary<string, object> m_map; | 49 | private IDictionary<string, object> m_map; |
50 | 50 | ||
51 | public void Add(string ns, string objName, object dynObj) | 51 | public void Add(string ns, string objName, object dynObj) |
52 | { | 52 | { |
53 | DAMap.ValidateNamespace(ns); | 53 | DAMap.ValidateNamespace(ns); |
diff --git a/OpenSim/Framework/DoubleDictionaryThreadAbortSafe.cs b/OpenSim/Framework/DoubleDictionaryThreadAbortSafe.cs index 9056548..816523b 100644 --- a/OpenSim/Framework/DoubleDictionaryThreadAbortSafe.cs +++ b/OpenSim/Framework/DoubleDictionaryThreadAbortSafe.cs | |||
@@ -55,6 +55,11 @@ namespace OpenSim.Framework | |||
55 | Dictionary2 = new Dictionary<TKey2, TValue>(capacity); | 55 | Dictionary2 = new Dictionary<TKey2, TValue>(capacity); |
56 | } | 56 | } |
57 | 57 | ||
58 | ~DoubleDictionaryThreadAbortSafe() | ||
59 | { | ||
60 | rwLock.Dispose(); | ||
61 | } | ||
62 | |||
58 | public void Add(TKey1 key1, TKey2 key2, TValue value) | 63 | public void Add(TKey1 key1, TKey2 key2, TValue value) |
59 | { | 64 | { |
60 | bool gotLock = false; | 65 | bool gotLock = false; |
@@ -64,31 +69,29 @@ namespace OpenSim.Framework | |||
64 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 69 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
65 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 70 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
66 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 71 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
67 | try {} | 72 | try {} |
68 | finally | 73 | finally |
69 | { | 74 | { |
70 | rwLock.EnterWriteLock(); | 75 | rwLock.EnterWriteLock(); |
71 | gotLock = true; | 76 | gotLock = true; |
77 | if (Dictionary1.ContainsKey(key1)) | ||
78 | { | ||
79 | if (!Dictionary2.ContainsKey(key2)) | ||
80 | throw new ArgumentException("key1 exists in the dictionary but not key2"); | ||
81 | } | ||
82 | else if (Dictionary2.ContainsKey(key2)) | ||
83 | { | ||
84 | if (!Dictionary1.ContainsKey(key1)) | ||
85 | throw new ArgumentException("key2 exists in the dictionary but not key1"); | ||
86 | } | ||
87 | Dictionary1[key1] = value; | ||
88 | Dictionary2[key2] = value; | ||
72 | } | 89 | } |
73 | |||
74 | if (Dictionary1.ContainsKey(key1)) | ||
75 | { | ||
76 | if (!Dictionary2.ContainsKey(key2)) | ||
77 | throw new ArgumentException("key1 exists in the dictionary but not key2"); | ||
78 | } | ||
79 | else if (Dictionary2.ContainsKey(key2)) | ||
80 | { | ||
81 | if (!Dictionary1.ContainsKey(key1)) | ||
82 | throw new ArgumentException("key2 exists in the dictionary but not key1"); | ||
83 | } | ||
84 | |||
85 | Dictionary1[key1] = value; | ||
86 | Dictionary2[key2] = value; | ||
87 | } | 90 | } |
88 | finally | 91 | finally |
89 | { | 92 | { |
90 | if (gotLock) | 93 | if (gotLock) |
91 | rwLock.ExitWriteLock(); | 94 | rwLock.ExitWriteLock(); |
92 | } | 95 | } |
93 | } | 96 | } |
94 | 97 | ||
@@ -102,20 +105,19 @@ namespace OpenSim.Framework | |||
102 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 105 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
103 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 106 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
104 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 107 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
105 | try {} | 108 | try {} |
106 | finally | 109 | finally |
107 | { | 110 | { |
108 | rwLock.EnterWriteLock(); | 111 | rwLock.EnterWriteLock(); |
109 | gotLock = true; | 112 | gotLock = true; |
113 | Dictionary1.Remove(key1); | ||
114 | success = Dictionary2.Remove(key2); | ||
110 | } | 115 | } |
111 | |||
112 | Dictionary1.Remove(key1); | ||
113 | success = Dictionary2.Remove(key2); | ||
114 | } | 116 | } |
115 | finally | 117 | finally |
116 | { | 118 | { |
117 | if (gotLock) | 119 | if (gotLock) |
118 | rwLock.ExitWriteLock(); | 120 | rwLock.ExitWriteLock(); |
119 | } | 121 | } |
120 | 122 | ||
121 | return success; | 123 | return success; |
@@ -131,7 +133,7 @@ namespace OpenSim.Framework | |||
131 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 133 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
132 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 134 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
133 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 135 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
134 | try {} | 136 | try {} |
135 | finally | 137 | finally |
136 | { | 138 | { |
137 | rwLock.EnterWriteLock(); | 139 | rwLock.EnterWriteLock(); |
@@ -146,18 +148,22 @@ namespace OpenSim.Framework | |||
146 | { | 148 | { |
147 | if (kvp.Value.Equals(value)) | 149 | if (kvp.Value.Equals(value)) |
148 | { | 150 | { |
149 | Dictionary1.Remove(key1); | 151 | try { } |
150 | Dictionary2.Remove(kvp.Key); | 152 | finally |
153 | { | ||
154 | Dictionary1.Remove(key1); | ||
155 | Dictionary2.Remove(kvp.Key); | ||
156 | } | ||
151 | found = true; | 157 | found = true; |
152 | break; | 158 | break; |
153 | } | 159 | } |
154 | } | 160 | } |
155 | } | 161 | } |
156 | } | 162 | } |
157 | finally | 163 | finally |
158 | { | 164 | { |
159 | if (gotLock) | 165 | if (gotLock) |
160 | rwLock.ExitWriteLock(); | 166 | rwLock.ExitWriteLock(); |
161 | } | 167 | } |
162 | 168 | ||
163 | return found; | 169 | return found; |
@@ -173,7 +179,7 @@ namespace OpenSim.Framework | |||
173 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 179 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
174 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 180 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
175 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 181 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
176 | try {} | 182 | try {} |
177 | finally | 183 | finally |
178 | { | 184 | { |
179 | rwLock.EnterWriteLock(); | 185 | rwLock.EnterWriteLock(); |
@@ -188,18 +194,22 @@ namespace OpenSim.Framework | |||
188 | { | 194 | { |
189 | if (kvp.Value.Equals(value)) | 195 | if (kvp.Value.Equals(value)) |
190 | { | 196 | { |
191 | Dictionary2.Remove(key2); | 197 | try { } |
192 | Dictionary1.Remove(kvp.Key); | 198 | finally |
199 | { | ||
200 | Dictionary2.Remove(key2); | ||
201 | Dictionary1.Remove(kvp.Key); | ||
202 | } | ||
193 | found = true; | 203 | found = true; |
194 | break; | 204 | break; |
195 | } | 205 | } |
196 | } | 206 | } |
197 | } | 207 | } |
198 | } | 208 | } |
199 | finally | 209 | finally |
200 | { | 210 | { |
201 | if (gotLock) | 211 | if (gotLock) |
202 | rwLock.ExitWriteLock(); | 212 | rwLock.ExitWriteLock(); |
203 | } | 213 | } |
204 | 214 | ||
205 | return found; | 215 | return found; |
@@ -214,20 +224,19 @@ namespace OpenSim.Framework | |||
214 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 224 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
215 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 225 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
216 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 226 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
217 | try {} | 227 | try {} |
218 | finally | 228 | finally |
219 | { | 229 | { |
220 | rwLock.EnterWriteLock(); | 230 | rwLock.EnterWriteLock(); |
221 | gotLock = true; | 231 | gotLock = true; |
232 | Dictionary1.Clear(); | ||
233 | Dictionary2.Clear(); | ||
222 | } | 234 | } |
223 | |||
224 | Dictionary1.Clear(); | ||
225 | Dictionary2.Clear(); | ||
226 | } | 235 | } |
227 | finally | 236 | finally |
228 | { | 237 | { |
229 | if (gotLock) | 238 | if (gotLock) |
230 | rwLock.ExitWriteLock(); | 239 | rwLock.ExitWriteLock(); |
231 | } | 240 | } |
232 | } | 241 | } |
233 | 242 | ||
@@ -251,24 +260,24 @@ namespace OpenSim.Framework | |||
251 | bool success; | 260 | bool success; |
252 | bool gotLock = false; | 261 | bool gotLock = false; |
253 | 262 | ||
254 | try | 263 | try |
255 | { | 264 | { |
256 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 265 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
257 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 266 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
258 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 267 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
259 | try {} | 268 | try {} |
260 | finally | 269 | finally |
261 | { | 270 | { |
262 | rwLock.EnterReadLock(); | 271 | rwLock.EnterReadLock(); |
263 | gotLock = true; | 272 | gotLock = true; |
264 | } | 273 | } |
265 | 274 | ||
266 | success = Dictionary1.TryGetValue(key, out value); | 275 | success = Dictionary1.TryGetValue(key, out value); |
267 | } | 276 | } |
268 | finally | 277 | finally |
269 | { | 278 | { |
270 | if (gotLock) | 279 | if (gotLock) |
271 | rwLock.ExitReadLock(); | 280 | rwLock.ExitReadLock(); |
272 | } | 281 | } |
273 | 282 | ||
274 | return success; | 283 | return success; |
@@ -279,24 +288,24 @@ namespace OpenSim.Framework | |||
279 | bool success; | 288 | bool success; |
280 | bool gotLock = false; | 289 | bool gotLock = false; |
281 | 290 | ||
282 | try | 291 | try |
283 | { | 292 | { |
284 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 293 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
285 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 294 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
286 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 295 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
287 | try {} | 296 | try {} |
288 | finally | 297 | finally |
289 | { | 298 | { |
290 | rwLock.EnterReadLock(); | 299 | rwLock.EnterReadLock(); |
291 | gotLock = true; | 300 | gotLock = true; |
292 | } | 301 | } |
293 | 302 | ||
294 | success = Dictionary2.TryGetValue(key, out value); | 303 | success = Dictionary2.TryGetValue(key, out value); |
295 | } | 304 | } |
296 | finally | 305 | finally |
297 | { | 306 | { |
298 | if (gotLock) | 307 | if (gotLock) |
299 | rwLock.ExitReadLock(); | 308 | rwLock.ExitReadLock(); |
300 | } | 309 | } |
301 | 310 | ||
302 | return success; | 311 | return success; |
@@ -311,7 +320,7 @@ namespace OpenSim.Framework | |||
311 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 320 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
312 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 321 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
313 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 322 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
314 | try {} | 323 | try {} |
315 | finally | 324 | finally |
316 | { | 325 | { |
317 | rwLock.EnterReadLock(); | 326 | rwLock.EnterReadLock(); |
@@ -321,10 +330,10 @@ namespace OpenSim.Framework | |||
321 | foreach (TValue value in Dictionary1.Values) | 330 | foreach (TValue value in Dictionary1.Values) |
322 | action(value); | 331 | action(value); |
323 | } | 332 | } |
324 | finally | 333 | finally |
325 | { | 334 | { |
326 | if (gotLock) | 335 | if (gotLock) |
327 | rwLock.ExitReadLock(); | 336 | rwLock.ExitReadLock(); |
328 | } | 337 | } |
329 | } | 338 | } |
330 | 339 | ||
@@ -337,7 +346,7 @@ namespace OpenSim.Framework | |||
337 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 346 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
338 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 347 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
339 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 348 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
340 | try {} | 349 | try {} |
341 | finally | 350 | finally |
342 | { | 351 | { |
343 | rwLock.EnterReadLock(); | 352 | rwLock.EnterReadLock(); |
@@ -347,10 +356,10 @@ namespace OpenSim.Framework | |||
347 | foreach (KeyValuePair<TKey1, TValue> entry in Dictionary1) | 356 | foreach (KeyValuePair<TKey1, TValue> entry in Dictionary1) |
348 | action(entry); | 357 | action(entry); |
349 | } | 358 | } |
350 | finally | 359 | finally |
351 | { | 360 | { |
352 | if (gotLock) | 361 | if (gotLock) |
353 | rwLock.ExitReadLock(); | 362 | rwLock.ExitReadLock(); |
354 | } | 363 | } |
355 | } | 364 | } |
356 | 365 | ||
@@ -363,7 +372,7 @@ namespace OpenSim.Framework | |||
363 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 372 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
364 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 373 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
365 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 374 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
366 | try {} | 375 | try {} |
367 | finally | 376 | finally |
368 | { | 377 | { |
369 | rwLock.EnterReadLock(); | 378 | rwLock.EnterReadLock(); |
@@ -373,10 +382,10 @@ namespace OpenSim.Framework | |||
373 | foreach (KeyValuePair<TKey2, TValue> entry in Dictionary2) | 382 | foreach (KeyValuePair<TKey2, TValue> entry in Dictionary2) |
374 | action(entry); | 383 | action(entry); |
375 | } | 384 | } |
376 | finally | 385 | finally |
377 | { | 386 | { |
378 | if (gotLock) | 387 | if (gotLock) |
379 | rwLock.ExitReadLock(); | 388 | rwLock.ExitReadLock(); |
380 | } | 389 | } |
381 | } | 390 | } |
382 | 391 | ||
@@ -389,7 +398,7 @@ namespace OpenSim.Framework | |||
389 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 398 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
390 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 399 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
391 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 400 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
392 | try {} | 401 | try {} |
393 | finally | 402 | finally |
394 | { | 403 | { |
395 | rwLock.EnterReadLock(); | 404 | rwLock.EnterReadLock(); |
@@ -402,10 +411,10 @@ namespace OpenSim.Framework | |||
402 | return value; | 411 | return value; |
403 | } | 412 | } |
404 | } | 413 | } |
405 | finally | 414 | finally |
406 | { | 415 | { |
407 | if (gotLock) | 416 | if (gotLock) |
408 | rwLock.ExitReadLock(); | 417 | rwLock.ExitReadLock(); |
409 | } | 418 | } |
410 | 419 | ||
411 | return default(TValue); | 420 | return default(TValue); |
@@ -421,7 +430,7 @@ namespace OpenSim.Framework | |||
421 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 430 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
422 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 431 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
423 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 432 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
424 | try {} | 433 | try {} |
425 | finally | 434 | finally |
426 | { | 435 | { |
427 | rwLock.EnterReadLock(); | 436 | rwLock.EnterReadLock(); |
@@ -434,10 +443,10 @@ namespace OpenSim.Framework | |||
434 | list.Add(value); | 443 | list.Add(value); |
435 | } | 444 | } |
436 | } | 445 | } |
437 | finally | 446 | finally |
438 | { | 447 | { |
439 | if (gotLock) | 448 | if (gotLock) |
440 | rwLock.ExitReadLock(); | 449 | rwLock.ExitReadLock(); |
441 | } | 450 | } |
442 | 451 | ||
443 | return list; | 452 | return list; |
@@ -453,7 +462,7 @@ namespace OpenSim.Framework | |||
453 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing | 462 | // Avoid an asynchronous Thread.Abort() from possibly never existing an acquired lock by placing |
454 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot | 463 | // the acquision inside the main try. The inner finally block is needed because thread aborts cannot |
455 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). | 464 | // interrupt code in these blocks (hence gotLock is guaranteed to be set correctly). |
456 | try {} | 465 | try {} |
457 | finally | 466 | finally |
458 | { | 467 | { |
459 | rwLock.EnterUpgradeableReadLock(); | 468 | rwLock.EnterUpgradeableReadLock(); |
@@ -477,29 +486,29 @@ namespace OpenSim.Framework | |||
477 | 486 | ||
478 | try | 487 | try |
479 | { | 488 | { |
480 | try {} | 489 | try {} |
481 | finally | 490 | finally |
482 | { | 491 | { |
483 | rwLock.EnterUpgradeableReadLock(); | 492 | rwLock.EnterWriteLock(); |
484 | gotWriteLock = true; | 493 | gotWriteLock = true; |
485 | } | ||
486 | 494 | ||
487 | for (int i = 0; i < list.Count; i++) | 495 | for (int i = 0; i < list.Count; i++) |
488 | Dictionary1.Remove(list[i]); | 496 | Dictionary1.Remove(list[i]); |
489 | 497 | ||
490 | for (int i = 0; i < list2.Count; i++) | 498 | for (int i = 0; i < list2.Count; i++) |
491 | Dictionary2.Remove(list2[i]); | 499 | Dictionary2.Remove(list2[i]); |
500 | } | ||
492 | } | 501 | } |
493 | finally | 502 | finally |
494 | { | 503 | { |
495 | if (gotWriteLock) | 504 | if (gotWriteLock) |
496 | rwLock.ExitWriteLock(); | 505 | rwLock.ExitWriteLock(); |
497 | } | 506 | } |
498 | } | 507 | } |
499 | finally | 508 | finally |
500 | { | 509 | { |
501 | if (gotUpgradeableLock) | 510 | if (gotUpgradeableLock) |
502 | rwLock.ExitUpgradeableReadLock(); | 511 | rwLock.ExitUpgradeableReadLock(); |
503 | } | 512 | } |
504 | 513 | ||
505 | return list.Count; | 514 | return list.Count; |
diff --git a/OpenSim/Framework/EntityTransferContext.cs b/OpenSim/Framework/EntityTransferContext.cs new file mode 100644 index 0000000..860414e --- /dev/null +++ b/OpenSim/Framework/EntityTransferContext.cs | |||
@@ -0,0 +1,70 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using OpenMetaverse; | ||
31 | using OpenMetaverse.StructuredData; | ||
32 | |||
33 | namespace OpenSim.Framework | ||
34 | { | ||
35 | public class EntityTransferContext | ||
36 | { | ||
37 | public EntityTransferContext() | ||
38 | { | ||
39 | InboundVersion = VersionInfo.SimulationServiceVersionAcceptedMax; | ||
40 | OutboundVersion = VersionInfo.SimulationServiceVersionSupportedMax; | ||
41 | WearablesCount = -1; | ||
42 | } | ||
43 | |||
44 | public float InboundVersion { get; set; } | ||
45 | public float OutboundVersion { get; set; } | ||
46 | public int WearablesCount { get; set; } | ||
47 | |||
48 | public OSD Pack() | ||
49 | { | ||
50 | OSDMap data = new OSDMap(); | ||
51 | data["InboundVersion"] = OSD.FromReal(InboundVersion); | ||
52 | data["OutboundVersion"] = OSD.FromReal(OutboundVersion); | ||
53 | data["WearablesCount"] = OSD.FromInteger(WearablesCount); | ||
54 | |||
55 | return data; | ||
56 | } | ||
57 | |||
58 | public void Unpack(OSD data) | ||
59 | { | ||
60 | OSDMap map = (OSDMap)data; | ||
61 | |||
62 | if (map.ContainsKey("InboundVersion")) | ||
63 | InboundVersion = (float)map["InboundVersion"].AsReal(); | ||
64 | if (map.ContainsKey("OutboundVersion")) | ||
65 | OutboundVersion = (float)map["OutboundVersion"].AsReal(); | ||
66 | if (map.ContainsKey("WearablesCount")) | ||
67 | WearablesCount = map["WearablesCount"].AsInteger(); | ||
68 | } | ||
69 | } | ||
70 | } | ||
diff --git a/OpenSim/Framework/EstateBan.cs b/OpenSim/Framework/EstateBan.cs index ebed794..12a92bb 100644 --- a/OpenSim/Framework/EstateBan.cs +++ b/OpenSim/Framework/EstateBan.cs | |||
@@ -43,7 +43,7 @@ namespace OpenSim.Framework | |||
43 | { | 43 | { |
44 | get | 44 | get |
45 | { | 45 | { |
46 | return m_estateID; | 46 | return m_estateID; |
47 | } | 47 | } |
48 | set | 48 | set |
49 | { | 49 | { |
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 4df7860..8c8270a 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs | |||
@@ -305,11 +305,17 @@ namespace OpenSim.Framework | |||
305 | OnSave(this); | 305 | OnSave(this); |
306 | } | 306 | } |
307 | 307 | ||
308 | public int EstateUsersCount() | ||
309 | { | ||
310 | return l_EstateAccess.Count; | ||
311 | } | ||
312 | |||
308 | public void AddEstateUser(UUID avatarID) | 313 | public void AddEstateUser(UUID avatarID) |
309 | { | 314 | { |
310 | if (avatarID == UUID.Zero) | 315 | if (avatarID == UUID.Zero) |
311 | return; | 316 | return; |
312 | if (!l_EstateAccess.Contains(avatarID)) | 317 | if (!l_EstateAccess.Contains(avatarID) && |
318 | (l_EstateAccess.Count < (int)Constants.EstateAccessLimits.AllowedAccess)) | ||
313 | l_EstateAccess.Add(avatarID); | 319 | l_EstateAccess.Add(avatarID); |
314 | } | 320 | } |
315 | 321 | ||
@@ -319,11 +325,17 @@ namespace OpenSim.Framework | |||
319 | l_EstateAccess.Remove(avatarID); | 325 | l_EstateAccess.Remove(avatarID); |
320 | } | 326 | } |
321 | 327 | ||
328 | public int EstateGroupsCount() | ||
329 | { | ||
330 | return l_EstateGroups.Count; | ||
331 | } | ||
332 | |||
322 | public void AddEstateGroup(UUID avatarID) | 333 | public void AddEstateGroup(UUID avatarID) |
323 | { | 334 | { |
324 | if (avatarID == UUID.Zero) | 335 | if (avatarID == UUID.Zero) |
325 | return; | 336 | return; |
326 | if (!l_EstateGroups.Contains(avatarID)) | 337 | if (!l_EstateGroups.Contains(avatarID) && |
338 | (l_EstateGroups.Count < (int)Constants.EstateAccessLimits.AllowedGroups)) | ||
327 | l_EstateGroups.Add(avatarID); | 339 | l_EstateGroups.Add(avatarID); |
328 | } | 340 | } |
329 | 341 | ||
@@ -333,11 +345,17 @@ namespace OpenSim.Framework | |||
333 | l_EstateGroups.Remove(avatarID); | 345 | l_EstateGroups.Remove(avatarID); |
334 | } | 346 | } |
335 | 347 | ||
348 | public int EstateManagersCount() | ||
349 | { | ||
350 | return l_EstateManagers.Count; | ||
351 | } | ||
352 | |||
336 | public void AddEstateManager(UUID avatarID) | 353 | public void AddEstateManager(UUID avatarID) |
337 | { | 354 | { |
338 | if (avatarID == UUID.Zero) | 355 | if (avatarID == UUID.Zero) |
339 | return; | 356 | return; |
340 | if (!l_EstateManagers.Contains(avatarID)) | 357 | if (!l_EstateManagers.Contains(avatarID) && |
358 | (l_EstateManagers.Count < (int)Constants.EstateAccessLimits.EstateManagers)) | ||
341 | l_EstateManagers.Add(avatarID); | 359 | l_EstateManagers.Add(avatarID); |
342 | } | 360 | } |
343 | 361 | ||
@@ -365,17 +383,55 @@ namespace OpenSim.Framework | |||
365 | 383 | ||
366 | public bool IsBanned(UUID avatarID) | 384 | public bool IsBanned(UUID avatarID) |
367 | { | 385 | { |
368 | foreach (EstateBan ban in l_EstateBans) | 386 | if (!IsEstateManagerOrOwner(avatarID)) |
387 | { | ||
388 | foreach (EstateBan ban in l_EstateBans) | ||
389 | if (ban.BannedUserID == avatarID) | ||
390 | return true; | ||
391 | } | ||
392 | return false; | ||
393 | } | ||
394 | |||
395 | public bool IsBanned(UUID avatarID, int userFlags) | ||
396 | { | ||
397 | if (!IsEstateManagerOrOwner(avatarID)) | ||
398 | { | ||
399 | foreach (EstateBan ban in l_EstateBans) | ||
369 | if (ban.BannedUserID == avatarID) | 400 | if (ban.BannedUserID == avatarID) |
370 | return true; | 401 | return true; |
402 | |||
403 | if (!HasAccess(avatarID)) | ||
404 | { | ||
405 | if (DenyMinors) | ||
406 | { | ||
407 | if ((userFlags & 32) == 0) | ||
408 | { | ||
409 | return true; | ||
410 | } | ||
411 | } | ||
412 | if (DenyAnonymous) | ||
413 | { | ||
414 | if ((userFlags & 4) == 0) | ||
415 | { | ||
416 | return true; | ||
417 | } | ||
418 | } | ||
419 | } | ||
420 | } | ||
371 | return false; | 421 | return false; |
372 | } | 422 | } |
373 | 423 | ||
424 | public int EstateBansCount() | ||
425 | { | ||
426 | return l_EstateBans.Count; | ||
427 | } | ||
428 | |||
374 | public void AddBan(EstateBan ban) | 429 | public void AddBan(EstateBan ban) |
375 | { | 430 | { |
376 | if (ban == null) | 431 | if (ban == null) |
377 | return; | 432 | return; |
378 | if (!IsBanned(ban.BannedUserID)) | 433 | if (!IsBanned(ban.BannedUserID, 32) && |
434 | (l_EstateBans.Count < (int)Constants.EstateAccessLimits.EstateBans)) //Ignore age-based bans | ||
379 | l_EstateBans.Add(ban); | 435 | l_EstateBans.Add(ban); |
380 | } | 436 | } |
381 | 437 | ||
@@ -516,14 +572,41 @@ namespace OpenSim.Framework | |||
516 | 572 | ||
517 | // EstateBans are special | 573 | // EstateBans are special |
518 | if (map.ContainsKey("EstateBans")) | 574 | if (map.ContainsKey("EstateBans")) |
519 | { | 575 | { |
520 | var banData = ((Dictionary<string, object>)map["EstateBans"]).Values; | 576 | if(map["EstateBans"] is string) |
521 | EstateBan[] bans = new EstateBan[banData.Count]; | 577 | { |
522 | int b = 0; | 578 | // JSON encoded bans map |
523 | foreach (Dictionary<string, object> ban in banData) | 579 | Dictionary<string, EstateBan> bdata = new Dictionary<string, EstateBan>(); |
524 | bans[b++] = new EstateBan(ban); | 580 | try |
525 | PropertyInfo bansProperty = this.GetType().GetProperty("EstateBans", BindingFlags.Public | BindingFlags.Instance); | 581 | { |
526 | bansProperty.SetValue(this, bans, null); | 582 | // bypass libovm, we dont need even more useless high level maps |
583 | // this should only be called once.. but no problem, i hope | ||
584 | // (other uses may need more..) | ||
585 | LitJson.JsonMapper.RegisterImporter<string, UUID>((input) => new UUID(input)); | ||
586 | bdata = LitJson.JsonMapper.ToObject<Dictionary<string,EstateBan>>((string)map["EstateBans"]); | ||
587 | } | ||
588 | // catch(Exception e) | ||
589 | catch | ||
590 | { | ||
591 | return; | ||
592 | } | ||
593 | EstateBan[] jbans = new EstateBan[bdata.Count]; | ||
594 | bdata.Values.CopyTo(jbans,0); | ||
595 | |||
596 | PropertyInfo jbansProperty = this.GetType().GetProperty("EstateBans", BindingFlags.Public | BindingFlags.Instance); | ||
597 | jbansProperty.SetValue(this, jbans, null); | ||
598 | } | ||
599 | else | ||
600 | { | ||
601 | var banData = ((Dictionary<string, object>)map["EstateBans"]).Values; | ||
602 | EstateBan[] bans = new EstateBan[banData.Count]; | ||
603 | |||
604 | int b = 0; | ||
605 | foreach (Dictionary<string, object> ban in banData) | ||
606 | bans[b++] = new EstateBan(ban); | ||
607 | PropertyInfo bansProperty = this.GetType().GetProperty("EstateBans", BindingFlags.Public | BindingFlags.Instance); | ||
608 | bansProperty.SetValue(this, bans, null); | ||
609 | } | ||
527 | } | 610 | } |
528 | } | 611 | } |
529 | } | 612 | } |
diff --git a/OpenSim/Framework/GridInstantMessage.cs b/OpenSim/Framework/GridInstantMessage.cs index da3690c..1605005 100644 --- a/OpenSim/Framework/GridInstantMessage.cs +++ b/OpenSim/Framework/GridInstantMessage.cs | |||
@@ -66,6 +66,7 @@ namespace OpenSim.Framework | |||
66 | Position = im.Position; | 66 | Position = im.Position; |
67 | binaryBucket = im.binaryBucket; | 67 | binaryBucket = im.binaryBucket; |
68 | RegionID = im.RegionID; | 68 | RegionID = im.RegionID; |
69 | ParentEstateID = im.ParentEstateID; | ||
69 | 70 | ||
70 | if (addTimestamp) | 71 | if (addTimestamp) |
71 | timestamp = (uint)Util.UnixTimeSinceEpoch(); | 72 | timestamp = (uint)Util.UnixTimeSinceEpoch(); |
@@ -84,6 +85,7 @@ namespace OpenSim.Framework | |||
84 | fromGroup = _fromGroup; | 85 | fromGroup = _fromGroup; |
85 | message = _message; | 86 | message = _message; |
86 | imSessionID = _imSessionID.Guid; | 87 | imSessionID = _imSessionID.Guid; |
88 | |||
87 | if (_offline) | 89 | if (_offline) |
88 | offline = 1; | 90 | offline = 1; |
89 | else | 91 | else |
diff --git a/OpenSim/Framework/IImprovedAssetCache.cs b/OpenSim/Framework/IAssetCache.cs index a853e90..2df9199 100644 --- a/OpenSim/Framework/IImprovedAssetCache.cs +++ b/OpenSim/Framework/IAssetCache.cs | |||
@@ -29,7 +29,7 @@ using OpenSim.Framework; | |||
29 | 29 | ||
30 | namespace OpenSim.Framework | 30 | namespace OpenSim.Framework |
31 | { | 31 | { |
32 | public interface IImprovedAssetCache | 32 | public interface IAssetCache |
33 | { | 33 | { |
34 | /// <summary> | 34 | /// <summary> |
35 | /// Cache the specified asset. | 35 | /// Cache the specified asset. |
@@ -38,11 +38,18 @@ namespace OpenSim.Framework | |||
38 | void Cache(AssetBase asset); | 38 | void Cache(AssetBase asset); |
39 | 39 | ||
40 | /// <summary> | 40 | /// <summary> |
41 | /// Cache that the specified asset wasn't found. | ||
42 | /// </summary> | ||
43 | /// <param name='id'></param> | ||
44 | /// <summary> | ||
45 | void CacheNegative(string id); | ||
46 | |||
41 | /// Get an asset by its id. | 47 | /// Get an asset by its id. |
42 | /// </summary> | 48 | /// </summary> |
43 | /// <param name='id'></param> | 49 | /// <param name='id'></param> |
44 | /// <returns>null if the asset does not exist.</returns> | 50 | /// <param name='asset'>Will be set to null if no asset was found</param> |
45 | AssetBase Get(string id); | 51 | /// <returns>False if the asset has been negative-cached</returns> |
52 | bool Get(string id, out AssetBase asset); | ||
46 | 53 | ||
47 | /// <summary> | 54 | /// <summary> |
48 | /// Check whether an asset with the specified id exists in the cache. | 55 | /// Check whether an asset with the specified id exists in the cache. |
@@ -61,4 +68,4 @@ namespace OpenSim.Framework | |||
61 | /// </summary> | 68 | /// </summary> |
62 | void Clear(); | 69 | void Clear(); |
63 | } | 70 | } |
64 | } \ No newline at end of file | 71 | } |
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index e36edb2..a9044d5 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs | |||
@@ -47,10 +47,12 @@ namespace OpenSim.Framework | |||
47 | 47 | ||
48 | public delegate void ImprovedInstantMessage(IClientAPI remoteclient, GridInstantMessage im); | 48 | public delegate void ImprovedInstantMessage(IClientAPI remoteclient, GridInstantMessage im); |
49 | 49 | ||
50 | public delegate void RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, | 50 | public delegate void RezObject(IClientAPI remoteClient, UUID itemID, UUID GroupID, |
51 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | 51 | Vector3 RayEnd, Vector3 RayStart, |
52 | bool RezSelected, bool RemoveItem, UUID fromTaskID); | 52 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, |
53 | bool RezSelected, bool RemoveItem, UUID fromTaskID); | ||
53 | 54 | ||
55 | public delegate void RezRestoreToWorld(IClientAPI remoteClient, UUID itemId); | ||
54 | public delegate ISceneEntity RezSingleAttachmentFromInv(IClientAPI remoteClient, UUID itemID, uint AttachmentPt); | 56 | public delegate ISceneEntity RezSingleAttachmentFromInv(IClientAPI remoteClient, UUID itemID, uint AttachmentPt); |
55 | 57 | ||
56 | public delegate void RezMultipleAttachmentsFromInv(IClientAPI remoteClient, List<KeyValuePair<UUID, uint>> rezlist ); | 58 | public delegate void RezMultipleAttachmentsFromInv(IClientAPI remoteClient, List<KeyValuePair<UUID, uint>> rezlist ); |
@@ -58,20 +60,21 @@ namespace OpenSim.Framework | |||
58 | public delegate void ObjectAttach( | 60 | public delegate void ObjectAttach( |
59 | IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent); | 61 | IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent); |
60 | 62 | ||
61 | public delegate void ModifyTerrain(UUID user, | 63 | public delegate void ModifyTerrain(UUID user, |
62 | float height, float seconds, byte size, byte action, float north, float west, float south, float east, | 64 | float height, float seconds, byte size, byte action, float north, float west, float south, float east, |
63 | UUID agentId); | 65 | UUID agentId); |
64 | 66 | ||
65 | public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes); | 67 | public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes); |
66 | 68 | ||
67 | public delegate void CachedTextureRequest(IClientAPI remoteClient, int serial, List<CachedTextureRequestArg> cachedTextureRequest); | ||
68 | |||
69 | public delegate void SetAppearance(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 AvSize, WearableCacheItem[] CacheItems); | 69 | public delegate void SetAppearance(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 AvSize, WearableCacheItem[] CacheItems); |
70 | public delegate void CachedTextureRequest(IClientAPI remoteClient, int serial, List<CachedTextureRequestArg> cachedTextureRequest); | ||
70 | 71 | ||
71 | public delegate void StartAnim(IClientAPI remoteClient, UUID animID); | 72 | public delegate void StartAnim(IClientAPI remoteClient, UUID animID); |
72 | 73 | ||
73 | public delegate void StopAnim(IClientAPI remoteClient, UUID animID); | 74 | public delegate void StopAnim(IClientAPI remoteClient, UUID animID); |
74 | 75 | ||
76 | public delegate void ChangeAnim(UUID animID, bool addOrRemove, bool sendPack); | ||
77 | |||
75 | public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children); | 78 | public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children); |
76 | 79 | ||
77 | public delegate void DelinkObjects(List<uint> primIds, IClientAPI client); | 80 | public delegate void DelinkObjects(List<uint> primIds, IClientAPI client); |
@@ -104,7 +107,7 @@ namespace OpenSim.Framework | |||
104 | public delegate void GenericCall4(Packet packet, IClientAPI remoteClient); | 107 | public delegate void GenericCall4(Packet packet, IClientAPI remoteClient); |
105 | 108 | ||
106 | public delegate void DeRezObject( | 109 | public delegate void DeRezObject( |
107 | IClientAPI remoteClient, List<uint> localIDs, UUID groupID, DeRezAction action, UUID destinationID); | 110 | IClientAPI remoteClient, List<uint> localIDs, UUID groupID, DeRezAction action, UUID destinationID, bool AddToReturns = true); |
108 | 111 | ||
109 | public delegate void GenericCall5(IClientAPI remoteClient, bool status); | 112 | public delegate void GenericCall5(IClientAPI remoteClient, bool status); |
110 | 113 | ||
@@ -114,7 +117,7 @@ namespace OpenSim.Framework | |||
114 | 117 | ||
115 | public delegate void ObjectExtraParams(UUID agentID, uint localID, ushort type, bool inUse, byte[] data); | 118 | public delegate void ObjectExtraParams(UUID agentID, uint localID, ushort type, bool inUse, byte[] data); |
116 | 119 | ||
117 | public delegate void ObjectSelect(uint localID, IClientAPI remoteClient); | 120 | public delegate void ObjectSelect(List<uint> localID, IClientAPI remoteClient); |
118 | 121 | ||
119 | public delegate void ObjectRequest(uint localID, IClientAPI remoteClient); | 122 | public delegate void ObjectRequest(uint localID, IClientAPI remoteClient); |
120 | 123 | ||
@@ -132,6 +135,8 @@ namespace OpenSim.Framework | |||
132 | 135 | ||
133 | public delegate void UpdateVector(uint localID, Vector3 pos, IClientAPI remoteClient); | 136 | public delegate void UpdateVector(uint localID, Vector3 pos, IClientAPI remoteClient); |
134 | 137 | ||
138 | public delegate void ClientChangeObject(uint localID, object data ,IClientAPI remoteClient); | ||
139 | |||
135 | public delegate void UpdatePrimRotation(uint localID, Quaternion rot, IClientAPI remoteClient); | 140 | public delegate void UpdatePrimRotation(uint localID, Quaternion rot, IClientAPI remoteClient); |
136 | 141 | ||
137 | public delegate void UpdatePrimSingleRotation(uint localID, Quaternion rot, IClientAPI remoteClient); | 142 | public delegate void UpdatePrimSingleRotation(uint localID, Quaternion rot, IClientAPI remoteClient); |
@@ -222,10 +227,10 @@ namespace OpenSim.Framework | |||
222 | byte RayEndIsIntersection); | 227 | byte RayEndIsIntersection); |
223 | 228 | ||
224 | public delegate void RequestGodlikePowers( | 229 | public delegate void RequestGodlikePowers( |
225 | UUID AgentID, UUID SessionID, UUID token, bool GodLike, IClientAPI remote_client); | 230 | UUID AgentID, UUID SessionID, UUID token, bool GodLike); |
226 | 231 | ||
227 | public delegate void GodKickUser( | 232 | public delegate void GodKickUser( |
228 | UUID GodAgentID, UUID GodSessionID, UUID AgentID, uint kickflags, byte[] reason); | 233 | UUID GodAgentID, UUID AgentID, uint kickflags, byte[] reason); |
229 | 234 | ||
230 | public delegate void CreateInventoryFolder( | 235 | public delegate void CreateInventoryFolder( |
231 | IClientAPI remoteClient, UUID folderID, ushort folderType, string folderName, UUID parentID); | 236 | IClientAPI remoteClient, UUID folderID, ushort folderType, string folderName, UUID parentID); |
@@ -238,7 +243,7 @@ namespace OpenSim.Framework | |||
238 | 243 | ||
239 | public delegate void CreateNewInventoryItem( | 244 | public delegate void CreateNewInventoryItem( |
240 | IClientAPI remoteClient, UUID transActionID, UUID folderID, uint callbackID, string description, string name, | 245 | IClientAPI remoteClient, UUID transActionID, UUID folderID, uint callbackID, string description, string name, |
241 | sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask, int creationDate); | 246 | sbyte invType, sbyte type, byte wearableType, uint everyoneMask, int creationDate); |
242 | 247 | ||
243 | public delegate void LinkInventoryItem( | 248 | public delegate void LinkInventoryItem( |
244 | IClientAPI remoteClient, UUID transActionID, UUID folderID, uint callbackID, string description, string name, | 249 | IClientAPI remoteClient, UUID transActionID, UUID folderID, uint callbackID, string description, string name, |
@@ -268,6 +273,9 @@ namespace OpenSim.Framework | |||
268 | public delegate void MoveInventoryItem( | 273 | public delegate void MoveInventoryItem( |
269 | IClientAPI remoteClient, List<InventoryItemBase> items); | 274 | IClientAPI remoteClient, List<InventoryItemBase> items); |
270 | 275 | ||
276 | public delegate void MoveItemsAndLeaveCopy( | ||
277 | IClientAPI remoteClient, List<InventoryItemBase> items, UUID destFolder); | ||
278 | |||
271 | public delegate void RemoveInventoryItem( | 279 | public delegate void RemoveInventoryItem( |
272 | IClientAPI remoteClient, List<UUID> itemIDs); | 280 | IClientAPI remoteClient, List<UUID> itemIDs); |
273 | 281 | ||
@@ -443,6 +451,7 @@ namespace OpenSim.Framework | |||
443 | public delegate void ClassifiedInfoRequest(UUID classifiedID, IClientAPI client); | 451 | public delegate void ClassifiedInfoRequest(UUID classifiedID, IClientAPI client); |
444 | public delegate void ClassifiedInfoUpdate(UUID classifiedID, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, Vector3 globalPos, byte classifiedFlags, int price, IClientAPI client); | 452 | public delegate void ClassifiedInfoUpdate(UUID classifiedID, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, Vector3 globalPos, byte classifiedFlags, int price, IClientAPI client); |
445 | public delegate void ClassifiedDelete(UUID classifiedID, IClientAPI client); | 453 | public delegate void ClassifiedDelete(UUID classifiedID, IClientAPI client); |
454 | public delegate void ClassifiedGodDelete(UUID classifiedID, UUID queryID, IClientAPI client); | ||
446 | 455 | ||
447 | public delegate void EventNotificationAddRequest(uint EventID, IClientAPI client); | 456 | public delegate void EventNotificationAddRequest(uint EventID, IClientAPI client); |
448 | public delegate void EventNotificationRemoveRequest(uint EventID, IClientAPI client); | 457 | public delegate void EventNotificationRemoveRequest(uint EventID, IClientAPI client); |
@@ -464,47 +473,48 @@ namespace OpenSim.Framework | |||
464 | public delegate void PlacesQuery(UUID QueryID, UUID TransactionID, string QueryText, uint QueryFlags, byte Category, string SimName, IClientAPI client); | 473 | public delegate void PlacesQuery(UUID QueryID, UUID TransactionID, string QueryText, uint QueryFlags, byte Category, string SimName, IClientAPI client); |
465 | 474 | ||
466 | public delegate void AgentFOV(IClientAPI client, float verticalAngle); | 475 | public delegate void AgentFOV(IClientAPI client, float verticalAngle); |
467 | 476 | ||
468 | public delegate void MuteListEntryUpdate(IClientAPI client, UUID MuteID, string Name, int Flags,UUID AgentID); | 477 | public delegate void MuteListEntryUpdate(IClientAPI client, UUID MuteID, string Name, int type, uint flags); |
469 | 478 | ||
470 | public delegate void MuteListEntryRemove(IClientAPI client, UUID MuteID, string Name, UUID AgentID); | 479 | public delegate void MuteListEntryRemove(IClientAPI client, UUID MuteID, string Name); |
471 | 480 | ||
472 | public delegate void AvatarInterestReply(IClientAPI client,UUID target, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages); | 481 | public delegate void AvatarInterestReply(IClientAPI client,UUID target, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages); |
473 | 482 | ||
474 | public delegate void FindAgentUpdate(IClientAPI client, UUID hunter, UUID target); | 483 | public delegate void FindAgentUpdate(IClientAPI client, UUID hunter, UUID target); |
475 | 484 | ||
476 | public delegate void TrackAgentUpdate(IClientAPI client, UUID hunter, UUID target); | 485 | public delegate void TrackAgentUpdate(IClientAPI client, UUID hunter, UUID target); |
477 | 486 | ||
478 | public delegate void FreezeUserUpdate(IClientAPI client, UUID parcelowner,uint flags, UUID target); | 487 | public delegate void FreezeUserUpdate(IClientAPI client, UUID parcelowner,uint flags, UUID target); |
479 | 488 | ||
480 | public delegate void EjectUserUpdate(IClientAPI client, UUID parcelowner,uint flags, UUID target); | 489 | public delegate void EjectUserUpdate(IClientAPI client, UUID parcelowner,uint flags, UUID target); |
481 | 490 | ||
482 | public delegate void NewUserReport(IClientAPI client, string regionName,UUID abuserID, byte catagory, byte checkflags, string details, UUID objectID, Vector3 postion, byte reportType ,UUID screenshotID, string Summary, UUID reporter); | 491 | public delegate void NewUserReport(IClientAPI client, string regionName,UUID abuserID, byte catagory, byte checkflags, string details, UUID objectID, Vector3 postion, byte reportType ,UUID screenshotID, string Summary, UUID reporter); |
483 | 492 | ||
484 | public delegate void GodUpdateRegionInfoUpdate(IClientAPI client, float BillableFactor, ulong EstateID, ulong RegionFlags, byte[] SimName,int RedirectX, int RedirectY); | 493 | public delegate void GodUpdateRegionInfoUpdate(IClientAPI client, float BillableFactor, ulong EstateID, ulong RegionFlags, byte[] SimName,int RedirectX, int RedirectY); |
485 | 494 | ||
486 | public delegate void GodlikeMessage(IClientAPI client, UUID requester, byte[] Method, byte[] Parameter); | 495 | public delegate void GodlikeMessage(IClientAPI client, UUID requester, byte[] Method, byte[] Parameter); |
487 | 496 | ||
488 | public delegate void SaveStateHandler(IClientAPI client,UUID agentID); | 497 | public delegate void SaveStateHandler(IClientAPI client,UUID agentID); |
489 | 498 | ||
490 | public delegate void GroupAccountSummaryRequest(IClientAPI client,UUID agentID, UUID groupID); | 499 | public delegate void GroupAccountSummaryRequest(IClientAPI client,UUID agentID, UUID groupID); |
491 | 500 | ||
492 | public delegate void GroupAccountDetailsRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); | 501 | public delegate void GroupAccountDetailsRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); |
493 | 502 | ||
494 | public delegate void GroupAccountTransactionsRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); | 503 | public delegate void GroupAccountTransactionsRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); |
495 | 504 | ||
496 | public delegate void ParcelBuyPass(IClientAPI client, UUID agentID, int ParcelLocalID); | 505 | public delegate void ParcelBuyPass(IClientAPI client, UUID agentID, int ParcelLocalID); |
497 | 506 | ||
498 | public delegate void ParcelGodMark(IClientAPI client, UUID agentID, int ParcelLocalID); | 507 | public delegate void ParcelGodMark(IClientAPI client, UUID agentID, int ParcelLocalID); |
499 | 508 | ||
500 | public delegate void GroupActiveProposalsRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); | 509 | public delegate void GroupActiveProposalsRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); |
501 | 510 | ||
502 | public delegate void GroupVoteHistoryRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); | 511 | public delegate void GroupVoteHistoryRequest(IClientAPI client,UUID agentID, UUID groupID, UUID transactionID, UUID sessionID); |
503 | 512 | ||
504 | 513 | ||
505 | public delegate void SimWideDeletesDelegate(IClientAPI client,UUID agentID, int flags, UUID targetID); | 514 | public delegate void SimWideDeletesDelegate(IClientAPI client,UUID agentID, int flags, UUID targetID); |
506 | 515 | ||
507 | public delegate void SendPostcard(IClientAPI client); | 516 | public delegate void SendPostcard(IClientAPI client); |
517 | public delegate void ChangeInventoryItemFlags(IClientAPI client, UUID itemID, uint flags); | ||
508 | 518 | ||
509 | #endregion | 519 | #endregion |
510 | 520 | ||
@@ -575,10 +585,10 @@ namespace OpenSim.Framework | |||
575 | public float dwell; | 585 | public float dwell; |
576 | } | 586 | } |
577 | 587 | ||
578 | public class IEntityUpdate | 588 | public class EntityUpdate |
579 | { | 589 | { |
580 | private ISceneEntity m_entity; | 590 | private ISceneEntity m_entity; |
581 | private uint m_flags; | 591 | private PrimUpdateFlags m_flags; |
582 | private int m_updateTime; | 592 | private int m_updateTime; |
583 | 593 | ||
584 | public ISceneEntity Entity | 594 | public ISceneEntity Entity |
@@ -586,7 +596,7 @@ namespace OpenSim.Framework | |||
586 | get { return m_entity; } | 596 | get { return m_entity; } |
587 | } | 597 | } |
588 | 598 | ||
589 | public uint Flags | 599 | public PrimUpdateFlags Flags |
590 | { | 600 | { |
591 | get { return m_flags; } | 601 | get { return m_flags; } |
592 | } | 602 | } |
@@ -596,23 +606,30 @@ namespace OpenSim.Framework | |||
596 | get { return m_updateTime; } | 606 | get { return m_updateTime; } |
597 | } | 607 | } |
598 | 608 | ||
599 | public virtual void Update(IEntityUpdate update) | 609 | public virtual void Update(EntityUpdate oldupdate) |
600 | { | 610 | { |
601 | m_flags |= update.Flags; | 611 | // we are on the new one |
612 | PrimUpdateFlags updateFlags = oldupdate.Flags; | ||
613 | if(m_flags.HasFlag(PrimUpdateFlags.CancelKill)) | ||
614 | m_flags = PrimUpdateFlags.FullUpdate; | ||
615 | else if(updateFlags.HasFlag(PrimUpdateFlags.Kill)) | ||
616 | return; | ||
617 | else // kill case will just merge in | ||
618 | m_flags |= updateFlags; | ||
602 | 619 | ||
603 | // Use the older of the updates as the updateTime | 620 | // Use the older of the updates as the updateTime |
604 | if (Util.EnvironmentTickCountCompare(UpdateTime, update.UpdateTime) > 0) | 621 | if (Util.EnvironmentTickCountCompare(UpdateTime, oldupdate.UpdateTime) > 0) |
605 | m_updateTime = update.UpdateTime; | 622 | m_updateTime = oldupdate.UpdateTime; |
606 | } | 623 | } |
607 | 624 | ||
608 | public IEntityUpdate(ISceneEntity entity, uint flags) | 625 | public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags) |
609 | { | 626 | { |
610 | m_entity = entity; | 627 | m_entity = entity; |
611 | m_flags = flags; | 628 | m_flags = flags; |
612 | m_updateTime = Util.EnvironmentTickCount(); | 629 | m_updateTime = Util.EnvironmentTickCount(); |
613 | } | 630 | } |
614 | 631 | ||
615 | public IEntityUpdate(ISceneEntity entity, uint flags, Int32 updateTime) | 632 | public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags, Int32 updateTime) |
616 | { | 633 | { |
617 | m_entity = entity; | 634 | m_entity = entity; |
618 | m_flags = flags; | 635 | m_flags = flags; |
@@ -620,29 +637,6 @@ namespace OpenSim.Framework | |||
620 | } | 637 | } |
621 | } | 638 | } |
622 | 639 | ||
623 | public class EntityUpdate : IEntityUpdate | ||
624 | { | ||
625 | private float m_timeDilation; | ||
626 | |||
627 | public float TimeDilation | ||
628 | { | ||
629 | get { return m_timeDilation; } | ||
630 | } | ||
631 | |||
632 | public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags, float timedilation) | ||
633 | : base(entity, (uint)flags) | ||
634 | { | ||
635 | // Flags = flags; | ||
636 | m_timeDilation = timedilation; | ||
637 | } | ||
638 | |||
639 | public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags, float timedilation, Int32 updateTime) | ||
640 | : base(entity,(uint)flags,updateTime) | ||
641 | { | ||
642 | m_timeDilation = timedilation; | ||
643 | } | ||
644 | } | ||
645 | |||
646 | public class PlacesReplyData | 640 | public class PlacesReplyData |
647 | { | 641 | { |
648 | public UUID OwnerID; | 642 | public UUID OwnerID; |
@@ -691,9 +685,13 @@ namespace OpenSim.Framework | |||
691 | ExtraData = 1 << 20, | 685 | ExtraData = 1 << 20, |
692 | Sound = 1 << 21, | 686 | Sound = 1 << 21, |
693 | Joint = 1 << 22, | 687 | Joint = 1 << 22, |
694 | FullUpdate = UInt32.MaxValue | 688 | FullUpdate = 0x0fffffff, |
689 | SendInTransit = 0x20000000, | ||
690 | CancelKill = 0x4fffffff, // 1 << 30 | ||
691 | Kill = 0x80000000 // 1 << 31 | ||
695 | } | 692 | } |
696 | 693 | ||
694 | /* included in .net 4.0 | ||
697 | public static class PrimUpdateFlagsExtensions | 695 | public static class PrimUpdateFlagsExtensions |
698 | { | 696 | { |
699 | public static bool HasFlag(this PrimUpdateFlags updateFlags, PrimUpdateFlags flag) | 697 | public static bool HasFlag(this PrimUpdateFlags updateFlags, PrimUpdateFlags flag) |
@@ -701,7 +699,7 @@ namespace OpenSim.Framework | |||
701 | return (updateFlags & flag) == flag; | 699 | return (updateFlags & flag) == flag; |
702 | } | 700 | } |
703 | } | 701 | } |
704 | 702 | */ | |
705 | public interface IClientAPI | 703 | public interface IClientAPI |
706 | { | 704 | { |
707 | Vector3 StartPos { get; set; } | 705 | Vector3 StartPos { get; set; } |
@@ -718,11 +716,15 @@ namespace OpenSim.Framework | |||
718 | 716 | ||
719 | UUID SecureSessionId { get; } | 717 | UUID SecureSessionId { get; } |
720 | 718 | ||
721 | UUID ActiveGroupId { get; } | 719 | UUID ActiveGroupId { get; set; } |
720 | |||
721 | string ActiveGroupName { get; set;} | ||
722 | 722 | ||
723 | string ActiveGroupName { get; } | 723 | ulong ActiveGroupPowers { get; set;} |
724 | 724 | ||
725 | ulong ActiveGroupPowers { get; } | 725 | Dictionary<UUID, ulong> GetGroupPowers(); |
726 | |||
727 | void SetGroupPowers(Dictionary<UUID, ulong> powers); | ||
726 | 728 | ||
727 | ulong GetGroupPowers(UUID groupID); | 729 | ulong GetGroupPowers(UUID groupID); |
728 | 730 | ||
@@ -734,6 +736,8 @@ namespace OpenSim.Framework | |||
734 | 736 | ||
735 | IScene Scene { get; } | 737 | IScene Scene { get; } |
736 | 738 | ||
739 | List<uint> SelectedObjects { get; } | ||
740 | |||
737 | // [Obsolete("LLClientView Specific - Replace with ???")] | 741 | // [Obsolete("LLClientView Specific - Replace with ???")] |
738 | int NextAnimationSequenceNumber { get; } | 742 | int NextAnimationSequenceNumber { get; } |
739 | 743 | ||
@@ -747,6 +751,8 @@ namespace OpenSim.Framework | |||
747 | /// </summary> | 751 | /// </summary> |
748 | bool IsActive { get; set; } | 752 | bool IsActive { get; set; } |
749 | 753 | ||
754 | int PingTimeMS { get; } | ||
755 | |||
750 | /// <summary> | 756 | /// <summary> |
751 | /// Set if the client is closing due to a logout request | 757 | /// Set if the client is closing due to a logout request |
752 | /// </summary> | 758 | /// </summary> |
@@ -758,7 +764,7 @@ namespace OpenSim.Framework | |||
758 | /// Only set for root agents. | 764 | /// Only set for root agents. |
759 | /// </remarks> | 765 | /// </remarks> |
760 | bool IsLoggingOut { get; set; } | 766 | bool IsLoggingOut { get; set; } |
761 | 767 | ||
762 | bool SendLogoutPacketWhenClosing { set; } | 768 | bool SendLogoutPacketWhenClosing { set; } |
763 | 769 | ||
764 | // [Obsolete("LLClientView Specific - Circuits are unique to LLClientView")] | 770 | // [Obsolete("LLClientView Specific - Circuits are unique to LLClientView")] |
@@ -794,6 +800,7 @@ namespace OpenSim.Framework | |||
794 | event ObjectDrop OnObjectDrop; | 800 | event ObjectDrop OnObjectDrop; |
795 | event StartAnim OnStartAnim; | 801 | event StartAnim OnStartAnim; |
796 | event StopAnim OnStopAnim; | 802 | event StopAnim OnStopAnim; |
803 | event ChangeAnim OnChangeAnim; | ||
797 | event LinkObjects OnLinkObjects; | 804 | event LinkObjects OnLinkObjects; |
798 | event DelinkObjects OnDelinkObjects; | 805 | event DelinkObjects OnDelinkObjects; |
799 | event RequestMapBlocks OnRequestMapBlocks; | 806 | event RequestMapBlocks OnRequestMapBlocks; |
@@ -805,6 +812,7 @@ namespace OpenSim.Framework | |||
805 | event TeleportLandmarkRequest OnTeleportLandmarkRequest; | 812 | event TeleportLandmarkRequest OnTeleportLandmarkRequest; |
806 | event TeleportCancel OnTeleportCancel; | 813 | event TeleportCancel OnTeleportCancel; |
807 | event DeRezObject OnDeRezObject; | 814 | event DeRezObject OnDeRezObject; |
815 | event RezRestoreToWorld OnRezRestoreToWorld; | ||
808 | event Action<IClientAPI> OnRegionHandShakeReply; | 816 | event Action<IClientAPI> OnRegionHandShakeReply; |
809 | event GenericCall1 OnRequestWearables; | 817 | event GenericCall1 OnRequestWearables; |
810 | event Action<IClientAPI, bool> OnCompleteMovementToRegion; | 818 | event Action<IClientAPI, bool> OnCompleteMovementToRegion; |
@@ -860,6 +868,7 @@ namespace OpenSim.Framework | |||
860 | event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily; | 868 | event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily; |
861 | event UpdatePrimFlags OnUpdatePrimFlags; | 869 | event UpdatePrimFlags OnUpdatePrimFlags; |
862 | event UpdatePrimTexture OnUpdatePrimTexture; | 870 | event UpdatePrimTexture OnUpdatePrimTexture; |
871 | event ClientChangeObject onClientChangeObject; | ||
863 | event UpdateVector OnUpdatePrimGroupPosition; | 872 | event UpdateVector OnUpdatePrimGroupPosition; |
864 | event UpdateVector OnUpdatePrimSinglePosition; | 873 | event UpdateVector OnUpdatePrimSinglePosition; |
865 | event UpdatePrimRotation OnUpdatePrimGroupRotation; | 874 | event UpdatePrimRotation OnUpdatePrimGroupRotation; |
@@ -884,6 +893,7 @@ namespace OpenSim.Framework | |||
884 | event RequestTaskInventory OnRequestTaskInventory; | 893 | event RequestTaskInventory OnRequestTaskInventory; |
885 | event UpdateInventoryItem OnUpdateInventoryItem; | 894 | event UpdateInventoryItem OnUpdateInventoryItem; |
886 | event CopyInventoryItem OnCopyInventoryItem; | 895 | event CopyInventoryItem OnCopyInventoryItem; |
896 | event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy; | ||
887 | event MoveInventoryItem OnMoveInventoryItem; | 897 | event MoveInventoryItem OnMoveInventoryItem; |
888 | event RemoveInventoryFolder OnRemoveInventoryFolder; | 898 | event RemoveInventoryFolder OnRemoveInventoryFolder; |
889 | event RemoveInventoryItem OnRemoveInventoryItem; | 899 | event RemoveInventoryItem OnRemoveInventoryItem; |
@@ -1002,7 +1012,7 @@ namespace OpenSim.Framework | |||
1002 | event ClassifiedInfoRequest OnClassifiedInfoRequest; | 1012 | event ClassifiedInfoRequest OnClassifiedInfoRequest; |
1003 | event ClassifiedInfoUpdate OnClassifiedInfoUpdate; | 1013 | event ClassifiedInfoUpdate OnClassifiedInfoUpdate; |
1004 | event ClassifiedDelete OnClassifiedDelete; | 1014 | event ClassifiedDelete OnClassifiedDelete; |
1005 | event ClassifiedDelete OnClassifiedGodDelete; | 1015 | event ClassifiedGodDelete OnClassifiedGodDelete; |
1006 | 1016 | ||
1007 | event EventNotificationAddRequest OnEventNotificationAddRequest; | 1017 | event EventNotificationAddRequest OnEventNotificationAddRequest; |
1008 | event EventNotificationRemoveRequest OnEventNotificationRemoveRequest; | 1018 | event EventNotificationRemoveRequest OnEventNotificationRemoveRequest; |
@@ -1025,7 +1035,7 @@ namespace OpenSim.Framework | |||
1025 | event MuteListRequest OnMuteListRequest; | 1035 | event MuteListRequest OnMuteListRequest; |
1026 | 1036 | ||
1027 | event PlacesQuery OnPlacesQuery; | 1037 | event PlacesQuery OnPlacesQuery; |
1028 | 1038 | ||
1029 | event FindAgentUpdate OnFindAgent; | 1039 | event FindAgentUpdate OnFindAgent; |
1030 | event TrackAgentUpdate OnTrackAgent; | 1040 | event TrackAgentUpdate OnTrackAgent; |
1031 | event NewUserReport OnUserReport; | 1041 | event NewUserReport OnUserReport; |
@@ -1041,11 +1051,12 @@ namespace OpenSim.Framework | |||
1041 | event GroupVoteHistoryRequest OnGroupVoteHistoryRequest; | 1051 | event GroupVoteHistoryRequest OnGroupVoteHistoryRequest; |
1042 | event SimWideDeletesDelegate OnSimWideDeletes; | 1052 | event SimWideDeletesDelegate OnSimWideDeletes; |
1043 | event SendPostcard OnSendPostcard; | 1053 | event SendPostcard OnSendPostcard; |
1054 | event ChangeInventoryItemFlags OnChangeInventoryItemFlags; | ||
1044 | event MuteListEntryUpdate OnUpdateMuteListEntry; | 1055 | event MuteListEntryUpdate OnUpdateMuteListEntry; |
1045 | event MuteListEntryRemove OnRemoveMuteListEntry; | 1056 | event MuteListEntryRemove OnRemoveMuteListEntry; |
1046 | event GodlikeMessage onGodlikeMessage; | 1057 | event GodlikeMessage onGodlikeMessage; |
1047 | event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; | 1058 | event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; |
1048 | 1059 | event GenericCall2 OnUpdateThrottles; | |
1049 | /// <summary> | 1060 | /// <summary> |
1050 | /// Set the debug level at which packet output should be printed to console. | 1061 | /// Set the debug level at which packet output should be printed to console. |
1051 | /// </summary> | 1062 | /// </summary> |
@@ -1066,15 +1077,15 @@ namespace OpenSim.Framework | |||
1066 | /// If true, attempts the close without checking active status. You do not want to try this except as a last | 1077 | /// If true, attempts the close without checking active status. You do not want to try this except as a last |
1067 | /// ditch attempt where Active == false but the ScenePresence still exists. | 1078 | /// ditch attempt where Active == false but the ScenePresence still exists. |
1068 | /// </param> | 1079 | /// </param> |
1069 | void Close(bool force); | 1080 | void Close(bool sendStop, bool force); |
1070 | 1081 | ||
1071 | void Kick(string message); | 1082 | void Kick(string message); |
1072 | 1083 | ||
1073 | /// <summary> | 1084 | /// <summary> |
1074 | /// Start processing for this client. | 1085 | /// Start processing for this client. |
1075 | /// </summary> | 1086 | /// </summary> |
1076 | void Start(); | 1087 | void Start(); |
1077 | 1088 | ||
1078 | void Stop(); | 1089 | void Stop(); |
1079 | 1090 | ||
1080 | // void ActivateGesture(UUID assetId, UUID gestureId); | 1091 | // void ActivateGesture(UUID assetId, UUID gestureId); |
@@ -1102,6 +1113,8 @@ namespace OpenSim.Framework | |||
1102 | /// <param name="localID"></param> | 1113 | /// <param name="localID"></param> |
1103 | void SendKillObject(List<uint> localID); | 1114 | void SendKillObject(List<uint> localID); |
1104 | 1115 | ||
1116 | // void SendPartFullUpdate(ISceneEntity ent, uint? parentID); | ||
1117 | |||
1105 | void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs); | 1118 | void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs); |
1106 | void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args); | 1119 | void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args); |
1107 | 1120 | ||
@@ -1125,11 +1138,13 @@ namespace OpenSim.Framework | |||
1125 | void SendGenericMessage(string method, UUID invoice, List<string> message); | 1138 | void SendGenericMessage(string method, UUID invoice, List<string> message); |
1126 | void SendGenericMessage(string method, UUID invoice, List<byte[]> message); | 1139 | void SendGenericMessage(string method, UUID invoice, List<byte[]> message); |
1127 | 1140 | ||
1141 | bool CanSendLayerData(); | ||
1142 | |||
1128 | void SendLayerData(float[] map); | 1143 | void SendLayerData(float[] map); |
1129 | void SendLayerData(int px, int py, float[] map); | 1144 | void SendLayerData(int px, int py, float[] map); |
1130 | 1145 | ||
1131 | void SendWindData(Vector2[] windSpeeds); | 1146 | void SendWindData(int version, Vector2[] windSpeeds); |
1132 | void SendCloudData(float[] cloudCover); | 1147 | void SendCloudData(int version, float[] cloudCover); |
1133 | 1148 | ||
1134 | /// <summary> | 1149 | /// <summary> |
1135 | /// Sent when an agent completes its movement into a region. | 1150 | /// Sent when an agent completes its movement into a region. |
@@ -1141,7 +1156,7 @@ namespace OpenSim.Framework | |||
1141 | void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look); | 1156 | void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look); |
1142 | 1157 | ||
1143 | void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint); | 1158 | void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint); |
1144 | 1159 | ||
1145 | /// <summary> | 1160 | /// <summary> |
1146 | /// Return circuit information for this client. | 1161 | /// Return circuit information for this client. |
1147 | /// </summary> | 1162 | /// </summary> |
@@ -1168,8 +1183,13 @@ namespace OpenSim.Framework | |||
1168 | void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations); | 1183 | void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations); |
1169 | 1184 | ||
1170 | void SetChildAgentThrottle(byte[] throttle); | 1185 | void SetChildAgentThrottle(byte[] throttle); |
1186 | void SetChildAgentThrottle(byte[] throttle,float factor); | ||
1187 | |||
1188 | void SetAgentThrottleSilent(int throttle, int setting); | ||
1189 | int GetAgentThrottleSilent(int throttle); | ||
1171 | 1190 | ||
1172 | void SendAvatarDataImmediate(ISceneEntity avatar); | 1191 | void SendEntityFullUpdateImmediate(ISceneEntity entity); |
1192 | void SendEntityTerseUpdateImmediate(ISceneEntity entity); | ||
1173 | 1193 | ||
1174 | /// <summary> | 1194 | /// <summary> |
1175 | /// Send a positional, velocity, etc. update to the viewer for a given entity. | 1195 | /// Send a positional, velocity, etc. update to the viewer for a given entity. |
@@ -1192,6 +1212,7 @@ namespace OpenSim.Framework | |||
1192 | /// </summary> | 1212 | /// </summary> |
1193 | /// <param name="Item"></param> | 1213 | /// <param name="Item"></param> |
1194 | void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId); | 1214 | void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId); |
1215 | void SendInventoryItemCreateUpdate(InventoryItemBase Item, UUID transactionID, uint callbackId); | ||
1195 | 1216 | ||
1196 | void SendRemoveInventoryItem(UUID itemID); | 1217 | void SendRemoveInventoryItem(UUID itemID); |
1197 | 1218 | ||
@@ -1204,14 +1225,14 @@ namespace OpenSim.Framework | |||
1204 | /// <summary> | 1225 | /// <summary> |
1205 | /// Used by the server to inform the client of new inventory items and folders. | 1226 | /// Used by the server to inform the client of new inventory items and folders. |
1206 | /// </summary> | 1227 | /// </summary> |
1207 | /// | 1228 | /// |
1208 | /// If the node is a folder then the contents will be transferred | 1229 | /// If the node is a folder then the contents will be transferred |
1209 | /// (including all descendent folders) as well as the folder itself. | 1230 | /// (including all descendent folders) as well as the folder itself. |
1210 | /// | 1231 | /// |
1211 | /// <param name="node"></param> | 1232 | /// <param name="node"></param> |
1212 | void SendBulkUpdateInventory(InventoryNodeBase node); | 1233 | void SendBulkUpdateInventory(InventoryNodeBase node); |
1213 | 1234 | ||
1214 | void SendXferPacket(ulong xferID, uint packet, byte[] data); | 1235 | void SendXferPacket(ulong xferID, uint packet, byte[] data, bool isTaskInventory); |
1215 | 1236 | ||
1216 | void SendAbortXferPacket(ulong xferID); | 1237 | void SendAbortXferPacket(ulong xferID); |
1217 | 1238 | ||
@@ -1237,9 +1258,11 @@ namespace OpenSim.Framework | |||
1237 | void SendAttachedSoundGainChange(UUID objectID, float gain); | 1258 | void SendAttachedSoundGainChange(UUID objectID, float gain); |
1238 | 1259 | ||
1239 | void SendNameReply(UUID profileId, string firstname, string lastname); | 1260 | void SendNameReply(UUID profileId, string firstname, string lastname); |
1240 | void SendAlertMessage(string message); | ||
1241 | 1261 | ||
1262 | void SendAlertMessage(string message); | ||
1263 | void SendAlertMessage(string message, string into); | ||
1242 | void SendAgentAlertMessage(string message, bool modal); | 1264 | void SendAgentAlertMessage(string message, bool modal); |
1265 | |||
1243 | void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message, string url); | 1266 | void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message, string url); |
1244 | 1267 | ||
1245 | /// <summary> | 1268 | /// <summary> |
@@ -1268,11 +1291,11 @@ namespace OpenSim.Framework | |||
1268 | /// <param name="OrbitalPosition">The orbital position is given in radians, and must be "adjusted" for the linden client, see LLClientView</param> | 1291 | /// <param name="OrbitalPosition">The orbital position is given in radians, and must be "adjusted" for the linden client, see LLClientView</param> |
1269 | void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, | 1292 | void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, |
1270 | float OrbitalPosition); | 1293 | float OrbitalPosition); |
1271 | 1294 | ||
1272 | void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks); | 1295 | void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks); |
1273 | void SendViewerTime(int phase); | 1296 | void SendViewerTime(int phase); |
1274 | 1297 | ||
1275 | void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember, string flAbout, | 1298 | void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType, string flAbout, |
1276 | uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID); | 1299 | uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID); |
1277 | 1300 | ||
1278 | void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question); | 1301 | void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question); |
@@ -1336,7 +1359,7 @@ namespace OpenSim.Framework | |||
1336 | void SendImageFirstPart(ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec); | 1359 | void SendImageFirstPart(ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec); |
1337 | 1360 | ||
1338 | /// <summary> | 1361 | /// <summary> |
1339 | /// Send the next packet for a series of packets making up a single texture, | 1362 | /// Send the next packet for a series of packets making up a single texture, |
1340 | /// as established by SendImageFirstPart() | 1363 | /// as established by SendImageFirstPart() |
1341 | /// </summary> | 1364 | /// </summary> |
1342 | /// <param name="partNumber"></param> | 1365 | /// <param name="partNumber"></param> |
@@ -1361,12 +1384,16 @@ namespace OpenSim.Framework | |||
1361 | 1384 | ||
1362 | void SendObjectPropertiesReply(ISceneEntity Entity); | 1385 | void SendObjectPropertiesReply(ISceneEntity Entity); |
1363 | 1386 | ||
1387 | void SendSelectedPartsProprieties(List<ISceneEntity> parts); | ||
1388 | |||
1364 | void SendPartPhysicsProprieties(ISceneEntity Entity); | 1389 | void SendPartPhysicsProprieties(ISceneEntity Entity); |
1365 | 1390 | ||
1366 | void SendAgentOffline(UUID[] agentIDs); | 1391 | void SendAgentOffline(UUID[] agentIDs); |
1367 | 1392 | ||
1368 | void SendAgentOnline(UUID[] agentIDs); | 1393 | void SendAgentOnline(UUID[] agentIDs); |
1369 | 1394 | ||
1395 | void SendFindAgent(UUID HunterID, UUID PreyID, double GlobalX, double GlobalY); | ||
1396 | |||
1370 | void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot, | 1397 | void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot, |
1371 | Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook); | 1398 | Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook); |
1372 | 1399 | ||
@@ -1432,6 +1459,7 @@ namespace OpenSim.Framework | |||
1432 | void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags); | 1459 | void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags); |
1433 | 1460 | ||
1434 | void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data); | 1461 | void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data); |
1462 | void SendAgentGroupDataUpdate(UUID avatarID, GroupMembershipData[] data); | ||
1435 | void SendOfferCallingCard(UUID srcID, UUID transactionID); | 1463 | void SendOfferCallingCard(UUID srcID, UUID transactionID); |
1436 | void SendAcceptCallingCard(UUID transactionID); | 1464 | void SendAcceptCallingCard(UUID transactionID); |
1437 | void SendDeclineCallingCard(UUID transactionID); | 1465 | void SendDeclineCallingCard(UUID transactionID); |
@@ -1443,6 +1471,9 @@ namespace OpenSim.Framework | |||
1443 | 1471 | ||
1444 | void SendAgentDropGroup(UUID groupID); | 1472 | void SendAgentDropGroup(UUID groupID); |
1445 | void RefreshGroupMembership(); | 1473 | void RefreshGroupMembership(); |
1474 | void UpdateGroupMembership(GroupMembershipData[] data); | ||
1475 | void GroupMembershipRemove(UUID GroupID); | ||
1476 | void GroupMembershipAddReplace(UUID GroupID,ulong GroupPowers); | ||
1446 | void SendAvatarNotesReply(UUID targetID, string text); | 1477 | void SendAvatarNotesReply(UUID targetID, string text); |
1447 | void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks); | 1478 | void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks); |
1448 | void SendPickInfoReply(UUID pickID,UUID creatorID, bool topPick, UUID parcelID, string name, string desc, UUID snapshotID, string user, string originalName, string simName, Vector3 posGlobal, int sortOrder, bool enabled); | 1479 | void SendPickInfoReply(UUID pickID,UUID creatorID, bool topPick, UUID parcelID, string name, string desc, UUID snapshotID, string user, string originalName, string simName, Vector3 posGlobal, int sortOrder, bool enabled); |
@@ -1452,9 +1483,9 @@ namespace OpenSim.Framework | |||
1452 | void SendParcelDwellReply(int localID, UUID parcelID, float dwell); | 1483 | void SendParcelDwellReply(int localID, UUID parcelID, float dwell); |
1453 | 1484 | ||
1454 | void SendUserInfoReply(bool imViaEmail, bool visible, string email); | 1485 | void SendUserInfoReply(bool imViaEmail, bool visible, string email); |
1455 | |||
1456 | void SendUseCachedMuteList(); | ||
1457 | 1486 | ||
1487 | void SendUseCachedMuteList(); | ||
1488 | void SendEmpytMuteList(); | ||
1458 | void SendMuteListUpdate(string filename); | 1489 | void SendMuteListUpdate(string filename); |
1459 | 1490 | ||
1460 | void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals); | 1491 | void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals); |
@@ -1466,13 +1497,13 @@ namespace OpenSim.Framework | |||
1466 | void SendRebakeAvatarTextures(UUID textureID); | 1497 | void SendRebakeAvatarTextures(UUID textureID); |
1467 | 1498 | ||
1468 | void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages); | 1499 | void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages); |
1469 | 1500 | ||
1470 | void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt); | 1501 | void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt); |
1471 | 1502 | ||
1472 | void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier); | 1503 | void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier); |
1473 | 1504 | ||
1474 | void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID,int amt); | 1505 | void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID,int amt); |
1475 | 1506 | ||
1476 | void SendChangeUserRights(UUID agentID, UUID friendID, int rights); | 1507 | void SendChangeUserRights(UUID agentID, UUID friendID, int rights); |
1477 | void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId); | 1508 | void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId); |
1478 | 1509 | ||
diff --git a/OpenSim/Framework/ICnmCache.cs b/OpenSim/Framework/ICnmCache.cs index 27b9c56..69b5b42 100644 --- a/OpenSim/Framework/ICnmCache.cs +++ b/OpenSim/Framework/ICnmCache.cs | |||
@@ -34,10 +34,10 @@ namespace OpenSim.Framework | |||
34 | /// Represent generic cache to store key/value pairs (elements) limited by time, size and count of elements. | 34 | /// Represent generic cache to store key/value pairs (elements) limited by time, size and count of elements. |
35 | /// </summary> | 35 | /// </summary> |
36 | /// <typeparam name="TKey"> | 36 | /// <typeparam name="TKey"> |
37 | /// The type of keys in the cache. | 37 | /// The type of keys in the cache. |
38 | /// </typeparam> | 38 | /// </typeparam> |
39 | /// <typeparam name="TValue"> | 39 | /// <typeparam name="TValue"> |
40 | /// The type of values in the cache. | 40 | /// The type of values in the cache. |
41 | /// </typeparam> | 41 | /// </typeparam> |
42 | /// <remarks> | 42 | /// <remarks> |
43 | /// <para> | 43 | /// <para> |
@@ -51,8 +51,8 @@ namespace OpenSim.Framework | |||
51 | /// <item> | 51 | /// <item> |
52 | /// <term>Time</term> | 52 | /// <term>Time</term> |
53 | /// <description> | 53 | /// <description> |
54 | /// Element that is not accessed through <see cref="TryGetValue"/> or <see cref="Set"/> in last <see cref="ExpirationTime"/> are | 54 | /// Element that is not accessed through <see cref="TryGetValue"/> or <see cref="Set"/> in last <see cref="ExpirationTime"/> are |
55 | /// removed from the cache automatically. Depending on implementation of the cache some of elements may stay longer in cache. | 55 | /// removed from the cache automatically. Depending on implementation of the cache some of elements may stay longer in cache. |
56 | /// <see cref="IsTimeLimited"/> returns <see langword="true"/>, if cache is limited by time. | 56 | /// <see cref="IsTimeLimited"/> returns <see langword="true"/>, if cache is limited by time. |
57 | /// </description> | 57 | /// </description> |
58 | /// </item> | 58 | /// </item> |
@@ -60,7 +60,7 @@ namespace OpenSim.Framework | |||
60 | /// <term>Count</term> | 60 | /// <term>Count</term> |
61 | /// <description> | 61 | /// <description> |
62 | /// When adding an new element to cache that already have <see cref="MaxCount"/> of elements, cache will remove less recently | 62 | /// When adding an new element to cache that already have <see cref="MaxCount"/> of elements, cache will remove less recently |
63 | /// used element(s) from the cache, until element fits to cache. | 63 | /// used element(s) from the cache, until element fits to cache. |
64 | /// <see cref="IsCountLimited"/> returns <see langword="true"/>, if cache is limiting element count. | 64 | /// <see cref="IsCountLimited"/> returns <see langword="true"/>, if cache is limiting element count. |
65 | /// </description> | 65 | /// </description> |
66 | /// </item> | 66 | /// </item> |
@@ -69,8 +69,8 @@ namespace OpenSim.Framework | |||
69 | /// <description> | 69 | /// <description> |
70 | /// <description> | 70 | /// <description> |
71 | /// When adding an new element to cache that already have <see cref="MaxSize"/> of elements, cache will remove less recently | 71 | /// When adding an new element to cache that already have <see cref="MaxSize"/> of elements, cache will remove less recently |
72 | /// used element(s) from the cache, until element fits to cache. | 72 | /// used element(s) from the cache, until element fits to cache. |
73 | /// <see cref="IsSizeLimited"/> returns <see langword="true"/>, if cache is limiting total size of elements. | 73 | /// <see cref="IsSizeLimited"/> returns <see langword="true"/>, if cache is limiting total size of elements. |
74 | /// Normally size is bytes used by element in the cache. But it can be any other suitable unit of measure. | 74 | /// Normally size is bytes used by element in the cache. But it can be any other suitable unit of measure. |
75 | /// </description> | 75 | /// </description> |
76 | /// </description> | 76 | /// </description> |
@@ -84,8 +84,8 @@ namespace OpenSim.Framework | |||
84 | /// </summary> | 84 | /// </summary> |
85 | /// <remarks> | 85 | /// <remarks> |
86 | /// <para> | 86 | /// <para> |
87 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 87 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
88 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 88 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
89 | /// </para> | 89 | /// </para> |
90 | /// </remarks> | 90 | /// </remarks> |
91 | /// <seealso cref="MaxCount"/> | 91 | /// <seealso cref="MaxCount"/> |
@@ -102,13 +102,13 @@ namespace OpenSim.Framework | |||
102 | /// </value> | 102 | /// </value> |
103 | /// <remarks> | 103 | /// <remarks> |
104 | /// <para> | 104 | /// <para> |
105 | /// When element has been stored in <see cref="ICnmCache{TKey,TValue}"/> longer than <see cref="ExpirationTime"/> | 105 | /// When element has been stored in <see cref="ICnmCache{TKey,TValue}"/> longer than <see cref="ExpirationTime"/> |
106 | /// and it is not accessed through <see cref="TryGetValue"/> method or element's value is | 106 | /// and it is not accessed through <see cref="TryGetValue"/> method or element's value is |
107 | /// not replaced by <see cref="Set"/> method, then it is automatically removed from the | 107 | /// not replaced by <see cref="Set"/> method, then it is automatically removed from the |
108 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 108 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
109 | /// </para> | 109 | /// </para> |
110 | /// <para> | 110 | /// <para> |
111 | /// It is possible that <see cref="ICnmCache{TKey,TValue}"/> implementation removes element before it's expiration time, | 111 | /// It is possible that <see cref="ICnmCache{TKey,TValue}"/> implementation removes element before it's expiration time, |
112 | /// because total size or count of elements stored to cache is larger than <see cref="MaxSize"/> or <see cref="MaxCount"/>. | 112 | /// because total size or count of elements stored to cache is larger than <see cref="MaxSize"/> or <see cref="MaxCount"/>. |
113 | /// </para> | 113 | /// </para> |
114 | /// <para> | 114 | /// <para> |
@@ -135,12 +135,12 @@ namespace OpenSim.Framework | |||
135 | /// Gets a value indicating whether or not access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe). | 135 | /// Gets a value indicating whether or not access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe). |
136 | /// </summary> | 136 | /// </summary> |
137 | /// <value> | 137 | /// <value> |
138 | /// <see langword="true"/> if access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe); | 138 | /// <see langword="true"/> if access to the <see cref="ICnmCache{TKey,TValue}"/> is synchronized (thread safe); |
139 | /// otherwise, <see langword="false"/>. | 139 | /// otherwise, <see langword="false"/>. |
140 | /// </value> | 140 | /// </value> |
141 | /// <remarks> | 141 | /// <remarks> |
142 | /// <para> | 142 | /// <para> |
143 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/> object, use | 143 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/> object, use |
144 | /// <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> in <see cref="CnmSynchronizedCache{TKey,TValue}"/> class | 144 | /// <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> in <see cref="CnmSynchronizedCache{TKey,TValue}"/> class |
145 | /// to retrieve synchronized wrapper for <see cref="ICnmCache{TKey,TValue}"/> object. | 145 | /// to retrieve synchronized wrapper for <see cref="ICnmCache{TKey,TValue}"/> object. |
146 | /// </para> | 146 | /// </para> |
@@ -153,17 +153,17 @@ namespace OpenSim.Framework | |||
153 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting count of elements. | 153 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting count of elements. |
154 | /// </summary> | 154 | /// </summary> |
155 | /// <value> | 155 | /// <value> |
156 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> count of elements is limited; | 156 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> count of elements is limited; |
157 | /// otherwise, <see langword="false"/>. | 157 | /// otherwise, <see langword="false"/>. |
158 | /// </value> | 158 | /// </value> |
159 | /// <remarks> | 159 | /// <remarks> |
160 | /// <para> | 160 | /// <para> |
161 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 161 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
162 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 162 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
163 | /// </para> | 163 | /// </para> |
164 | /// </remarks> | 164 | /// </remarks> |
165 | /// <seealso cref="Count"/> | 165 | /// <seealso cref="Count"/> |
166 | /// <seealso cref="MaxCount"/> | 166 | /// <seealso cref="MaxCount"/> |
167 | /// <seealso cref="IsSizeLimited"/> | 167 | /// <seealso cref="IsSizeLimited"/> |
168 | /// <seealso cref="IsTimeLimited"/> | 168 | /// <seealso cref="IsTimeLimited"/> |
169 | bool IsCountLimited { get; } | 169 | bool IsCountLimited { get; } |
@@ -172,13 +172,13 @@ namespace OpenSim.Framework | |||
172 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting size of elements. | 172 | /// Gets a value indicating whether <see cref="ICnmCache{TKey,TValue}"/> is limiting size of elements. |
173 | /// </summary> | 173 | /// </summary> |
174 | /// <value> | 174 | /// <value> |
175 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> total size of elements is limited; | 175 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> total size of elements is limited; |
176 | /// otherwise, <see langword="false"/>. | 176 | /// otherwise, <see langword="false"/>. |
177 | /// </value> | 177 | /// </value> |
178 | /// <remarks> | 178 | /// <remarks> |
179 | /// <para> | 179 | /// <para> |
180 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 180 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
181 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 181 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
182 | /// </para> | 182 | /// </para> |
183 | /// </remarks> | 183 | /// </remarks> |
184 | /// <seealso cref="MaxElementSize"/> | 184 | /// <seealso cref="MaxElementSize"/> |
@@ -192,13 +192,13 @@ namespace OpenSim.Framework | |||
192 | /// Gets a value indicating whether elements stored to <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time. | 192 | /// Gets a value indicating whether elements stored to <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time. |
193 | /// </summary> | 193 | /// </summary> |
194 | /// <value> | 194 | /// <value> |
195 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> has a fixed total size of elements; | 195 | /// <see langword="true"/> if the <see cref="ICnmCache{TKey,TValue}"/> has a fixed total size of elements; |
196 | /// otherwise, <see langword="false"/>. | 196 | /// otherwise, <see langword="false"/>. |
197 | /// </value> | 197 | /// </value> |
198 | /// <remarks> | 198 | /// <remarks> |
199 | /// If <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time and element is not accessed through <see cref="Set"/> | 199 | /// If <see cref="ICnmCache{TKey,TValue}"/> have limited inactivity time and element is not accessed through <see cref="Set"/> |
200 | /// or <see cref="TryGetValue"/> methods in <see cref="ExpirationTime"/> , then element is automatically removed from | 200 | /// or <see cref="TryGetValue"/> methods in <see cref="ExpirationTime"/> , then element is automatically removed from |
201 | /// the cache. Depending on implementation of the <see cref="ICnmCache{TKey,TValue}"/>, some of the elements may | 201 | /// the cache. Depending on implementation of the <see cref="ICnmCache{TKey,TValue}"/>, some of the elements may |
202 | /// stay longer in cache. | 202 | /// stay longer in cache. |
203 | /// </remarks> | 203 | /// </remarks> |
204 | /// <seealso cref="ExpirationTime"/> | 204 | /// <seealso cref="ExpirationTime"/> |
@@ -206,18 +206,18 @@ namespace OpenSim.Framework | |||
206 | /// <seealso cref="IsCountLimited"/> | 206 | /// <seealso cref="IsCountLimited"/> |
207 | /// <seealso cref="IsSizeLimited"/> | 207 | /// <seealso cref="IsSizeLimited"/> |
208 | bool IsTimeLimited { get; } | 208 | bool IsTimeLimited { get; } |
209 | 209 | ||
210 | /// <summary> | 210 | /// <summary> |
211 | /// Gets or sets maximal allowed count of elements that can be stored to <see cref="ICnmCache{TKey,TValue}"/>. | 211 | /// Gets or sets maximal allowed count of elements that can be stored to <see cref="ICnmCache{TKey,TValue}"/>. |
212 | /// </summary> | 212 | /// </summary> |
213 | /// <value> | 213 | /// <value> |
214 | /// <see cref="int.MaxValue"/>, if <see cref="ICnmCache{TKey,TValue}"/> is not limited by count of elements; | 214 | /// <see cref="int.MaxValue"/>, if <see cref="ICnmCache{TKey,TValue}"/> is not limited by count of elements; |
215 | /// otherwise maximal allowed count of elements. | 215 | /// otherwise maximal allowed count of elements. |
216 | /// </value> | 216 | /// </value> |
217 | /// <remarks> | 217 | /// <remarks> |
218 | /// <para> | 218 | /// <para> |
219 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 219 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
220 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 220 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
221 | /// </para> | 221 | /// </para> |
222 | /// </remarks> | 222 | /// </remarks> |
223 | int MaxCount { get; set; } | 223 | int MaxCount { get; set; } |
@@ -230,7 +230,7 @@ namespace OpenSim.Framework | |||
230 | /// </value> | 230 | /// </value> |
231 | /// <remarks> | 231 | /// <remarks> |
232 | /// <para> | 232 | /// <para> |
233 | /// If element's size is larger than <see cref="MaxElementSize"/>, then element is | 233 | /// If element's size is larger than <see cref="MaxElementSize"/>, then element is |
234 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>. | 234 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>. |
235 | /// </para> | 235 | /// </para> |
236 | /// </remarks> | 236 | /// </remarks> |
@@ -251,8 +251,8 @@ namespace OpenSim.Framework | |||
251 | /// Normally size is total bytes used by elements in the cache. But it can be any other suitable unit of measure. | 251 | /// Normally size is total bytes used by elements in the cache. But it can be any other suitable unit of measure. |
252 | /// </para> | 252 | /// </para> |
253 | /// <para> | 253 | /// <para> |
254 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 254 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
255 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 255 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
256 | /// </para> | 256 | /// </para> |
257 | /// </remarks> | 257 | /// </remarks> |
258 | /// <exception cref="ArgumentOutOfRangeException">value is less than 0.</exception> | 258 | /// <exception cref="ArgumentOutOfRangeException">value is less than 0.</exception> |
@@ -272,11 +272,11 @@ namespace OpenSim.Framework | |||
272 | /// Normally bytes, but can be any suitable unit of measure. | 272 | /// Normally bytes, but can be any suitable unit of measure. |
273 | /// </para> | 273 | /// </para> |
274 | /// <para> | 274 | /// <para> |
275 | /// Element's size is given when element is added or replaced by <see cref="Set"/> method. | 275 | /// Element's size is given when element is added or replaced by <see cref="Set"/> method. |
276 | /// </para> | 276 | /// </para> |
277 | /// <para> | 277 | /// <para> |
278 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 278 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
279 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. | 279 | /// <see cref="ICnmCache{TKey,TValue}"/> will remove less recently used elements until it can fit an new element. |
280 | /// </para> | 280 | /// </para> |
281 | /// </remarks> | 281 | /// </remarks> |
282 | /// <seealso cref="MaxElementSize"/> | 282 | /// <seealso cref="MaxElementSize"/> |
@@ -294,8 +294,8 @@ namespace OpenSim.Framework | |||
294 | /// </value> | 294 | /// </value> |
295 | /// <remarks> | 295 | /// <remarks> |
296 | /// <para> | 296 | /// <para> |
297 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/>, use <see cref="CnmSynchronizedCache{TKey,TValue}"/> | 297 | /// To get synchronized (thread safe) access to <see cref="ICnmCache{TKey,TValue}"/>, use <see cref="CnmSynchronizedCache{TKey,TValue}"/> |
298 | /// method <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> to retrieve synchronized wrapper interface to | 298 | /// method <see cref="CnmSynchronizedCache{TKey,TValue}.Synchronized"/> to retrieve synchronized wrapper interface to |
299 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 299 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
300 | /// </para> | 300 | /// </para> |
301 | /// </remarks> | 301 | /// </remarks> |
@@ -367,7 +367,7 @@ namespace OpenSim.Framework | |||
367 | void RemoveRange(IEnumerable<TKey> keys); | 367 | void RemoveRange(IEnumerable<TKey> keys); |
368 | 368 | ||
369 | /// <summary> | 369 | /// <summary> |
370 | /// Add or replace an element with the provided <paramref name="key"/>, <paramref name="value"/> and <paramref name="size"/> to | 370 | /// Add or replace an element with the provided <paramref name="key"/>, <paramref name="value"/> and <paramref name="size"/> to |
371 | /// <see cref="ICnmCache{TKey,TValue}"/>. | 371 | /// <see cref="ICnmCache{TKey,TValue}"/>. |
372 | /// </summary> | 372 | /// </summary> |
373 | /// <param name="key"> | 373 | /// <param name="key"> |
@@ -380,7 +380,7 @@ namespace OpenSim.Framework | |||
380 | /// The element's size. Normally bytes, but can be any suitable unit of measure. | 380 | /// The element's size. Normally bytes, but can be any suitable unit of measure. |
381 | /// </param> | 381 | /// </param> |
382 | /// <returns> | 382 | /// <returns> |
383 | /// <see langword="true"/> if element has been added successfully to the <see cref="ICnmCache{TKey,TValue}"/>; | 383 | /// <see langword="true"/> if element has been added successfully to the <see cref="ICnmCache{TKey,TValue}"/>; |
384 | /// otherwise <see langword="false"/>. | 384 | /// otherwise <see langword="false"/>. |
385 | /// </returns> | 385 | /// </returns> |
386 | /// <exception cref="ArgumentNullException"> | 386 | /// <exception cref="ArgumentNullException"> |
@@ -391,17 +391,17 @@ namespace OpenSim.Framework | |||
391 | /// </exception> | 391 | /// </exception> |
392 | /// <remarks> | 392 | /// <remarks> |
393 | /// <para> | 393 | /// <para> |
394 | /// If element's <paramref name="size"/> is larger than <see cref="MaxElementSize"/>, then element is | 394 | /// If element's <paramref name="size"/> is larger than <see cref="MaxElementSize"/>, then element is |
395 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>, however - possible older element is | 395 | /// not added to the <see cref="ICnmCache{TKey,TValue}"/>, however - possible older element is |
396 | /// removed from the <see cref="ICnmCache{TKey,TValue}"/>. | 396 | /// removed from the <see cref="ICnmCache{TKey,TValue}"/>. |
397 | /// </para> | 397 | /// </para> |
398 | /// <para> | 398 | /// <para> |
399 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, | 399 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting total size of elements, |
400 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. | 400 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. |
401 | /// </para> | 401 | /// </para> |
402 | /// <para> | 402 | /// <para> |
403 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, | 403 | /// When adding an new element to <see cref="ICnmCache{TKey,TValue}"/> that is limiting element count, |
404 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. | 404 | /// <see cref="ICnmCache{TKey,TValue}"/>will remove less recently used elements until it can fit an new element. |
405 | /// </para> | 405 | /// </para> |
406 | /// </remarks> | 406 | /// </remarks> |
407 | /// <seealso cref="IsSizeLimited"/> | 407 | /// <seealso cref="IsSizeLimited"/> |
@@ -417,15 +417,15 @@ namespace OpenSim.Framework | |||
417 | /// Gets the <paramref name="value"/> associated with the specified <paramref name="key"/>. | 417 | /// Gets the <paramref name="value"/> associated with the specified <paramref name="key"/>. |
418 | /// </summary> | 418 | /// </summary> |
419 | /// <returns> | 419 | /// <returns> |
420 | /// <see langword="true"/>if the <see cref="ICnmCache{TKey,TValue}"/> contains an element with | 420 | /// <see langword="true"/>if the <see cref="ICnmCache{TKey,TValue}"/> contains an element with |
421 | /// the specified key; otherwise, <see langword="false"/>. | 421 | /// the specified key; otherwise, <see langword="false"/>. |
422 | /// </returns> | 422 | /// </returns> |
423 | /// <param name="key"> | 423 | /// <param name="key"> |
424 | /// The key whose <paramref name="value"/> to get. | 424 | /// The key whose <paramref name="value"/> to get. |
425 | /// </param> | 425 | /// </param> |
426 | /// <param name="value"> | 426 | /// <param name="value"> |
427 | /// When this method returns, the value associated with the specified <paramref name="key"/>, | 427 | /// When this method returns, the value associated with the specified <paramref name="key"/>, |
428 | /// if the <paramref name="key"/> is found; otherwise, the | 428 | /// if the <paramref name="key"/> is found; otherwise, the |
429 | /// default value for the type of the <paramref name="value"/> parameter. This parameter is passed uninitialized. | 429 | /// default value for the type of the <paramref name="value"/> parameter. This parameter is passed uninitialized. |
430 | /// </param> | 430 | /// </param> |
431 | /// <exception cref="ArgumentNullException"> | 431 | /// <exception cref="ArgumentNullException"> |
diff --git a/OpenSim/Framework/ILandChannel.cs b/OpenSim/Framework/ILandChannel.cs index c46c03c..8667837 100644 --- a/OpenSim/Framework/ILandChannel.cs +++ b/OpenSim/Framework/ILandChannel.cs | |||
@@ -38,7 +38,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
38 | /// </summary> | 38 | /// </summary> |
39 | /// <returns></returns> | 39 | /// <returns></returns> |
40 | List<ILandObject> AllParcels(); | 40 | List<ILandObject> AllParcels(); |
41 | 41 | ||
42 | /// <summary> | 42 | /// <summary> |
43 | /// Get the parcel at the specified point | 43 | /// Get the parcel at the specified point |
44 | /// </summary> | 44 | /// </summary> |
@@ -75,7 +75,9 @@ namespace OpenSim.Region.Framework.Interfaces | |||
75 | /// <param name="localID"></param> | 75 | /// <param name="localID"></param> |
76 | /// <returns></returns> | 76 | /// <returns></returns> |
77 | ILandObject GetLandObject(int localID); | 77 | ILandObject GetLandObject(int localID); |
78 | 78 | ||
79 | ILandObject GetLandObject(UUID GlobalID); | ||
80 | |||
79 | /// <summary> | 81 | /// <summary> |
80 | /// Clear the land channel of all parcels. | 82 | /// Clear the land channel of all parcels. |
81 | /// </summary> | 83 | /// </summary> |
@@ -83,9 +85,10 @@ namespace OpenSim.Region.Framework.Interfaces | |||
83 | /// If true, set up a default parcel covering the whole region owned by the estate owner. | 85 | /// If true, set up a default parcel covering the whole region owned by the estate owner. |
84 | /// </param> | 86 | /// </param> |
85 | void Clear(bool setupDefaultParcel); | 87 | void Clear(bool setupDefaultParcel); |
86 | 88 | ||
87 | bool IsForcefulBansAllowed(); | 89 | bool IsForcefulBansAllowed(); |
88 | void UpdateLandObject(int localID, LandData data); | 90 | void UpdateLandObject(int localID, LandData data); |
91 | void SendParcelsOverlay(IClientAPI client); | ||
89 | void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient); | 92 | void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient); |
90 | void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel); | 93 | void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel); |
91 | void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel); | 94 | void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel); |
@@ -93,5 +96,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
93 | 96 | ||
94 | void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id); | 97 | void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id); |
95 | void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id); | 98 | void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id); |
99 | void sendClientInitialLandInfo(IClientAPI remoteClient); | ||
100 | |||
96 | } | 101 | } |
97 | } | 102 | } |
diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs index 8465c86..a783256 100644 --- a/OpenSim/Framework/ILandObject.cs +++ b/OpenSim/Framework/ILandObject.cs | |||
@@ -43,32 +43,39 @@ namespace OpenSim.Framework | |||
43 | LandData LandData { get; set; } | 43 | LandData LandData { get; set; } |
44 | bool[,] LandBitmap { get; set; } | 44 | bool[,] LandBitmap { get; set; } |
45 | UUID RegionUUID { get; } | 45 | UUID RegionUUID { get; } |
46 | 46 | ||
47 | /// <summary> | 47 | /// <summary> |
48 | /// Prim counts for this land object. | 48 | /// Prim counts for this land object. |
49 | /// </summary> | 49 | /// </summary> |
50 | IPrimCounts PrimCounts { get; set; } | 50 | IPrimCounts PrimCounts { get; set; } |
51 | 51 | ||
52 | /// <summary> | 52 | /// <summary> |
53 | /// The start point for the land object. This is the western-most point as one scans land working from | 53 | /// The start point for the land object. This is the northern-most point as one scans land working from |
54 | /// north to south. | 54 | /// west to east. |
55 | /// </summary> | 55 | /// </summary> |
56 | Vector3 StartPoint { get; } | 56 | Vector2 StartPoint { get; } |
57 | 57 | ||
58 | /// <summary> | 58 | /// <summary> |
59 | /// The end point for the land object. This is the eastern-most point as one scans land working from | 59 | /// The end point for the land object. This is the southern-most point as one scans land working from |
60 | /// south to north. | 60 | /// west to east. |
61 | /// </summary> | 61 | /// </summary> |
62 | Vector3 EndPoint { get; } | 62 | Vector2 EndPoint { get; } |
63 | 63 | ||
64 | // a estimation of a parcel center. | ||
65 | Vector2 CenterPoint { get; } | ||
66 | |||
67 | // get positions | ||
68 | Vector2? GetNearestPoint(Vector3 pos); | ||
69 | Vector2? GetNearestPointAlongDirection(Vector3 pos, Vector3 pdirection); | ||
70 | |||
64 | bool ContainsPoint(int x, int y); | 71 | bool ContainsPoint(int x, int y); |
65 | 72 | ||
66 | ILandObject Copy(); | 73 | ILandObject Copy(); |
67 | 74 | ||
68 | void SendLandUpdateToAvatarsOverMe(); | 75 | void SendLandUpdateToAvatarsOverMe(); |
69 | 76 | ||
70 | void SendLandProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client); | 77 | void SendLandProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client); |
71 | void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client); | 78 | bool UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client, out bool snap_selection, out bool needOverlay); |
72 | bool IsEitherBannedOrRestricted(UUID avatar); | 79 | bool IsEitherBannedOrRestricted(UUID avatar); |
73 | bool IsBannedFromLand(UUID avatar); | 80 | bool IsBannedFromLand(UUID avatar); |
74 | bool CanBeOnThisLand(UUID avatar, float posHeight); | 81 | bool CanBeOnThisLand(UUID avatar, float posHeight); |
@@ -90,27 +97,70 @@ namespace OpenSim.Framework | |||
90 | /// </summary> | 97 | /// </summary> |
91 | /// <returns>The bitmap created.</returns> | 98 | /// <returns>The bitmap created.</returns> |
92 | bool[,] BasicFullRegionLandBitmap(); | 99 | bool[,] BasicFullRegionLandBitmap(); |
93 | 100 | ||
94 | /// <summary> | 101 | /// <summary> |
95 | /// Create a square land bitmap. | 102 | /// Create a square land bitmap. |
96 | /// </summary> | 103 | /// </summary> |
97 | /// <remarks> | 104 | /// <remarks> |
98 | /// Land co-ordinates are zero indexed. The inputs are treated as points. So if you want to create a bitmap | 105 | /// Land co-ordinates are zero indexed. The inputs are treated as points. So if you want to create a bitmap |
99 | /// that covers an entire 256 x 256m region apart from a strip of land on the east, then you would need to | 106 | /// that covers an entire 256 x 256m region apart from a strip of land on the east, then you would need to |
100 | /// specify start_x = 0, start_y = 0, end_x = 252 (or anything up to 255), end_y = 256. | 107 | /// specify start_x = 0, start_y = 0, end_x = 252 (or anything up to 255), end_y = 255. |
101 | /// | 108 | /// |
102 | /// At the moment, the smallest parcel of land is 4m x 4m, so if the | 109 | /// At the moment, the smallest parcel of land is 4m x 4m, so if the |
103 | /// region is 256 x 256m (the SL size), the bitmap returned will start at (0,0) and end at (63,63). | 110 | /// region is 256 x 256m (the SL size), the bitmap returned will start at (0,0) and end at (63,63). |
111 | /// The value of the set_value needs to be true to define an active parcel of the given size. | ||
104 | /// </remarks> | 112 | /// </remarks> |
105 | /// <param name="start_x"></param> | 113 | /// <param name="start_x"></param> |
106 | /// <param name="start_y"></param> | 114 | /// <param name="start_y"></param> |
107 | /// <param name="end_x"></param> | 115 | /// <param name="end_x"></param> |
108 | /// <param name="end_y"></param> | 116 | /// <param name="end_y"></param> |
117 | /// <param name="set_value"></param> | ||
109 | /// <returns>The bitmap created.</returns> | 118 | /// <returns>The bitmap created.</returns> |
110 | bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y); | 119 | bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y, bool set_value = true); |
111 | 120 | ||
112 | bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value); | 121 | bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value); |
122 | |||
123 | /// <summary> | ||
124 | /// Merge two (same size) land bitmaps. | ||
125 | /// </summary> | ||
126 | /// <param name="bitmap_base"></param> | ||
127 | /// <param name="bitmap_add"></param> | ||
128 | /// <returns>The modified bitmap.</returns> | ||
113 | bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add); | 129 | bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add); |
130 | |||
131 | /// <summary> | ||
132 | /// Remap a land bitmap. Takes the supplied land bitmap and rotates it, crops it and finally offsets it into | ||
133 | /// a final land bitmap of the target region size. | ||
134 | /// </summary> | ||
135 | /// <param name="bitmap_base">The original parcel bitmap</param> | ||
136 | /// <param name="rotationDegrees"></param> | ||
137 | /// <param name="displacement"><x,y,?></param> | ||
138 | /// <param name="boundingOrigin"><x,y,?></param> | ||
139 | /// <param name="boundingSize"><x,y,?></param> | ||
140 | /// <param name="regionSize"><x,y,?></param> | ||
141 | /// <param name="isEmptyNow">out: This is set if the resultant bitmap is now empty</param> | ||
142 | /// <param name="AABBMin">out: parcel.AABBMin <x,y,0></param> | ||
143 | /// <param name="AABBMax">out: parcel.AABBMax <x,y,0></param> | ||
144 | /// <returns>New parcel bitmap</returns> | ||
145 | bool[,] RemapLandBitmap(bool[,] bitmap_base, Vector2 displacement, float rotationDegrees, Vector2 boundingOrigin, Vector2 boundingSize, Vector2 regionSize, out bool isEmptyNow, out Vector3 AABBMin, out Vector3 AABBMax); | ||
146 | |||
147 | /// <summary> | ||
148 | /// Clears any parcel data in bitmap_base where there exists parcel data in bitmap_new. In other words the parcel data | ||
149 | /// in bitmap_new takes over the space of the parcel data in bitmap_base. | ||
150 | /// </summary> | ||
151 | /// <param name="bitmap_base"></param> | ||
152 | /// <param name="bitmap_new"></param> | ||
153 | /// <param name="isEmptyNow">out: This is set if the resultant bitmap is now empty</param> | ||
154 | /// <param name="AABBMin">out: parcel.AABBMin <x,y,0></param> | ||
155 | /// <param name="AABBMax">out: parcel.AABBMax <x,y,0></param> | ||
156 | /// <returns>New parcel bitmap</returns> | ||
157 | bool[,] RemoveFromLandBitmap(bool[,] bitmap_base, bool[,] bitmap_new, out bool isEmptyNow, out Vector3 AABBMin, out Vector3 AABBMax); | ||
158 | |||
159 | byte[] ConvertLandBitmapToBytes(); | ||
160 | bool[,] ConvertBytesToLandBitmap(bool overrideRegionSize = false); | ||
161 | bool IsLandBitmapEmpty(bool[,] landBitmap); | ||
162 | void DebugLandBitmap(bool[,] landBitmap); | ||
163 | |||
114 | void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client); | 164 | void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client); |
115 | void SendLandObjectOwners(IClientAPI remote_client); | 165 | void SendLandObjectOwners(IClientAPI remote_client); |
116 | void ReturnLandObjects(uint type, UUID[] owners, UUID[] tasks, IClientAPI remote_client); | 166 | void ReturnLandObjects(uint type, UUID[] owners, UUID[] tasks, IClientAPI remote_client); |
@@ -127,7 +177,7 @@ namespace OpenSim.Framework | |||
127 | /// </summary> | 177 | /// </summary> |
128 | /// <param name="url"></param> | 178 | /// <param name="url"></param> |
129 | void SetMediaUrl(string url); | 179 | void SetMediaUrl(string url); |
130 | 180 | ||
131 | /// <summary> | 181 | /// <summary> |
132 | /// Set the music url for this land parcel | 182 | /// Set the music url for this land parcel |
133 | /// </summary> | 183 | /// </summary> |
@@ -139,5 +189,7 @@ namespace OpenSim.Framework | |||
139 | /// </summary> | 189 | /// </summary> |
140 | /// <returns>The music url.</returns> | 190 | /// <returns>The music url.</returns> |
141 | string GetMusicUrl(); | 191 | string GetMusicUrl(); |
192 | |||
193 | void Clear(); | ||
142 | } | 194 | } |
143 | } | 195 | } |
diff --git a/OpenSim/Framework/IMoneyModule.cs b/OpenSim/Framework/IMoneyModule.cs index 52f3e83..c72c742 100644 --- a/OpenSim/Framework/IMoneyModule.cs +++ b/OpenSim/Framework/IMoneyModule.cs | |||
@@ -32,15 +32,16 @@ namespace OpenSim.Framework | |||
32 | public delegate void ObjectPaid(UUID objectID, UUID agentID, int amount); | 32 | public delegate void ObjectPaid(UUID objectID, UUID agentID, int amount); |
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, |
36 | int amount); | 36 | UUID toID, int amount, UUID txn, out string reason); |
37 | 37 | ||
38 | int GetBalance(UUID agentID); | 38 | int GetBalance(UUID agentID); |
39 | bool UploadCovered(UUID agentID, int amount); | 39 | bool UploadCovered(UUID agentID, int amount); |
40 | bool AmountCovered(UUID agentID, int amount); | 40 | bool AmountCovered(UUID agentID, int amount); |
41 | void ApplyCharge(UUID agentID, int amount, MoneyTransactionType type); | 41 | void ApplyCharge(UUID agentID, int amount, MoneyTransactionType type, string extraData = ""); |
42 | void ApplyCharge(UUID agentID, int amount, MoneyTransactionType type, string extraData); | ||
43 | void ApplyUploadCharge(UUID agentID, int amount, string text); | 42 | void ApplyUploadCharge(UUID agentID, int amount, string text); |
43 | void MoveMoney(UUID fromUser, UUID toUser, int amount, string text); | ||
44 | bool MoveMoney(UUID fromUser, UUID toUser, int amount, MoneyTransactionType type, string text); | ||
44 | 45 | ||
45 | int UploadCharge { get; } | 46 | int UploadCharge { get; } |
46 | int GroupCreationCharge { get; } | 47 | int GroupCreationCharge { get; } |
diff --git a/OpenSim/Framework/IPrimCounts.cs b/OpenSim/Framework/IPrimCounts.cs index 3e12348..3b62ad3 100644 --- a/OpenSim/Framework/IPrimCounts.cs +++ b/OpenSim/Framework/IPrimCounts.cs | |||
@@ -35,12 +35,12 @@ namespace OpenSim.Framework | |||
35 | /// Parcel owner owned prims | 35 | /// Parcel owner owned prims |
36 | /// </summary> | 36 | /// </summary> |
37 | int Owner { get; } | 37 | int Owner { get; } |
38 | 38 | ||
39 | /// <summary> | 39 | /// <summary> |
40 | /// Parcel group owned prims | 40 | /// Parcel group owned prims |
41 | /// </summary> | 41 | /// </summary> |
42 | int Group { get; } | 42 | int Group { get; } |
43 | 43 | ||
44 | /// <summary> | 44 | /// <summary> |
45 | /// Prims owned by others (not parcel owner or parcel group). | 45 | /// Prims owned by others (not parcel owner or parcel group). |
46 | /// </summary> | 46 | /// </summary> |
@@ -48,19 +48,19 @@ namespace OpenSim.Framework | |||
48 | 48 | ||
49 | /// <summary> | 49 | /// <summary> |
50 | /// Selected prims | 50 | /// Selected prims |
51 | /// </summary> | 51 | /// </summary> |
52 | int Selected { get; } | 52 | int Selected { get; } |
53 | 53 | ||
54 | /// <summary> | 54 | /// <summary> |
55 | /// Total prims on the parcel. | 55 | /// Total prims on the parcel. |
56 | /// </summary> | 56 | /// </summary> |
57 | int Total { get; } | 57 | int Total { get; } |
58 | 58 | ||
59 | /// <summary> | 59 | /// <summary> |
60 | /// Prims on the simulator that are owned by the parcel owner, even if they are in other parcels. | 60 | /// Prims on the simulator that are owned by the parcel owner, even if they are in other parcels. |
61 | /// </summary> | 61 | /// </summary> |
62 | int Simulator { get; } | 62 | int Simulator { get; } |
63 | 63 | ||
64 | /// <summary> | 64 | /// <summary> |
65 | /// Prims per individual users. | 65 | /// Prims per individual users. |
66 | /// </summary> | 66 | /// </summary> |
diff --git a/OpenSim/Framework/IRegistryCore.cs b/OpenSim/Framework/IRegistryCore.cs index a94b65d..cf3ecc0 100644 --- a/OpenSim/Framework/IRegistryCore.cs +++ b/OpenSim/Framework/IRegistryCore.cs | |||
@@ -31,7 +31,7 @@ using System.Text; | |||
31 | 31 | ||
32 | namespace OpenSim.Framework | 32 | namespace OpenSim.Framework |
33 | { | 33 | { |
34 | public interface IRegistryCore | 34 | public interface IRegistryCore |
35 | { | 35 | { |
36 | T Get<T>(); | 36 | T Get<T>(); |
37 | void RegisterInterface<T>(T iface); | 37 | void RegisterInterface<T>(T iface); |
diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index e1b6d1e..37a064f 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs | |||
@@ -40,7 +40,7 @@ namespace OpenSim.Framework | |||
40 | Crashed = 2, | 40 | Crashed = 2, |
41 | Starting = 3, | 41 | Starting = 3, |
42 | }; | 42 | }; |
43 | 43 | ||
44 | /// <value> | 44 | /// <value> |
45 | /// Indicate what action to take on an object derez request | 45 | /// Indicate what action to take on an object derez request |
46 | /// </value> | 46 | /// </value> |
@@ -118,7 +118,7 @@ namespace OpenSim.Framework | |||
118 | /// </summary> | 118 | /// </summary> |
119 | /// <param name="mod"></param> | 119 | /// <param name="mod"></param> |
120 | void RegisterModuleInterface<M>(M mod); | 120 | void RegisterModuleInterface<M>(M mod); |
121 | 121 | ||
122 | void StackModuleInterface<M>(M mod); | 122 | void StackModuleInterface<M>(M mod); |
123 | 123 | ||
124 | /// <summary> | 124 | /// <summary> |
diff --git a/OpenSim/Framework/ISceneAgent.cs b/OpenSim/Framework/ISceneAgent.cs index ca1399c..5d70b83 100644 --- a/OpenSim/Framework/ISceneAgent.cs +++ b/OpenSim/Framework/ISceneAgent.cs | |||
@@ -55,6 +55,10 @@ namespace OpenSim.Framework | |||
55 | /// </summary> | 55 | /// </summary> |
56 | bool IsChildAgent { get; } | 56 | bool IsChildAgent { get; } |
57 | 57 | ||
58 | bool IsInTransit { get; } | ||
59 | bool IsNPC { get;} | ||
60 | |||
61 | bool Invulnerable { get; set; } | ||
58 | /// <summary> | 62 | /// <summary> |
59 | /// Avatar appearance data. | 63 | /// Avatar appearance data. |
60 | /// </summary> | 64 | /// </summary> |
@@ -66,22 +70,17 @@ namespace OpenSim.Framework | |||
66 | AvatarAppearance Appearance { get; set; } | 70 | AvatarAppearance Appearance { get; set; } |
67 | 71 | ||
68 | /// <summary> | 72 | /// <summary> |
69 | /// Set if initial data about the scene (avatars, objects) has been sent to the client. | ||
70 | /// </summary> | ||
71 | bool SentInitialDataToClient { get; } | ||
72 | |||
73 | /// <summary> | ||
74 | /// Send initial scene data to the client controlling this agent | 73 | /// Send initial scene data to the client controlling this agent |
75 | /// </summary> | 74 | /// </summary> |
76 | /// <remarks> | 75 | /// <remarks> |
77 | /// This includes scene object data and the appearance data of other avatars. | 76 | /// This includes scene object data and the appearance data of other avatars. |
78 | /// </remarks> | 77 | /// </remarks> |
79 | void SendInitialDataToClient(); | 78 | void SendInitialDataToMe(); |
80 | 79 | ||
81 | /// <summary> | 80 | /// <summary> |
82 | /// Direction in which the scene presence is looking. | 81 | /// Direction in which the scene presence is looking. |
83 | /// </summary> | 82 | /// </summary> |
84 | /// <remarks>Will be Vector3.Zero for a child agent.</remarks> | 83 | /// <remarks>Will be Vector3.Zero for a child agent.</remarks> |
85 | Vector3 Lookat { get; } | 84 | Vector3 Lookat { get; } |
86 | } | 85 | } |
87 | } \ No newline at end of file | 86 | } |
diff --git a/OpenSim/Framework/InventoryFolderImpl.cs b/OpenSim/Framework/InventoryFolderImpl.cs index 139776b..d14f3be 100644 --- a/OpenSim/Framework/InventoryFolderImpl.cs +++ b/OpenSim/Framework/InventoryFolderImpl.cs | |||
@@ -314,7 +314,7 @@ namespace OpenSim.Framework | |||
314 | /// XPath like expression | 314 | /// XPath like expression |
315 | /// | 315 | /// |
316 | /// FIXME: Delimitors which occur in names themselves are not currently escapable. | 316 | /// FIXME: Delimitors which occur in names themselves are not currently escapable. |
317 | /// | 317 | /// |
318 | /// <param name="path"> | 318 | /// <param name="path"> |
319 | /// The path to the required folder. | 319 | /// The path to the required folder. |
320 | /// It this is empty or consists only of the PATH_DELIMTER then this folder itself is returned. | 320 | /// It this is empty or consists only of the PATH_DELIMTER then this folder itself is returned. |
diff --git a/OpenSim/Framework/InventoryItemBase.cs b/OpenSim/Framework/InventoryItemBase.cs index f9fd752..c359a0c 100644 --- a/OpenSim/Framework/InventoryItemBase.cs +++ b/OpenSim/Framework/InventoryItemBase.cs | |||
@@ -34,17 +34,17 @@ namespace OpenSim.Framework | |||
34 | /// Inventory Item - contains all the properties associated with an individual inventory piece. | 34 | /// Inventory Item - contains all the properties associated with an individual inventory piece. |
35 | /// </summary> | 35 | /// </summary> |
36 | public class InventoryItemBase : InventoryNodeBase, ICloneable | 36 | public class InventoryItemBase : InventoryNodeBase, ICloneable |
37 | { | 37 | { |
38 | /// <value> | 38 | /// <value> |
39 | /// The inventory type of the item. This is slightly different from the asset type in some situations. | 39 | /// The inventory type of the item. This is slightly different from the asset type in some situations. |
40 | /// </value> | 40 | /// </value> |
41 | public int InvType | 41 | public int InvType |
42 | { | 42 | { |
43 | get | 43 | get |
44 | { | 44 | { |
45 | return m_invType; | 45 | return m_invType; |
46 | } | 46 | } |
47 | 47 | ||
48 | set | 48 | set |
49 | { | 49 | { |
50 | m_invType = value; | 50 | m_invType = value; |
@@ -55,13 +55,13 @@ namespace OpenSim.Framework | |||
55 | /// <value> | 55 | /// <value> |
56 | /// The folder this item is contained in | 56 | /// The folder this item is contained in |
57 | /// </value> | 57 | /// </value> |
58 | public UUID Folder | 58 | public UUID Folder |
59 | { | 59 | { |
60 | get | 60 | get |
61 | { | 61 | { |
62 | return m_folder; | 62 | return m_folder; |
63 | } | 63 | } |
64 | 64 | ||
65 | set | 65 | set |
66 | { | 66 | { |
67 | m_folder = value; | 67 | m_folder = value; |
@@ -72,17 +72,17 @@ namespace OpenSim.Framework | |||
72 | /// <value> | 72 | /// <value> |
73 | /// The creator of this item | 73 | /// The creator of this item |
74 | /// </value> | 74 | /// </value> |
75 | public string CreatorId | 75 | public string CreatorId |
76 | { | 76 | { |
77 | get | 77 | get |
78 | { | 78 | { |
79 | return m_creatorId; | 79 | return m_creatorId; |
80 | } | 80 | } |
81 | 81 | ||
82 | set | 82 | set |
83 | { | 83 | { |
84 | m_creatorId = value; | 84 | m_creatorId = value; |
85 | 85 | ||
86 | if ((m_creatorId == null) || !UUID.TryParse(m_creatorId, out m_creatorIdAsUuid)) | 86 | if ((m_creatorId == null) || !UUID.TryParse(m_creatorId, out m_creatorIdAsUuid)) |
87 | m_creatorIdAsUuid = UUID.Zero; | 87 | m_creatorIdAsUuid = UUID.Zero; |
88 | } | 88 | } |
@@ -92,7 +92,7 @@ namespace OpenSim.Framework | |||
92 | /// <value> | 92 | /// <value> |
93 | /// The CreatorId expressed as a UUID. | 93 | /// The CreatorId expressed as a UUID. |
94 | /// </value> | 94 | /// </value> |
95 | public UUID CreatorIdAsUuid | 95 | public UUID CreatorIdAsUuid |
96 | { | 96 | { |
97 | get | 97 | get |
98 | { | 98 | { |
@@ -161,13 +161,13 @@ namespace OpenSim.Framework | |||
161 | /// <value> | 161 | /// <value> |
162 | /// The description of the inventory item (must be less than 64 characters) | 162 | /// The description of the inventory item (must be less than 64 characters) |
163 | /// </value> | 163 | /// </value> |
164 | public string Description | 164 | public string Description |
165 | { | 165 | { |
166 | get | 166 | get |
167 | { | 167 | { |
168 | return m_description; | 168 | return m_description; |
169 | } | 169 | } |
170 | 170 | ||
171 | set | 171 | set |
172 | { | 172 | { |
173 | m_description = value; | 173 | m_description = value; |
@@ -178,13 +178,13 @@ namespace OpenSim.Framework | |||
178 | /// <value> | 178 | /// <value> |
179 | /// | 179 | /// |
180 | /// </value> | 180 | /// </value> |
181 | public uint NextPermissions | 181 | public uint NextPermissions |
182 | { | 182 | { |
183 | get | 183 | get |
184 | { | 184 | { |
185 | return m_nextPermissions; | 185 | return m_nextPermissions; |
186 | } | 186 | } |
187 | 187 | ||
188 | set | 188 | set |
189 | { | 189 | { |
190 | m_nextPermissions = value; | 190 | m_nextPermissions = value; |
@@ -195,13 +195,13 @@ namespace OpenSim.Framework | |||
195 | /// <value> | 195 | /// <value> |
196 | /// A mask containing permissions for the current owner (cannot be enforced) | 196 | /// A mask containing permissions for the current owner (cannot be enforced) |
197 | /// </value> | 197 | /// </value> |
198 | public uint CurrentPermissions | 198 | public uint CurrentPermissions |
199 | { | 199 | { |
200 | get | 200 | get |
201 | { | 201 | { |
202 | return m_currentPermissions; | 202 | return m_currentPermissions; |
203 | } | 203 | } |
204 | 204 | ||
205 | set | 205 | set |
206 | { | 206 | { |
207 | m_currentPermissions = value; | 207 | m_currentPermissions = value; |
@@ -212,13 +212,13 @@ namespace OpenSim.Framework | |||
212 | /// <value> | 212 | /// <value> |
213 | /// | 213 | /// |
214 | /// </value> | 214 | /// </value> |
215 | public uint BasePermissions | 215 | public uint BasePermissions |
216 | { | 216 | { |
217 | get | 217 | get |
218 | { | 218 | { |
219 | return m_basePermissions; | 219 | return m_basePermissions; |
220 | } | 220 | } |
221 | 221 | ||
222 | set | 222 | set |
223 | { | 223 | { |
224 | m_basePermissions = value; | 224 | m_basePermissions = value; |
@@ -229,13 +229,13 @@ namespace OpenSim.Framework | |||
229 | /// <value> | 229 | /// <value> |
230 | /// | 230 | /// |
231 | /// </value> | 231 | /// </value> |
232 | public uint EveryOnePermissions | 232 | public uint EveryOnePermissions |
233 | { | 233 | { |
234 | get | 234 | get |
235 | { | 235 | { |
236 | return m_everyonePermissions; | 236 | return m_everyonePermissions; |
237 | } | 237 | } |
238 | 238 | ||
239 | set | 239 | set |
240 | { | 240 | { |
241 | m_everyonePermissions = value; | 241 | m_everyonePermissions = value; |
@@ -246,13 +246,13 @@ namespace OpenSim.Framework | |||
246 | /// <value> | 246 | /// <value> |
247 | /// | 247 | /// |
248 | /// </value> | 248 | /// </value> |
249 | public uint GroupPermissions | 249 | public uint GroupPermissions |
250 | { | 250 | { |
251 | get | 251 | get |
252 | { | 252 | { |
253 | return m_groupPermissions; | 253 | return m_groupPermissions; |
254 | } | 254 | } |
255 | 255 | ||
256 | set | 256 | set |
257 | { | 257 | { |
258 | m_groupPermissions = value; | 258 | m_groupPermissions = value; |
@@ -263,13 +263,13 @@ namespace OpenSim.Framework | |||
263 | /// <value> | 263 | /// <value> |
264 | /// This is an enumerated value determining the type of asset (eg Notecard, Sound, Object, etc) | 264 | /// This is an enumerated value determining the type of asset (eg Notecard, Sound, Object, etc) |
265 | /// </value> | 265 | /// </value> |
266 | public int AssetType | 266 | public int AssetType |
267 | { | 267 | { |
268 | get | 268 | get |
269 | { | 269 | { |
270 | return m_assetType; | 270 | return m_assetType; |
271 | } | 271 | } |
272 | 272 | ||
273 | set | 273 | set |
274 | { | 274 | { |
275 | m_assetType = value; | 275 | m_assetType = value; |
@@ -280,13 +280,13 @@ namespace OpenSim.Framework | |||
280 | /// <value> | 280 | /// <value> |
281 | /// The UUID of the associated asset on the asset server | 281 | /// The UUID of the associated asset on the asset server |
282 | /// </value> | 282 | /// </value> |
283 | public UUID AssetID | 283 | public UUID AssetID |
284 | { | 284 | { |
285 | get | 285 | get |
286 | { | 286 | { |
287 | return m_assetID; | 287 | return m_assetID; |
288 | } | 288 | } |
289 | 289 | ||
290 | set | 290 | set |
291 | { | 291 | { |
292 | m_assetID = value; | 292 | m_assetID = value; |
@@ -297,13 +297,13 @@ namespace OpenSim.Framework | |||
297 | /// <value> | 297 | /// <value> |
298 | /// | 298 | /// |
299 | /// </value> | 299 | /// </value> |
300 | public UUID GroupID | 300 | public UUID GroupID |
301 | { | 301 | { |
302 | get | 302 | get |
303 | { | 303 | { |
304 | return m_groupID; | 304 | return m_groupID; |
305 | } | 305 | } |
306 | 306 | ||
307 | set | 307 | set |
308 | { | 308 | { |
309 | m_groupID = value; | 309 | m_groupID = value; |
@@ -314,13 +314,13 @@ namespace OpenSim.Framework | |||
314 | /// <value> | 314 | /// <value> |
315 | /// | 315 | /// |
316 | /// </value> | 316 | /// </value> |
317 | public bool GroupOwned | 317 | public bool GroupOwned |
318 | { | 318 | { |
319 | get | 319 | get |
320 | { | 320 | { |
321 | return m_groupOwned; | 321 | return m_groupOwned; |
322 | } | 322 | } |
323 | 323 | ||
324 | set | 324 | set |
325 | { | 325 | { |
326 | m_groupOwned = value; | 326 | m_groupOwned = value; |
@@ -331,13 +331,13 @@ namespace OpenSim.Framework | |||
331 | /// <value> | 331 | /// <value> |
332 | /// | 332 | /// |
333 | /// </value> | 333 | /// </value> |
334 | public int SalePrice | 334 | public int SalePrice |
335 | { | 335 | { |
336 | get | 336 | get |
337 | { | 337 | { |
338 | return m_salePrice; | 338 | return m_salePrice; |
339 | } | 339 | } |
340 | 340 | ||
341 | set | 341 | set |
342 | { | 342 | { |
343 | m_salePrice = value; | 343 | m_salePrice = value; |
@@ -348,13 +348,13 @@ namespace OpenSim.Framework | |||
348 | /// <value> | 348 | /// <value> |
349 | /// | 349 | /// |
350 | /// </value> | 350 | /// </value> |
351 | public byte SaleType | 351 | public byte SaleType |
352 | { | 352 | { |
353 | get | 353 | get |
354 | { | 354 | { |
355 | return m_saleType; | 355 | return m_saleType; |
356 | } | 356 | } |
357 | 357 | ||
358 | set | 358 | set |
359 | { | 359 | { |
360 | m_saleType = value; | 360 | m_saleType = value; |
@@ -365,13 +365,13 @@ namespace OpenSim.Framework | |||
365 | /// <value> | 365 | /// <value> |
366 | /// | 366 | /// |
367 | /// </value> | 367 | /// </value> |
368 | public uint Flags | 368 | public uint Flags |
369 | { | 369 | { |
370 | get | 370 | get |
371 | { | 371 | { |
372 | return m_flags; | 372 | return m_flags; |
373 | } | 373 | } |
374 | 374 | ||
375 | set | 375 | set |
376 | { | 376 | { |
377 | m_flags = value; | 377 | m_flags = value; |
@@ -382,13 +382,13 @@ namespace OpenSim.Framework | |||
382 | /// <value> | 382 | /// <value> |
383 | /// | 383 | /// |
384 | /// </value> | 384 | /// </value> |
385 | public int CreationDate | 385 | public int CreationDate |
386 | { | 386 | { |
387 | get | 387 | get |
388 | { | 388 | { |
389 | return m_creationDate; | 389 | return m_creationDate; |
390 | } | 390 | } |
391 | 391 | ||
392 | set | 392 | set |
393 | { | 393 | { |
394 | m_creationDate = value; | 394 | m_creationDate = value; |
diff --git a/OpenSim/Framework/InventoryNodeBase.cs b/OpenSim/Framework/InventoryNodeBase.cs index 31c3fd1..9ef36b7 100644 --- a/OpenSim/Framework/InventoryNodeBase.cs +++ b/OpenSim/Framework/InventoryNodeBase.cs | |||
@@ -41,19 +41,19 @@ namespace OpenSim.Framework | |||
41 | { | 41 | { |
42 | get { return m_name; } | 42 | get { return m_name; } |
43 | set { m_name = value; } | 43 | set { m_name = value; } |
44 | } | 44 | } |
45 | private string m_name = string.Empty; | 45 | private string m_name = string.Empty; |
46 | 46 | ||
47 | /// <summary> | 47 | /// <summary> |
48 | /// A UUID containing the ID for the inventory node itself | 48 | /// A UUID containing the ID for the inventory node itself |
49 | /// </summary> | 49 | /// </summary> |
50 | public UUID ID | 50 | public UUID ID |
51 | { | 51 | { |
52 | get { return m_id; } | 52 | get { return m_id; } |
53 | set { m_id = value; } | 53 | set { m_id = value; } |
54 | } | 54 | } |
55 | private UUID m_id; | 55 | private UUID m_id; |
56 | 56 | ||
57 | /// <summary> | 57 | /// <summary> |
58 | /// The agent who's inventory this is contained by | 58 | /// The agent who's inventory this is contained by |
59 | /// </summary> | 59 | /// </summary> |
diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs index fc02f33..13b58be 100644 --- a/OpenSim/Framework/LandData.cs +++ b/OpenSim/Framework/LandData.cs | |||
@@ -67,11 +67,11 @@ namespace OpenSim.Framework | |||
67 | 67 | ||
68 | private uint _flags = (uint)ParcelFlags.AllowFly | (uint)ParcelFlags.AllowLandmark | | 68 | private uint _flags = (uint)ParcelFlags.AllowFly | (uint)ParcelFlags.AllowLandmark | |
69 | (uint)ParcelFlags.AllowAPrimitiveEntry | | 69 | (uint)ParcelFlags.AllowAPrimitiveEntry | |
70 | (uint)ParcelFlags.AllowDeedToGroup | (uint)ParcelFlags.AllowTerraform | | 70 | (uint)ParcelFlags.AllowDeedToGroup | |
71 | (uint)ParcelFlags.CreateObjects | (uint)ParcelFlags.AllowOtherScripts | | 71 | (uint)ParcelFlags.CreateObjects | (uint)ParcelFlags.AllowOtherScripts | |
72 | (uint)ParcelFlags.SoundLocal | (uint)ParcelFlags.AllowVoiceChat; | 72 | (uint)ParcelFlags.AllowVoiceChat; |
73 | 73 | ||
74 | private byte _landingType = 0; | 74 | private byte _landingType = (byte)OpenMetaverse.LandingType.Direct; |
75 | private string _name = "Your Parcel"; | 75 | private string _name = "Your Parcel"; |
76 | private ParcelStatus _status = ParcelStatus.Leased; | 76 | private ParcelStatus _status = ParcelStatus.Leased; |
77 | private int _localID = 0; | 77 | private int _localID = 0; |
@@ -97,7 +97,13 @@ 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; | 100 | |
101 | private float m_dwell = 0; | ||
102 | public double LastDwellTimeMS; | ||
103 | |||
104 | public bool SeeAVs { get; set; } | ||
105 | public bool AnyAVSounds { get; set; } | ||
106 | public bool GroupAVSounds { get; set; } | ||
101 | 107 | ||
102 | /// <summary> | 108 | /// <summary> |
103 | /// Traffic count of parcel | 109 | /// Traffic count of parcel |
@@ -107,11 +113,12 @@ namespace OpenSim.Framework | |||
107 | { | 113 | { |
108 | get | 114 | get |
109 | { | 115 | { |
110 | return _dwell; | 116 | return m_dwell; |
111 | } | 117 | } |
112 | set | 118 | set |
113 | { | 119 | { |
114 | _dwell = value; | 120 | m_dwell = value; |
121 | LastDwellTimeMS = Util.GetTimeStampMS(); | ||
115 | } | 122 | } |
116 | } | 123 | } |
117 | 124 | ||
@@ -407,7 +414,7 @@ namespace OpenSim.Framework | |||
407 | } | 414 | } |
408 | 415 | ||
409 | /// <summary> | 416 | /// <summary> |
410 | /// Determines if people are able to teleport where they please on the parcel or if they | 417 | /// Determines if people are able to teleport where they please on the parcel or if they |
411 | /// get constrainted to a specific point on teleport within the parcel | 418 | /// get constrainted to a specific point on teleport within the parcel |
412 | /// </summary> | 419 | /// </summary> |
413 | public byte LandingType | 420 | public byte LandingType |
@@ -616,7 +623,7 @@ namespace OpenSim.Framework | |||
616 | } | 623 | } |
617 | 624 | ||
618 | /// <summary> | 625 | /// <summary> |
619 | /// Number of meters^2 in the Simulator | 626 | /// Number of meters^2 that the land owner has in the Simulator |
620 | /// </summary> | 627 | /// </summary> |
621 | [XmlIgnore] | 628 | [XmlIgnore] |
622 | public int SimwideArea | 629 | public int SimwideArea |
@@ -663,7 +670,7 @@ namespace OpenSim.Framework | |||
663 | } | 670 | } |
664 | 671 | ||
665 | /// <summary> | 672 | /// <summary> |
666 | /// When teleporting is restricted to a certain point, this is the location | 673 | /// When teleporting is restricted to a certain point, this is the location |
667 | /// that the user will be redirected to | 674 | /// that the user will be redirected to |
668 | /// </summary> | 675 | /// </summary> |
669 | public Vector3 UserLocation | 676 | public Vector3 UserLocation |
@@ -679,7 +686,7 @@ namespace OpenSim.Framework | |||
679 | } | 686 | } |
680 | 687 | ||
681 | /// <summary> | 688 | /// <summary> |
682 | /// When teleporting is restricted to a certain point, this is the rotation | 689 | /// When teleporting is restricted to a certain point, this is the rotation |
683 | /// that the user will be positioned | 690 | /// that the user will be positioned |
684 | /// </summary> | 691 | /// </summary> |
685 | public Vector3 UserLookAt | 692 | public Vector3 UserLookAt |
@@ -695,7 +702,7 @@ namespace OpenSim.Framework | |||
695 | } | 702 | } |
696 | 703 | ||
697 | /// <summary> | 704 | /// <summary> |
698 | /// Autoreturn number of minutes to return SceneObjectGroup that are owned by someone who doesn't own | 705 | /// Autoreturn number of minutes to return SceneObjectGroup that are owned by someone who doesn't own |
699 | /// the parcel and isn't set to the same 'group' as the parcel. | 706 | /// the parcel and isn't set to the same 'group' as the parcel. |
700 | /// </summary> | 707 | /// </summary> |
701 | public int OtherCleanTime | 708 | public int OtherCleanTime |
@@ -728,6 +735,10 @@ namespace OpenSim.Framework | |||
728 | public LandData() | 735 | public LandData() |
729 | { | 736 | { |
730 | _globalID = UUID.Random(); | 737 | _globalID = UUID.Random(); |
738 | SeeAVs = true; | ||
739 | AnyAVSounds = true; | ||
740 | GroupAVSounds = true; | ||
741 | LastDwellTimeMS = Util.GetTimeStampMS(); | ||
731 | } | 742 | } |
732 | 743 | ||
733 | /// <summary> | 744 | /// <summary> |
@@ -777,7 +788,10 @@ namespace OpenSim.Framework | |||
777 | landData._obscureMedia = _obscureMedia; | 788 | landData._obscureMedia = _obscureMedia; |
778 | landData._simwideArea = _simwideArea; | 789 | landData._simwideArea = _simwideArea; |
779 | landData._simwidePrims = _simwidePrims; | 790 | landData._simwidePrims = _simwidePrims; |
780 | landData._dwell = _dwell; | 791 | landData.m_dwell = m_dwell; |
792 | landData.SeeAVs = SeeAVs; | ||
793 | landData.AnyAVSounds = AnyAVSounds; | ||
794 | landData.GroupAVSounds = GroupAVSounds; | ||
781 | 795 | ||
782 | landData._parcelAccessList.Clear(); | 796 | landData._parcelAccessList.Clear(); |
783 | foreach (LandAccessEntry entry in _parcelAccessList) | 797 | foreach (LandAccessEntry entry in _parcelAccessList) |
@@ -793,21 +807,21 @@ namespace OpenSim.Framework | |||
793 | return landData; | 807 | return landData; |
794 | } | 808 | } |
795 | 809 | ||
796 | public void ToXml(XmlWriter xmlWriter) | 810 | // public void ToXml(XmlWriter xmlWriter) |
797 | { | 811 | // { |
798 | serializer.Serialize(xmlWriter, this); | 812 | // serializer.Serialize(xmlWriter, this); |
799 | } | 813 | // } |
800 | 814 | ||
801 | /// <summary> | 815 | /// <summary> |
802 | /// Restore a LandData object from the serialized xml representation. | 816 | /// Restore a LandData object from the serialized xml representation. |
803 | /// </summary> | 817 | /// </summary> |
804 | /// <param name="xmlReader"></param> | 818 | /// <param name="xmlReader"></param> |
805 | /// <returns></returns> | 819 | /// <returns></returns> |
806 | public static LandData FromXml(XmlReader xmlReader) | 820 | // public static LandData FromXml(XmlReader xmlReader) |
807 | { | 821 | // { |
808 | LandData land = (LandData)serializer.Deserialize(xmlReader); | 822 | // LandData land = (LandData)serializer.Deserialize(xmlReader); |
809 | 823 | // | |
810 | return land; | 824 | // return land; |
811 | } | 825 | // } |
812 | } | 826 | } |
813 | } | 827 | } |
diff --git a/OpenSim/Framework/LandUpdateArgs.cs b/OpenSim/Framework/LandUpdateArgs.cs index 7d6c4f2..a48b8bf 100644 --- a/OpenSim/Framework/LandUpdateArgs.cs +++ b/OpenSim/Framework/LandUpdateArgs.cs | |||
@@ -56,5 +56,8 @@ namespace OpenSim.Framework | |||
56 | public bool MediaLoop; | 56 | public bool MediaLoop; |
57 | public bool ObscureMusic; | 57 | public bool ObscureMusic; |
58 | public bool ObscureMedia; | 58 | public bool ObscureMedia; |
59 | public bool SeeAVs; | ||
60 | public bool AnyAVSounds; | ||
61 | public bool GroupAVSounds; | ||
59 | } | 62 | } |
60 | } | 63 | } |
diff --git a/OpenSim/Framework/Lazy.cs b/OpenSim/Framework/Lazy.cs index 91de4bd..ea07d0e 100644 --- a/OpenSim/Framework/Lazy.cs +++ b/OpenSim/Framework/Lazy.cs | |||
@@ -14,10 +14,10 @@ | |||
14 | // distribute, sublicense, and/or sell copies of the Software, and to | 14 | // distribute, sublicense, and/or sell copies of the Software, and to |
15 | // permit persons to whom the Software is furnished to do so, subject to | 15 | // permit persons to whom the Software is furnished to do so, subject to |
16 | // the following conditions: | 16 | // the following conditions: |
17 | // | 17 | // |
18 | // The above copyright notice and this permission notice shall be | 18 | // The above copyright notice and this permission notice shall be |
19 | // included in all copies or substantial portions of the Software. | 19 | // included in all copies or substantial portions of the Software. |
20 | // | 20 | // |
21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
22 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 22 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
23 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 23 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
diff --git a/OpenSim/Framework/LocklessQueue.cs b/OpenSim/Framework/LocklessQueue.cs index 84f887c..21b8178 100644 --- a/OpenSim/Framework/LocklessQueue.cs +++ b/OpenSim/Framework/LocklessQueue.cs | |||
@@ -29,7 +29,7 @@ using System.Threading; | |||
29 | 29 | ||
30 | namespace OpenSim.Framework | 30 | namespace OpenSim.Framework |
31 | { | 31 | { |
32 | public sealed class LocklessQueue<T> | 32 | public class LocklessQueue<T> |
33 | { | 33 | { |
34 | private sealed class SingleLinkNode | 34 | private sealed class SingleLinkNode |
35 | { | 35 | { |
@@ -41,7 +41,7 @@ namespace OpenSim.Framework | |||
41 | SingleLinkNode tail; | 41 | SingleLinkNode tail; |
42 | int count; | 42 | int count; |
43 | 43 | ||
44 | public int Count { get { return count; } } | 44 | public virtual int Count { get { return count; } } |
45 | 45 | ||
46 | public LocklessQueue() | 46 | public LocklessQueue() |
47 | { | 47 | { |
@@ -76,7 +76,7 @@ namespace OpenSim.Framework | |||
76 | Interlocked.Increment(ref count); | 76 | Interlocked.Increment(ref count); |
77 | } | 77 | } |
78 | 78 | ||
79 | public bool Dequeue(out T item) | 79 | public virtual bool Dequeue(out T item) |
80 | { | 80 | { |
81 | item = default(T); | 81 | item = default(T); |
82 | SingleLinkNode oldHead = null; | 82 | SingleLinkNode oldHead = null; |
@@ -93,13 +93,16 @@ namespace OpenSim.Framework | |||
93 | if (oldHead == oldTail) | 93 | if (oldHead == oldTail) |
94 | { | 94 | { |
95 | if (oldHeadNext == null) | 95 | if (oldHeadNext == null) |
96 | { | ||
97 | count = 0; | ||
96 | return false; | 98 | return false; |
99 | } | ||
97 | 100 | ||
98 | CAS(ref tail, oldTail, oldHeadNext); | 101 | CAS(ref tail, oldTail, oldHeadNext); |
99 | } | 102 | } |
100 | else | 103 | else |
101 | { | 104 | { |
102 | item = oldHeadNext.Item; | 105 | item = oldHeadNext.Item; |
103 | haveAdvancedHead = CAS(ref head, oldHead, oldHeadNext); | 106 | haveAdvancedHead = CAS(ref head, oldHead, oldHeadNext); |
104 | if (haveAdvancedHead) | 107 | if (haveAdvancedHead) |
105 | { | 108 | { |
@@ -118,8 +121,7 @@ namespace OpenSim.Framework | |||
118 | { | 121 | { |
119 | // ugly | 122 | // ugly |
120 | T item; | 123 | T item; |
121 | while(count > 0) | 124 | while(Dequeue(out item)); |
122 | Dequeue(out item); | ||
123 | Init(); | 125 | Init(); |
124 | } | 126 | } |
125 | 127 | ||
@@ -136,4 +138,4 @@ namespace OpenSim.Framework | |||
136 | (object)Interlocked.CompareExchange<SingleLinkNode>(ref location, newValue, comparand); | 138 | (object)Interlocked.CompareExchange<SingleLinkNode>(ref location, newValue, comparand); |
137 | } | 139 | } |
138 | } | 140 | } |
139 | } \ No newline at end of file | 141 | } |
diff --git a/OpenSim/Framework/LogWriter.cs b/OpenSim/Framework/LogWriter.cs index 2e0bf4a..2e0bf4a 100644..100755 --- a/OpenSim/Framework/LogWriter.cs +++ b/OpenSim/Framework/LogWriter.cs | |||
diff --git a/OpenSim/Framework/MapAndArray.cs b/OpenSim/Framework/MapAndArray.cs index c98d3cc..32d6978 100644 --- a/OpenSim/Framework/MapAndArray.cs +++ b/OpenSim/Framework/MapAndArray.cs | |||
@@ -45,9 +45,9 @@ namespace OpenSim.Framework | |||
45 | 45 | ||
46 | /// <summary>Number of values currently stored in the collection</summary> | 46 | /// <summary>Number of values currently stored in the collection</summary> |
47 | public int Count { get { return m_array.Length; } } | 47 | public int Count { get { return m_array.Length; } } |
48 | /// <summary>NOTE: This collection is thread safe. You do not need to | 48 | /// <summary>NOTE: This collection is thread safe. You do not need to |
49 | /// acquire a lock to add, remove, or enumerate entries. This | 49 | /// acquire a lock to add, remove, or enumerate entries. This |
50 | /// synchronization object should only be locked for larger | 50 | /// synchronization object should only be locked for larger |
51 | /// transactions</summary> | 51 | /// transactions</summary> |
52 | public object SyncRoot { get { return m_syncRoot; } } | 52 | public object SyncRoot { get { return m_syncRoot; } } |
53 | 53 | ||
@@ -92,7 +92,7 @@ namespace OpenSim.Framework | |||
92 | } | 92 | } |
93 | 93 | ||
94 | /// <summary> | 94 | /// <summary> |
95 | /// Adds a key/value pair to the collection. This will throw an | 95 | /// Adds a key/value pair to the collection. This will throw an |
96 | /// exception if the key is already present in the collection | 96 | /// exception if the key is already present in the collection |
97 | /// </summary> | 97 | /// </summary> |
98 | /// <param name="key">Key to add or update</param> | 98 | /// <param name="key">Key to add or update</param> |
@@ -166,7 +166,7 @@ namespace OpenSim.Framework | |||
166 | /// Gets a reference to the immutable array of values stored in this | 166 | /// Gets a reference to the immutable array of values stored in this |
167 | /// collection. This array is thread safe for iteration | 167 | /// collection. This array is thread safe for iteration |
168 | /// </summary> | 168 | /// </summary> |
169 | /// <returns>A thread safe reference ton an array of all of the stored | 169 | /// <returns>A thread safe reference ton an array of all of the stored |
170 | /// values</returns> | 170 | /// values</returns> |
171 | public TValue[] GetArray() | 171 | public TValue[] GetArray() |
172 | { | 172 | { |
@@ -175,7 +175,7 @@ namespace OpenSim.Framework | |||
175 | 175 | ||
176 | private void CreateArray() | 176 | private void CreateArray() |
177 | { | 177 | { |
178 | // Rebuild the array from the dictionary. This method must be | 178 | // Rebuild the array from the dictionary. This method must be |
179 | // called from inside a lock | 179 | // called from inside a lock |
180 | TValue[] array = new TValue[m_dict.Count]; | 180 | TValue[] array = new TValue[m_dict.Count]; |
181 | int i = 0; | 181 | int i = 0; |
diff --git a/OpenSim/Framework/MapItemReplyStruct.cs b/OpenSim/Framework/MapItemReplyStruct.cs index c8693ae..348a240 100644 --- a/OpenSim/Framework/MapItemReplyStruct.cs +++ b/OpenSim/Framework/MapItemReplyStruct.cs | |||
@@ -60,7 +60,7 @@ namespace OpenSim.Framework | |||
60 | map["Extra2"] = OSD.FromInteger(Extra2); | 60 | map["Extra2"] = OSD.FromInteger(Extra2); |
61 | return map; | 61 | return map; |
62 | } | 62 | } |
63 | 63 | ||
64 | public void FromOSD(OSDMap map) | 64 | public void FromOSD(OSDMap map) |
65 | { | 65 | { |
66 | x = (uint) map["X"].AsInteger(); | 66 | x = (uint) map["X"].AsInteger(); |
diff --git a/OpenSim/Framework/MetricsCollector.cs b/OpenSim/Framework/MetricsCollector.cs index c8f4a33..391f57e 100644 --- a/OpenSim/Framework/MetricsCollector.cs +++ b/OpenSim/Framework/MetricsCollector.cs | |||
@@ -42,23 +42,23 @@ namespace OpenSim.Framework | |||
42 | } | 42 | } |
43 | } | 43 | } |
44 | 44 | ||
45 | 45 | ||
46 | struct MetricsBucket<T> | 46 | struct MetricsBucket<T> |
47 | { | 47 | { |
48 | public T value; | 48 | public T value; |
49 | public int count; | 49 | public int count; |
50 | } | 50 | } |
51 | 51 | ||
52 | 52 | ||
53 | /// <summary> | 53 | /// <summary> |
54 | /// Collects metrics in a sliding window. | 54 | /// Collects metrics in a sliding window. |
55 | /// </summary> | 55 | /// </summary> |
56 | /// <remarks> | 56 | /// <remarks> |
57 | /// MetricsCollector provides the current Sum of the metrics that it collects. It can easily be extended | 57 | /// MetricsCollector provides the current Sum of the metrics that it collects. It can easily be extended |
58 | /// to provide the Average, too. It uses a sliding window to keep these values current. | 58 | /// to provide the Average, too. It uses a sliding window to keep these values current. |
59 | /// | 59 | /// |
60 | /// This class is not thread-safe. | 60 | /// This class is not thread-safe. |
61 | /// | 61 | /// |
62 | /// Subclass MetricsCollector to have it use a concrete value type. Override the abstract methods. | 62 | /// Subclass MetricsCollector to have it use a concrete value type. Override the abstract methods. |
63 | /// </remarks> | 63 | /// </remarks> |
64 | public abstract class MetricsCollector<T> | 64 | public abstract class MetricsCollector<T> |
diff --git a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs index 20495f6..e513abd 100644 --- a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs +++ b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs | |||
@@ -43,7 +43,6 @@ namespace OpenSim.Framework.Monitoring | |||
43 | StringBuilder sb = new StringBuilder(Environment.NewLine); | 43 | StringBuilder sb = new StringBuilder(Environment.NewLine); |
44 | sb.Append("MEMORY STATISTICS"); | 44 | sb.Append("MEMORY STATISTICS"); |
45 | sb.Append(Environment.NewLine); | 45 | sb.Append(Environment.NewLine); |
46 | |||
47 | sb.AppendFormat( | 46 | sb.AppendFormat( |
48 | "Heap allocated to OpenSim : {0} MB\n", | 47 | "Heap allocated to OpenSim : {0} MB\n", |
49 | Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0)); | 48 | Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0)); |
@@ -56,13 +55,30 @@ namespace OpenSim.Framework.Monitoring | |||
56 | "Average heap allocation rate: {0} MB/s\n", | 55 | "Average heap allocation rate: {0} MB/s\n", |
57 | Math.Round((MemoryWatchdog.AverageHeapAllocationRate * 1000) / 1024.0 / 1024, 3)); | 56 | Math.Round((MemoryWatchdog.AverageHeapAllocationRate * 1000) / 1024.0 / 1024, 3)); |
58 | 57 | ||
59 | sb.AppendFormat( | 58 | Process myprocess = Process.GetCurrentProcess(); |
60 | "Process memory : {0} MB\n", | 59 | // if (!myprocess.HasExited) |
61 | Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0)); | 60 | try |
61 | { | ||
62 | myprocess.Refresh(); | ||
63 | sb.AppendFormat( | ||
64 | "Process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n", | ||
65 | Math.Round(myprocess.WorkingSet64 / 1024.0 / 1024.0), | ||
66 | Math.Round(myprocess.PagedMemorySize64 / 1024.0 / 1024.0), | ||
67 | Math.Round(myprocess.VirtualMemorySize64 / 1024.0 / 1024.0)); | ||
68 | sb.AppendFormat( | ||
69 | "Peak process memory: Physical {0} MB \t Paged {1} MB \t Virtual {2} MB\n", | ||
70 | Math.Round(myprocess.PeakWorkingSet64 / 1024.0 / 1024.0), | ||
71 | Math.Round(myprocess.PeakPagedMemorySize64 / 1024.0 / 1024.0), | ||
72 | Math.Round(myprocess.PeakVirtualMemorySize64 / 1024.0 / 1024.0)); | ||
73 | } | ||
74 | catch | ||
75 | { } | ||
76 | // else | ||
77 | // sb.Append("Process reported as Exited \n"); | ||
62 | 78 | ||
63 | return sb.ToString(); | 79 | return sb.ToString(); |
64 | } | 80 | } |
65 | 81 | ||
66 | public virtual string XReport(string uptime, string version) | 82 | public virtual string XReport(string uptime, string version) |
67 | { | 83 | { |
68 | return (string) Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0).ToString() ; | 84 | return (string) Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0).ToString() ; |
diff --git a/OpenSim/Framework/Monitoring/Checks/Check.cs b/OpenSim/Framework/Monitoring/Checks/Check.cs index 594386a..9a1bd45 100644 --- a/OpenSim/Framework/Monitoring/Checks/Check.cs +++ b/OpenSim/Framework/Monitoring/Checks/Check.cs | |||
@@ -79,7 +79,7 @@ namespace OpenSim.Framework.Monitoring | |||
79 | string category, | 79 | string category, |
80 | string container, | 80 | string container, |
81 | Func<Check, bool> checkFunc, | 81 | Func<Check, bool> checkFunc, |
82 | StatVerbosity verbosity) | 82 | StatVerbosity verbosity) |
83 | { | 83 | { |
84 | if (ChecksManager.SubCommands.Contains(category)) | 84 | if (ChecksManager.SubCommands.Contains(category)) |
85 | throw new Exception( | 85 | throw new Exception( |
@@ -108,9 +108,9 @@ namespace OpenSim.Framework.Monitoring | |||
108 | public virtual string ToConsoleString() | 108 | public virtual string ToConsoleString() |
109 | { | 109 | { |
110 | return string.Format( | 110 | return string.Format( |
111 | "{0}.{1}.{2} - {3}", | 111 | "{0}.{1}.{2} - {3}", |
112 | Category, | 112 | Category, |
113 | Container, | 113 | Container, |
114 | ShortName, | 114 | ShortName, |
115 | Description); | 115 | Description); |
116 | } | 116 | } |
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs index e4a7f8c..ff3b041 100644 --- a/OpenSim/Framework/Monitoring/ChecksManager.cs +++ b/OpenSim/Framework/Monitoring/ChecksManager.cs | |||
@@ -132,8 +132,8 @@ namespace OpenSim.Framework.Monitoring | |||
132 | /// <returns></returns> | 132 | /// <returns></returns> |
133 | public static bool RegisterCheck(Check check) | 133 | public static bool RegisterCheck(Check check) |
134 | { | 134 | { |
135 | SortedDictionary<string, SortedDictionary<string, Check>> category = null, newCategory; | 135 | SortedDictionary<string, SortedDictionary<string, Check>> category = null; |
136 | SortedDictionary<string, Check> container = null, newContainer; | 136 | SortedDictionary<string, Check> container = null; |
137 | 137 | ||
138 | lock (RegisteredChecks) | 138 | lock (RegisteredChecks) |
139 | { | 139 | { |
@@ -146,19 +146,15 @@ namespace OpenSim.Framework.Monitoring | |||
146 | // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed. | 146 | // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed. |
147 | // This means that we don't need to lock or copy them on iteration, which will be a much more | 147 | // This means that we don't need to lock or copy them on iteration, which will be a much more |
148 | // common operation after startup. | 148 | // common operation after startup. |
149 | if (container != null) | 149 | if (container == null) |
150 | newContainer = new SortedDictionary<string, Check>(container); | 150 | container = new SortedDictionary<string, Check>(); |
151 | else | ||
152 | newContainer = new SortedDictionary<string, Check>(); | ||
153 | 151 | ||
154 | if (category != null) | 152 | if (category == null) |
155 | newCategory = new SortedDictionary<string, SortedDictionary<string, Check>>(category); | 153 | category = new SortedDictionary<string, SortedDictionary<string, Check>>(); |
156 | else | ||
157 | newCategory = new SortedDictionary<string, SortedDictionary<string, Check>>(); | ||
158 | 154 | ||
159 | newContainer[check.ShortName] = check; | 155 | container[check.ShortName] = check; |
160 | newCategory[check.Container] = newContainer; | 156 | category[check.Container] = container; |
161 | RegisteredChecks[check.Category] = newCategory; | 157 | RegisteredChecks[check.Category] = category; |
162 | } | 158 | } |
163 | 159 | ||
164 | return true; | 160 | return true; |
@@ -171,23 +167,24 @@ namespace OpenSim.Framework.Monitoring | |||
171 | /// <returns></returns> | 167 | /// <returns></returns> |
172 | public static bool DeregisterCheck(Check check) | 168 | public static bool DeregisterCheck(Check check) |
173 | { | 169 | { |
174 | SortedDictionary<string, SortedDictionary<string, Check>> category = null, newCategory; | 170 | SortedDictionary<string, SortedDictionary<string, Check>> category = null; |
175 | SortedDictionary<string, Check> container = null, newContainer; | 171 | SortedDictionary<string, Check> container = null; |
176 | 172 | ||
177 | lock (RegisteredChecks) | 173 | lock (RegisteredChecks) |
178 | { | 174 | { |
179 | if (!TryGetCheckParents(check, out category, out container)) | 175 | if (!TryGetCheckParents(check, out category, out container)) |
180 | return false; | 176 | return false; |
181 | 177 | ||
182 | newContainer = new SortedDictionary<string, Check>(container); | 178 | if(container != null) |
183 | newContainer.Remove(check.ShortName); | 179 | { |
184 | 180 | container.Remove(check.ShortName); | |
185 | newCategory = new SortedDictionary<string, SortedDictionary<string, Check>>(category); | 181 | if(category != null && container.Count == 0) |
186 | newCategory.Remove(check.Container); | 182 | { |
187 | 183 | category.Remove(check.Container); | |
188 | newCategory[check.Container] = newContainer; | 184 | if(category.Count == 0) |
189 | RegisteredChecks[check.Category] = newCategory; | 185 | RegisteredChecks.Remove(check.Category); |
190 | 186 | } | |
187 | } | ||
191 | return true; | 188 | return true; |
192 | } | 189 | } |
193 | } | 190 | } |
diff --git a/OpenSim/Framework/Monitoring/Interfaces/IStatsCollector.cs b/OpenSim/Framework/Monitoring/Interfaces/IStatsCollector.cs index 40df562..e326e8b 100644 --- a/OpenSim/Framework/Monitoring/Interfaces/IStatsCollector.cs +++ b/OpenSim/Framework/Monitoring/Interfaces/IStatsCollector.cs | |||
@@ -39,7 +39,7 @@ namespace OpenSim.Framework.Monitoring | |||
39 | /// </summary> | 39 | /// </summary> |
40 | /// <returns></returns> | 40 | /// <returns></returns> |
41 | string Report(); | 41 | string Report(); |
42 | 42 | ||
43 | /// <summary> | 43 | /// <summary> |
44 | /// Report back collected statistical information in json | 44 | /// Report back collected statistical information in json |
45 | /// </summary> | 45 | /// </summary> |
diff --git a/OpenSim/Framework/Monitoring/JobEngine.cs b/OpenSim/Framework/Monitoring/JobEngine.cs index 6db9a67..115871e 100644 --- a/OpenSim/Framework/Monitoring/JobEngine.cs +++ b/OpenSim/Framework/Monitoring/JobEngine.cs | |||
@@ -40,6 +40,8 @@ namespace OpenSim.Framework.Monitoring | |||
40 | 40 | ||
41 | public int LogLevel { get; set; } | 41 | public int LogLevel { get; set; } |
42 | 42 | ||
43 | private object JobLock = new object(); | ||
44 | |||
43 | public string Name { get; private set; } | 45 | public string Name { get; private set; } |
44 | 46 | ||
45 | public string LoggingName { get; private set; } | 47 | public string LoggingName { get; private set; } |
@@ -47,7 +49,7 @@ namespace OpenSim.Framework.Monitoring | |||
47 | /// <summary> | 49 | /// <summary> |
48 | /// Is this engine running? | 50 | /// Is this engine running? |
49 | /// </summary> | 51 | /// </summary> |
50 | public bool IsRunning { get; private set; } | 52 | public bool IsRunning { get; private set; } |
51 | 53 | ||
52 | /// <summary> | 54 | /// <summary> |
53 | /// The current job that the engine is running. | 55 | /// The current job that the engine is running. |
@@ -55,7 +57,8 @@ namespace OpenSim.Framework.Monitoring | |||
55 | /// <remarks> | 57 | /// <remarks> |
56 | /// Will be null if no job is currently running. | 58 | /// Will be null if no job is currently running. |
57 | /// </remarks> | 59 | /// </remarks> |
58 | public Job CurrentJob { get; private set; } | 60 | private Job m_currentJob; |
61 | public Job CurrentJob { get { return m_currentJob;} } | ||
59 | 62 | ||
60 | /// <summary> | 63 | /// <summary> |
61 | /// Number of jobs waiting to be processed. | 64 | /// Number of jobs waiting to be processed. |
@@ -71,96 +74,64 @@ namespace OpenSim.Framework.Monitoring | |||
71 | /// Controls whether we need to warn in the log about exceeding the max queue size. | 74 | /// Controls whether we need to warn in the log about exceeding the max queue size. |
72 | /// </summary> | 75 | /// </summary> |
73 | /// <remarks> | 76 | /// <remarks> |
74 | /// This is flipped to false once queue max has been exceeded and back to true when it falls below max, in | 77 | /// This is flipped to false once queue max has been exceeded and back to true when it falls below max, in |
75 | /// order to avoid spamming the log with lots of warnings. | 78 | /// order to avoid spamming the log with lots of warnings. |
76 | /// </remarks> | 79 | /// </remarks> |
77 | private bool m_warnOverMaxQueue = true; | 80 | private bool m_warnOverMaxQueue = true; |
78 | 81 | ||
79 | private BlockingCollection<Job> m_jobQueue; | 82 | private BlockingCollection<Job> m_jobQueue = new BlockingCollection<Job>(new ConcurrentQueue<Job>(), 5000); |
80 | 83 | ||
81 | private CancellationTokenSource m_cancelSource; | 84 | private CancellationTokenSource m_cancelSource; |
82 | 85 | ||
83 | /// <summary> | 86 | private int m_timeout = -1; |
84 | /// Used to signal that we are ready to complete stop. | ||
85 | /// </summary> | ||
86 | private ManualResetEvent m_finishedProcessingAfterStop = new ManualResetEvent(false); | ||
87 | 87 | ||
88 | public JobEngine(string name, string loggingName) | 88 | private bool m_threadRunnig = false; |
89 | |||
90 | public JobEngine(string name, string loggingName, int timeout = -1) | ||
89 | { | 91 | { |
90 | Name = name; | 92 | Name = name; |
91 | LoggingName = loggingName; | 93 | LoggingName = loggingName; |
92 | 94 | m_timeout = timeout; | |
93 | RequestProcessTimeoutOnStop = 5000; | 95 | RequestProcessTimeoutOnStop = 5000; |
94 | } | 96 | } |
95 | 97 | ||
96 | public void Start() | 98 | public void Start() |
97 | { | 99 | { |
98 | lock (this) | 100 | lock (JobLock) |
99 | { | 101 | { |
100 | if (IsRunning) | 102 | if (IsRunning) |
101 | return; | 103 | return; |
102 | 104 | ||
103 | IsRunning = true; | 105 | IsRunning = true; |
104 | 106 | ||
105 | m_finishedProcessingAfterStop.Reset(); | ||
106 | |||
107 | m_jobQueue = new BlockingCollection<Job>(new ConcurrentQueue<Job>(), 5000); | ||
108 | m_cancelSource = new CancellationTokenSource(); | 107 | m_cancelSource = new CancellationTokenSource(); |
109 | 108 | WorkManager.RunInThreadPool(ProcessRequests, null, Name, false); | |
110 | WorkManager.StartThread( | 109 | m_threadRunnig = true; |
111 | ProcessRequests, | ||
112 | Name, | ||
113 | ThreadPriority.Normal, | ||
114 | false, | ||
115 | true, | ||
116 | null, | ||
117 | int.MaxValue); | ||
118 | } | 110 | } |
119 | } | 111 | } |
120 | 112 | ||
121 | public void Stop() | 113 | public void Stop() |
122 | { | 114 | { |
123 | lock (this) | 115 | lock (JobLock) |
124 | { | 116 | { |
125 | try | 117 | try |
126 | { | 118 | { |
127 | if (!IsRunning) | 119 | if (!IsRunning) |
128 | return; | 120 | return; |
129 | 121 | ||
130 | IsRunning = false; | 122 | m_log.DebugFormat("[JobEngine] Stopping {0}", Name); |
131 | 123 | ||
132 | int requestsLeft = m_jobQueue.Count; | 124 | IsRunning = false; |
133 | 125 | if(m_threadRunnig) | |
134 | if (requestsLeft <= 0) | ||
135 | { | 126 | { |
136 | m_cancelSource.Cancel(); | 127 | m_cancelSource.Cancel(); |
137 | } | 128 | m_threadRunnig = false; |
138 | else | ||
139 | { | ||
140 | m_log.InfoFormat("[{0}]: Waiting to write {1} events after stop.", LoggingName, requestsLeft); | ||
141 | |||
142 | while (requestsLeft > 0) | ||
143 | { | ||
144 | if (!m_finishedProcessingAfterStop.WaitOne(RequestProcessTimeoutOnStop)) | ||
145 | { | ||
146 | // After timeout no events have been written | ||
147 | if (requestsLeft == m_jobQueue.Count) | ||
148 | { | ||
149 | m_log.WarnFormat( | ||
150 | "[{0}]: No requests processed after {1} ms wait. Discarding remaining {2} requests", | ||
151 | LoggingName, RequestProcessTimeoutOnStop, requestsLeft); | ||
152 | |||
153 | break; | ||
154 | } | ||
155 | } | ||
156 | |||
157 | requestsLeft = m_jobQueue.Count; | ||
158 | } | ||
159 | } | 129 | } |
160 | } | 130 | } |
161 | finally | 131 | finally |
162 | { | 132 | { |
163 | m_cancelSource.Dispose(); | 133 | if(m_cancelSource != null) |
134 | m_cancelSource.Dispose(); | ||
164 | } | 135 | } |
165 | } | 136 | } |
166 | } | 137 | } |
@@ -169,7 +140,7 @@ namespace OpenSim.Framework.Monitoring | |||
169 | /// Make a job. | 140 | /// Make a job. |
170 | /// </summary> | 141 | /// </summary> |
171 | /// <remarks> | 142 | /// <remarks> |
172 | /// We provide this method to replace the constructor so that we can later pool job objects if necessary to | 143 | /// We provide this method to replace the constructor so that we can later pool job objects if necessary to |
173 | /// reduce memory churn. Normally one would directly call QueueJob() with parameters anyway. | 144 | /// reduce memory churn. Normally one would directly call QueueJob() with parameters anyway. |
174 | /// </remarks> | 145 | /// </remarks> |
175 | /// <returns></returns> | 146 | /// <returns></returns> |
@@ -219,6 +190,18 @@ namespace OpenSim.Framework.Monitoring | |||
219 | /// </param> | 190 | /// </param> |
220 | public bool QueueJob(Job job) | 191 | public bool QueueJob(Job job) |
221 | { | 192 | { |
193 | lock(JobLock) | ||
194 | { | ||
195 | if(!IsRunning) | ||
196 | return false; | ||
197 | |||
198 | if(!m_threadRunnig) | ||
199 | { | ||
200 | WorkManager.RunInThreadPool(ProcessRequests, null, Name, false); | ||
201 | m_threadRunnig = true; | ||
202 | } | ||
203 | } | ||
204 | |||
222 | if (m_jobQueue.Count < m_jobQueue.BoundedCapacity) | 205 | if (m_jobQueue.Count < m_jobQueue.BoundedCapacity) |
223 | { | 206 | { |
224 | m_jobQueue.Add(job); | 207 | m_jobQueue.Add(job); |
@@ -238,56 +221,53 @@ namespace OpenSim.Framework.Monitoring | |||
238 | 221 | ||
239 | m_warnOverMaxQueue = false; | 222 | m_warnOverMaxQueue = false; |
240 | } | 223 | } |
241 | |||
242 | return false; | 224 | return false; |
243 | } | 225 | } |
244 | } | 226 | } |
245 | 227 | ||
246 | private void ProcessRequests() | 228 | private void ProcessRequests(Object o) |
247 | { | 229 | { |
248 | try | 230 | while(IsRunning) |
249 | { | 231 | { |
250 | while (IsRunning || m_jobQueue.Count > 0) | 232 | try |
251 | { | 233 | { |
252 | try | 234 | if(!m_jobQueue.TryTake(out m_currentJob, m_timeout, m_cancelSource.Token)) |
253 | { | 235 | { |
254 | CurrentJob = m_jobQueue.Take(m_cancelSource.Token); | 236 | lock(JobLock) |
255 | } | 237 | m_threadRunnig = false; |
256 | catch (ObjectDisposedException e) | 238 | break; |
257 | { | ||
258 | // If we see this whilst not running then it may be due to a race where this thread checks | ||
259 | // IsRunning after the stopping thread sets it to false and disposes of the cancellation source. | ||
260 | if (IsRunning) | ||
261 | throw e; | ||
262 | else | ||
263 | break; | ||
264 | } | 239 | } |
240 | } | ||
241 | catch(ObjectDisposedException e) | ||
242 | { | ||
243 | m_log.DebugFormat("[JobEngine] {0} stopping ignoring {1} jobs in queue", | ||
244 | Name,m_jobQueue.Count); | ||
245 | break; | ||
246 | } | ||
247 | catch(OperationCanceledException) | ||
248 | { | ||
249 | break; | ||
250 | } | ||
265 | 251 | ||
266 | if (LogLevel >= 1) | 252 | if(LogLevel >= 1) |
267 | m_log.DebugFormat("[{0}]: Processing job {1}", LoggingName, CurrentJob.Name); | 253 | m_log.DebugFormat("[{0}]: Processing job {1}",LoggingName,m_currentJob.Name); |
268 | 254 | ||
269 | try | 255 | try |
270 | { | 256 | { |
271 | CurrentJob.Action(); | 257 | m_currentJob.Action(); |
272 | } | 258 | } |
273 | catch (Exception e) | 259 | catch(Exception e) |
274 | { | 260 | { |
275 | m_log.Error( | 261 | m_log.Error( |
276 | string.Format( | 262 | string.Format( |
277 | "[{0}]: Job {1} failed, continuing. Exception ", LoggingName, CurrentJob.Name), e); | 263 | "[{0}]: Job {1} failed, continuing. Exception ",LoggingName,m_currentJob.Name),e); |
278 | } | 264 | } |
279 | 265 | ||
280 | if (LogLevel >= 1) | 266 | if(LogLevel >= 1) |
281 | m_log.DebugFormat("[{0}]: Processed job {1}", LoggingName, CurrentJob.Name); | 267 | m_log.DebugFormat("[{0}]: Processed job {1}",LoggingName,m_currentJob.Name); |
282 | 268 | ||
283 | CurrentJob = null; | 269 | m_currentJob = null; |
284 | } | ||
285 | } | ||
286 | catch (OperationCanceledException) | ||
287 | { | ||
288 | } | 270 | } |
289 | |||
290 | m_finishedProcessingAfterStop.Set(); | ||
291 | } | 271 | } |
292 | 272 | ||
293 | public class Job | 273 | public class Job |
@@ -320,7 +300,7 @@ namespace OpenSim.Framework.Monitoring | |||
320 | CommonId = commonId; | 300 | CommonId = commonId; |
321 | Action = action; | 301 | Action = action; |
322 | } | 302 | } |
323 | 303 | ||
324 | /// <summary> | 304 | /// <summary> |
325 | /// Make a job. It needs to be separately queued. | 305 | /// Make a job. It needs to be separately queued. |
326 | /// </summary> | 306 | /// </summary> |
@@ -338,4 +318,4 @@ namespace OpenSim.Framework.Monitoring | |||
338 | } | 318 | } |
339 | } | 319 | } |
340 | } | 320 | } |
341 | } \ No newline at end of file | 321 | } |
diff --git a/OpenSim/Framework/Monitoring/Properties/AssemblyInfo.cs b/OpenSim/Framework/Monitoring/Properties/AssemblyInfo.cs index a617b93..2ff2014 100644 --- a/OpenSim/Framework/Monitoring/Properties/AssemblyInfo.cs +++ b/OpenSim/Framework/Monitoring/Properties/AssemblyInfo.cs | |||
@@ -2,7 +2,7 @@ | |||
2 | using System.Runtime.CompilerServices; | 2 | using System.Runtime.CompilerServices; |
3 | using System.Runtime.InteropServices; | 3 | using System.Runtime.InteropServices; |
4 | 4 | ||
5 | // General Information about an assembly is controlled through the following | 5 | // General Information about an assembly is controlled through the following |
6 | // set of attributes. Change these attribute values to modify the information | 6 | // set of attributes. Change these attribute values to modify the information |
7 | // associated with an assembly. | 7 | // associated with an assembly. |
8 | [assembly: AssemblyTitle("OpenSim.Framework.Monitoring")] | 8 | [assembly: AssemblyTitle("OpenSim.Framework.Monitoring")] |
@@ -14,8 +14,8 @@ using System.Runtime.InteropServices; | |||
14 | [assembly: AssemblyTrademark("")] | 14 | [assembly: AssemblyTrademark("")] |
15 | [assembly: AssemblyCulture("")] | 15 | [assembly: AssemblyCulture("")] |
16 | 16 | ||
17 | // Setting ComVisible to false makes the types in this assembly not visible | 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 | 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. | 19 | // COM, set the ComVisible attribute to true on that type. |
20 | [assembly: ComVisible(false)] | 20 | [assembly: ComVisible(false)] |
21 | 21 | ||
@@ -25,9 +25,9 @@ using System.Runtime.InteropServices; | |||
25 | // Version information for an assembly consists of the following four values: | 25 | // Version information for an assembly consists of the following four values: |
26 | // | 26 | // |
27 | // Major Version | 27 | // Major Version |
28 | // Minor Version | 28 | // Minor Version |
29 | // Build Number | 29 | // Build Number |
30 | // Revision | 30 | // Revision |
31 | // | 31 | // |
32 | [assembly: AssemblyVersion("0.8.3.*")] | 32 | [assembly: AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] |
33 | 33 | ||
diff --git a/OpenSim/Framework/Monitoring/ServerStatsCollector.cs b/OpenSim/Framework/Monitoring/ServerStatsCollector.cs index 77315bb..a26a6e0 100644 --- a/OpenSim/Framework/Monitoring/ServerStatsCollector.cs +++ b/OpenSim/Framework/Monitoring/ServerStatsCollector.cs | |||
@@ -88,7 +88,7 @@ namespace OpenSim.Framework.Monitoring | |||
88 | IConfig cfg = source.Configs["Monitoring"]; | 88 | IConfig cfg = source.Configs["Monitoring"]; |
89 | 89 | ||
90 | if (cfg != null) | 90 | if (cfg != null) |
91 | Enabled = cfg.GetBoolean("ServerStatsEnabled", true); | 91 | Enabled = cfg.GetBoolean("ServerStatsEnabled", false); |
92 | 92 | ||
93 | if (Enabled) | 93 | if (Enabled) |
94 | { | 94 | { |
@@ -98,12 +98,18 @@ namespace OpenSim.Framework.Monitoring | |||
98 | 98 | ||
99 | public void Start() | 99 | public void Start() |
100 | { | 100 | { |
101 | if(!Enabled) | ||
102 | return; | ||
103 | |||
101 | if (RegisteredStats.Count == 0) | 104 | if (RegisteredStats.Count == 0) |
102 | RegisterServerStats(); | 105 | RegisterServerStats(); |
103 | } | 106 | } |
104 | 107 | ||
105 | public void Close() | 108 | public void Close() |
106 | { | 109 | { |
110 | if(!Enabled) | ||
111 | return; | ||
112 | |||
107 | if (RegisteredStats.Count > 0) | 113 | if (RegisteredStats.Count > 0) |
108 | { | 114 | { |
109 | foreach (Stat stat in RegisteredStats.Values) | 115 | foreach (Stat stat in RegisteredStats.Values) |
@@ -167,18 +173,18 @@ namespace OpenSim.Framework.Monitoring | |||
167 | } | 173 | } |
168 | 174 | ||
169 | MakeStat("BuiltinThreadpoolWorkerThreadsAvailable", null, "threads", ContainerThreadpool, | 175 | MakeStat("BuiltinThreadpoolWorkerThreadsAvailable", null, "threads", ContainerThreadpool, |
170 | s => | 176 | s => |
171 | { | 177 | { |
172 | int workerThreads, iocpThreads; | 178 | int workerThreads, iocpThreads; |
173 | ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads); | 179 | ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads); |
174 | s.Value = workerThreads; | 180 | s.Value = workerThreads; |
175 | }); | 181 | }); |
176 | 182 | ||
177 | MakeStat("BuiltinThreadpoolIOCPThreadsAvailable", null, "threads", ContainerThreadpool, | 183 | MakeStat("BuiltinThreadpoolIOCPThreadsAvailable", null, "threads", ContainerThreadpool, |
178 | s => | 184 | s => |
179 | { | 185 | { |
180 | int workerThreads, iocpThreads; | 186 | int workerThreads, iocpThreads; |
181 | ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads); | 187 | ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads); |
182 | s.Value = iocpThreads; | 188 | s.Value = iocpThreads; |
183 | }); | 189 | }); |
184 | 190 | ||
@@ -193,10 +199,10 @@ namespace OpenSim.Framework.Monitoring | |||
193 | } | 199 | } |
194 | 200 | ||
195 | MakeStat( | 201 | MakeStat( |
196 | "HTTPRequestsMade", | 202 | "HTTPRequestsMade", |
197 | "Number of outbound HTTP requests made", | 203 | "Number of outbound HTTP requests made", |
198 | "requests", | 204 | "requests", |
199 | ContainerNetwork, | 205 | ContainerNetwork, |
200 | s => s.Value = WebUtil.RequestNumber, | 206 | s => s.Value = WebUtil.RequestNumber, |
201 | MeasuresOfInterest.AverageChangeOverTime); | 207 | MeasuresOfInterest.AverageChangeOverTime); |
202 | 208 | ||
@@ -249,9 +255,52 @@ namespace OpenSim.Framework.Monitoring | |||
249 | (s) => { s.Value = Math.Round(MemoryWatchdog.LastHeapAllocationRate * 1000d / 1024d / 1024d, 3); }); | 255 | (s) => { s.Value = Math.Round(MemoryWatchdog.LastHeapAllocationRate * 1000d / 1024d / 1024d, 3); }); |
250 | MakeStat("AverageHeapAllocationRate", null, "MB/sec", ContainerMemory, | 256 | MakeStat("AverageHeapAllocationRate", null, "MB/sec", ContainerMemory, |
251 | (s) => { s.Value = Math.Round(MemoryWatchdog.AverageHeapAllocationRate * 1000d / 1024d / 1024d, 3); }); | 257 | (s) => { s.Value = Math.Round(MemoryWatchdog.AverageHeapAllocationRate * 1000d / 1024d / 1024d, 3); }); |
258 | |||
259 | MakeStat("ProcessResident", null, "MB", ContainerProcess, | ||
260 | (s) => | ||
261 | { | ||
262 | Process myprocess = Process.GetCurrentProcess(); | ||
263 | myprocess.Refresh(); | ||
264 | s.Value = Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0); | ||
265 | }); | ||
266 | MakeStat("ProcessPaged", null, "MB", ContainerProcess, | ||
267 | (s) => | ||
268 | { | ||
269 | Process myprocess = Process.GetCurrentProcess(); | ||
270 | myprocess.Refresh(); | ||
271 | s.Value = Math.Round(Process.GetCurrentProcess().PagedMemorySize64 / 1024.0 / 1024.0); | ||
272 | }); | ||
273 | MakeStat("ProcessVirtual", null, "MB", ContainerProcess, | ||
274 | (s) => | ||
275 | { | ||
276 | Process myprocess = Process.GetCurrentProcess(); | ||
277 | myprocess.Refresh(); | ||
278 | s.Value = Math.Round(Process.GetCurrentProcess().VirtualMemorySize64 / 1024.0 / 1024.0); | ||
279 | }); | ||
280 | MakeStat("PeakProcessResident", null, "MB", ContainerProcess, | ||
281 | (s) => | ||
282 | { | ||
283 | Process myprocess = Process.GetCurrentProcess(); | ||
284 | myprocess.Refresh(); | ||
285 | s.Value = Math.Round(Process.GetCurrentProcess().PeakWorkingSet64 / 1024.0 / 1024.0); | ||
286 | }); | ||
287 | MakeStat("PeakProcessPaged", null, "MB", ContainerProcess, | ||
288 | (s) => | ||
289 | { | ||
290 | Process myprocess = Process.GetCurrentProcess(); | ||
291 | myprocess.Refresh(); | ||
292 | s.Value = Math.Round(Process.GetCurrentProcess().PeakPagedMemorySize64 / 1024.0 / 1024.0); | ||
293 | }); | ||
294 | MakeStat("PeakProcessVirtual", null, "MB", ContainerProcess, | ||
295 | (s) => | ||
296 | { | ||
297 | Process myprocess = Process.GetCurrentProcess(); | ||
298 | myprocess.Refresh(); | ||
299 | s.Value = Math.Round(Process.GetCurrentProcess().PeakVirtualMemorySize64 / 1024.0 / 1024.0); | ||
300 | }); | ||
252 | } | 301 | } |
253 | 302 | ||
254 | // Notes on performance counters: | 303 | // Notes on performance counters: |
255 | // "How To Read Performance Counters": http://blogs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx | 304 | // "How To Read Performance Counters": http://blogs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx |
256 | // "How to get the CPU Usage in C#": http://stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c | 305 | // "How to get the CPU Usage in C#": http://stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c |
257 | // "Mono Performance Counters": http://www.mono-project.com/Mono_Performance_Counters | 306 | // "Mono Performance Counters": http://www.mono-project.com/Mono_Performance_Counters |
diff --git a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs index e4df7ee..88a0297 100644..100755 --- a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs +++ b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs | |||
@@ -34,6 +34,7 @@ using OpenMetaverse; | |||
34 | using OpenMetaverse.StructuredData; | 34 | using OpenMetaverse.StructuredData; |
35 | using OpenSim.Framework.Monitoring.Interfaces; | 35 | using OpenSim.Framework.Monitoring.Interfaces; |
36 | 36 | ||
37 | |||
37 | namespace OpenSim.Framework.Monitoring | 38 | namespace OpenSim.Framework.Monitoring |
38 | { | 39 | { |
39 | /// <summary> | 40 | /// <summary> |
@@ -71,6 +72,11 @@ namespace OpenSim.Framework.Monitoring | |||
71 | private volatile float pendingDownloads; | 72 | private volatile float pendingDownloads; |
72 | private volatile float pendingUploads; | 73 | private volatile float pendingUploads; |
73 | private volatile float activeScripts; | 74 | private volatile float activeScripts; |
75 | private volatile float spareTime; | ||
76 | private volatile float sleepTime; | ||
77 | private volatile float physicsStep; | ||
78 | |||
79 | |||
74 | private volatile float scriptLinesPerSecond; | 80 | private volatile float scriptLinesPerSecond; |
75 | private volatile float m_frameDilation; | 81 | private volatile float m_frameDilation; |
76 | private volatile float m_usersLoggingIn; | 82 | private volatile float m_usersLoggingIn; |
@@ -84,17 +90,17 @@ namespace OpenSim.Framework.Monitoring | |||
84 | // /// haven't yet been implemented... | 90 | // /// haven't yet been implemented... |
85 | // /// </summary> | 91 | // /// </summary> |
86 | // public long AssetsInCache { get { return assetsInCache; } } | 92 | // public long AssetsInCache { get { return assetsInCache; } } |
87 | // | 93 | // |
88 | // /// <value> | 94 | // /// <value> |
89 | // /// Currently unused | 95 | // /// Currently unused |
90 | // /// </value> | 96 | // /// </value> |
91 | // public long TexturesInCache { get { return texturesInCache; } } | 97 | // public long TexturesInCache { get { return texturesInCache; } } |
92 | // | 98 | // |
93 | // /// <value> | 99 | // /// <value> |
94 | // /// Currently misleading since we can't currently subtract removed asset memory usage without a performance hit | 100 | // /// Currently misleading since we can't currently subtract removed asset memory usage without a performance hit |
95 | // /// </value> | 101 | // /// </value> |
96 | // public long AssetCacheMemoryUsage { get { return assetCacheMemoryUsage; } } | 102 | // public long AssetCacheMemoryUsage { get { return assetCacheMemoryUsage; } } |
97 | // | 103 | // |
98 | // /// <value> | 104 | // /// <value> |
99 | // /// Currently unused | 105 | // /// Currently unused |
100 | // /// </value> | 106 | // /// </value> |
@@ -121,7 +127,7 @@ namespace OpenSim.Framework.Monitoring | |||
121 | public float PendingUploads { get { return pendingUploads; } } | 127 | public float PendingUploads { get { return pendingUploads; } } |
122 | public float ActiveScripts { get { return activeScripts; } } | 128 | public float ActiveScripts { get { return activeScripts; } } |
123 | public float ScriptLinesPerSecond { get { return scriptLinesPerSecond; } } | 129 | public float ScriptLinesPerSecond { get { return scriptLinesPerSecond; } } |
124 | 130 | ||
125 | // /// <summary> | 131 | // /// <summary> |
126 | // /// This is the time it took for the last asset request made in response to a cache miss. | 132 | // /// This is the time it took for the last asset request made in response to a cache miss. |
127 | // /// </summary> | 133 | // /// </summary> |
@@ -171,7 +177,7 @@ namespace OpenSim.Framework.Monitoring | |||
171 | // assetsInCache++; | 177 | // assetsInCache++; |
172 | // //assetCacheMemoryUsage += asset.Data.Length; | 178 | // //assetCacheMemoryUsage += asset.Data.Length; |
173 | // } | 179 | // } |
174 | // | 180 | // |
175 | // public void RemoveAsset(UUID uuid) | 181 | // public void RemoveAsset(UUID uuid) |
176 | // { | 182 | // { |
177 | // assetsInCache--; | 183 | // assetsInCache--; |
@@ -198,7 +204,7 @@ namespace OpenSim.Framework.Monitoring | |||
198 | // texturesInCache = 0; | 204 | // texturesInCache = 0; |
199 | // textureCacheMemoryUsage = 0; | 205 | // textureCacheMemoryUsage = 0; |
200 | // } | 206 | // } |
201 | // | 207 | // |
202 | // public void AddAssetRequestTimeAfterCacheMiss(TimeSpan ts) | 208 | // public void AddAssetRequestTimeAfterCacheMiss(TimeSpan ts) |
203 | // { | 209 | // { |
204 | // assetRequestTimeAfterCacheMiss = ts; | 210 | // assetRequestTimeAfterCacheMiss = ts; |
@@ -253,7 +259,7 @@ namespace OpenSim.Framework.Monitoring | |||
253 | /// <param name="pack"></param> | 259 | /// <param name="pack"></param> |
254 | public void ReceiveClassicSimStatsPacket(SimStats stats) | 260 | public void ReceiveClassicSimStatsPacket(SimStats stats) |
255 | { | 261 | { |
256 | // FIXME: SimStats shouldn't allow an arbitrary stat packing order (which is inherited from the original | 262 | // FIXME: SimStats shouldn't allow an arbitrary stat packing order (which is inherited from the original |
257 | // SimStatsPacket that was being used). | 263 | // SimStatsPacket that was being used). |
258 | 264 | ||
259 | // For an unknown reason the original designers decided not to | 265 | // For an unknown reason the original designers decided not to |
@@ -270,8 +276,8 @@ namespace OpenSim.Framework.Monitoring | |||
270 | totalFrameTime = stats.StatsBlock[8].StatValue; | 276 | totalFrameTime = stats.StatsBlock[8].StatValue; |
271 | netFrameTime = stats.StatsBlock[9].StatValue; | 277 | netFrameTime = stats.StatsBlock[9].StatValue; |
272 | physicsFrameTime = stats.StatsBlock[10].StatValue; | 278 | physicsFrameTime = stats.StatsBlock[10].StatValue; |
273 | otherFrameTime = stats.StatsBlock[11].StatValue; | 279 | imageFrameTime = stats.StatsBlock[11].StatValue; |
274 | imageFrameTime = stats.StatsBlock[12].StatValue; | 280 | otherFrameTime = stats.StatsBlock[12].StatValue; |
275 | inPacketsPerSecond = stats.StatsBlock[13].StatValue; | 281 | inPacketsPerSecond = stats.StatsBlock[13].StatValue; |
276 | outPacketsPerSecond = stats.StatsBlock[14].StatValue; | 282 | outPacketsPerSecond = stats.StatsBlock[14].StatValue; |
277 | unackedBytes = stats.StatsBlock[15].StatValue; | 283 | unackedBytes = stats.StatsBlock[15].StatValue; |
@@ -279,12 +285,16 @@ namespace OpenSim.Framework.Monitoring | |||
279 | pendingDownloads = stats.StatsBlock[17].StatValue; | 285 | pendingDownloads = stats.StatsBlock[17].StatValue; |
280 | pendingUploads = stats.StatsBlock[18].StatValue; | 286 | pendingUploads = stats.StatsBlock[18].StatValue; |
281 | activeScripts = stats.StatsBlock[19].StatValue; | 287 | activeScripts = stats.StatsBlock[19].StatValue; |
282 | scriptLinesPerSecond = stats.StatsBlock[20].StatValue; | 288 | sleepTime = stats.StatsBlock[20].StatValue; |
283 | m_frameDilation = stats.StatsBlock[22].StatValue; | 289 | spareTime = stats.StatsBlock[21].StatValue; |
284 | m_usersLoggingIn = stats.StatsBlock[23].StatValue; | 290 | physicsStep = stats.StatsBlock[22].StatValue; |
285 | m_totalGeoPrims = stats.StatsBlock[24].StatValue; | 291 | |
286 | m_totalMeshes = stats.StatsBlock[25].StatValue; | 292 | scriptLinesPerSecond = stats.ExtraStatsBlock[0].StatValue; |
287 | m_inUseThreads = stats.StatsBlock[26].StatValue; | 293 | m_frameDilation = stats.ExtraStatsBlock[1].StatValue; |
294 | m_usersLoggingIn = stats.ExtraStatsBlock[2].StatValue; | ||
295 | m_totalGeoPrims = stats.ExtraStatsBlock[3].StatValue; | ||
296 | m_totalMeshes = stats.ExtraStatsBlock[4].StatValue; | ||
297 | m_inUseThreads = stats.ExtraStatsBlock[5].StatValue; | ||
288 | } | 298 | } |
289 | 299 | ||
290 | /// <summary> | 300 | /// <summary> |
@@ -296,7 +306,7 @@ namespace OpenSim.Framework.Monitoring | |||
296 | StringBuilder sb = new StringBuilder(Environment.NewLine); | 306 | StringBuilder sb = new StringBuilder(Environment.NewLine); |
297 | // sb.Append("ASSET STATISTICS"); | 307 | // sb.Append("ASSET STATISTICS"); |
298 | // sb.Append(Environment.NewLine); | 308 | // sb.Append(Environment.NewLine); |
299 | 309 | ||
300 | /* | 310 | /* |
301 | sb.Append( | 311 | sb.Append( |
302 | string.Format( | 312 | string.Format( |
@@ -332,7 +342,7 @@ Asset service request failures: {3}" + Environment.NewLine, | |||
332 | List<Stat> stats = StatsManager.GetStatsFromEachContainer("clientstack", "ClientLogoutsDueToNoReceives"); | 342 | List<Stat> stats = StatsManager.GetStatsFromEachContainer("clientstack", "ClientLogoutsDueToNoReceives"); |
333 | 343 | ||
334 | sb.AppendFormat( | 344 | sb.AppendFormat( |
335 | "Client logouts due to no data receive timeout: {0}\n\n", | 345 | "Client logouts due to no data receive timeout: {0}\n\n", |
336 | stats != null ? stats.Sum(s => s.Value).ToString() : "unknown"); | 346 | stats != null ? stats.Sum(s => s.Value).ToString() : "unknown"); |
337 | 347 | ||
338 | // sb.Append(Environment.NewLine); | 348 | // sb.Append(Environment.NewLine); |
@@ -433,10 +443,10 @@ Asset service request failures: {3}" + Environment.NewLine, | |||
433 | foreach (ProcessThread currentThread in | 443 | foreach (ProcessThread currentThread in |
434 | Process.GetCurrentProcess().Threads) | 444 | Process.GetCurrentProcess().Threads) |
435 | { | 445 | { |
436 | // A known issue with the current process .Threads property is | 446 | // A known issue with the current process .Threads property is |
437 | // that it can return null threads, thus don't count those as | 447 | // that it can return null threads, thus don't count those as |
438 | // running threads and prevent the program function from failing | 448 | // running threads and prevent the program function from failing |
439 | if (currentThread != null && | 449 | if (currentThread != null && |
440 | currentThread.ThreadState == ThreadState.Running) | 450 | currentThread.ThreadState == ThreadState.Running) |
441 | { | 451 | { |
442 | numberThreadsRunning++; | 452 | numberThreadsRunning++; |
@@ -495,7 +505,7 @@ Asset service request failures: {3}" + Environment.NewLine, | |||
495 | "{0:0.##}", numberThreadsRunning)); | 505 | "{0:0.##}", numberThreadsRunning)); |
496 | args["ProcMem"] = OSD.FromString(String.Format("{0:#,###,###.##}", | 506 | args["ProcMem"] = OSD.FromString(String.Format("{0:#,###,###.##}", |
497 | memUsage)); | 507 | memUsage)); |
498 | 508 | ||
499 | return args; | 509 | return args; |
500 | } | 510 | } |
501 | } | 511 | } |
@@ -521,12 +531,12 @@ Asset service request failures: {3}" + Environment.NewLine, | |||
521 | { | 531 | { |
522 | return m_statsProvider.GetStats(); | 532 | return m_statsProvider.GetStats(); |
523 | } | 533 | } |
524 | 534 | ||
525 | public string XReport(string uptime, string version) | 535 | public string XReport(string uptime, string version) |
526 | { | 536 | { |
527 | return ""; | 537 | return ""; |
528 | } | 538 | } |
529 | 539 | ||
530 | public OSDMap OReport(string uptime, string version) | 540 | public OSDMap OReport(string uptime, string version) |
531 | { | 541 | { |
532 | OSDMap ret = new OSDMap(); | 542 | OSDMap ret = new OSDMap(); |
diff --git a/OpenSim/Framework/Monitoring/Stats/CounterStat.cs b/OpenSim/Framework/Monitoring/Stats/CounterStat.cs index 318cf1c..318cf1c 100644..100755 --- a/OpenSim/Framework/Monitoring/Stats/CounterStat.cs +++ b/OpenSim/Framework/Monitoring/Stats/CounterStat.cs | |||
diff --git a/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs b/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs index f51f322..bc56372 100644..100755 --- a/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs +++ b/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs | |||
@@ -1,173 +1,173 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSimulator Project nor the | 12 | * * Neither the name of the OpenSimulator Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Linq; | 30 | using System.Linq; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | using OpenMetaverse.StructuredData; | 33 | using OpenMetaverse.StructuredData; |
34 | 34 | ||
35 | namespace OpenSim.Framework.Monitoring | 35 | namespace OpenSim.Framework.Monitoring |
36 | { | 36 | { |
37 | // Create a time histogram of events. The histogram is built in a wrap-around | 37 | // Create a time histogram of events. The histogram is built in a wrap-around |
38 | // array of equally distributed buckets. | 38 | // array of equally distributed buckets. |
39 | // For instance, a minute long histogram of second sized buckets would be: | 39 | // For instance, a minute long histogram of second sized buckets would be: |
40 | // new EventHistogram(60, 1000) | 40 | // new EventHistogram(60, 1000) |
41 | public class EventHistogram | 41 | public class EventHistogram |
42 | { | 42 | { |
43 | private int m_timeBase; | 43 | private int m_timeBase; |
44 | private int m_numBuckets; | 44 | private int m_numBuckets; |
45 | private int m_bucketMilliseconds; | 45 | private int m_bucketMilliseconds; |
46 | private int m_lastBucket; | 46 | private int m_lastBucket; |
47 | private int m_totalHistogramMilliseconds; | 47 | private int m_totalHistogramMilliseconds; |
48 | private long[] m_histogram; | 48 | private long[] m_histogram; |
49 | private object histoLock = new object(); | 49 | private object histoLock = new object(); |
50 | 50 | ||
51 | public EventHistogram(int numberOfBuckets, int millisecondsPerBucket) | 51 | public EventHistogram(int numberOfBuckets, int millisecondsPerBucket) |
52 | { | 52 | { |
53 | m_numBuckets = numberOfBuckets; | 53 | m_numBuckets = numberOfBuckets; |
54 | m_bucketMilliseconds = millisecondsPerBucket; | 54 | m_bucketMilliseconds = millisecondsPerBucket; |
55 | m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds; | 55 | m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds; |
56 | 56 | ||
57 | m_histogram = new long[m_numBuckets]; | 57 | m_histogram = new long[m_numBuckets]; |
58 | Zero(); | 58 | Zero(); |
59 | m_lastBucket = 0; | 59 | m_lastBucket = 0; |
60 | m_timeBase = Util.EnvironmentTickCount(); | 60 | m_timeBase = Util.EnvironmentTickCount(); |
61 | } | 61 | } |
62 | 62 | ||
63 | public void Event() | 63 | public void Event() |
64 | { | 64 | { |
65 | this.Event(1); | 65 | this.Event(1); |
66 | } | 66 | } |
67 | 67 | ||
68 | // Record an event at time 'now' in the histogram. | 68 | // Record an event at time 'now' in the histogram. |
69 | public void Event(int cnt) | 69 | public void Event(int cnt) |
70 | { | 70 | { |
71 | lock (histoLock) | 71 | lock (histoLock) |
72 | { | 72 | { |
73 | // The time as displaced from the base of the histogram | 73 | // The time as displaced from the base of the histogram |
74 | int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase); | 74 | int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase); |
75 | 75 | ||
76 | // If more than the total time of the histogram, we just start over | 76 | // If more than the total time of the histogram, we just start over |
77 | if (bucketTime > m_totalHistogramMilliseconds) | 77 | if (bucketTime > m_totalHistogramMilliseconds) |
78 | { | 78 | { |
79 | Zero(); | 79 | Zero(); |
80 | m_lastBucket = 0; | 80 | m_lastBucket = 0; |
81 | m_timeBase = Util.EnvironmentTickCount(); | 81 | m_timeBase = Util.EnvironmentTickCount(); |
82 | } | 82 | } |
83 | else | 83 | else |
84 | { | 84 | { |
85 | // To which bucket should we add this event? | 85 | // To which bucket should we add this event? |
86 | int bucket = bucketTime / m_bucketMilliseconds; | 86 | int bucket = bucketTime / m_bucketMilliseconds; |
87 | 87 | ||
88 | // Advance m_lastBucket to the new bucket. Zero any buckets skipped over. | 88 | // Advance m_lastBucket to the new bucket. Zero any buckets skipped over. |
89 | while (bucket != m_lastBucket) | 89 | while (bucket != m_lastBucket) |
90 | { | 90 | { |
91 | // Zero from just after the last bucket to the new bucket or the end | 91 | // Zero from just after the last bucket to the new bucket or the end |
92 | for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++) | 92 | for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++) |
93 | { | 93 | { |
94 | m_histogram[jj] = 0; | 94 | m_histogram[jj] = 0; |
95 | } | 95 | } |
96 | m_lastBucket = bucket; | 96 | m_lastBucket = bucket; |
97 | // If the new bucket is off the end, wrap around to the beginning | 97 | // If the new bucket is off the end, wrap around to the beginning |
98 | if (bucket > m_numBuckets) | 98 | if (bucket > m_numBuckets) |
99 | { | 99 | { |
100 | bucket -= m_numBuckets; | 100 | bucket -= m_numBuckets; |
101 | m_lastBucket = 0; | 101 | m_lastBucket = 0; |
102 | m_histogram[m_lastBucket] = 0; | 102 | m_histogram[m_lastBucket] = 0; |
103 | m_timeBase += m_totalHistogramMilliseconds; | 103 | m_timeBase += m_totalHistogramMilliseconds; |
104 | } | 104 | } |
105 | } | 105 | } |
106 | } | 106 | } |
107 | m_histogram[m_lastBucket] += cnt; | 107 | m_histogram[m_lastBucket] += cnt; |
108 | } | 108 | } |
109 | } | 109 | } |
110 | 110 | ||
111 | // Get a copy of the current histogram | 111 | // Get a copy of the current histogram |
112 | public long[] GetHistogram() | 112 | public long[] GetHistogram() |
113 | { | 113 | { |
114 | long[] ret = new long[m_numBuckets]; | 114 | long[] ret = new long[m_numBuckets]; |
115 | lock (histoLock) | 115 | lock (histoLock) |
116 | { | 116 | { |
117 | int indx = m_lastBucket + 1; | 117 | int indx = m_lastBucket + 1; |
118 | for (int ii = 0; ii < m_numBuckets; ii++, indx++) | 118 | for (int ii = 0; ii < m_numBuckets; ii++, indx++) |
119 | { | 119 | { |
120 | if (indx >= m_numBuckets) | 120 | if (indx >= m_numBuckets) |
121 | indx = 0; | 121 | indx = 0; |
122 | ret[ii] = m_histogram[indx]; | 122 | ret[ii] = m_histogram[indx]; |
123 | } | 123 | } |
124 | } | 124 | } |
125 | return ret; | 125 | return ret; |
126 | } | 126 | } |
127 | 127 | ||
128 | public OSDMap GetHistogramAsOSDMap() | 128 | public OSDMap GetHistogramAsOSDMap() |
129 | { | 129 | { |
130 | OSDMap ret = new OSDMap(); | 130 | OSDMap ret = new OSDMap(); |
131 | 131 | ||
132 | ret.Add("Buckets", OSD.FromInteger(m_numBuckets)); | 132 | ret.Add("Buckets", OSD.FromInteger(m_numBuckets)); |
133 | ret.Add("BucketMilliseconds", OSD.FromInteger(m_bucketMilliseconds)); | 133 | ret.Add("BucketMilliseconds", OSD.FromInteger(m_bucketMilliseconds)); |
134 | ret.Add("TotalMilliseconds", OSD.FromInteger(m_totalHistogramMilliseconds)); | 134 | ret.Add("TotalMilliseconds", OSD.FromInteger(m_totalHistogramMilliseconds)); |
135 | 135 | ||
136 | // Compute a number for the first bucket in the histogram. | 136 | // Compute a number for the first bucket in the histogram. |
137 | // This will allow readers to know how this histogram relates to any previously read histogram. | 137 | // This will allow readers to know how this histogram relates to any previously read histogram. |
138 | int baseBucketNum = (m_timeBase / m_bucketMilliseconds) + m_lastBucket + 1; | 138 | int baseBucketNum = (m_timeBase / m_bucketMilliseconds) + m_lastBucket + 1; |
139 | ret.Add("BaseNumber", OSD.FromInteger(baseBucketNum)); | 139 | ret.Add("BaseNumber", OSD.FromInteger(baseBucketNum)); |
140 | 140 | ||
141 | ret.Add("Values", GetHistogramAsOSDArray()); | 141 | ret.Add("Values", GetHistogramAsOSDArray()); |
142 | 142 | ||
143 | return ret; | 143 | return ret; |
144 | } | 144 | } |
145 | // Get a copy of the current histogram | 145 | // Get a copy of the current histogram |
146 | public OSDArray GetHistogramAsOSDArray() | 146 | public OSDArray GetHistogramAsOSDArray() |
147 | { | 147 | { |
148 | OSDArray ret = new OSDArray(m_numBuckets); | 148 | OSDArray ret = new OSDArray(m_numBuckets); |
149 | lock (histoLock) | 149 | lock (histoLock) |
150 | { | 150 | { |
151 | int indx = m_lastBucket + 1; | 151 | int indx = m_lastBucket + 1; |
152 | for (int ii = 0; ii < m_numBuckets; ii++, indx++) | 152 | for (int ii = 0; ii < m_numBuckets; ii++, indx++) |
153 | { | 153 | { |
154 | if (indx >= m_numBuckets) | 154 | if (indx >= m_numBuckets) |
155 | indx = 0; | 155 | indx = 0; |
156 | ret[ii] = OSD.FromLong(m_histogram[indx]); | 156 | ret[ii] = OSD.FromLong(m_histogram[indx]); |
157 | } | 157 | } |
158 | } | 158 | } |
159 | return ret; | 159 | return ret; |
160 | } | 160 | } |
161 | 161 | ||
162 | // Zero out the histogram | 162 | // Zero out the histogram |
163 | public void Zero() | 163 | public void Zero() |
164 | { | 164 | { |
165 | lock (histoLock) | 165 | lock (histoLock) |
166 | { | 166 | { |
167 | for (int ii = 0; ii < m_numBuckets; ii++) | 167 | for (int ii = 0; ii < m_numBuckets; ii++) |
168 | m_histogram[ii] = 0; | 168 | m_histogram[ii] = 0; |
169 | } | 169 | } |
170 | } | 170 | } |
171 | } | 171 | } |
172 | 172 | ||
173 | } | 173 | } |
diff --git a/OpenSim/Framework/Monitoring/Stats/Stat.cs b/OpenSim/Framework/Monitoring/Stats/Stat.cs index a7cb2a6..2402acd 100644 --- a/OpenSim/Framework/Monitoring/Stats/Stat.cs +++ b/OpenSim/Framework/Monitoring/Stats/Stat.cs | |||
@@ -121,17 +121,17 @@ namespace OpenSim.Framework.Monitoring | |||
121 | string container, | 121 | string container, |
122 | StatType type, | 122 | StatType type, |
123 | Action<Stat> pullAction, | 123 | Action<Stat> pullAction, |
124 | StatVerbosity verbosity) | 124 | StatVerbosity verbosity) |
125 | : this( | 125 | : this( |
126 | shortName, | 126 | shortName, |
127 | name, | 127 | name, |
128 | description, | 128 | description, |
129 | unitName, | 129 | unitName, |
130 | category, | 130 | category, |
131 | container, | 131 | container, |
132 | type, | 132 | type, |
133 | MeasuresOfInterest.None, | 133 | MeasuresOfInterest.None, |
134 | pullAction, | 134 | pullAction, |
135 | verbosity) | 135 | verbosity) |
136 | { | 136 | { |
137 | } | 137 | } |
@@ -227,11 +227,11 @@ namespace OpenSim.Framework.Monitoring | |||
227 | { | 227 | { |
228 | StringBuilder sb = new StringBuilder(); | 228 | StringBuilder sb = new StringBuilder(); |
229 | sb.AppendFormat( | 229 | sb.AppendFormat( |
230 | "{0}.{1}.{2} : {3}{4}", | 230 | "{0}.{1}.{2} : {3}{4}", |
231 | Category, | 231 | Category, |
232 | Container, | 232 | Container, |
233 | ShortName, | 233 | ShortName, |
234 | Value, | 234 | Value, |
235 | string.IsNullOrEmpty(UnitName) ? "" : string.Format(" {0}", UnitName)); | 235 | string.IsNullOrEmpty(UnitName) ? "" : string.Format(" {0}", UnitName)); |
236 | 236 | ||
237 | AppendMeasuresOfInterest(sb); | 237 | AppendMeasuresOfInterest(sb); |
@@ -239,6 +239,17 @@ namespace OpenSim.Framework.Monitoring | |||
239 | return sb.ToString(); | 239 | return sb.ToString(); |
240 | } | 240 | } |
241 | 241 | ||
242 | public virtual OSDMap ToBriefOSDMap() | ||
243 | { | ||
244 | OSDMap ret = new OSDMap(); | ||
245 | |||
246 | ret.Add("Value", OSD.FromReal(Value)); | ||
247 | |||
248 | double lastChangeOverTime, averageChangeOverTime; | ||
249 | |||
250 | return ret; | ||
251 | } | ||
252 | |||
242 | public virtual OSDMap ToOSDMap() | 253 | public virtual OSDMap ToOSDMap() |
243 | { | 254 | { |
244 | OSDMap ret = new OSDMap(); | 255 | OSDMap ret = new OSDMap(); |
@@ -279,7 +290,7 @@ namespace OpenSim.Framework.Monitoring | |||
279 | lock (m_samples) | 290 | lock (m_samples) |
280 | { | 291 | { |
281 | // m_log.DebugFormat( | 292 | // m_log.DebugFormat( |
282 | // "[STAT]: Samples for {0} are {1}", | 293 | // "[STAT]: Samples for {0} are {1}", |
283 | // Name, string.Join(",", m_samples.Select(s => s.ToString()).ToArray())); | 294 | // Name, string.Join(",", m_samples.Select(s => s.ToString()).ToArray())); |
284 | 295 | ||
285 | foreach (double s in m_samples) | 296 | foreach (double s in m_samples) |
@@ -315,12 +326,12 @@ namespace OpenSim.Framework.Monitoring | |||
315 | if (ComputeMeasuresOfInterest(out lastChangeOverTime, out averageChangeOverTime)) | 326 | if (ComputeMeasuresOfInterest(out lastChangeOverTime, out averageChangeOverTime)) |
316 | { | 327 | { |
317 | sb.AppendFormat( | 328 | sb.AppendFormat( |
318 | ", {0:0.##}{1}/s, {2:0.##}{3}/s", | 329 | ", {0:0.##}{1}/s, {2:0.##}{3}/s", |
319 | lastChangeOverTime, | 330 | lastChangeOverTime, |
320 | string.IsNullOrEmpty(UnitName) ? "" : string.Format(" {0}", UnitName), | 331 | string.IsNullOrEmpty(UnitName) ? "" : string.Format(" {0}", UnitName), |
321 | averageChangeOverTime, | 332 | averageChangeOverTime, |
322 | string.IsNullOrEmpty(UnitName) ? "" : string.Format(" {0}", UnitName)); | 333 | string.IsNullOrEmpty(UnitName) ? "" : string.Format(" {0}", UnitName)); |
323 | } | 334 | } |
324 | } | 335 | } |
325 | } | 336 | } |
326 | } \ No newline at end of file | 337 | } |
diff --git a/OpenSim/Framework/Monitoring/StatsLogger.cs b/OpenSim/Framework/Monitoring/StatsLogger.cs index 15a37aa..b719af9 100644 --- a/OpenSim/Framework/Monitoring/StatsLogger.cs +++ b/OpenSim/Framework/Monitoring/StatsLogger.cs | |||
@@ -99,13 +99,13 @@ namespace OpenSim.Framework.Monitoring | |||
99 | } | 99 | } |
100 | 100 | ||
101 | string path = cmd[2]; | 101 | string path = cmd[2]; |
102 | 102 | ||
103 | using (StreamWriter sw = new StreamWriter(path, true)) | 103 | using (StreamWriter sw = new StreamWriter(path, true)) |
104 | { | 104 | { |
105 | foreach (string line in GetReport()) | 105 | foreach (string line in GetReport()) |
106 | sw.WriteLine(line); | 106 | sw.WriteLine(line); |
107 | } | 107 | } |
108 | 108 | ||
109 | MainConsole.Instance.OutputFormat("Stats saved to file {0}", path); | 109 | MainConsole.Instance.OutputFormat("Stats saved to file {0}", path); |
110 | } | 110 | } |
111 | 111 | ||
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs index 3136ee8..a6b341f 100644 --- a/OpenSim/Framework/Monitoring/StatsManager.cs +++ b/OpenSim/Framework/Monitoring/StatsManager.cs | |||
@@ -47,6 +47,8 @@ namespace OpenSim.Framework.Monitoring | |||
47 | // Subcommand used to list other stats. | 47 | // Subcommand used to list other stats. |
48 | public const string ListSubCommand = "list"; | 48 | public const string ListSubCommand = "list"; |
49 | 49 | ||
50 | public static string StatsPassword { get; set; } | ||
51 | |||
50 | // All subcommands | 52 | // All subcommands |
51 | public static HashSet<string> SubCommands = new HashSet<string> { AllSubCommand, ListSubCommand }; | 53 | public static HashSet<string> SubCommands = new HashSet<string> { AllSubCommand, ListSubCommand }; |
52 | 54 | ||
@@ -80,8 +82,7 @@ namespace OpenSim.Framework.Monitoring | |||
80 | + "'all' will show all statistics.\n" | 82 | + "'all' will show all statistics.\n" |
81 | + "A <category> name will show statistics from that category.\n" | 83 | + "A <category> name will show statistics from that category.\n" |
82 | + "A <category>.<container> name will show statistics from that category in that container.\n" | 84 | + "A <category>.<container> name will show statistics from that category in that container.\n" |
83 | + "More than one name can be given separated by spaces.\n" | 85 | + "More than one name can be given separated by spaces.\n", |
84 | + "THIS STATS FACILITY IS EXPERIMENTAL AND DOES NOT YET CONTAIN ALL STATS", | ||
85 | HandleShowStatsCommand); | 86 | HandleShowStatsCommand); |
86 | 87 | ||
87 | console.Commands.AddCommand( | 88 | console.Commands.AddCommand( |
@@ -91,7 +92,6 @@ namespace OpenSim.Framework.Monitoring | |||
91 | "show stats [list|all|(<category>[.<container>])+", | 92 | "show stats [list|all|(<category>[.<container>])+", |
92 | "Alias for 'stats show' command", | 93 | "Alias for 'stats show' command", |
93 | HandleShowStatsCommand); | 94 | HandleShowStatsCommand); |
94 | |||
95 | StatsLogger.RegisterConsoleCommands(console); | 95 | StatsLogger.RegisterConsoleCommands(console); |
96 | } | 96 | } |
97 | 97 | ||
@@ -262,33 +262,36 @@ namespace OpenSim.Framework.Monitoring | |||
262 | { | 262 | { |
263 | OSDMap map = new OSDMap(); | 263 | OSDMap map = new OSDMap(); |
264 | 264 | ||
265 | foreach (string catName in RegisteredStats.Keys) | 265 | lock (RegisteredStats) |
266 | { | 266 | { |
267 | // Do this category if null spec, "all" subcommand or category name matches passed parameter. | 267 | foreach (string catName in RegisteredStats.Keys) |
268 | // Skip category if none of the above. | ||
269 | if (!(String.IsNullOrEmpty(pCategoryName) || pCategoryName == AllSubCommand || pCategoryName == catName)) | ||
270 | continue; | ||
271 | |||
272 | OSDMap contMap = new OSDMap(); | ||
273 | foreach (string contName in RegisteredStats[catName].Keys) | ||
274 | { | 268 | { |
275 | if (!(string.IsNullOrEmpty(pContainerName) || pContainerName == AllSubCommand || pContainerName == contName)) | 269 | // Do this category if null spec, "all" subcommand or category name matches passed parameter. |
270 | // Skip category if none of the above. | ||
271 | if (!(String.IsNullOrEmpty(pCategoryName) || pCategoryName == AllSubCommand || pCategoryName == catName)) | ||
276 | continue; | 272 | continue; |
277 | |||
278 | OSDMap statMap = new OSDMap(); | ||
279 | 273 | ||
280 | SortedDictionary<string, Stat> theStats = RegisteredStats[catName][contName]; | 274 | OSDMap contMap = new OSDMap(); |
281 | foreach (string statName in theStats.Keys) | 275 | foreach (string contName in RegisteredStats[catName].Keys) |
282 | { | 276 | { |
283 | if (!(String.IsNullOrEmpty(pStatName) || pStatName == AllSubCommand || pStatName == statName)) | 277 | if (!(string.IsNullOrEmpty(pContainerName) || pContainerName == AllSubCommand || pContainerName == contName)) |
284 | continue; | 278 | continue; |
285 | 279 | ||
286 | statMap.Add(statName, theStats[statName].ToOSDMap()); | 280 | OSDMap statMap = new OSDMap(); |
287 | } | 281 | |
282 | SortedDictionary<string, Stat> theStats = RegisteredStats[catName][contName]; | ||
283 | foreach (string statName in theStats.Keys) | ||
284 | { | ||
285 | if (!(String.IsNullOrEmpty(pStatName) || pStatName == AllSubCommand || pStatName == statName)) | ||
286 | continue; | ||
287 | |||
288 | statMap.Add(statName, theStats[statName].ToBriefOSDMap()); | ||
289 | } | ||
288 | 290 | ||
289 | contMap.Add(contName, statMap); | 291 | contMap.Add(contName, statMap); |
292 | } | ||
293 | map.Add(catName, contMap); | ||
290 | } | 294 | } |
291 | map.Add(catName, contMap); | ||
292 | } | 295 | } |
293 | 296 | ||
294 | return map; | 297 | return map; |
@@ -301,6 +304,17 @@ namespace OpenSim.Framework.Monitoring | |||
301 | int response_code = 200; | 304 | int response_code = 200; |
302 | string contenttype = "text/json"; | 305 | string contenttype = "text/json"; |
303 | 306 | ||
307 | if (StatsPassword != String.Empty && (!request.ContainsKey("pass") || request["pass"].ToString() != StatsPassword)) | ||
308 | { | ||
309 | responsedata["int_response_code"] = response_code; | ||
310 | responsedata["content_type"] = "text/plain"; | ||
311 | responsedata["keepalive"] = false; | ||
312 | responsedata["str_response_string"] = "Access denied"; | ||
313 | responsedata["access_control_allow_origin"] = "*"; | ||
314 | |||
315 | return responsedata; | ||
316 | } | ||
317 | |||
304 | string pCategoryName = StatsManager.AllSubCommand; | 318 | string pCategoryName = StatsManager.AllSubCommand; |
305 | string pContainerName = StatsManager.AllSubCommand; | 319 | string pContainerName = StatsManager.AllSubCommand; |
306 | string pStatName = StatsManager.AllSubCommand; | 320 | string pStatName = StatsManager.AllSubCommand; |
@@ -358,8 +372,8 @@ namespace OpenSim.Framework.Monitoring | |||
358 | /// <returns></returns> | 372 | /// <returns></returns> |
359 | public static bool RegisterStat(Stat stat) | 373 | public static bool RegisterStat(Stat stat) |
360 | { | 374 | { |
361 | SortedDictionary<string, SortedDictionary<string, Stat>> category = null, newCategory; | 375 | SortedDictionary<string, SortedDictionary<string, Stat>> category = null; |
362 | SortedDictionary<string, Stat> container = null, newContainer; | 376 | SortedDictionary<string, Stat> container = null; |
363 | 377 | ||
364 | lock (RegisteredStats) | 378 | lock (RegisteredStats) |
365 | { | 379 | { |
@@ -369,22 +383,15 @@ namespace OpenSim.Framework.Monitoring | |||
369 | if (TryGetStatParents(stat, out category, out container)) | 383 | if (TryGetStatParents(stat, out category, out container)) |
370 | return false; | 384 | return false; |
371 | 385 | ||
372 | // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed. | 386 | if (container == null) |
373 | // This means that we don't need to lock or copy them on iteration, which will be a much more | 387 | container = new SortedDictionary<string, Stat>(); |
374 | // common operation after startup. | ||
375 | if (container != null) | ||
376 | newContainer = new SortedDictionary<string, Stat>(container); | ||
377 | else | ||
378 | newContainer = new SortedDictionary<string, Stat>(); | ||
379 | 388 | ||
380 | if (category != null) | 389 | if (category == null) |
381 | newCategory = new SortedDictionary<string, SortedDictionary<string, Stat>>(category); | 390 | category = new SortedDictionary<string, SortedDictionary<string, Stat>>(); |
382 | else | ||
383 | newCategory = new SortedDictionary<string, SortedDictionary<string, Stat>>(); | ||
384 | 391 | ||
385 | newContainer[stat.ShortName] = stat; | 392 | container[stat.ShortName] = stat; |
386 | newCategory[stat.Container] = newContainer; | 393 | category[stat.Container] = container; |
387 | RegisteredStats[stat.Category] = newCategory; | 394 | RegisteredStats[stat.Category] = category; |
388 | } | 395 | } |
389 | 396 | ||
390 | return true; | 397 | return true; |
@@ -397,23 +404,24 @@ namespace OpenSim.Framework.Monitoring | |||
397 | /// <returns></returns> | 404 | /// <returns></returns> |
398 | public static bool DeregisterStat(Stat stat) | 405 | public static bool DeregisterStat(Stat stat) |
399 | { | 406 | { |
400 | SortedDictionary<string, SortedDictionary<string, Stat>> category = null, newCategory; | 407 | SortedDictionary<string, SortedDictionary<string, Stat>> category = null; |
401 | SortedDictionary<string, Stat> container = null, newContainer; | 408 | SortedDictionary<string, Stat> container = null; |
402 | 409 | ||
403 | lock (RegisteredStats) | 410 | lock (RegisteredStats) |
404 | { | 411 | { |
405 | if (!TryGetStatParents(stat, out category, out container)) | 412 | if (!TryGetStatParents(stat, out category, out container)) |
406 | return false; | 413 | return false; |
407 | 414 | ||
408 | newContainer = new SortedDictionary<string, Stat>(container); | 415 | if(container != null) |
409 | newContainer.Remove(stat.ShortName); | 416 | { |
410 | 417 | container.Remove(stat.ShortName); | |
411 | newCategory = new SortedDictionary<string, SortedDictionary<string, Stat>>(category); | 418 | if(category != null && container.Count == 0) |
412 | newCategory.Remove(stat.Container); | 419 | { |
413 | 420 | category.Remove(stat.Container); | |
414 | newCategory[stat.Container] = newContainer; | 421 | if(category.Count == 0) |
415 | RegisteredStats[stat.Category] = newCategory; | 422 | RegisteredStats.Remove(stat.Category); |
416 | 423 | } | |
424 | } | ||
417 | return true; | 425 | return true; |
418 | } | 426 | } |
419 | } | 427 | } |
@@ -554,4 +562,4 @@ namespace OpenSim.Framework.Monitoring | |||
554 | Debug, | 562 | Debug, |
555 | Info | 563 | Info |
556 | } | 564 | } |
557 | } \ No newline at end of file | 565 | } |
diff --git a/OpenSim/Framework/Monitoring/Watchdog.cs b/OpenSim/Framework/Monitoring/Watchdog.cs index a644fa5..9cac451 100644 --- a/OpenSim/Framework/Monitoring/Watchdog.cs +++ b/OpenSim/Framework/Monitoring/Watchdog.cs | |||
@@ -96,7 +96,7 @@ namespace OpenSim.Framework.Monitoring | |||
96 | FirstTick = Environment.TickCount & Int32.MaxValue; | 96 | FirstTick = Environment.TickCount & Int32.MaxValue; |
97 | LastTick = FirstTick; | 97 | LastTick = FirstTick; |
98 | 98 | ||
99 | Stat | 99 | Stat |
100 | = new Stat( | 100 | = new Stat( |
101 | name, | 101 | name, |
102 | string.Format("Last update of thread {0}", name), | 102 | string.Format("Last update of thread {0}", name), |
@@ -180,6 +180,30 @@ namespace OpenSim.Framework.Monitoring | |||
180 | m_watchdogTimer.Elapsed += WatchdogTimerElapsed; | 180 | m_watchdogTimer.Elapsed += WatchdogTimerElapsed; |
181 | } | 181 | } |
182 | 182 | ||
183 | public static void Stop() | ||
184 | { | ||
185 | if(m_threads == null) | ||
186 | return; | ||
187 | |||
188 | lock(m_threads) | ||
189 | { | ||
190 | m_enabled = false; | ||
191 | if(m_watchdogTimer != null) | ||
192 | { | ||
193 | m_watchdogTimer.Dispose(); | ||
194 | m_watchdogTimer = null; | ||
195 | } | ||
196 | |||
197 | foreach(ThreadWatchdogInfo twi in m_threads.Values) | ||
198 | { | ||
199 | Thread t = twi.Thread; | ||
200 | if(t.IsAlive) | ||
201 | t.Abort(); | ||
202 | } | ||
203 | m_threads.Clear(); | ||
204 | } | ||
205 | } | ||
206 | |||
183 | /// <summary> | 207 | /// <summary> |
184 | /// Add a thread to the watchdog tracker. | 208 | /// Add a thread to the watchdog tracker. |
185 | /// </summary> | 209 | /// </summary> |
@@ -230,14 +254,12 @@ namespace OpenSim.Framework.Monitoring | |||
230 | 254 | ||
231 | twi.Cleanup(); | 255 | twi.Cleanup(); |
232 | m_threads.Remove(threadID); | 256 | m_threads.Remove(threadID); |
233 | |||
234 | return true; | 257 | return true; |
235 | } | 258 | } |
236 | else | 259 | else |
237 | { | 260 | { |
238 | m_log.WarnFormat( | 261 | m_log.WarnFormat( |
239 | "[WATCHDOG]: Requested to remove thread with ID {0} but this is not being monitored", threadID); | 262 | "[WATCHDOG]: Requested to remove thread with ID {0} but this is not being monitored", threadID); |
240 | |||
241 | return false; | 263 | return false; |
242 | } | 264 | } |
243 | } | 265 | } |
@@ -317,6 +339,8 @@ namespace OpenSim.Framework.Monitoring | |||
317 | /// <param name="e"></param> | 339 | /// <param name="e"></param> |
318 | private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) | 340 | private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) |
319 | { | 341 | { |
342 | if(!m_enabled) | ||
343 | return; | ||
320 | int now = Environment.TickCount & Int32.MaxValue; | 344 | int now = Environment.TickCount & Int32.MaxValue; |
321 | int msElapsed = now - LastWatchdogThreadTick; | 345 | int msElapsed = now - LastWatchdogThreadTick; |
322 | 346 | ||
@@ -332,27 +356,36 @@ namespace OpenSim.Framework.Monitoring | |||
332 | if (callback != null) | 356 | if (callback != null) |
333 | { | 357 | { |
334 | List<ThreadWatchdogInfo> callbackInfos = null; | 358 | List<ThreadWatchdogInfo> callbackInfos = null; |
359 | List<ThreadWatchdogInfo> threadsToRemove = null; | ||
360 | |||
361 | const ThreadState thgone = ThreadState.Stopped; | ||
335 | 362 | ||
336 | lock (m_threads) | 363 | lock (m_threads) |
337 | { | 364 | { |
338 | foreach (ThreadWatchdogInfo threadInfo in m_threads.Values) | 365 | foreach(ThreadWatchdogInfo threadInfo in m_threads.Values) |
339 | { | 366 | { |
340 | if (threadInfo.Thread.ThreadState == ThreadState.Stopped) | 367 | if(!m_enabled) |
368 | return; | ||
369 | if((threadInfo.Thread.ThreadState & thgone) != 0) | ||
341 | { | 370 | { |
342 | RemoveThread(threadInfo.Thread.ManagedThreadId); | 371 | if(threadsToRemove == null) |
372 | threadsToRemove = new List<ThreadWatchdogInfo>(); | ||
343 | 373 | ||
344 | if (callbackInfos == null) | 374 | threadsToRemove.Add(threadInfo); |
375 | /* | ||
376 | if(callbackInfos == null) | ||
345 | callbackInfos = new List<ThreadWatchdogInfo>(); | 377 | callbackInfos = new List<ThreadWatchdogInfo>(); |
346 | 378 | ||
347 | callbackInfos.Add(threadInfo); | 379 | callbackInfos.Add(threadInfo); |
380 | */ | ||
348 | } | 381 | } |
349 | else if (!threadInfo.IsTimedOut && now - threadInfo.LastTick >= threadInfo.Timeout) | 382 | else if(!threadInfo.IsTimedOut && now - threadInfo.LastTick >= threadInfo.Timeout) |
350 | { | 383 | { |
351 | threadInfo.IsTimedOut = true; | 384 | threadInfo.IsTimedOut = true; |
352 | 385 | ||
353 | if (threadInfo.AlarmIfTimeout) | 386 | if(threadInfo.AlarmIfTimeout) |
354 | { | 387 | { |
355 | if (callbackInfos == null) | 388 | if(callbackInfos == null) |
356 | callbackInfos = new List<ThreadWatchdogInfo>(); | 389 | callbackInfos = new List<ThreadWatchdogInfo>(); |
357 | 390 | ||
358 | // Send a copy of the watchdog info to prevent race conditions where the watchdog | 391 | // Send a copy of the watchdog info to prevent race conditions where the watchdog |
@@ -361,9 +394,13 @@ namespace OpenSim.Framework.Monitoring | |||
361 | } | 394 | } |
362 | } | 395 | } |
363 | } | 396 | } |
397 | |||
398 | if(threadsToRemove != null) | ||
399 | foreach(ThreadWatchdogInfo twi in threadsToRemove) | ||
400 | RemoveThread(twi.Thread.ManagedThreadId); | ||
364 | } | 401 | } |
365 | 402 | ||
366 | if (callbackInfos != null) | 403 | if(callbackInfos != null) |
367 | foreach (ThreadWatchdogInfo callbackInfo in callbackInfos) | 404 | foreach (ThreadWatchdogInfo callbackInfo in callbackInfos) |
368 | callback(callbackInfo); | 405 | callback(callbackInfo); |
369 | } | 406 | } |
@@ -377,4 +414,4 @@ namespace OpenSim.Framework.Monitoring | |||
377 | m_watchdogTimer.Start(); | 414 | m_watchdogTimer.Start(); |
378 | } | 415 | } |
379 | } | 416 | } |
380 | } \ No newline at end of file | 417 | } |
diff --git a/OpenSim/Framework/Monitoring/WorkManager.cs b/OpenSim/Framework/Monitoring/WorkManager.cs index d1a74ce..5d9b185 100644 --- a/OpenSim/Framework/Monitoring/WorkManager.cs +++ b/OpenSim/Framework/Monitoring/WorkManager.cs | |||
@@ -36,16 +36,16 @@ namespace OpenSim.Framework.Monitoring | |||
36 | /// Manages various work items in the simulator. | 36 | /// Manages various work items in the simulator. |
37 | /// </summary> | 37 | /// </summary> |
38 | /// <remarks> | 38 | /// <remarks> |
39 | /// Currently, here work can be started | 39 | /// Currently, here work can be started |
40 | /// * As a long-running and monitored thread. | 40 | /// * As a long-running and monitored thread. |
41 | /// * In a thread that will never timeout but where the job is expected to eventually complete. | 41 | /// * In a thread that will never timeout but where the job is expected to eventually complete. |
42 | /// * In a threadpool thread that will timeout if it takes a very long time to complete (> 10 mins). | 42 | /// * In a threadpool thread that will timeout if it takes a very long time to complete (> 10 mins). |
43 | /// * As a job which will be run in a single-threaded job engine. Such jobs must not incorporate delays (sleeps, | 43 | /// * As a job which will be run in a single-threaded job engine. Such jobs must not incorporate delays (sleeps, |
44 | /// network waits, etc.). | 44 | /// network waits, etc.). |
45 | /// | 45 | /// |
46 | /// This is an evolving approach to better manage the work that OpenSimulator is asked to do from a very diverse | 46 | /// This is an evolving approach to better manage the work that OpenSimulator is asked to do from a very diverse |
47 | /// range of sources (client actions, incoming network, outgoing network calls, etc.). | 47 | /// range of sources (client actions, incoming network, outgoing network calls, etc.). |
48 | /// | 48 | /// |
49 | /// Util.FireAndForget is still available to insert jobs in the threadpool, though this is equivalent to | 49 | /// Util.FireAndForget is still available to insert jobs in the threadpool, though this is equivalent to |
50 | /// WorkManager.RunInThreadPool(). | 50 | /// WorkManager.RunInThreadPool(). |
51 | /// </remarks> | 51 | /// </remarks> |
@@ -57,7 +57,7 @@ namespace OpenSim.Framework.Monitoring | |||
57 | 57 | ||
58 | static WorkManager() | 58 | static WorkManager() |
59 | { | 59 | { |
60 | JobEngine = new JobEngine("Non-blocking non-critical job engine", "JOB ENGINE"); | 60 | JobEngine = new JobEngine("Non-blocking non-critical job engine", "JOB ENGINE", 30000); |
61 | 61 | ||
62 | StatsManager.RegisterStat( | 62 | StatsManager.RegisterStat( |
63 | new Stat( | 63 | new Stat( |
@@ -82,6 +82,12 @@ namespace OpenSim.Framework.Monitoring | |||
82 | HandleControlCommand); | 82 | HandleControlCommand); |
83 | } | 83 | } |
84 | 84 | ||
85 | public static void Stop() | ||
86 | { | ||
87 | JobEngine.Stop(); | ||
88 | Watchdog.Stop(); | ||
89 | } | ||
90 | |||
85 | /// <summary> | 91 | /// <summary> |
86 | /// Start a new long-lived thread. | 92 | /// Start a new long-lived thread. |
87 | /// </summary> | 93 | /// </summary> |
@@ -121,6 +127,7 @@ namespace OpenSim.Framework.Monitoring | |||
121 | Thread thread = new Thread(start); | 127 | Thread thread = new Thread(start); |
122 | thread.Priority = priority; | 128 | thread.Priority = priority; |
123 | thread.IsBackground = isBackground; | 129 | thread.IsBackground = isBackground; |
130 | thread.Name = name; | ||
124 | 131 | ||
125 | Watchdog.ThreadWatchdogInfo twi | 132 | Watchdog.ThreadWatchdogInfo twi |
126 | = new Watchdog.ThreadWatchdogInfo(thread, timeout, name) | 133 | = new Watchdog.ThreadWatchdogInfo(thread, timeout, name) |
@@ -129,7 +136,6 @@ namespace OpenSim.Framework.Monitoring | |||
129 | Watchdog.AddThread(twi, name, log:log); | 136 | Watchdog.AddThread(twi, name, log:log); |
130 | 137 | ||
131 | thread.Start(); | 138 | thread.Start(); |
132 | thread.Name = name; | ||
133 | 139 | ||
134 | return thread; | 140 | return thread; |
135 | } | 141 | } |
@@ -143,7 +149,7 @@ namespace OpenSim.Framework.Monitoring | |||
143 | /// <param name="name">Name of the thread</param> | 149 | /// <param name="name">Name of the thread</param> |
144 | public static void RunInThread(WaitCallback callback, object obj, string name, bool log = false) | 150 | public static void RunInThread(WaitCallback callback, object obj, string name, bool log = false) |
145 | { | 151 | { |
146 | if (Util.FireAndForgetMethod == FireAndForgetMethod.RegressionTest) | 152 | if (Util.FireAndForgetMethod == FireAndForgetMethod.RegressionTest) |
147 | { | 153 | { |
148 | Culture.SetCurrentCulture(); | 154 | Culture.SetCurrentCulture(); |
149 | callback(obj); | 155 | callback(obj); |
@@ -168,7 +174,7 @@ namespace OpenSim.Framework.Monitoring | |||
168 | } | 174 | } |
169 | 175 | ||
170 | /// <summary> | 176 | /// <summary> |
171 | /// Run the callback via a threadpool thread. | 177 | /// Run the callback via a threadpool thread. |
172 | /// </summary> | 178 | /// </summary> |
173 | /// <remarks> | 179 | /// <remarks> |
174 | /// Such jobs may run after some delay but must always complete. | 180 | /// Such jobs may run after some delay but must always complete. |
@@ -176,9 +182,9 @@ namespace OpenSim.Framework.Monitoring | |||
176 | /// <param name="callback"></param> | 182 | /// <param name="callback"></param> |
177 | /// <param name="obj"></param> | 183 | /// <param name="obj"></param> |
178 | /// <param name="name">The name of the job. This is used in monitoring and debugging.</param> | 184 | /// <param name="name">The name of the job. This is used in monitoring and debugging.</param> |
179 | public static void RunInThreadPool(System.Threading.WaitCallback callback, object obj, string name) | 185 | public static void RunInThreadPool(System.Threading.WaitCallback callback, object obj, string name, bool timeout = true) |
180 | { | 186 | { |
181 | Util.FireAndForget(callback, obj, name); | 187 | Util.FireAndForget(callback, obj, name, timeout); |
182 | } | 188 | } |
183 | 189 | ||
184 | /// <summary> | 190 | /// <summary> |
@@ -187,17 +193,17 @@ namespace OpenSim.Framework.Monitoring | |||
187 | /// <remarks> | 193 | /// <remarks> |
188 | /// This differs from direct scheduling (e.g. Util.FireAndForget) in that a job can be run in the job | 194 | /// This differs from direct scheduling (e.g. Util.FireAndForget) in that a job can be run in the job |
189 | /// engine if it is running, where all jobs are currently performed in sequence on a single thread. This is | 195 | /// engine if it is running, where all jobs are currently performed in sequence on a single thread. This is |
190 | /// to prevent observed overload and server freeze problems when there are hundreds of connections which all attempt to | 196 | /// to prevent observed overload and server freeze problems when there are hundreds of connections which all attempt to |
191 | /// perform work at once (e.g. in conference situations). With lower numbers of connections, the small | 197 | /// perform work at once (e.g. in conference situations). With lower numbers of connections, the small |
192 | /// delay in performing jobs in sequence rather than concurrently has not been notiecable in testing, though a future more | 198 | /// delay in performing jobs in sequence rather than concurrently has not been notiecable in testing, though a future more |
193 | /// sophisticated implementation could perform jobs concurrently when the server is under low load. | 199 | /// sophisticated implementation could perform jobs concurrently when the server is under low load. |
194 | /// | 200 | /// |
195 | /// However, be advised that some callers of this function rely on all jobs being performed in sequence if any | 201 | /// However, be advised that some callers of this function rely on all jobs being performed in sequence if any |
196 | /// jobs are performed in sequence (i.e. if jobengine is active or not). Therefore, expanding the jobengine | 202 | /// jobs are performed in sequence (i.e. if jobengine is active or not). Therefore, expanding the jobengine |
197 | /// beyond a single thread will require considerable thought. | 203 | /// beyond a single thread will require considerable thought. |
198 | /// | 204 | /// |
199 | /// Also, any jobs submitted must be guaranteed to complete within a reasonable timeframe (e.g. they cannot | 205 | /// Also, any jobs submitted must be guaranteed to complete within a reasonable timeframe (e.g. they cannot |
200 | /// incorporate a network delay with a long timeout). At the moment, work that could suffer such issues | 206 | /// incorporate a network delay with a long timeout). At the moment, work that could suffer such issues |
201 | /// should still be run directly with RunInThread(), Util.FireAndForget(), etc. This is another area where | 207 | /// should still be run directly with RunInThread(), Util.FireAndForget(), etc. This is another area where |
202 | /// the job engine could be improved and so CPU utilization improved by better management of concurrency within | 208 | /// the job engine could be improved and so CPU utilization improved by better management of concurrency within |
203 | /// OpenSimulator. | 209 | /// OpenSimulator. |
@@ -211,10 +217,10 @@ namespace OpenSim.Framework.Monitoring | |||
211 | /// <param name="log">If set to true then extra logging is performed.</param> | 217 | /// <param name="log">If set to true then extra logging is performed.</param> |
212 | public static void RunJob( | 218 | public static void RunJob( |
213 | string jobType, WaitCallback callback, object obj, string name, | 219 | string jobType, WaitCallback callback, object obj, string name, |
214 | bool canRunInThisThread = false, bool mustNotTimeout = false, | 220 | bool canRunInThisThread = false, bool mustNotTimeout = false, |
215 | bool log = false) | 221 | bool log = false) |
216 | { | 222 | { |
217 | if (Util.FireAndForgetMethod == FireAndForgetMethod.RegressionTest) | 223 | if (Util.FireAndForgetMethod == FireAndForgetMethod.RegressionTest) |
218 | { | 224 | { |
219 | Culture.SetCurrentCulture(); | 225 | Culture.SetCurrentCulture(); |
220 | callback(obj); | 226 | callback(obj); |
@@ -225,10 +231,8 @@ namespace OpenSim.Framework.Monitoring | |||
225 | JobEngine.QueueJob(name, () => callback(obj)); | 231 | JobEngine.QueueJob(name, () => callback(obj)); |
226 | else if (canRunInThisThread) | 232 | else if (canRunInThisThread) |
227 | callback(obj); | 233 | callback(obj); |
228 | else if (mustNotTimeout) | ||
229 | RunInThread(callback, obj, name, log); | ||
230 | else | 234 | else |
231 | Util.FireAndForget(callback, obj, name); | 235 | Util.FireAndForget(callback, obj, name, !mustNotTimeout); |
232 | } | 236 | } |
233 | 237 | ||
234 | private static void HandleControlCommand(string module, string[] args) | 238 | private static void HandleControlCommand(string module, string[] args) |
@@ -272,16 +276,16 @@ namespace OpenSim.Framework.Monitoring | |||
272 | MainConsole.Instance.Output("Usage: debug jobengine log <level>"); | 276 | MainConsole.Instance.Output("Usage: debug jobengine log <level>"); |
273 | return; | 277 | return; |
274 | } | 278 | } |
275 | 279 | ||
276 | // int logLevel; | 280 | // int logLevel; |
277 | int logLevel = int.Parse(args[3]); | 281 | int logLevel = int.Parse(args[3]); |
278 | // if (ConsoleUtil.TryParseConsoleInt(MainConsole.Instance, args[4], out logLevel)) | 282 | // if (ConsoleUtil.TryParseConsoleInt(MainConsole.Instance, args[4], out logLevel)) |
279 | // { | 283 | // { |
280 | JobEngine.LogLevel = logLevel; | 284 | JobEngine.LogLevel = logLevel; |
281 | MainConsole.Instance.OutputFormat("Set debug log level to {0}", JobEngine.LogLevel); | 285 | MainConsole.Instance.OutputFormat("Set debug log level to {0}", JobEngine.LogLevel); |
282 | // } | 286 | // } |
283 | } | 287 | } |
284 | else | 288 | else |
285 | { | 289 | { |
286 | MainConsole.Instance.OutputFormat("Unrecognized job engine subcommand {0}", subCommand); | 290 | MainConsole.Instance.OutputFormat("Unrecognized job engine subcommand {0}", subCommand); |
287 | } | 291 | } |
diff --git a/OpenSim/Framework/MuteData.cs b/OpenSim/Framework/MuteData.cs new file mode 100644 index 0000000..7c946d6 --- /dev/null +++ b/OpenSim/Framework/MuteData.cs | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using OpenMetaverse; | ||
29 | |||
30 | namespace OpenSim.Framework | ||
31 | { | ||
32 | public class MuteData | ||
33 | { | ||
34 | public UUID AgentID; | ||
35 | public UUID MuteID; | ||
36 | public string MuteName; | ||
37 | public int MuteType; | ||
38 | public int MuteFlags; | ||
39 | public int Stamp; | ||
40 | } | ||
41 | } | ||
diff --git a/OpenSim/Framework/NetworkServersInfo.cs b/OpenSim/Framework/NetworkServersInfo.cs index 4b7d4c7..dfe9695 100644 --- a/OpenSim/Framework/NetworkServersInfo.cs +++ b/OpenSim/Framework/NetworkServersInfo.cs | |||
@@ -41,6 +41,7 @@ namespace OpenSim.Framework | |||
41 | 41 | ||
42 | // "Out of band" managemnt https | 42 | // "Out of band" managemnt https |
43 | public bool ssl_listener = false; | 43 | public bool ssl_listener = false; |
44 | public bool ssl_external = false; | ||
44 | public uint https_port = 0; | 45 | public uint https_port = 0; |
45 | public string cert_path = String.Empty; | 46 | public string cert_path = String.Empty; |
46 | public string cert_pass = String.Empty; | 47 | public string cert_pass = String.Empty; |
@@ -64,6 +65,7 @@ namespace OpenSim.Framework | |||
64 | 65 | ||
65 | // "Out of band management https" | 66 | // "Out of band management https" |
66 | ssl_listener = config.Configs["Network"].GetBoolean("https_listener",false); | 67 | ssl_listener = config.Configs["Network"].GetBoolean("https_listener",false); |
68 | ssl_external = config.Configs["Network"].GetBoolean("https_external",false); | ||
67 | if( ssl_listener) | 69 | if( ssl_listener) |
68 | { | 70 | { |
69 | cert_path = config.Configs["Network"].GetString("cert_path",String.Empty); | 71 | cert_path = config.Configs["Network"].GetString("cert_path",String.Empty); |
diff --git a/OpenSim/Framework/NetworkUtil.cs b/OpenSim/Framework/NetworkUtil.cs index 2e94b0d..93c9446 100644 --- a/OpenSim/Framework/NetworkUtil.cs +++ b/OpenSim/Framework/NetworkUtil.cs | |||
@@ -40,7 +40,7 @@ namespace OpenSim.Framework | |||
40 | /// Handles NAT translation in a 'manner of speaking' | 40 | /// Handles NAT translation in a 'manner of speaking' |
41 | /// Allows you to return multiple different external | 41 | /// Allows you to return multiple different external |
42 | /// hostnames depending on the requestors network | 42 | /// hostnames depending on the requestors network |
43 | /// | 43 | /// |
44 | /// This enables standard port forwarding techniques | 44 | /// This enables standard port forwarding techniques |
45 | /// to work correctly with OpenSim. | 45 | /// to work correctly with OpenSim. |
46 | /// </summary> | 46 | /// </summary> |
@@ -145,7 +145,7 @@ namespace OpenSim.Framework | |||
145 | byte[] subnetBytes = subnet.Value.GetAddressBytes(); | 145 | byte[] subnetBytes = subnet.Value.GetAddressBytes(); |
146 | byte[] localBytes = subnet.Key.GetAddressBytes(); | 146 | byte[] localBytes = subnet.Key.GetAddressBytes(); |
147 | byte[] destBytes = destination.GetAddressBytes(); | 147 | byte[] destBytes = destination.GetAddressBytes(); |
148 | 148 | ||
149 | if (subnetBytes.Length != destBytes.Length || subnetBytes.Length != localBytes.Length) | 149 | if (subnetBytes.Length != destBytes.Length || subnetBytes.Length != localBytes.Length) |
150 | return null; | 150 | return null; |
151 | 151 | ||
diff --git a/OpenSim/Framework/OSChatMessage.cs b/OpenSim/Framework/OSChatMessage.cs index 455756d..7450be2 100644 --- a/OpenSim/Framework/OSChatMessage.cs +++ b/OpenSim/Framework/OSChatMessage.cs | |||
@@ -51,12 +51,11 @@ namespace OpenSim.Framework | |||
51 | protected object m_senderObject; | 51 | protected object m_senderObject; |
52 | protected ChatTypeEnum m_type; | 52 | protected ChatTypeEnum m_type; |
53 | protected UUID m_fromID; | 53 | protected UUID m_fromID; |
54 | protected UUID m_toID; | 54 | protected UUID m_destination = UUID.Zero; |
55 | 55 | ||
56 | public OSChatMessage() | 56 | public OSChatMessage() |
57 | { | 57 | { |
58 | m_position = new Vector3(); | 58 | m_position = new Vector3(); |
59 | m_toID = UUID.Zero; | ||
60 | } | 59 | } |
61 | 60 | ||
62 | /// <summary> | 61 | /// <summary> |
@@ -104,15 +103,6 @@ namespace OpenSim.Framework | |||
104 | set { m_from = value; } | 103 | set { m_from = value; } |
105 | } | 104 | } |
106 | 105 | ||
107 | /// <summary> | ||
108 | /// The name of the sender (needed for scripts) | ||
109 | /// </summary> | ||
110 | public string To | ||
111 | { | ||
112 | get { return m_from; } | ||
113 | set { m_from = value; } | ||
114 | } | ||
115 | |||
116 | #region IEventArgs Members | 106 | #region IEventArgs Members |
117 | 107 | ||
118 | /// TODO: Sender and SenderObject should just be Sender and of | 108 | /// TODO: Sender and SenderObject should just be Sender and of |
@@ -142,13 +132,10 @@ namespace OpenSim.Framework | |||
142 | set { m_fromID = value; } | 132 | set { m_fromID = value; } |
143 | } | 133 | } |
144 | 134 | ||
145 | /// <summary> | 135 | public UUID Destination |
146 | /// The single recipient or all if not set. | ||
147 | /// </summary> | ||
148 | public UUID TargetUUID | ||
149 | { | 136 | { |
150 | get { return m_toID; } | 137 | get { return m_destination; } |
151 | set { m_toID = value; } | 138 | set { m_destination = value; } |
152 | } | 139 | } |
153 | 140 | ||
154 | /// <summary> | 141 | /// <summary> |
diff --git a/OpenSim/Framework/ObjectChangeData.cs b/OpenSim/Framework/ObjectChangeData.cs new file mode 100644 index 0000000..8d56291 --- /dev/null +++ b/OpenSim/Framework/ObjectChangeData.cs | |||
@@ -0,0 +1,80 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using OpenMetaverse; | ||
29 | |||
30 | namespace OpenSim.Framework | ||
31 | { | ||
32 | public enum ObjectChangeType : uint | ||
33 | { | ||
34 | // bits definitions | ||
35 | Position = 0x01, | ||
36 | Rotation = 0x02, | ||
37 | Scale = 0x04, | ||
38 | Group = 0x08, | ||
39 | UniformScale = 0x10, | ||
40 | |||
41 | // macros from above | ||
42 | // single prim | ||
43 | primP = 0x01, | ||
44 | primR = 0x02, | ||
45 | primPR = 0x03, | ||
46 | primS = 0x04, | ||
47 | primPS = 0x05, | ||
48 | primRS = 0x06, | ||
49 | primPSR = 0x07, | ||
50 | |||
51 | primUS = 0x14, | ||
52 | primPUS = 0x15, | ||
53 | primRUS = 0x16, | ||
54 | primPUSR = 0x17, | ||
55 | |||
56 | // group | ||
57 | groupP = 0x09, | ||
58 | groupR = 0x0A, | ||
59 | groupPR = 0x0B, | ||
60 | groupS = 0x0C, | ||
61 | groupPS = 0x0D, | ||
62 | groupRS = 0x0E, | ||
63 | groupPSR = 0x0F, | ||
64 | |||
65 | groupUS = 0x1C, | ||
66 | groupPUS = 0x1D, | ||
67 | groupRUS = 0x1E, | ||
68 | groupPUSR = 0x1F, | ||
69 | |||
70 | PRSmask = 0x07 | ||
71 | } | ||
72 | |||
73 | public struct ObjectChangeData | ||
74 | { | ||
75 | public Quaternion rotation; | ||
76 | public Vector3 position; | ||
77 | public Vector3 scale; | ||
78 | public ObjectChangeType change; | ||
79 | } | ||
80 | } | ||
diff --git a/OpenSim/Framework/OutboundUrlFilter.cs b/OpenSim/Framework/OutboundUrlFilter.cs index baa3647..63ae361 100644 --- a/OpenSim/Framework/OutboundUrlFilter.cs +++ b/OpenSim/Framework/OutboundUrlFilter.cs | |||
@@ -49,8 +49,8 @@ namespace OpenSim.Framework | |||
49 | private List<IPEndPoint> m_blacklistExceptionEndPoints; | 49 | private List<IPEndPoint> m_blacklistExceptionEndPoints; |
50 | 50 | ||
51 | public OutboundUrlFilter( | 51 | public OutboundUrlFilter( |
52 | string name, | 52 | string name, |
53 | List<IPNetwork> blacklistNetworks, List<IPEndPoint> blacklistEndPoints, | 53 | List<IPNetwork> blacklistNetworks, List<IPEndPoint> blacklistEndPoints, |
54 | List<IPNetwork> blacklistExceptionNetworks, List<IPEndPoint> blacklistExceptionEndPoints) | 54 | List<IPNetwork> blacklistExceptionNetworks, List<IPEndPoint> blacklistExceptionEndPoints) |
55 | { | 55 | { |
56 | Name = name; | 56 | Name = name; |
@@ -79,7 +79,7 @@ namespace OpenSim.Framework | |||
79 | if (networkConfig != null) | 79 | if (networkConfig != null) |
80 | { | 80 | { |
81 | configBlacklist = networkConfig.GetString("OutboundDisallowForUserScripts", configBlacklist); | 81 | configBlacklist = networkConfig.GetString("OutboundDisallowForUserScripts", configBlacklist); |
82 | configBlacklistExceptions | 82 | configBlacklistExceptions |
83 | = networkConfig.GetString("OutboundDisallowForUserScriptsExcept", configBlacklistExceptions); | 83 | = networkConfig.GetString("OutboundDisallowForUserScriptsExcept", configBlacklistExceptions); |
84 | } | 84 | } |
85 | 85 | ||
@@ -98,7 +98,7 @@ namespace OpenSim.Framework | |||
98 | string fullConfigEntry, string filterName, out List<IPNetwork> networks, out List<IPEndPoint> endPoints) | 98 | string fullConfigEntry, string filterName, out List<IPNetwork> networks, out List<IPEndPoint> endPoints) |
99 | { | 99 | { |
100 | // Parse blacklist | 100 | // Parse blacklist |
101 | string[] configBlacklistEntries | 101 | string[] configBlacklistEntries |
102 | = fullConfigEntry.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); | 102 | = fullConfigEntry.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); |
103 | 103 | ||
104 | configBlacklistEntries = configBlacklistEntries.Select(e => e.Trim()).ToArray(); | 104 | configBlacklistEntries = configBlacklistEntries.Select(e => e.Trim()).ToArray(); |
@@ -129,7 +129,7 @@ namespace OpenSim.Framework | |||
129 | if (!Uri.TryCreate("http://" + configEntry, UriKind.Absolute, out configEntryUri)) | 129 | if (!Uri.TryCreate("http://" + configEntry, UriKind.Absolute, out configEntryUri)) |
130 | { | 130 | { |
131 | m_log.ErrorFormat( | 131 | m_log.ErrorFormat( |
132 | "[OUTBOUND URL FILTER]: EndPoint entry [{0}] is invalid endpoint for {1}", | 132 | "[OUTBOUND URL FILTER]: EndPoint entry [{0}] is invalid endpoint for {1}", |
133 | configEntry, filterName); | 133 | configEntry, filterName); |
134 | 134 | ||
135 | continue; | 135 | continue; |
@@ -184,14 +184,14 @@ namespace OpenSim.Framework | |||
184 | foreach (IPEndPoint ep in endPoints) | 184 | foreach (IPEndPoint ep in endPoints) |
185 | { | 185 | { |
186 | // m_log.DebugFormat( | 186 | // m_log.DebugFormat( |
187 | // "[OUTBOUND URL FILTER]: Checking [{0}:{1}] against endpoint [{2}]", | 187 | // "[OUTBOUND URL FILTER]: Checking [{0}:{1}] against endpoint [{2}]", |
188 | // addr, port, ep); | 188 | // addr, port, ep); |
189 | 189 | ||
190 | if (addr.Equals(ep.Address) && port == ep.Port) | 190 | if (addr.Equals(ep.Address) && port == ep.Port) |
191 | { | 191 | { |
192 | // m_log.DebugFormat( | 192 | // m_log.DebugFormat( |
193 | // "[OUTBOUND URL FILTER]: Found [{0}:{1}] in endpoint [{2}]", addr, port, ep); | 193 | // "[OUTBOUND URL FILTER]: Found [{0}:{1}] in endpoint [{2}]", addr, port, ep); |
194 | 194 | ||
195 | return true; | 195 | return true; |
196 | } | 196 | } |
197 | } | 197 | } |
@@ -212,7 +212,17 @@ namespace OpenSim.Framework | |||
212 | // Check that we are permitted to make calls to this endpoint. | 212 | // Check that we are permitted to make calls to this endpoint. |
213 | bool foundIpv4Address = false; | 213 | bool foundIpv4Address = false; |
214 | 214 | ||
215 | IPAddress[] addresses = Dns.GetHostAddresses(url.Host); | 215 | IPAddress[] addresses = null; |
216 | |||
217 | try | ||
218 | { | ||
219 | addresses = Dns.GetHostAddresses(url.Host); | ||
220 | } | ||
221 | catch | ||
222 | { | ||
223 | // If there is a DNS error, we can't stop the script! | ||
224 | return true; | ||
225 | } | ||
216 | 226 | ||
217 | foreach (IPAddress addr in addresses) | 227 | foreach (IPAddress addr in addresses) |
218 | { | 228 | { |
@@ -228,7 +238,7 @@ namespace OpenSim.Framework | |||
228 | // m_log.DebugFormat("[OUTBOUND URL FILTER]: Found [{0}] in blacklist for {1}", url, Name); | 238 | // m_log.DebugFormat("[OUTBOUND URL FILTER]: Found [{0}] in blacklist for {1}", url, Name); |
229 | 239 | ||
230 | // Check blacklist exceptions | 240 | // Check blacklist exceptions |
231 | allowed | 241 | allowed |
232 | = OutboundUrlFilter.IsInNetwork( | 242 | = OutboundUrlFilter.IsInNetwork( |
233 | addr, url.Port, m_blacklistExceptionNetworks, m_blacklistExceptionEndPoints, Name); | 243 | addr, url.Port, m_blacklistExceptionNetworks, m_blacklistExceptionEndPoints, Name); |
234 | 244 | ||
@@ -253,4 +263,4 @@ namespace OpenSim.Framework | |||
253 | return allowed; | 263 | return allowed; |
254 | } | 264 | } |
255 | } | 265 | } |
256 | } \ No newline at end of file | 266 | } |
diff --git a/OpenSim/Framework/ParcelMediaCommandEnum.cs b/OpenSim/Framework/ParcelMediaCommandEnum.cs index 93c41ec..e714382 100644 --- a/OpenSim/Framework/ParcelMediaCommandEnum.cs +++ b/OpenSim/Framework/ParcelMediaCommandEnum.cs | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | namespace OpenSim.Framework | 28 | namespace OpenSim.Framework |
29 | { | 29 | { |
30 | public enum ParcelMediaCommandEnum | 30 | public enum ParcelMediaCommandEnum : int |
31 | { | 31 | { |
32 | Stop = 0, | 32 | Stop = 0, |
33 | Pause = 1, | 33 | Pause = 1, |
diff --git a/OpenSim/Framework/PermissionsUtil.cs b/OpenSim/Framework/PermissionsUtil.cs index d785a78..e50d4df 100644 --- a/OpenSim/Framework/PermissionsUtil.cs +++ b/OpenSim/Framework/PermissionsUtil.cs | |||
@@ -60,28 +60,57 @@ namespace OpenSim.Framework | |||
60 | str += "C"; | 60 | str += "C"; |
61 | if ((perms & (int)PermissionMask.Transfer) != 0) | 61 | if ((perms & (int)PermissionMask.Transfer) != 0) |
62 | str += "T"; | 62 | str += "T"; |
63 | if ((perms & (int)PermissionMask.Export) != 0) | ||
64 | str += "X"; | ||
63 | if (str == "") | 65 | if (str == "") |
64 | str = "."; | 66 | str = "."; |
65 | return str; | 67 | return str; |
66 | } | 68 | } |
67 | 69 | ||
68 | /// <summary> | 70 | public static void ApplyFoldedPermissions(uint foldedSourcePerms, ref uint targetPerms) |
69 | /// Applies an object's folded permissions to its regular permissions. | 71 | { |
70 | /// </summary> | 72 | uint folded = foldedSourcePerms & (uint)PermissionMask.FoldedMask; |
71 | /// <param name="foldedPerms">The folded permissions. Only the lowest 7 bits are examined.</param> | 73 | if(folded == 0 || folded == (uint)PermissionMask.FoldedMask) // invalid we need to ignore, or nothing to do |
72 | /// <param name="mainPerms">The permissions variable to modify.</param> | 74 | return; |
73 | public static void ApplyFoldedPermissions(uint foldedPerms, ref uint mainPerms) | 75 | |
76 | folded <<= (int)PermissionMask.FoldingShift; | ||
77 | folded |= ~(uint)PermissionMask.UnfoldedMask; | ||
78 | |||
79 | uint tmp = targetPerms; | ||
80 | tmp &= folded; | ||
81 | targetPerms = tmp; | ||
82 | } | ||
83 | |||
84 | // do not touch MOD | ||
85 | public static void ApplyNoModFoldedPermissions(uint foldedSourcePerms, ref uint target) | ||
74 | { | 86 | { |
75 | if ((foldedPerms & 7) == 0) | 87 | uint folded = foldedSourcePerms & (uint)PermissionMask.FoldedMask; |
76 | return; // assume that if the folded permissions are 0 then this means that they weren't actually recorded | 88 | if(folded == 0 || folded == (uint)PermissionMask.FoldedMask) // invalid we need to ignore, or nothing to do |
89 | return; | ||
77 | 90 | ||
78 | if ((foldedPerms & ((uint)PermissionMask.Copy >> 13)) == 0) | 91 | folded <<= (int)PermissionMask.FoldingShift; |
79 | mainPerms &= ~(uint)PermissionMask.Copy; | 92 | folded |= (~(uint)PermissionMask.UnfoldedMask | (uint)PermissionMask.Modify); |
80 | if ((foldedPerms & ((uint)PermissionMask.Transfer >> 13)) == 0) | 93 | |
81 | mainPerms &= ~(uint)PermissionMask.Transfer; | 94 | uint tmp = target; |
82 | if ((foldedPerms & ((uint)PermissionMask.Modify >> 13)) == 0) | 95 | tmp &= folded; |
83 | mainPerms &= ~(uint)PermissionMask.Modify; | 96 | target = tmp; |
84 | } | 97 | } |
85 | 98 | ||
99 | public static uint FixAndFoldPermissions(uint perms) | ||
100 | { | ||
101 | uint tmp = perms; | ||
102 | |||
103 | // C & T rule | ||
104 | if((tmp & (uint)(PermissionMask.Copy | PermissionMask.Transfer)) == 0) | ||
105 | tmp |= (uint)PermissionMask.Transfer; | ||
106 | |||
107 | // unlock | ||
108 | tmp |= (uint)PermissionMask.Move; | ||
109 | |||
110 | tmp &= ~(uint)PermissionMask.FoldedMask; | ||
111 | tmp |= ((tmp >> (int)PermissionMask.FoldingShift) & (uint)PermissionMask.FoldedMask); | ||
112 | |||
113 | return tmp; | ||
114 | } | ||
86 | } | 115 | } |
87 | } | 116 | } |
diff --git a/OpenSim/Framework/PhysicsInertia.cs b/OpenSim/Framework/PhysicsInertia.cs new file mode 100644 index 0000000..fa83de8 --- /dev/null +++ b/OpenSim/Framework/PhysicsInertia.cs | |||
@@ -0,0 +1,263 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using OpenMetaverse; | ||
31 | using System.Text; | ||
32 | using System.IO; | ||
33 | using System.Xml; | ||
34 | |||
35 | namespace OpenSim.Framework | ||
36 | { | ||
37 | public class PhysicsInertiaData | ||
38 | { | ||
39 | public float TotalMass; // the total mass of a linkset | ||
40 | public Vector3 CenterOfMass; // the center of mass position relative to root part position | ||
41 | public Vector3 Inertia; // (Ixx, Iyy, Izz) moment of inertia relative to center of mass and principal axis in local coords | ||
42 | public Vector4 InertiaRotation; // if principal axis don't match local axis, the principal axis rotation | ||
43 | // or the upper triangle of the inertia tensor | ||
44 | // Ixy (= Iyx), Ixz (= Izx), Iyz (= Izy)) | ||
45 | |||
46 | public PhysicsInertiaData() | ||
47 | { | ||
48 | } | ||
49 | |||
50 | public PhysicsInertiaData(PhysicsInertiaData source) | ||
51 | { | ||
52 | TotalMass = source.TotalMass; | ||
53 | CenterOfMass = source.CenterOfMass; | ||
54 | Inertia = source.Inertia; | ||
55 | InertiaRotation = source.InertiaRotation; | ||
56 | } | ||
57 | |||
58 | private XmlTextWriter writer; | ||
59 | |||
60 | private void XWint(string name, int i) | ||
61 | { | ||
62 | writer.WriteElementString(name, i.ToString()); | ||
63 | } | ||
64 | |||
65 | private void XWfloat(string name, float f) | ||
66 | { | ||
67 | writer.WriteElementString(name, f.ToString(Culture.FormatProvider)); | ||
68 | } | ||
69 | |||
70 | private void XWVector(string name, Vector3 vec) | ||
71 | { | ||
72 | writer.WriteStartElement(name); | ||
73 | writer.WriteElementString("X", vec.X.ToString(Culture.FormatProvider)); | ||
74 | writer.WriteElementString("Y", vec.Y.ToString(Culture.FormatProvider)); | ||
75 | writer.WriteElementString("Z", vec.Z.ToString(Culture.FormatProvider)); | ||
76 | writer.WriteEndElement(); | ||
77 | } | ||
78 | |||
79 | private void XWVector4(string name, Vector4 quat) | ||
80 | { | ||
81 | writer.WriteStartElement(name); | ||
82 | writer.WriteElementString("X", quat.X.ToString(Culture.FormatProvider)); | ||
83 | writer.WriteElementString("Y", quat.Y.ToString(Culture.FormatProvider)); | ||
84 | writer.WriteElementString("Z", quat.Z.ToString(Culture.FormatProvider)); | ||
85 | writer.WriteElementString("W", quat.W.ToString(Culture.FormatProvider)); | ||
86 | writer.WriteEndElement(); | ||
87 | } | ||
88 | |||
89 | public void ToXml2(XmlTextWriter twriter) | ||
90 | { | ||
91 | writer = twriter; | ||
92 | writer.WriteStartElement("PhysicsInertia"); | ||
93 | |||
94 | XWfloat("MASS", TotalMass); | ||
95 | XWVector("CM", CenterOfMass); | ||
96 | XWVector("INERTIA", Inertia); | ||
97 | XWVector4("IROT", InertiaRotation); | ||
98 | |||
99 | writer.WriteEndElement(); | ||
100 | writer = null; | ||
101 | } | ||
102 | |||
103 | XmlReader reader; | ||
104 | |||
105 | private int XRint() | ||
106 | { | ||
107 | return reader.ReadElementContentAsInt(); | ||
108 | } | ||
109 | |||
110 | private float XRfloat() | ||
111 | { | ||
112 | return reader.ReadElementContentAsFloat(); | ||
113 | } | ||
114 | |||
115 | public Vector3 XRvector() | ||
116 | { | ||
117 | Vector3 vec; | ||
118 | reader.ReadStartElement(); | ||
119 | vec.X = reader.ReadElementContentAsFloat(); | ||
120 | vec.Y = reader.ReadElementContentAsFloat(); | ||
121 | vec.Z = reader.ReadElementContentAsFloat(); | ||
122 | reader.ReadEndElement(); | ||
123 | return vec; | ||
124 | } | ||
125 | |||
126 | public Vector4 XRVector4() | ||
127 | { | ||
128 | Vector4 q; | ||
129 | reader.ReadStartElement(); | ||
130 | q.X = reader.ReadElementContentAsFloat(); | ||
131 | q.Y = reader.ReadElementContentAsFloat(); | ||
132 | q.Z = reader.ReadElementContentAsFloat(); | ||
133 | q.W = reader.ReadElementContentAsFloat(); | ||
134 | reader.ReadEndElement(); | ||
135 | return q; | ||
136 | } | ||
137 | |||
138 | public static bool EReadProcessors( | ||
139 | Dictionary<string, Action> processors, | ||
140 | XmlReader xtr) | ||
141 | { | ||
142 | bool errors = false; | ||
143 | |||
144 | string nodeName = string.Empty; | ||
145 | while (xtr.NodeType != XmlNodeType.EndElement) | ||
146 | { | ||
147 | nodeName = xtr.Name; | ||
148 | |||
149 | Action p = null; | ||
150 | if (processors.TryGetValue(xtr.Name, out p)) | ||
151 | { | ||
152 | try | ||
153 | { | ||
154 | p(); | ||
155 | } | ||
156 | catch | ||
157 | { | ||
158 | errors = true; | ||
159 | if (xtr.NodeType == XmlNodeType.EndElement) | ||
160 | xtr.Read(); | ||
161 | } | ||
162 | } | ||
163 | else | ||
164 | { | ||
165 | xtr.ReadOuterXml(); // ignore | ||
166 | } | ||
167 | } | ||
168 | |||
169 | return errors; | ||
170 | } | ||
171 | |||
172 | public string ToXml2() | ||
173 | { | ||
174 | using (StringWriter sw = new StringWriter()) | ||
175 | { | ||
176 | using (XmlTextWriter xwriter = new XmlTextWriter(sw)) | ||
177 | { | ||
178 | ToXml2(xwriter); | ||
179 | } | ||
180 | |||
181 | return sw.ToString(); | ||
182 | } | ||
183 | } | ||
184 | |||
185 | public static PhysicsInertiaData FromXml2(string text) | ||
186 | { | ||
187 | if (text == String.Empty) | ||
188 | return null; | ||
189 | |||
190 | bool error; | ||
191 | PhysicsInertiaData v; | ||
192 | UTF8Encoding enc = new UTF8Encoding(); | ||
193 | using(MemoryStream ms = new MemoryStream(enc.GetBytes(text))) | ||
194 | using(XmlTextReader xreader = new XmlTextReader(ms)) | ||
195 | { | ||
196 | xreader.ProhibitDtd = true; | ||
197 | |||
198 | v = new PhysicsInertiaData(); | ||
199 | v.FromXml2(xreader, out error); | ||
200 | } | ||
201 | |||
202 | if (error) | ||
203 | return null; | ||
204 | |||
205 | return v; | ||
206 | } | ||
207 | |||
208 | public static PhysicsInertiaData FromXml2(XmlReader reader) | ||
209 | { | ||
210 | PhysicsInertiaData data = new PhysicsInertiaData(); | ||
211 | |||
212 | bool errors = false; | ||
213 | |||
214 | data.FromXml2(reader, out errors); | ||
215 | if (errors) | ||
216 | return null; | ||
217 | |||
218 | return data; | ||
219 | } | ||
220 | |||
221 | private void FromXml2(XmlReader _reader, out bool errors) | ||
222 | { | ||
223 | errors = false; | ||
224 | reader = _reader; | ||
225 | |||
226 | Dictionary<string, Action> m_XmlProcessors = new Dictionary<string, Action>(); | ||
227 | |||
228 | m_XmlProcessors.Add("MASS", ProcessXR_Mass); | ||
229 | m_XmlProcessors.Add("CM", ProcessXR_CM); | ||
230 | m_XmlProcessors.Add("INERTIA", ProcessXR_Inertia); | ||
231 | m_XmlProcessors.Add("IROT", ProcessXR_InertiaRotation); | ||
232 | |||
233 | reader.ReadStartElement("PhysicsInertia", String.Empty); | ||
234 | |||
235 | errors = EReadProcessors( | ||
236 | m_XmlProcessors, | ||
237 | reader); | ||
238 | |||
239 | reader.ReadEndElement(); | ||
240 | reader = null; | ||
241 | } | ||
242 | |||
243 | private void ProcessXR_Mass() | ||
244 | { | ||
245 | TotalMass = XRfloat(); | ||
246 | } | ||
247 | |||
248 | private void ProcessXR_CM() | ||
249 | { | ||
250 | CenterOfMass = XRvector(); | ||
251 | } | ||
252 | |||
253 | private void ProcessXR_Inertia() | ||
254 | { | ||
255 | Inertia = XRvector(); | ||
256 | } | ||
257 | |||
258 | private void ProcessXR_InertiaRotation() | ||
259 | { | ||
260 | InertiaRotation = XRVector4(); | ||
261 | } | ||
262 | } | ||
263 | } | ||
diff --git a/OpenSim/Framework/PluginLoader.cs b/OpenSim/Framework/PluginLoader.cs index d12aa61..1e5e8bf 100644 --- a/OpenSim/Framework/PluginLoader.cs +++ b/OpenSim/Framework/PluginLoader.cs | |||
@@ -245,13 +245,22 @@ namespace OpenSim.Framework | |||
245 | // occasionally seems to corrupt its addin cache | 245 | // occasionally seems to corrupt its addin cache |
246 | // Hence, as a temporary solution we'll remove it before each startup | 246 | // Hence, as a temporary solution we'll remove it before each startup |
247 | 247 | ||
248 | string customDir = Environment.GetEnvironmentVariable ("MONO_ADDINS_REGISTRY"); | ||
249 | string v0 = "addin-db-000"; | ||
250 | string v1 = "addin-db-001"; | ||
251 | if (customDir != null && customDir != String.Empty) | ||
252 | { | ||
253 | v0 = Path.Combine(customDir, v0); | ||
254 | v1 = Path.Combine(customDir, v1); | ||
255 | } | ||
248 | try | 256 | try |
249 | { | 257 | { |
250 | if (Directory.Exists(dir + "/addin-db-000")) | 258 | if (Directory.Exists(v0)) |
251 | Directory.Delete(dir + "/addin-db-000", true); | 259 | Directory.Delete(v0, true); |
260 | |||
261 | if (Directory.Exists(v1)) | ||
262 | Directory.Delete(v1, true); | ||
252 | 263 | ||
253 | if (Directory.Exists(dir + "/addin-db-001")) | ||
254 | Directory.Delete(dir + "/addin-db-001", true); | ||
255 | } | 264 | } |
256 | catch (IOException) | 265 | catch (IOException) |
257 | { | 266 | { |
diff --git a/OpenSim/Framework/PluginManager.cs b/OpenSim/Framework/PluginManager.cs index 0117096..0c94fcb 100644 --- a/OpenSim/Framework/PluginManager.cs +++ b/OpenSim/Framework/PluginManager.cs | |||
@@ -44,17 +44,17 @@ namespace OpenSim.Framework | |||
44 | /// <summary> | 44 | /// <summary> |
45 | /// Manager for registries and plugins | 45 | /// Manager for registries and plugins |
46 | /// </summary> | 46 | /// </summary> |
47 | public class PluginManager : SetupService | 47 | public class PluginManager : SetupService |
48 | { | 48 | { |
49 | public AddinRegistry PluginRegistry; | 49 | public AddinRegistry PluginRegistry; |
50 | 50 | ||
51 | public PluginManager(AddinRegistry registry): base (registry) | 51 | public PluginManager(AddinRegistry registry): base (registry) |
52 | { | 52 | { |
53 | PluginRegistry = registry; | 53 | PluginRegistry = registry; |
54 | 54 | ||
55 | } | 55 | } |
56 | 56 | ||
57 | /// <summary> | 57 | /// <summary> |
58 | /// Installs the plugin. | 58 | /// Installs the plugin. |
59 | /// </summary> | 59 | /// </summary> |
60 | /// <returns> | 60 | /// <returns> |
@@ -97,14 +97,14 @@ namespace OpenSim.Framework | |||
97 | Addin addin = PluginRegistry.GetAddin(aentry.Addin.Id); | 97 | Addin addin = PluginRegistry.GetAddin(aentry.Addin.Id); |
98 | PluginRegistry.DisableAddin(addin.Id); | 98 | PluginRegistry.DisableAddin(addin.Id); |
99 | addin.Enabled = false; | 99 | addin.Enabled = false; |
100 | 100 | ||
101 | MainConsole.Instance.Output("Installation Success"); | 101 | MainConsole.Instance.Output("Installation Success"); |
102 | ListInstalledAddins(out res); | 102 | ListInstalledAddins(out res); |
103 | result = res; | 103 | result = res; |
104 | return true; | 104 | return true; |
105 | } | 105 | } |
106 | else | 106 | else |
107 | { | 107 | { |
108 | MainConsole.Instance.Output("Installation Failed"); | 108 | MainConsole.Instance.Output("Installation Failed"); |
109 | result = res; | 109 | result = res; |
110 | return false; | 110 | return false; |
@@ -159,11 +159,11 @@ namespace OpenSim.Framework | |||
159 | { | 159 | { |
160 | Dictionary<string, object> res = new Dictionary<string, object>(); | 160 | Dictionary<string, object> res = new Dictionary<string, object>(); |
161 | 161 | ||
162 | Addin[] addins = GetSortedAddinList("RobustPlugin"); | 162 | Addin[] addins = GetSortedAddinList("RobustPlugin"); |
163 | if(addins.Count() < 1) | 163 | if(addins.Count() < 1) |
164 | { | 164 | { |
165 | MainConsole.Instance.Output("Error!"); | 165 | MainConsole.Instance.Output("Error!"); |
166 | } | 166 | } |
167 | int count = 0; | 167 | int count = 0; |
168 | foreach (Addin addin in addins) | 168 | foreach (Addin addin in addins) |
169 | { | 169 | { |
@@ -377,7 +377,7 @@ namespace OpenSim.Framework | |||
377 | r["enabled"] = rep.Enabled == true ? true : false; | 377 | r["enabled"] = rep.Enabled == true ? true : false; |
378 | r["name"] = rep.Name; | 378 | r["name"] = rep.Name; |
379 | r["url"] = rep.Url; | 379 | r["url"] = rep.Url; |
380 | 380 | ||
381 | res.Add(count.ToString(), r); | 381 | res.Add(count.ToString(), r); |
382 | count++; | 382 | count++; |
383 | } | 383 | } |
@@ -493,7 +493,7 @@ namespace OpenSim.Framework | |||
493 | } | 493 | } |
494 | 494 | ||
495 | 495 | ||
496 | 496 | ||
497 | #region Util | 497 | #region Util |
498 | private void Testing() | 498 | private void Testing() |
499 | { | 499 | { |
@@ -537,15 +537,15 @@ namespace OpenSim.Framework | |||
537 | 537 | ||
538 | ArrayList xlist = new ArrayList(); | 538 | ArrayList xlist = new ArrayList(); |
539 | ArrayList list = new ArrayList(); | 539 | ArrayList list = new ArrayList(); |
540 | try | 540 | try |
541 | { | 541 | { |
542 | list.AddRange(PluginRegistry.GetAddins()); | 542 | list.AddRange(PluginRegistry.GetAddins()); |
543 | } | 543 | } |
544 | catch (Exception) | 544 | catch (Exception) |
545 | { | 545 | { |
546 | Addin[] x = xlist.ToArray(typeof(Addin)) as Addin[]; | 546 | Addin[] x = xlist.ToArray(typeof(Addin)) as Addin[]; |
547 | return x; | 547 | return x; |
548 | } | 548 | } |
549 | 549 | ||
550 | foreach (Addin addin in list) | 550 | foreach (Addin addin in list) |
551 | { | 551 | { |
@@ -559,5 +559,5 @@ namespace OpenSim.Framework | |||
559 | return addins; | 559 | return addins; |
560 | } | 560 | } |
561 | #endregion Util | 561 | #endregion Util |
562 | } | 562 | } |
563 | } | 563 | } |
diff --git a/OpenSim/Framework/PrimeNumberHelper.cs b/OpenSim/Framework/PrimeNumberHelper.cs index 477c274..5a1b3b2 100644 --- a/OpenSim/Framework/PrimeNumberHelper.cs +++ b/OpenSim/Framework/PrimeNumberHelper.cs | |||
@@ -35,7 +35,7 @@ namespace OpenSim.Framework | |||
35 | public static class PrimeNumberHelper | 35 | public static class PrimeNumberHelper |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// Precalculated prime numbers. | 38 | /// Precalculated prime numbers. |
39 | /// </summary> | 39 | /// </summary> |
40 | private static readonly int[] Primes = new int[] | 40 | private static readonly int[] Primes = new int[] |
41 | { | 41 | { |
diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index c8a5376..6e7a038 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs | |||
@@ -238,8 +238,8 @@ namespace OpenSim.Framework | |||
238 | SculptTexture = prim.Sculpt.SculptTexture; | 238 | SculptTexture = prim.Sculpt.SculptTexture; |
239 | SculptType = (byte)prim.Sculpt.Type; | 239 | SculptType = (byte)prim.Sculpt.Type; |
240 | } | 240 | } |
241 | else | 241 | else |
242 | { | 242 | { |
243 | SculptType = (byte)OpenMetaverse.SculptType.None; | 243 | SculptType = (byte)OpenMetaverse.SculptType.None; |
244 | } | 244 | } |
245 | } | 245 | } |
@@ -328,6 +328,72 @@ namespace OpenSim.Framework | |||
328 | return shape; | 328 | return shape; |
329 | } | 329 | } |
330 | 330 | ||
331 | public static PrimitiveBaseShape CreateMesh(int numberOfFaces, UUID meshAssetID) | ||
332 | { | ||
333 | PrimitiveBaseShape shape = new PrimitiveBaseShape(); | ||
334 | |||
335 | shape._pathScaleX = 100; | ||
336 | shape._pathScaleY = 100; | ||
337 | |||
338 | if(numberOfFaces <= 0) // oops ? | ||
339 | numberOfFaces = 1; | ||
340 | |||
341 | switch(numberOfFaces) | ||
342 | { | ||
343 | case 1: // torus | ||
344 | shape.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
345 | shape.PathCurve = (byte)Extrusion.Curve1; | ||
346 | shape._pathScaleY = 150; | ||
347 | break; | ||
348 | |||
349 | case 2: // torus with hollow (a sl viewer whould see 4 faces on a hollow sphere) | ||
350 | shape.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
351 | shape.PathCurve = (byte)Extrusion.Curve1; | ||
352 | shape.ProfileHollow = 27500; | ||
353 | shape._pathScaleY = 150; | ||
354 | break; | ||
355 | |||
356 | case 3: // cylinder | ||
357 | shape.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
358 | shape.PathCurve = (byte)Extrusion.Straight; | ||
359 | break; | ||
360 | |||
361 | case 4: // cylinder with hollow | ||
362 | shape.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
363 | shape.PathCurve = (byte)Extrusion.Straight; | ||
364 | shape.ProfileHollow = 27500; | ||
365 | break; | ||
366 | |||
367 | case 5: // prism | ||
368 | shape.ProfileCurve = (byte)ProfileShape.EquilateralTriangle | (byte)HollowShape.Triangle; | ||
369 | shape.PathCurve = (byte)Extrusion.Straight; | ||
370 | break; | ||
371 | |||
372 | case 6: // box | ||
373 | shape.ProfileCurve = (byte)ProfileShape.Square | (byte)HollowShape.Triangle; | ||
374 | shape.PathCurve = (byte)Extrusion.Straight; | ||
375 | break; | ||
376 | |||
377 | case 7: // box with hollow | ||
378 | shape.ProfileCurve = (byte)ProfileShape.Square | (byte)HollowShape.Triangle; | ||
379 | shape.PathCurve = (byte)Extrusion.Straight; | ||
380 | shape.ProfileHollow = 27500; | ||
381 | break; | ||
382 | |||
383 | default: // 8 faces box with cut | ||
384 | shape.ProfileCurve = (byte)ProfileShape.Square | (byte)HollowShape.Triangle; | ||
385 | shape.PathCurve = (byte)Extrusion.Straight; | ||
386 | shape.ProfileBegin = 9375; | ||
387 | break; | ||
388 | } | ||
389 | |||
390 | shape.SculptEntry = true; | ||
391 | shape.SculptType = (byte)OpenMetaverse.SculptType.Mesh; | ||
392 | shape.SculptTexture = meshAssetID; | ||
393 | |||
394 | return shape; | ||
395 | } | ||
396 | |||
331 | public void SetScale(float side) | 397 | public void SetScale(float side) |
332 | { | 398 | { |
333 | _scale = new Vector3(side, side, side); | 399 | _scale = new Vector3(side, side, side); |
@@ -728,7 +794,12 @@ namespace OpenSim.Framework | |||
728 | return _lightColorR; | 794 | return _lightColorR; |
729 | } | 795 | } |
730 | set { | 796 | set { |
731 | _lightColorR = value; | 797 | if (value < 0) |
798 | _lightColorR = 0; | ||
799 | else if (value > 1.0f) | ||
800 | _lightColorR = 1.0f; | ||
801 | else | ||
802 | _lightColorR = value; | ||
732 | } | 803 | } |
733 | } | 804 | } |
734 | 805 | ||
@@ -737,7 +808,12 @@ namespace OpenSim.Framework | |||
737 | return _lightColorG; | 808 | return _lightColorG; |
738 | } | 809 | } |
739 | set { | 810 | set { |
740 | _lightColorG = value; | 811 | if (value < 0) |
812 | _lightColorG = 0; | ||
813 | else if (value > 1.0f) | ||
814 | _lightColorG = 1.0f; | ||
815 | else | ||
816 | _lightColorG = value; | ||
741 | } | 817 | } |
742 | } | 818 | } |
743 | 819 | ||
@@ -746,7 +822,12 @@ namespace OpenSim.Framework | |||
746 | return _lightColorB; | 822 | return _lightColorB; |
747 | } | 823 | } |
748 | set { | 824 | set { |
749 | _lightColorB = value; | 825 | if (value < 0) |
826 | _lightColorB = 0; | ||
827 | else if (value > 1.0f) | ||
828 | _lightColorB = 1.0f; | ||
829 | else | ||
830 | _lightColorB = value; | ||
750 | } | 831 | } |
751 | } | 832 | } |
752 | 833 | ||
@@ -755,7 +836,12 @@ namespace OpenSim.Framework | |||
755 | return _lightColorA; | 836 | return _lightColorA; |
756 | } | 837 | } |
757 | set { | 838 | set { |
758 | _lightColorA = value; | 839 | if (value < 0) |
840 | _lightColorA = 0; | ||
841 | else if (value > 1.0f) | ||
842 | _lightColorA = 1.0f; | ||
843 | else | ||
844 | _lightColorA = value; | ||
759 | } | 845 | } |
760 | } | 846 | } |
761 | 847 | ||
@@ -869,6 +955,11 @@ namespace OpenSim.Framework | |||
869 | 955 | ||
870 | public ulong GetMeshKey(Vector3 size, float lod) | 956 | public ulong GetMeshKey(Vector3 size, float lod) |
871 | { | 957 | { |
958 | return GetMeshKey(size, lod, false); | ||
959 | } | ||
960 | |||
961 | public ulong GetMeshKey(Vector3 size, float lod, bool convex) | ||
962 | { | ||
872 | ulong hash = 5381; | 963 | ulong hash = 5381; |
873 | 964 | ||
874 | hash = djb2(hash, this.PathCurve); | 965 | hash = djb2(hash, this.PathCurve); |
@@ -914,6 +1005,9 @@ namespace OpenSim.Framework | |||
914 | hash = djb2(hash, scaleBytes[i]); | 1005 | hash = djb2(hash, scaleBytes[i]); |
915 | } | 1006 | } |
916 | 1007 | ||
1008 | if(convex) | ||
1009 | hash = djb2(hash, 0xa5); | ||
1010 | |||
917 | return hash; | 1011 | return hash; |
918 | } | 1012 | } |
919 | 1013 | ||
@@ -1417,7 +1511,7 @@ namespace OpenSim.Framework | |||
1417 | prim.Textures = this.Textures; | 1511 | prim.Textures = this.Textures; |
1418 | 1512 | ||
1419 | prim.Properties = new Primitive.ObjectProperties(); | 1513 | prim.Properties = new Primitive.ObjectProperties(); |
1420 | prim.Properties.Name = "Primitive"; | 1514 | prim.Properties.Name = "Object"; |
1421 | prim.Properties.Description = ""; | 1515 | prim.Properties.Description = ""; |
1422 | prim.Properties.CreatorID = UUID.Zero; | 1516 | prim.Properties.CreatorID = UUID.Zero; |
1423 | prim.Properties.GroupID = UUID.Zero; | 1517 | prim.Properties.GroupID = UUID.Zero; |
@@ -1488,35 +1582,50 @@ namespace OpenSim.Framework | |||
1488 | { | 1582 | { |
1489 | MediaList ml = new MediaList(); | 1583 | MediaList ml = new MediaList(); |
1490 | ml.ReadXml(rawXml); | 1584 | ml.ReadXml(rawXml); |
1585 | if(ml.Count == 0) | ||
1586 | return null; | ||
1491 | return ml; | 1587 | return ml; |
1492 | } | 1588 | } |
1493 | 1589 | ||
1494 | public void ReadXml(string rawXml) | 1590 | public void ReadXml(string rawXml) |
1495 | { | 1591 | { |
1496 | using (StringReader sr = new StringReader(rawXml)) | 1592 | try |
1497 | { | 1593 | { |
1498 | using (XmlTextReader xtr = new XmlTextReader(sr)) | 1594 | using (StringReader sr = new StringReader(rawXml)) |
1499 | { | 1595 | { |
1500 | xtr.MoveToContent(); | 1596 | using (XmlTextReader xtr = new XmlTextReader(sr)) |
1597 | { | ||
1598 | xtr.ProhibitDtd = true; | ||
1501 | 1599 | ||
1502 | string type = xtr.GetAttribute("type"); | 1600 | xtr.MoveToContent(); |
1503 | //m_log.DebugFormat("[MOAP]: Loaded media texture entry with type {0}", type); | ||
1504 | 1601 | ||
1505 | if (type != MEDIA_TEXTURE_TYPE) | 1602 | string type = xtr.GetAttribute("type"); |
1506 | return; | 1603 | //m_log.DebugFormat("[MOAP]: Loaded media texture entry with type {0}", type); |
1507 | 1604 | ||
1508 | xtr.ReadStartElement("OSMedia"); | 1605 | if (type != MEDIA_TEXTURE_TYPE) |
1606 | return; | ||
1509 | 1607 | ||
1510 | OSDArray osdMeArray = (OSDArray)OSDParser.DeserializeLLSDXml(xtr.ReadInnerXml()); | 1608 | xtr.ReadStartElement("OSMedia"); |
1511 | foreach (OSD osdMe in osdMeArray) | 1609 | OSD osdp = OSDParser.DeserializeLLSDXml(xtr.ReadInnerXml()); |
1512 | { | 1610 | if(osdp == null || !(osdp is OSDArray)) |
1513 | MediaEntry me = (osdMe is OSDMap ? MediaEntry.FromOSD(osdMe) : new MediaEntry()); | 1611 | return; |
1514 | Add(me); | ||
1515 | } | ||
1516 | 1612 | ||
1517 | xtr.ReadEndElement(); | 1613 | OSDArray osdMeArray = osdp as OSDArray; |
1614 | if(osdMeArray.Count == 0) | ||
1615 | return; | ||
1616 | |||
1617 | foreach (OSD osdMe in osdMeArray) | ||
1618 | { | ||
1619 | MediaEntry me = (osdMe is OSDMap ? MediaEntry.FromOSD(osdMe) : new MediaEntry()); | ||
1620 | Add(me); | ||
1621 | } | ||
1622 | } | ||
1518 | } | 1623 | } |
1519 | } | 1624 | } |
1625 | catch | ||
1626 | { | ||
1627 | m_log.Debug("PrimitiveBaseShape] error decoding MOAP xml" ); | ||
1628 | } | ||
1520 | } | 1629 | } |
1521 | 1630 | ||
1522 | public void ReadXml(XmlReader reader) | 1631 | public void ReadXml(XmlReader reader) |
diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs index e7a7f7f..22ffcdc 100644 --- a/OpenSim/Framework/PriorityQueue.cs +++ b/OpenSim/Framework/PriorityQueue.cs | |||
@@ -45,7 +45,8 @@ namespace OpenSim.Framework | |||
45 | /// <summary> | 45 | /// <summary> |
46 | /// Total number of queues (priorities) available | 46 | /// Total number of queues (priorities) available |
47 | /// </summary> | 47 | /// </summary> |
48 | public const uint NumberOfQueues = 12; | 48 | |
49 | public const uint NumberOfQueues = 12; // includes immediate queues, m_queueCounts need to be set acording | ||
49 | 50 | ||
50 | /// <summary> | 51 | /// <summary> |
51 | /// Number of queuest (priorities) that are processed immediately | 52 | /// Number of queuest (priorities) that are processed immediately |
@@ -56,11 +57,14 @@ namespace OpenSim.Framework | |||
56 | private Dictionary<uint, LookupItem> m_lookupTable; | 57 | private Dictionary<uint, LookupItem> m_lookupTable; |
57 | 58 | ||
58 | // internal state used to ensure the deqeues are spread across the priority | 59 | // internal state used to ensure the deqeues are spread across the priority |
59 | // queues "fairly". queuecounts is the amount to pull from each queue in | 60 | // queues "fairly". queuecounts is the amount to pull from each queue in |
60 | // each pass. weighted towards the higher priority queues | 61 | // each pass. weighted towards the higher priority queues |
61 | private uint m_nextQueue = 0; | 62 | private uint m_nextQueue = 0; |
62 | private uint m_countFromQueue = 0; | 63 | private uint m_countFromQueue = 0; |
63 | private uint[] m_queueCounts = { 8, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1 }; | 64 | // first queues are imediate, so no counts |
65 | // private uint[] m_queueCounts = { 0, 0, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1 }; | ||
66 | private uint[] m_queueCounts = {0, 0, 8, 8, 5, 4, 3, 2, 1, 1, 1, 1}; | ||
67 | // this is ava, ava, attach, <10m, 20,40,80,160m,320,640,1280, + | ||
64 | 68 | ||
65 | // next request is a counter of the number of updates queued, it provides | 69 | // next request is a counter of the number of updates queued, it provides |
66 | // a total ordering on the updates coming through the queue and is more | 70 | // a total ordering on the updates coming through the queue and is more |
@@ -101,7 +105,7 @@ namespace OpenSim.Framework | |||
101 | int count = 0; | 105 | int count = 0; |
102 | for (int i = 0; i < m_heaps.Length; ++i) | 106 | for (int i = 0; i < m_heaps.Length; ++i) |
103 | count += m_heaps[i].Count; | 107 | count += m_heaps[i].Count; |
104 | 108 | ||
105 | return count; | 109 | return count; |
106 | } | 110 | } |
107 | } | 111 | } |
@@ -109,7 +113,7 @@ namespace OpenSim.Framework | |||
109 | /// <summary> | 113 | /// <summary> |
110 | /// Enqueue an item into the specified priority queue | 114 | /// Enqueue an item into the specified priority queue |
111 | /// </summary> | 115 | /// </summary> |
112 | public bool Enqueue(uint pqueue, IEntityUpdate value) | 116 | public bool Enqueue(uint pqueue, EntityUpdate value) |
113 | { | 117 | { |
114 | LookupItem lookup; | 118 | LookupItem lookup; |
115 | 119 | ||
@@ -130,14 +134,29 @@ namespace OpenSim.Framework | |||
130 | return true; | 134 | return true; |
131 | } | 135 | } |
132 | 136 | ||
137 | |||
138 | public void Remove(List<uint> ids) | ||
139 | { | ||
140 | LookupItem lookup; | ||
141 | |||
142 | foreach (uint localid in ids) | ||
143 | { | ||
144 | if (m_lookupTable.TryGetValue(localid, out lookup)) | ||
145 | { | ||
146 | lookup.Heap.Remove(lookup.Handle); | ||
147 | m_lookupTable.Remove(localid); | ||
148 | } | ||
149 | } | ||
150 | } | ||
151 | |||
133 | /// <summary> | 152 | /// <summary> |
134 | /// Remove an item from one of the queues. Specifically, it removes the | 153 | /// Remove an item from one of the queues. Specifically, it removes the |
135 | /// oldest item from the next queue in order to provide fair access to | 154 | /// oldest item from the next queue in order to provide fair access to |
136 | /// all of the queues | 155 | /// all of the queues |
137 | /// </summary> | 156 | /// </summary> |
138 | public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue) | 157 | public bool TryDequeue(out EntityUpdate value, out Int32 timeinqueue) |
139 | { | 158 | { |
140 | // If there is anything in priority queue 0, return it first no | 159 | // If there is anything in imediate queues, return it first no |
141 | // matter what else. Breaks fairness. But very useful. | 160 | // matter what else. Breaks fairness. But very useful. |
142 | for (int iq = 0; iq < NumberOfImmediateQueues; iq++) | 161 | for (int iq = 0; iq < NumberOfImmediateQueues; iq++) |
143 | { | 162 | { |
@@ -151,36 +170,35 @@ namespace OpenSim.Framework | |||
151 | return true; | 170 | return true; |
152 | } | 171 | } |
153 | } | 172 | } |
154 | 173 | ||
155 | // To get the fair queing, we cycle through each of the | 174 | // To get the fair queing, we cycle through each of the |
156 | // queues when finding an element to dequeue. | 175 | // queues when finding an element to dequeue. |
157 | // We pull (NumberOfQueues - QueueIndex) items from each queue in order | 176 | // We pull (NumberOfQueues - QueueIndex) items from each queue in order |
158 | // to give lower numbered queues a higher priority and higher percentage | 177 | // to give lower numbered queues a higher priority and higher percentage |
159 | // of the bandwidth. | 178 | // of the bandwidth. |
160 | 179 | ||
161 | // Check for more items to be pulled from the current queue | 180 | // Check for more items to be pulled from the current queue |
162 | if (m_heaps[m_nextQueue].Count > 0 && m_countFromQueue > 0) | 181 | if (m_heaps[m_nextQueue].Count > 0 && m_countFromQueue > 0) |
163 | { | 182 | { |
164 | m_countFromQueue--; | 183 | m_countFromQueue--; |
165 | 184 | ||
166 | MinHeapItem item = m_heaps[m_nextQueue].RemoveMin(); | 185 | MinHeapItem item = m_heaps[m_nextQueue].RemoveMin(); |
167 | m_lookupTable.Remove(item.Value.Entity.LocalId); | 186 | m_lookupTable.Remove(item.Value.Entity.LocalId); |
168 | timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); | 187 | timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); |
169 | value = item.Value; | 188 | value = item.Value; |
170 | 189 | ||
171 | return true; | 190 | return true; |
172 | } | 191 | } |
173 | 192 | ||
174 | // Find the next non-immediate queue with updates in it | 193 | // Find the next non-immediate queue with updates in it |
175 | for (int i = 0; i < NumberOfQueues; ++i) | 194 | for (uint i = NumberOfImmediateQueues; i < NumberOfQueues; ++i) |
176 | { | 195 | { |
177 | m_nextQueue = (uint)((m_nextQueue + 1) % NumberOfQueues); | 196 | m_nextQueue++; |
197 | if(m_nextQueue >= NumberOfQueues) | ||
198 | m_nextQueue = NumberOfImmediateQueues; | ||
199 | |||
178 | m_countFromQueue = m_queueCounts[m_nextQueue]; | 200 | m_countFromQueue = m_queueCounts[m_nextQueue]; |
179 | 201 | ||
180 | // if this is one of the immediate queues, just skip it | ||
181 | if (m_nextQueue < NumberOfImmediateQueues) | ||
182 | continue; | ||
183 | |||
184 | if (m_heaps[m_nextQueue].Count > 0) | 202 | if (m_heaps[m_nextQueue].Count > 0) |
185 | { | 203 | { |
186 | m_countFromQueue--; | 204 | m_countFromQueue--; |
@@ -189,19 +207,39 @@ namespace OpenSim.Framework | |||
189 | m_lookupTable.Remove(item.Value.Entity.LocalId); | 207 | m_lookupTable.Remove(item.Value.Entity.LocalId); |
190 | timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); | 208 | timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); |
191 | value = item.Value; | 209 | value = item.Value; |
210 | return true; | ||
211 | } | ||
212 | } | ||
192 | 213 | ||
214 | timeinqueue = 0; | ||
215 | value = default(EntityUpdate); | ||
216 | return false; | ||
217 | } | ||
218 | |||
219 | public bool TryOrderedDequeue(out EntityUpdate value, out Int32 timeinqueue) | ||
220 | { | ||
221 | // If there is anything in imediate queues, return it first no | ||
222 | // matter what else. Breaks fairness. But very useful. | ||
223 | for (int iq = 0; iq < NumberOfQueues; iq++) | ||
224 | { | ||
225 | if (m_heaps[iq].Count > 0) | ||
226 | { | ||
227 | MinHeapItem item = m_heaps[iq].RemoveMin(); | ||
228 | m_lookupTable.Remove(item.Value.Entity.LocalId); | ||
229 | timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); | ||
230 | value = item.Value; | ||
193 | return true; | 231 | return true; |
194 | } | 232 | } |
195 | } | 233 | } |
196 | 234 | ||
197 | timeinqueue = 0; | 235 | timeinqueue = 0; |
198 | value = default(IEntityUpdate); | 236 | value = default(EntityUpdate); |
199 | return false; | 237 | return false; |
200 | } | 238 | } |
201 | 239 | ||
202 | /// <summary> | 240 | /// <summary> |
203 | /// Reapply the prioritization function to each of the updates currently | 241 | /// Reapply the prioritization function to each of the updates currently |
204 | /// stored in the priority queues. | 242 | /// stored in the priority queues. |
205 | /// </summary | 243 | /// </summary |
206 | public void Reprioritize(UpdatePriorityHandler handler) | 244 | public void Reprioritize(UpdatePriorityHandler handler) |
207 | { | 245 | { |
@@ -253,8 +291,8 @@ namespace OpenSim.Framework | |||
253 | #region MinHeapItem | 291 | #region MinHeapItem |
254 | private struct MinHeapItem : IComparable<MinHeapItem> | 292 | private struct MinHeapItem : IComparable<MinHeapItem> |
255 | { | 293 | { |
256 | private IEntityUpdate value; | 294 | private EntityUpdate value; |
257 | internal IEntityUpdate Value { | 295 | internal EntityUpdate Value { |
258 | get { | 296 | get { |
259 | return this.value; | 297 | return this.value; |
260 | } | 298 | } |
@@ -290,7 +328,7 @@ namespace OpenSim.Framework | |||
290 | this.pqueue = pqueue; | 328 | this.pqueue = pqueue; |
291 | } | 329 | } |
292 | 330 | ||
293 | internal MinHeapItem(uint pqueue, UInt64 entryorder, IEntityUpdate value) | 331 | internal MinHeapItem(uint pqueue, UInt64 entryorder, EntityUpdate value) |
294 | { | 332 | { |
295 | this.entrytime = Util.EnvironmentTickCount(); | 333 | this.entrytime = Util.EnvironmentTickCount(); |
296 | this.entryorder = entryorder; | 334 | this.entryorder = entryorder; |
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index 79fbd96..75ed999 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs | |||
@@ -40,6 +40,7 @@ using OpenMetaverse.StructuredData; | |||
40 | 40 | ||
41 | namespace OpenSim.Framework | 41 | namespace OpenSim.Framework |
42 | { | 42 | { |
43 | [Serializable] | ||
43 | public class RegionLightShareData : ICloneable | 44 | public class RegionLightShareData : ICloneable |
44 | { | 45 | { |
45 | public bool valid = false; | 46 | public bool valid = false; |
@@ -101,6 +102,11 @@ namespace OpenSim.Framework | |||
101 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 102 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
102 | private static readonly string LogHeader = "[REGION INFO]"; | 103 | private static readonly string LogHeader = "[REGION INFO]"; |
103 | 104 | ||
105 | |||
106 | public bool commFailTF = false; | ||
107 | public ConfigurationMember configMember; | ||
108 | public string DataStore = String.Empty; | ||
109 | |||
104 | public string RegionFile = String.Empty; | 110 | public string RegionFile = String.Empty; |
105 | public bool isSandbox = false; | 111 | public bool isSandbox = false; |
106 | public bool Persistent = true; | 112 | public bool Persistent = true; |
@@ -124,7 +130,7 @@ namespace OpenSim.Framework | |||
124 | private float m_physPrimMin = 0; | 130 | private float m_physPrimMin = 0; |
125 | private int m_physPrimMax = 0; | 131 | private int m_physPrimMax = 0; |
126 | private bool m_clampPrimSize = false; | 132 | private bool m_clampPrimSize = false; |
127 | private int m_objectCapacity = 0; | 133 | private int m_objectCapacity = 15000; |
128 | private int m_maxPrimsPerUser = -1; | 134 | private int m_maxPrimsPerUser = -1; |
129 | private int m_linksetCapacity = 0; | 135 | private int m_linksetCapacity = 0; |
130 | private string m_regionType = String.Empty; | 136 | private string m_regionType = String.Empty; |
@@ -132,8 +138,6 @@ namespace OpenSim.Framework | |||
132 | protected uint m_httpPort; | 138 | protected uint m_httpPort; |
133 | protected string m_serverURI; | 139 | protected string m_serverURI; |
134 | protected string m_regionName = String.Empty; | 140 | protected string m_regionName = String.Empty; |
135 | protected bool Allow_Alternate_Ports; | ||
136 | public bool m_allow_alternate_ports; | ||
137 | protected string m_externalHostName; | 141 | protected string m_externalHostName; |
138 | protected IPEndPoint m_internalEndPoint; | 142 | protected IPEndPoint m_internalEndPoint; |
139 | protected uint m_remotingPort; | 143 | protected uint m_remotingPort; |
@@ -141,6 +145,7 @@ namespace OpenSim.Framework | |||
141 | public string RemotingAddress; | 145 | public string RemotingAddress; |
142 | public UUID ScopeID = UUID.Zero; | 146 | public UUID ScopeID = UUID.Zero; |
143 | private UUID m_maptileStaticUUID = UUID.Zero; | 147 | private UUID m_maptileStaticUUID = UUID.Zero; |
148 | private bool m_resolveAddress = false; | ||
144 | 149 | ||
145 | public uint WorldLocX = 0; | 150 | public uint WorldLocX = 0; |
146 | public uint WorldLocY = 0; | 151 | public uint WorldLocY = 0; |
@@ -170,6 +175,9 @@ namespace OpenSim.Framework | |||
170 | /// </remarks> | 175 | /// </remarks> |
171 | public uint RegionSizeZ = Constants.RegionHeight; | 176 | public uint RegionSizeZ = Constants.RegionHeight; |
172 | 177 | ||
178 | // If entering avatar has no specific coords, this is where they land | ||
179 | public Vector3 DefaultLandingPoint = new Vector3(128, 128, 30); | ||
180 | |||
173 | private Dictionary<String, String> m_extraSettings = new Dictionary<string, string>(); | 181 | private Dictionary<String, String> m_extraSettings = new Dictionary<string, string>(); |
174 | 182 | ||
175 | // Apparently, we're applying the same estatesettings regardless of whether it's local or remote. | 183 | // Apparently, we're applying the same estatesettings regardless of whether it's local or remote. |
@@ -368,7 +376,7 @@ namespace OpenSim.Framework | |||
368 | } | 376 | } |
369 | 377 | ||
370 | public string MaptileStaticFile { get; private set; } | 378 | public string MaptileStaticFile { get; private set; } |
371 | 379 | ||
372 | /// <summary> | 380 | /// <summary> |
373 | /// The port by which http communication occurs with the region (most noticeably, CAPS communication) | 381 | /// The port by which http communication occurs with the region (most noticeably, CAPS communication) |
374 | /// </summary> | 382 | /// </summary> |
@@ -381,17 +389,17 @@ namespace OpenSim.Framework | |||
381 | /// <summary> | 389 | /// <summary> |
382 | /// A well-formed URI for the host region server (namely "http://" + ExternalHostName) | 390 | /// A well-formed URI for the host region server (namely "http://" + ExternalHostName) |
383 | /// </summary> | 391 | /// </summary> |
384 | 392 | ||
385 | public string ServerURI | 393 | public string ServerURI |
386 | { | 394 | { |
387 | get { | 395 | get { |
388 | if ( m_serverURI != string.Empty ) { | 396 | if ( m_serverURI != string.Empty ) { |
389 | return m_serverURI; | 397 | return m_serverURI; |
390 | } else { | 398 | } else { |
391 | return "http://" + m_externalHostName + ":" + m_httpPort + "/"; | 399 | return "http://" + m_externalHostName + ":" + m_httpPort + "/"; |
392 | } | 400 | } |
393 | } | 401 | } |
394 | set { | 402 | set { |
395 | if ( value.EndsWith("/") ) { | 403 | if ( value.EndsWith("/") ) { |
396 | m_serverURI = value; | 404 | m_serverURI = value; |
397 | } else { | 405 | } else { |
@@ -412,6 +420,7 @@ namespace OpenSim.Framework | |||
412 | set { m_remotingPort = value; } | 420 | set { m_remotingPort = value; } |
413 | } | 421 | } |
414 | 422 | ||
423 | |||
415 | /// <value> | 424 | /// <value> |
416 | /// This accessor can throw all the exceptions that Dns.GetHostAddresses can throw. | 425 | /// This accessor can throw all the exceptions that Dns.GetHostAddresses can throw. |
417 | /// | 426 | /// |
@@ -419,42 +428,7 @@ namespace OpenSim.Framework | |||
419 | /// </value> | 428 | /// </value> |
420 | public IPEndPoint ExternalEndPoint | 429 | public IPEndPoint ExternalEndPoint |
421 | { | 430 | { |
422 | get | 431 | get { return Util.getEndPoint(m_externalHostName, m_internalEndPoint.Port); } |
423 | { | ||
424 | // Old one defaults to IPv6 | ||
425 | //return new IPEndPoint(Dns.GetHostAddresses(m_externalHostName)[0], m_internalEndPoint.Port); | ||
426 | |||
427 | IPAddress ia = null; | ||
428 | // If it is already an IP, don't resolve it - just return directly | ||
429 | if (IPAddress.TryParse(m_externalHostName, out ia)) | ||
430 | return new IPEndPoint(ia, m_internalEndPoint.Port); | ||
431 | |||
432 | // Reset for next check | ||
433 | ia = null; | ||
434 | try | ||
435 | { | ||
436 | foreach (IPAddress Adr in Dns.GetHostAddresses(m_externalHostName)) | ||
437 | { | ||
438 | if (ia == null) | ||
439 | ia = Adr; | ||
440 | |||
441 | if (Adr.AddressFamily == AddressFamily.InterNetwork) | ||
442 | { | ||
443 | ia = Adr; | ||
444 | break; | ||
445 | } | ||
446 | } | ||
447 | } | ||
448 | catch (SocketException e) | ||
449 | { | ||
450 | throw new Exception( | ||
451 | "Unable to resolve local hostname " + m_externalHostName + " innerException of type '" + | ||
452 | e + "' attached to this exception", e); | ||
453 | } | ||
454 | |||
455 | return new IPEndPoint(ia, m_internalEndPoint.Port); | ||
456 | } | ||
457 | |||
458 | set { m_externalHostName = value.ToString(); } | 432 | set { m_externalHostName = value.ToString(); } |
459 | } | 433 | } |
460 | 434 | ||
@@ -527,7 +501,7 @@ namespace OpenSim.Framework | |||
527 | return null; | 501 | return null; |
528 | } | 502 | } |
529 | 503 | ||
530 | private void SetExtraSetting(string key, string value) | 504 | public void SetExtraSetting(string key, string value) |
531 | { | 505 | { |
532 | string keylower = key.ToLower(); | 506 | string keylower = key.ToLower(); |
533 | m_extraSettings[keylower] = value; | 507 | m_extraSettings[keylower] = value; |
@@ -535,7 +509,7 @@ namespace OpenSim.Framework | |||
535 | 509 | ||
536 | private void ReadNiniConfig(IConfigSource source, string name) | 510 | private void ReadNiniConfig(IConfigSource source, string name) |
537 | { | 511 | { |
538 | // bool creatingNew = false; | 512 | bool creatingNew = false; |
539 | 513 | ||
540 | if (source.Configs.Count == 0) | 514 | if (source.Configs.Count == 0) |
541 | { | 515 | { |
@@ -559,7 +533,7 @@ namespace OpenSim.Framework | |||
559 | 533 | ||
560 | source.AddConfig(name); | 534 | source.AddConfig(name); |
561 | 535 | ||
562 | // creatingNew = true; | 536 | creatingNew = true; |
563 | } | 537 | } |
564 | 538 | ||
565 | if (name == String.Empty) | 539 | if (name == String.Empty) |
@@ -663,18 +637,19 @@ namespace OpenSim.Framework | |||
663 | } | 637 | } |
664 | m_internalEndPoint = new IPEndPoint(address, port); | 638 | m_internalEndPoint = new IPEndPoint(address, port); |
665 | 639 | ||
666 | // AllowAlternatePorts | 640 | // ResolveAddress |
667 | // | 641 | // |
668 | allKeys.Remove("AllowAlternatePorts"); | 642 | allKeys.Remove("ResolveAddress"); |
669 | if (config.Contains("AllowAlternatePorts")) | 643 | if (config.Contains("ResolveAddress")) |
670 | { | 644 | { |
671 | m_allow_alternate_ports = config.GetBoolean("AllowAlternatePorts", true); | 645 | m_resolveAddress = config.GetBoolean("ResolveAddress", false); |
672 | } | 646 | } |
673 | else | 647 | else |
674 | { | 648 | { |
675 | m_allow_alternate_ports = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Allow alternate ports", "False")); | 649 | if (creatingNew) |
650 | m_resolveAddress = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Resolve hostname to IP on start (for running inside Docker)", "False")); | ||
676 | 651 | ||
677 | config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString()); | 652 | config.Set("ResolveAddress", m_resolveAddress.ToString()); |
678 | } | 653 | } |
679 | 654 | ||
680 | // ExternalHostName | 655 | // ExternalHostName |
@@ -697,15 +672,36 @@ namespace OpenSim.Framework | |||
697 | "[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}", | 672 | "[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}", |
698 | m_externalHostName, name); | 673 | m_externalHostName, name); |
699 | } | 674 | } |
700 | else | 675 | else if (!m_resolveAddress) |
701 | { | 676 | { |
702 | m_externalHostName = externalName; | 677 | m_externalHostName = externalName; |
703 | } | 678 | } |
679 | else | ||
680 | { | ||
681 | IPAddress[] addrs = Dns.GetHostAddresses(externalName); | ||
682 | if (addrs.Length != 1) // If it is ambiguous or not resolveable, use it literally | ||
683 | m_externalHostName = externalName; | ||
684 | else | ||
685 | m_externalHostName = addrs[0].ToString(); | ||
686 | } | ||
704 | 687 | ||
705 | // RegionType | 688 | // RegionType |
706 | m_regionType = config.GetString("RegionType", String.Empty); | 689 | m_regionType = config.GetString("RegionType", String.Empty); |
707 | allKeys.Remove("RegionType"); | 690 | allKeys.Remove("RegionType"); |
708 | 691 | ||
692 | // Get Default Landing Location (Defaults to 128,128) | ||
693 | string temp_location = config.GetString("DefaultLanding", "<128, 128, 30>"); | ||
694 | Vector3 temp_vector; | ||
695 | |||
696 | if (Vector3.TryParse(temp_location, out temp_vector)) | ||
697 | DefaultLandingPoint = temp_vector; | ||
698 | else | ||
699 | m_log.ErrorFormat("[RegionInfo]: Unable to parse DefaultLanding for '{0}'. The value given was '{1}'", RegionName, temp_location); | ||
700 | |||
701 | allKeys.Remove("DefaultLanding"); | ||
702 | |||
703 | DoDefaultLandingSanityChecks(); | ||
704 | |||
709 | #region Prim and map stuff | 705 | #region Prim and map stuff |
710 | 706 | ||
711 | m_nonphysPrimMin = config.GetFloat("NonPhysicalPrimMin", 0); | 707 | m_nonphysPrimMin = config.GetFloat("NonPhysicalPrimMin", 0); |
@@ -719,11 +715,11 @@ namespace OpenSim.Framework | |||
719 | 715 | ||
720 | m_physPrimMax = config.GetInt("PhysicalPrimMax", 0); | 716 | m_physPrimMax = config.GetInt("PhysicalPrimMax", 0); |
721 | allKeys.Remove("PhysicalPrimMax"); | 717 | allKeys.Remove("PhysicalPrimMax"); |
722 | 718 | ||
723 | m_clampPrimSize = config.GetBoolean("ClampPrimSize", false); | 719 | m_clampPrimSize = config.GetBoolean("ClampPrimSize", false); |
724 | allKeys.Remove("ClampPrimSize"); | 720 | allKeys.Remove("ClampPrimSize"); |
725 | 721 | ||
726 | m_objectCapacity = config.GetInt("MaxPrims", 15000); | 722 | m_objectCapacity = config.GetInt("MaxPrims", m_objectCapacity); |
727 | allKeys.Remove("MaxPrims"); | 723 | allKeys.Remove("MaxPrims"); |
728 | 724 | ||
729 | m_maxPrimsPerUser = config.GetInt("MaxPrimsPerUser", -1); | 725 | m_maxPrimsPerUser = config.GetInt("MaxPrimsPerUser", -1); |
@@ -736,12 +732,12 @@ namespace OpenSim.Framework | |||
736 | string mapTileStaticUUID = config.GetString("MaptileStaticUUID", UUID.Zero.ToString()); | 732 | string mapTileStaticUUID = config.GetString("MaptileStaticUUID", UUID.Zero.ToString()); |
737 | if (UUID.TryParse(mapTileStaticUUID.Trim(), out m_maptileStaticUUID)) | 733 | if (UUID.TryParse(mapTileStaticUUID.Trim(), out m_maptileStaticUUID)) |
738 | { | 734 | { |
739 | config.Set("MaptileStaticUUID", m_maptileStaticUUID.ToString()); | 735 | config.Set("MaptileStaticUUID", m_maptileStaticUUID.ToString()); |
740 | } | 736 | } |
741 | 737 | ||
742 | MaptileStaticFile = config.GetString("MaptileStaticFile", String.Empty); | 738 | MaptileStaticFile = config.GetString("MaptileStaticFile", String.Empty); |
743 | allKeys.Remove("MaptileStaticFile"); | 739 | allKeys.Remove("MaptileStaticFile"); |
744 | 740 | ||
745 | #endregion | 741 | #endregion |
746 | 742 | ||
747 | AgentCapacity = config.GetInt("MaxAgents", 100); | 743 | AgentCapacity = config.GetInt("MaxAgents", 100); |
@@ -758,6 +754,48 @@ namespace OpenSim.Framework | |||
758 | } | 754 | } |
759 | } | 755 | } |
760 | 756 | ||
757 | // Make sure DefaultLanding is within region borders with a buffer zone 5 meters from borders | ||
758 | private void DoDefaultLandingSanityChecks() | ||
759 | { | ||
760 | // Sanity Check Default Landing | ||
761 | float buffer_zone = 5f; | ||
762 | |||
763 | bool ValuesCapped = false; | ||
764 | |||
765 | // Minimum Positions | ||
766 | if (DefaultLandingPoint.X < buffer_zone) | ||
767 | { | ||
768 | DefaultLandingPoint.X = buffer_zone; | ||
769 | ValuesCapped = true; | ||
770 | } | ||
771 | |||
772 | if (DefaultLandingPoint.Y < buffer_zone) | ||
773 | { | ||
774 | DefaultLandingPoint.Y = buffer_zone; | ||
775 | ValuesCapped = true; | ||
776 | } | ||
777 | |||
778 | // Maximum Positions | ||
779 | if (DefaultLandingPoint.X > RegionSizeX - buffer_zone) | ||
780 | { | ||
781 | DefaultLandingPoint.X = RegionSizeX - buffer_zone; | ||
782 | ValuesCapped = true; | ||
783 | } | ||
784 | |||
785 | if (DefaultLandingPoint.Y > RegionSizeY - buffer_zone) | ||
786 | { | ||
787 | DefaultLandingPoint.Y = RegionSizeY - buffer_zone; | ||
788 | ValuesCapped = true; | ||
789 | } | ||
790 | |||
791 | // Height | ||
792 | if (DefaultLandingPoint.Z < 0f) | ||
793 | DefaultLandingPoint.Z = 0f; | ||
794 | |||
795 | if (ValuesCapped == true) | ||
796 | m_log.WarnFormat("[RegionInfo]: The default landing location for {0} has been capped to {1}", RegionName, DefaultLandingPoint); | ||
797 | } | ||
798 | |||
761 | // Make sure user specified region sizes are sane. | 799 | // Make sure user specified region sizes are sane. |
762 | // Must be multiples of legacy region size (256). | 800 | // Must be multiples of legacy region size (256). |
763 | private void DoRegionSizeSanityChecks() | 801 | private void DoRegionSizeSanityChecks() |
@@ -823,20 +861,20 @@ namespace OpenSim.Framework | |||
823 | string location = String.Format("{0},{1}", RegionLocX, RegionLocY); | 861 | string location = String.Format("{0},{1}", RegionLocX, RegionLocY); |
824 | config.Set("Location", location); | 862 | config.Set("Location", location); |
825 | 863 | ||
826 | if (RegionSizeX > 0) | 864 | if (DataStore != String.Empty) |
827 | config.Set("SizeX", RegionSizeX); | 865 | config.Set("Datastore", DataStore); |
828 | 866 | ||
829 | if (RegionSizeY > 0) | 867 | if (RegionSizeX != Constants.RegionSize || RegionSizeY != Constants.RegionSize) |
868 | { | ||
869 | config.Set("SizeX", RegionSizeX); | ||
830 | config.Set("SizeY", RegionSizeY); | 870 | config.Set("SizeY", RegionSizeY); |
831 | 871 | // if (RegionSizeZ > 0) | |
832 | // if (RegionSizeZ > 0) | 872 | // config.Set("SizeZ", RegionSizeZ); |
833 | // config.Set("SizeZ", RegionSizeZ); | 873 | } |
834 | 874 | ||
835 | config.Set("InternalAddress", m_internalEndPoint.Address.ToString()); | 875 | config.Set("InternalAddress", m_internalEndPoint.Address.ToString()); |
836 | config.Set("InternalPort", m_internalEndPoint.Port); | 876 | config.Set("InternalPort", m_internalEndPoint.Port); |
837 | 877 | ||
838 | config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString()); | ||
839 | |||
840 | config.Set("ExternalHostName", m_externalHostName); | 878 | config.Set("ExternalHostName", m_externalHostName); |
841 | 879 | ||
842 | if (m_nonphysPrimMin > 0) | 880 | if (m_nonphysPrimMin > 0) |
@@ -847,10 +885,10 @@ namespace OpenSim.Framework | |||
847 | 885 | ||
848 | if (m_physPrimMin > 0) | 886 | if (m_physPrimMin > 0) |
849 | config.Set("PhysicalPrimMax", m_physPrimMin); | 887 | config.Set("PhysicalPrimMax", m_physPrimMin); |
850 | 888 | ||
851 | if (m_physPrimMax > 0) | 889 | if (m_physPrimMax > 0) |
852 | config.Set("PhysicalPrimMax", m_physPrimMax); | 890 | config.Set("PhysicalPrimMax", m_physPrimMax); |
853 | 891 | ||
854 | config.Set("ClampPrimSize", m_clampPrimSize.ToString()); | 892 | config.Set("ClampPrimSize", m_clampPrimSize.ToString()); |
855 | 893 | ||
856 | if (m_objectCapacity > 0) | 894 | if (m_objectCapacity > 0) |
@@ -901,6 +939,222 @@ namespace OpenSim.Framework | |||
901 | throw new Exception("Invalid file type for region persistence."); | 939 | throw new Exception("Invalid file type for region persistence."); |
902 | } | 940 | } |
903 | 941 | ||
942 | public void loadConfigurationOptionsFromMe() | ||
943 | { | ||
944 | configMember.addConfigurationOption("sim_UUID", ConfigurationOption.ConfigurationTypes.TYPE_UUID_NULL_FREE, | ||
945 | "UUID of Region (Default is recommended, random UUID)", | ||
946 | RegionID.ToString(), true); | ||
947 | configMember.addConfigurationOption("sim_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, | ||
948 | "Region Name", RegionName, true); | ||
949 | |||
950 | configMember.addConfigurationOption("sim_location_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
951 | "Grid Location (X Axis)", RegionLocX.ToString(), true); | ||
952 | configMember.addConfigurationOption("sim_location_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
953 | "Grid Location (Y Axis)", RegionLocY.ToString(), true); | ||
954 | configMember.addConfigurationOption("sim_size_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
955 | "Size of region in X dimension", RegionSizeX.ToString(), true); | ||
956 | configMember.addConfigurationOption("sim_size_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
957 | "Size of region in Y dimension", RegionSizeY.ToString(), true); | ||
958 | configMember.addConfigurationOption("sim_size_z", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
959 | "Size of region in Z dimension", RegionSizeZ.ToString(), true); | ||
960 | |||
961 | //m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false); | ||
962 | configMember.addConfigurationOption("internal_ip_address", | ||
963 | ConfigurationOption.ConfigurationTypes.TYPE_IP_ADDRESS, | ||
964 | "Internal IP Address for incoming UDP client connections", | ||
965 | m_internalEndPoint.Address.ToString(), | ||
966 | true); | ||
967 | configMember.addConfigurationOption("internal_ip_port", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
968 | "Internal IP Port for incoming UDP client connections", | ||
969 | m_internalEndPoint.Port.ToString(), true); | ||
970 | configMember.addConfigurationOption("external_host_name", | ||
971 | ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, | ||
972 | "External Host Name", m_externalHostName, true); | ||
973 | configMember.addConfigurationOption("lastmap_uuid", ConfigurationOption.ConfigurationTypes.TYPE_UUID, | ||
974 | "Last Map UUID", lastMapUUID.ToString(), true); | ||
975 | configMember.addConfigurationOption("lastmap_refresh", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, | ||
976 | "Last Map Refresh", Util.UnixTimeSinceEpoch().ToString(), true); | ||
977 | |||
978 | configMember.addConfigurationOption("nonphysical_prim_min", ConfigurationOption.ConfigurationTypes.TYPE_FLOAT, | ||
979 | "Minimum size for nonphysical prims", m_nonphysPrimMin.ToString(), true); | ||
980 | |||
981 | configMember.addConfigurationOption("nonphysical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
982 | "Maximum size for nonphysical prims", m_nonphysPrimMax.ToString(), true); | ||
983 | |||
984 | configMember.addConfigurationOption("physical_prim_min", ConfigurationOption.ConfigurationTypes.TYPE_FLOAT, | ||
985 | "Minimum size for nonphysical prims", m_physPrimMin.ToString(), true); | ||
986 | |||
987 | configMember.addConfigurationOption("physical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
988 | "Maximum size for physical prims", m_physPrimMax.ToString(), true); | ||
989 | |||
990 | configMember.addConfigurationOption("clamp_prim_size", ConfigurationOption.ConfigurationTypes.TYPE_BOOLEAN, | ||
991 | "Clamp prims to max size", m_clampPrimSize.ToString(), true); | ||
992 | |||
993 | configMember.addConfigurationOption("object_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
994 | "Max objects this sim will hold", m_objectCapacity.ToString(), true); | ||
995 | |||
996 | configMember.addConfigurationOption("linkset_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
997 | "Max prims an object will hold", m_linksetCapacity.ToString(), true); | ||
998 | |||
999 | configMember.addConfigurationOption("agent_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
1000 | "Max avatars this sim will hold",AgentCapacity.ToString(), true); | ||
1001 | |||
1002 | configMember.addConfigurationOption("scope_id", ConfigurationOption.ConfigurationTypes.TYPE_UUID, | ||
1003 | "Scope ID for this region", ScopeID.ToString(), true); | ||
1004 | |||
1005 | configMember.addConfigurationOption("region_type", ConfigurationOption.ConfigurationTypes.TYPE_STRING, | ||
1006 | "Free form string describing the type of region", String.Empty, true); | ||
1007 | |||
1008 | configMember.addConfigurationOption("region_static_maptile", ConfigurationOption.ConfigurationTypes.TYPE_UUID, | ||
1009 | "UUID of a texture to use as the map for this region", m_maptileStaticUUID.ToString(), true); | ||
1010 | } | ||
1011 | |||
1012 | public void loadConfigurationOptions() | ||
1013 | { | ||
1014 | configMember.addConfigurationOption("sim_UUID", ConfigurationOption.ConfigurationTypes.TYPE_UUID, | ||
1015 | "UUID of Region (Default is recommended, random UUID)", | ||
1016 | UUID.Random().ToString(), true); | ||
1017 | configMember.addConfigurationOption("sim_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, | ||
1018 | "Region Name", "OpenSim Test", false); | ||
1019 | |||
1020 | configMember.addConfigurationOption("sim_location_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
1021 | "Grid Location (X Axis)", "1000", false); | ||
1022 | configMember.addConfigurationOption("sim_location_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
1023 | "Grid Location (Y Axis)", "1000", false); | ||
1024 | configMember.addConfigurationOption("sim_size_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
1025 | "Size of region in X dimension", Constants.RegionSize.ToString(), false); | ||
1026 | configMember.addConfigurationOption("sim_size_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
1027 | "Size of region in Y dimension", Constants.RegionSize.ToString(), false); | ||
1028 | configMember.addConfigurationOption("sim_size_z", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, | ||
1029 | "Size of region in Z dimension", Constants.RegionHeight.ToString(), false); | ||
1030 | |||
1031 | //m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false); | ||
1032 | configMember.addConfigurationOption("internal_ip_address", | ||
1033 | ConfigurationOption.ConfigurationTypes.TYPE_IP_ADDRESS, | ||
1034 | "Internal IP Address for incoming UDP client connections", "0.0.0.0", | ||
1035 | false); | ||
1036 | configMember.addConfigurationOption("internal_ip_port", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
1037 | "Internal IP Port for incoming UDP client connections", | ||
1038 | ConfigSettings.DefaultRegionHttpPort.ToString(), false); | ||
1039 | configMember.addConfigurationOption("external_host_name", | ||
1040 | ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, | ||
1041 | "External Host Name", "127.0.0.1", false); | ||
1042 | configMember.addConfigurationOption("lastmap_uuid", ConfigurationOption.ConfigurationTypes.TYPE_UUID, | ||
1043 | "Last Map UUID", lastMapUUID.ToString(), true); | ||
1044 | |||
1045 | configMember.addConfigurationOption("lastmap_refresh", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, | ||
1046 | "Last Map Refresh", Util.UnixTimeSinceEpoch().ToString(), true); | ||
1047 | |||
1048 | configMember.addConfigurationOption("nonphysical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
1049 | "Maximum size for nonphysical prims", "0", true); | ||
1050 | |||
1051 | configMember.addConfigurationOption("physical_prim_max", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
1052 | "Maximum size for physical prims", "0", true); | ||
1053 | |||
1054 | configMember.addConfigurationOption("clamp_prim_size", ConfigurationOption.ConfigurationTypes.TYPE_BOOLEAN, | ||
1055 | "Clamp prims to max size", "false", true); | ||
1056 | |||
1057 | configMember.addConfigurationOption("object_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
1058 | "Max objects this sim will hold", "15000", true); | ||
1059 | |||
1060 | configMember.addConfigurationOption("agent_capacity", ConfigurationOption.ConfigurationTypes.TYPE_INT32, | ||
1061 | "Max avatars this sim will hold", "100", true); | ||
1062 | |||
1063 | configMember.addConfigurationOption("scope_id", ConfigurationOption.ConfigurationTypes.TYPE_UUID, | ||
1064 | "Scope ID for this region", UUID.Zero.ToString(), true); | ||
1065 | |||
1066 | configMember.addConfigurationOption("region_type", ConfigurationOption.ConfigurationTypes.TYPE_STRING, | ||
1067 | "Region Type", String.Empty, true); | ||
1068 | |||
1069 | configMember.addConfigurationOption("region_static_maptile", ConfigurationOption.ConfigurationTypes.TYPE_UUID, | ||
1070 | "UUID of a texture to use as the map for this region", String.Empty, true); | ||
1071 | } | ||
1072 | |||
1073 | public bool handleIncomingConfiguration(string configuration_key, object configuration_result) | ||
1074 | { | ||
1075 | switch (configuration_key) | ||
1076 | { | ||
1077 | case "sim_UUID": | ||
1078 | RegionID = (UUID) configuration_result; | ||
1079 | originRegionID = (UUID) configuration_result; | ||
1080 | break; | ||
1081 | case "sim_name": | ||
1082 | RegionName = (string) configuration_result; | ||
1083 | break; | ||
1084 | case "sim_location_x": | ||
1085 | RegionLocX = (uint) configuration_result; | ||
1086 | break; | ||
1087 | case "sim_location_y": | ||
1088 | RegionLocY = (uint) configuration_result; | ||
1089 | break; | ||
1090 | case "sim_size_x": | ||
1091 | RegionSizeX = (uint) configuration_result; | ||
1092 | break; | ||
1093 | case "sim_size_y": | ||
1094 | RegionSizeY = (uint) configuration_result; | ||
1095 | break; | ||
1096 | case "sim_size_z": | ||
1097 | RegionSizeZ = (uint) configuration_result; | ||
1098 | break; | ||
1099 | case "datastore": | ||
1100 | DataStore = (string) configuration_result; | ||
1101 | break; | ||
1102 | case "internal_ip_address": | ||
1103 | IPAddress address = (IPAddress) configuration_result; | ||
1104 | m_internalEndPoint = new IPEndPoint(address, 0); | ||
1105 | break; | ||
1106 | case "internal_ip_port": | ||
1107 | m_internalEndPoint.Port = (int) configuration_result; | ||
1108 | break; | ||
1109 | case "external_host_name": | ||
1110 | if ((string) configuration_result != "SYSTEMIP") | ||
1111 | { | ||
1112 | m_externalHostName = (string) configuration_result; | ||
1113 | } | ||
1114 | else | ||
1115 | { | ||
1116 | m_externalHostName = Util.GetLocalHost().ToString(); | ||
1117 | } | ||
1118 | break; | ||
1119 | case "lastmap_uuid": | ||
1120 | lastMapUUID = (UUID)configuration_result; | ||
1121 | break; | ||
1122 | case "lastmap_refresh": | ||
1123 | lastMapRefresh = (string)configuration_result; | ||
1124 | break; | ||
1125 | case "nonphysical_prim_max": | ||
1126 | m_nonphysPrimMax = (int)configuration_result; | ||
1127 | break; | ||
1128 | case "physical_prim_max": | ||
1129 | m_physPrimMax = (int)configuration_result; | ||
1130 | break; | ||
1131 | case "clamp_prim_size": | ||
1132 | m_clampPrimSize = (bool)configuration_result; | ||
1133 | break; | ||
1134 | case "object_capacity": | ||
1135 | m_objectCapacity = (int)configuration_result; | ||
1136 | break; | ||
1137 | case "linkset_capacity": | ||
1138 | m_linksetCapacity = (int)configuration_result; | ||
1139 | break; | ||
1140 | case "agent_capacity": | ||
1141 | AgentCapacity = (int)configuration_result; | ||
1142 | break; | ||
1143 | case "scope_id": | ||
1144 | ScopeID = (UUID)configuration_result; | ||
1145 | break; | ||
1146 | case "region_type": | ||
1147 | m_regionType = (string)configuration_result; | ||
1148 | break; | ||
1149 | case "region_static_maptile": | ||
1150 | m_maptileStaticUUID = (UUID)configuration_result; | ||
1151 | break; | ||
1152 | } | ||
1153 | |||
1154 | return true; | ||
1155 | } | ||
1156 | |||
1157 | |||
904 | public void SaveLastMapUUID(UUID mapUUID) | 1158 | public void SaveLastMapUUID(UUID mapUUID) |
905 | { | 1159 | { |
906 | lastMapUUID = mapUUID; | 1160 | lastMapUUID = mapUUID; |
@@ -928,7 +1182,6 @@ namespace OpenSim.Framework | |||
928 | if ((RemotingAddress != null) && !RemotingAddress.Equals("")) | 1182 | if ((RemotingAddress != null) && !RemotingAddress.Equals("")) |
929 | args["remoting_address"] = OSD.FromString(RemotingAddress); | 1183 | args["remoting_address"] = OSD.FromString(RemotingAddress); |
930 | args["remoting_port"] = OSD.FromString(RemotingPort.ToString()); | 1184 | args["remoting_port"] = OSD.FromString(RemotingPort.ToString()); |
931 | args["allow_alt_ports"] = OSD.FromBoolean(m_allow_alternate_ports); | ||
932 | if ((proxyUrl != null) && !proxyUrl.Equals("")) | 1185 | if ((proxyUrl != null) && !proxyUrl.Equals("")) |
933 | args["proxy_url"] = OSD.FromString(proxyUrl); | 1186 | args["proxy_url"] = OSD.FromString(proxyUrl); |
934 | if (RegionType != String.Empty) | 1187 | if (RegionType != String.Empty) |
@@ -983,8 +1236,6 @@ namespace OpenSim.Framework | |||
983 | RemotingAddress = args["remoting_address"].AsString(); | 1236 | RemotingAddress = args["remoting_address"].AsString(); |
984 | if (args["remoting_port"] != null) | 1237 | if (args["remoting_port"] != null) |
985 | UInt32.TryParse(args["remoting_port"].AsString(), out m_remotingPort); | 1238 | UInt32.TryParse(args["remoting_port"].AsString(), out m_remotingPort); |
986 | if (args["allow_alt_ports"] != null) | ||
987 | m_allow_alternate_ports = args["allow_alt_ports"].AsBoolean(); | ||
988 | if (args["proxy_url"] != null) | 1239 | if (args["proxy_url"] != null) |
989 | proxyUrl = args["proxy_url"].AsString(); | 1240 | proxyUrl = args["proxy_url"].AsString(); |
990 | if (args["region_type"] != null) | 1241 | if (args["region_type"] != null) |
@@ -1004,5 +1255,29 @@ namespace OpenSim.Framework | |||
1004 | regionInfo.ServerURI = serverURI; | 1255 | regionInfo.ServerURI = serverURI; |
1005 | return regionInfo; | 1256 | return regionInfo; |
1006 | } | 1257 | } |
1258 | |||
1259 | public int getInternalEndPointPort() | ||
1260 | { | ||
1261 | return m_internalEndPoint.Port; | ||
1262 | } | ||
1263 | |||
1264 | public Dictionary<string, object> ToKeyValuePairs() | ||
1265 | { | ||
1266 | Dictionary<string, object> kvp = new Dictionary<string, object>(); | ||
1267 | kvp["uuid"] = RegionID.ToString(); | ||
1268 | kvp["locX"] = RegionLocX.ToString(); | ||
1269 | kvp["locY"] = RegionLocY.ToString(); | ||
1270 | kvp["external_ip_address"] = ExternalEndPoint.Address.ToString(); | ||
1271 | kvp["external_port"] = ExternalEndPoint.Port.ToString(); | ||
1272 | kvp["external_host_name"] = ExternalHostName; | ||
1273 | kvp["http_port"] = HttpPort.ToString(); | ||
1274 | kvp["internal_ip_address"] = InternalEndPoint.Address.ToString(); | ||
1275 | kvp["internal_port"] = InternalEndPoint.Port.ToString(); | ||
1276 | // TODO: Remove in next major version | ||
1277 | kvp["alternate_ports"] = "False"; | ||
1278 | kvp["server_uri"] = ServerURI; | ||
1279 | |||
1280 | return kvp; | ||
1281 | } | ||
1007 | } | 1282 | } |
1008 | } | 1283 | } |
diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs index a895c40..c2947a2 100644 --- a/OpenSim/Framework/RegionSettings.cs +++ b/OpenSim/Framework/RegionSettings.cs | |||
@@ -91,7 +91,7 @@ namespace OpenSim.Framework | |||
91 | string[] parts = str.Split(','); | 91 | string[] parts = str.Split(','); |
92 | if (parts.Length != 3) | 92 | if (parts.Length != 3) |
93 | throw new ArgumentException("Invalid string: " + str); | 93 | throw new ArgumentException("Invalid string: " + str); |
94 | 94 | ||
95 | SpawnPoint sp = new SpawnPoint(); | 95 | SpawnPoint sp = new SpawnPoint(); |
96 | sp.Yaw = float.Parse(parts[0]); | 96 | sp.Yaw = float.Parse(parts[0]); |
97 | sp.Pitch = float.Parse(parts[1]); | 97 | sp.Pitch = float.Parse(parts[1]); |
@@ -105,7 +105,7 @@ namespace OpenSim.Framework | |||
105 | public delegate void SaveDelegate(RegionSettings rs); | 105 | public delegate void SaveDelegate(RegionSettings rs); |
106 | 106 | ||
107 | public event SaveDelegate OnSave; | 107 | public event SaveDelegate OnSave; |
108 | 108 | ||
109 | /// <value> | 109 | /// <value> |
110 | /// These appear to be terrain textures that are shipped with the client. | 110 | /// These appear to be terrain textures that are shipped with the client. |
111 | /// </value> | 111 | /// </value> |
@@ -454,24 +454,24 @@ namespace OpenSim.Framework | |||
454 | get { return m_LoadedCreationDateTime; } | 454 | get { return m_LoadedCreationDateTime; } |
455 | set { m_LoadedCreationDateTime = value; } | 455 | set { m_LoadedCreationDateTime = value; } |
456 | } | 456 | } |
457 | 457 | ||
458 | public String LoadedCreationDate | 458 | public String LoadedCreationDate |
459 | { | 459 | { |
460 | get | 460 | get |
461 | { | 461 | { |
462 | TimeSpan ts = new TimeSpan(0, 0, LoadedCreationDateTime); | 462 | TimeSpan ts = new TimeSpan(0, 0, LoadedCreationDateTime); |
463 | DateTime stamp = new DateTime(1970, 1, 1) + ts; | 463 | DateTime stamp = new DateTime(1970, 1, 1) + ts; |
464 | return stamp.ToLongDateString(); | 464 | return stamp.ToLongDateString(); |
465 | } | 465 | } |
466 | } | 466 | } |
467 | 467 | ||
468 | public String LoadedCreationTime | 468 | public String LoadedCreationTime |
469 | { | 469 | { |
470 | get | 470 | get |
471 | { | 471 | { |
472 | TimeSpan ts = new TimeSpan(0, 0, LoadedCreationDateTime); | 472 | TimeSpan ts = new TimeSpan(0, 0, LoadedCreationDateTime); |
473 | DateTime stamp = new DateTime(1970, 1, 1) + ts; | 473 | DateTime stamp = new DateTime(1970, 1, 1) + ts; |
474 | return stamp.ToLongTimeString(); | 474 | return stamp.ToLongTimeString(); |
475 | } | 475 | } |
476 | } | 476 | } |
477 | 477 | ||
@@ -482,6 +482,28 @@ namespace OpenSim.Framework | |||
482 | set { m_LoadedCreationID = value; } | 482 | set { m_LoadedCreationID = value; } |
483 | } | 483 | } |
484 | 484 | ||
485 | private bool m_GodBlockSearch = false; | ||
486 | public bool GodBlockSearch | ||
487 | { | ||
488 | get { return m_GodBlockSearch; } | ||
489 | set { m_GodBlockSearch = value; } | ||
490 | } | ||
491 | |||
492 | private bool m_Casino = false; | ||
493 | public bool Casino | ||
494 | { | ||
495 | get { return m_Casino; } | ||
496 | set { m_Casino = value; } | ||
497 | } | ||
498 | |||
499 | // Telehub support | ||
500 | private bool m_TelehubEnabled = false; | ||
501 | public bool HasTelehub | ||
502 | { | ||
503 | get { return m_TelehubEnabled; } | ||
504 | set { m_TelehubEnabled = value; } | ||
505 | } | ||
506 | |||
485 | /// <summary> | 507 | /// <summary> |
486 | /// Connected Telehub object | 508 | /// Connected Telehub object |
487 | /// </summary> | 509 | /// </summary> |
@@ -520,4 +542,4 @@ namespace OpenSim.Framework | |||
520 | l_SpawnPoints.Clear(); | 542 | l_SpawnPoints.Clear(); |
521 | } | 543 | } |
522 | } | 544 | } |
523 | } \ No newline at end of file | 545 | } |
diff --git a/OpenSim/Framework/RestClient.cs b/OpenSim/Framework/RestClient.cs index 7080ca5..4939cf7 100644 --- a/OpenSim/Framework/RestClient.cs +++ b/OpenSim/Framework/RestClient.cs | |||
@@ -156,7 +156,7 @@ namespace OpenSim.Framework | |||
156 | public void Dispose() | 156 | public void Dispose() |
157 | { | 157 | { |
158 | Dispose(true); | 158 | Dispose(true); |
159 | GC.SuppressFinalize(this); | 159 | GC.SuppressFinalize(this); |
160 | } | 160 | } |
161 | 161 | ||
162 | protected virtual void Dispose(bool disposing) | 162 | protected virtual void Dispose(bool disposing) |
@@ -388,10 +388,10 @@ namespace OpenSim.Framework | |||
388 | m_log.Error(string.Format("[REST CLIENT] Error fetching resource from server: {0} ", _request.Address.ToString()), e); | 388 | m_log.Error(string.Format("[REST CLIENT] Error fetching resource from server: {0} ", _request.Address.ToString()), e); |
389 | } | 389 | } |
390 | } | 390 | } |
391 | |||
392 | return null; | 391 | return null; |
393 | } | 392 | } |
394 | 393 | ||
394 | |||
395 | if (_asyncException != null) | 395 | if (_asyncException != null) |
396 | throw _asyncException; | 396 | throw _asyncException; |
397 | 397 | ||
@@ -413,7 +413,7 @@ namespace OpenSim.Framework | |||
413 | _request = (HttpWebRequest) WebRequest.Create(buildUri()); | 413 | _request = (HttpWebRequest) WebRequest.Create(buildUri()); |
414 | _request.KeepAlive = false; | 414 | _request.KeepAlive = false; |
415 | _request.ContentType = "application/xml"; | 415 | _request.ContentType = "application/xml"; |
416 | _request.Timeout = 900000; | 416 | _request.Timeout = 90000; |
417 | _request.Method = RequestMethod; | 417 | _request.Method = RequestMethod; |
418 | _asyncException = null; | 418 | _asyncException = null; |
419 | _request.ContentLength = src.Length; | 419 | _request.ContentLength = src.Length; |
@@ -428,18 +428,23 @@ namespace OpenSim.Framework | |||
428 | if (WebUtil.DebugLevel >= 5) | 428 | if (WebUtil.DebugLevel >= 5) |
429 | WebUtil.LogOutgoingDetail(string.Format("SEND {0}: ", reqnum), src); | 429 | WebUtil.LogOutgoingDetail(string.Format("SEND {0}: ", reqnum), src); |
430 | 430 | ||
431 | Stream dst = _request.GetRequestStream(); | 431 | |
432 | |||
433 | byte[] buf = new byte[1024]; | ||
434 | int length = src.Read(buf, 0, 1024); | ||
435 | while (length > 0) | ||
436 | { | ||
437 | dst.Write(buf, 0, length); | ||
438 | length = src.Read(buf, 0, 1024); | ||
439 | } | ||
440 | |||
441 | try | 432 | try |
442 | { | 433 | { |
434 | using (Stream dst = _request.GetRequestStream()) | ||
435 | { | ||
436 | // m_log.Debug("[REST]: GetRequestStream is ok"); | ||
437 | |||
438 | byte[] buf = new byte[1024]; | ||
439 | int length = src.Read(buf, 0, 1024); | ||
440 | // m_log.Debug("[REST]: First Read is ok"); | ||
441 | while (length > 0) | ||
442 | { | ||
443 | dst.Write(buf, 0, length); | ||
444 | length = src.Read(buf, 0, 1024); | ||
445 | } | ||
446 | } | ||
447 | |||
443 | _response = (HttpWebResponse)_request.GetResponse(); | 448 | _response = (HttpWebResponse)_request.GetResponse(); |
444 | } | 449 | } |
445 | catch (WebException e) | 450 | catch (WebException e) |
@@ -468,7 +473,8 @@ namespace OpenSim.Framework | |||
468 | } | 473 | } |
469 | } | 474 | } |
470 | 475 | ||
471 | _response.Close(); | 476 | if (_response != null) |
477 | _response.Close(); | ||
472 | 478 | ||
473 | // IAsyncResult responseAsyncResult = _request.BeginGetResponse(new AsyncCallback(ResponseIsReadyDelegate), _request); | 479 | // IAsyncResult responseAsyncResult = _request.BeginGetResponse(new AsyncCallback(ResponseIsReadyDelegate), _request); |
474 | 480 | ||
@@ -673,4 +679,4 @@ namespace OpenSim.Framework | |||
673 | } | 679 | } |
674 | } | 680 | } |
675 | 681 | ||
676 | } \ No newline at end of file | 682 | } |
diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs index e66d5be..9458625 100644 --- a/OpenSim/Framework/SLUtil.cs +++ b/OpenSim/Framework/SLUtil.cs | |||
@@ -44,7 +44,7 @@ namespace OpenSim.Framework | |||
44 | Material = -2 | 44 | Material = -2 |
45 | } | 45 | } |
46 | 46 | ||
47 | 47 | ||
48 | #region SL / file extension / content-type conversions | 48 | #region SL / file extension / content-type conversions |
49 | 49 | ||
50 | /// <summary> | 50 | /// <summary> |
@@ -175,10 +175,10 @@ namespace OpenSim.Framework | |||
175 | new TypeMapping(AssetType.Folder, FolderType.CurrentOutfit, "application/vnd.ll.currentoutfitfolder", "currentoutfitfolder"), | 175 | new TypeMapping(AssetType.Folder, FolderType.CurrentOutfit, "application/vnd.ll.currentoutfitfolder", "currentoutfitfolder"), |
176 | new TypeMapping(AssetType.Folder, FolderType.Outfit, "application/vnd.ll.outfitfolder", "outfitfolder"), | 176 | new TypeMapping(AssetType.Folder, FolderType.Outfit, "application/vnd.ll.outfitfolder", "outfitfolder"), |
177 | new TypeMapping(AssetType.Folder, FolderType.MyOutfits, "application/vnd.ll.myoutfitsfolder", "myoutfitsfolder"), | 177 | new TypeMapping(AssetType.Folder, FolderType.MyOutfits, "application/vnd.ll.myoutfitsfolder", "myoutfitsfolder"), |
178 | 178 | ||
179 | // This next mappping is an asset to inventory item mapping. | 179 | // This next mappping is an asset to inventory item mapping. |
180 | // Note: LL stores folders as assets of type Folder = 8, and it has a corresponding InventoryType = 8 | 180 | // Note: LL stores folders as assets of type Folder = 8, and it has a corresponding InventoryType = 8 |
181 | // OpenSim doesn't store folders as assets, so this mapping should only be used when parsing things from the viewer to the server | 181 | // OpenSim doesn't store folders as assets, so this mapping should only be used when parsing things from the viewer to the server |
182 | new TypeMapping(AssetType.Folder, InventoryType.Folder, "application/vnd.ll.folder", "folder"), | 182 | new TypeMapping(AssetType.Folder, InventoryType.Folder, "application/vnd.ll.folder", "folder"), |
183 | 183 | ||
184 | // OpenSim specific | 184 | // OpenSim specific |
@@ -198,7 +198,7 @@ namespace OpenSim.Framework | |||
198 | inventory2Content = new Dictionary<sbyte, string>(); | 198 | inventory2Content = new Dictionary<sbyte, string>(); |
199 | content2Asset = new Dictionary<string, sbyte>(); | 199 | content2Asset = new Dictionary<string, sbyte>(); |
200 | content2Inventory = new Dictionary<string, sbyte>(); | 200 | content2Inventory = new Dictionary<string, sbyte>(); |
201 | 201 | ||
202 | foreach (TypeMapping mapping in MAPPINGS) | 202 | foreach (TypeMapping mapping in MAPPINGS) |
203 | { | 203 | { |
204 | sbyte assetType = mapping.AssetTypeCode; | 204 | sbyte assetType = mapping.AssetTypeCode; |
@@ -226,7 +226,7 @@ namespace OpenSim.Framework | |||
226 | } | 226 | } |
227 | } | 227 | } |
228 | } | 228 | } |
229 | 229 | ||
230 | public static string SLAssetTypeToContentType(int assetType) | 230 | public static string SLAssetTypeToContentType(int assetType) |
231 | { | 231 | { |
232 | string contentType; | 232 | string contentType; |
@@ -406,7 +406,7 @@ namespace OpenSim.Framework | |||
406 | if(data[0] == "inv_item") | 406 | if(data[0] == "inv_item") |
407 | { | 407 | { |
408 | skipInventoryItem(reader); | 408 | skipInventoryItem(reader); |
409 | } | 409 | } |
410 | else if (line.IndexOf('{') >= 0) | 410 | else if (line.IndexOf('{') >= 0) |
411 | { | 411 | { |
412 | throw new NotANotecardFormatException(reader.LineNumber); | 412 | throw new NotANotecardFormatException(reader.LineNumber); |
@@ -462,7 +462,7 @@ namespace OpenSim.Framework | |||
462 | { | 462 | { |
463 | int length = Int32.Parse(data[2]); | 463 | int length = Int32.Parse(data[2]); |
464 | notecardString = reader.getBlock(length); | 464 | notecardString = reader.getBlock(length); |
465 | } | 465 | } |
466 | else if (line.IndexOf('{') >= 0) | 466 | else if (line.IndexOf('{') >= 0) |
467 | { | 467 | { |
468 | throw new NotANotecardFormatException(reader.LineNumber); | 468 | throw new NotANotecardFormatException(reader.LineNumber); |
diff --git a/OpenSim/Framework/Serialization/ArchiveConstants.cs b/OpenSim/Framework/Serialization/ArchiveConstants.cs index ab3c285..9081411 100644 --- a/OpenSim/Framework/Serialization/ArchiveConstants.cs +++ b/OpenSim/Framework/Serialization/ArchiveConstants.cs | |||
@@ -72,12 +72,12 @@ namespace OpenSim.Framework.Serialization | |||
72 | /// Path for region settings. | 72 | /// Path for region settings. |
73 | /// </value> | 73 | /// </value> |
74 | public const string SETTINGS_PATH = "settings/"; | 74 | public const string SETTINGS_PATH = "settings/"; |
75 | 75 | ||
76 | /// <value> | 76 | /// <value> |
77 | /// Path for region settings. | 77 | /// Path for region settings. |
78 | /// </value> | 78 | /// </value> |
79 | public const string LANDDATA_PATH = "landdata/"; | 79 | public const string LANDDATA_PATH = "landdata/"; |
80 | 80 | ||
81 | /// <value> | 81 | /// <value> |
82 | /// Path for user profiles | 82 | /// Path for user profiles |
83 | /// </value> | 83 | /// </value> |
diff --git a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs index 55640ac..af130a5 100644 --- a/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs +++ b/OpenSim/Framework/Serialization/External/ExternalRepresentationUtils.cs | |||
@@ -106,13 +106,13 @@ namespace OpenSim.Framework.Serialization.External | |||
106 | { | 106 | { |
107 | errors = true; | 107 | errors = true; |
108 | parseExceptionAction(nodeToFill, nodeName, e); | 108 | parseExceptionAction(nodeToFill, nodeName, e); |
109 | 109 | ||
110 | if (xtr.EOF) | 110 | if (xtr.EOF) |
111 | { | 111 | { |
112 | m_log.Debug("[ExternalRepresentationUtils]: Aborting ExecuteReadProcessors due to unexpected end of XML"); | 112 | m_log.Debug("[ExternalRepresentationUtils]: Aborting ExecuteReadProcessors due to unexpected end of XML"); |
113 | break; | 113 | break; |
114 | } | 114 | } |
115 | 115 | ||
116 | if (++numErrors == 10) | 116 | if (++numErrors == 10) |
117 | { | 117 | { |
118 | m_log.Debug("[ExternalRepresentationUtils]: Aborting ExecuteReadProcessors due to too many parsing errors"); | 118 | m_log.Debug("[ExternalRepresentationUtils]: Aborting ExecuteReadProcessors due to too many parsing errors"); |
@@ -156,6 +156,7 @@ namespace OpenSim.Framework.Serialization.External | |||
156 | return xml; | 156 | return xml; |
157 | 157 | ||
158 | XmlDocument doc = new XmlDocument(); | 158 | XmlDocument doc = new XmlDocument(); |
159 | doc.XmlResolver=null; | ||
159 | doc.LoadXml(xml); | 160 | doc.LoadXml(xml); |
160 | XmlNodeList sops = doc.GetElementsByTagName("SceneObjectPart"); | 161 | XmlNodeList sops = doc.GetElementsByTagName("SceneObjectPart"); |
161 | 162 | ||
@@ -220,7 +221,7 @@ namespace OpenSim.Framework.Serialization.External | |||
220 | using (StringWriter sw = new StringWriter()) | 221 | using (StringWriter sw = new StringWriter()) |
221 | using (XmlTextWriter writer = new XmlTextWriter(sw)) | 222 | using (XmlTextWriter writer = new XmlTextWriter(sw)) |
222 | using (XmlTextReader wrappedReader = new XmlTextReader(xmlData, XmlNodeType.Element, null)) | 223 | using (XmlTextReader wrappedReader = new XmlTextReader(xmlData, XmlNodeType.Element, null)) |
223 | using (XmlReader reader = XmlReader.Create(wrappedReader, new XmlReaderSettings() { IgnoreWhitespace = true, ConformanceLevel = ConformanceLevel.Fragment })) | 224 | using (XmlReader reader = XmlReader.Create(wrappedReader, new XmlReaderSettings() { IgnoreWhitespace = true, ConformanceLevel = ConformanceLevel.Fragment, ProhibitDtd = true})) |
224 | { | 225 | { |
225 | TransformXml(reader, writer, sceneName, homeURL, userService, scopeID); | 226 | TransformXml(reader, writer, sceneName, homeURL, userService, scopeID); |
226 | 227 | ||
@@ -369,7 +370,7 @@ namespace OpenSim.Framework.Serialization.External | |||
369 | break; | 370 | break; |
370 | 371 | ||
371 | case XmlNodeType.XmlDeclaration: | 372 | case XmlNodeType.XmlDeclaration: |
372 | // For various reasons, not all serializations have xml declarations (or consistent ones) | 373 | // For various reasons, not all serializations have xml declarations (or consistent ones) |
373 | // and as it's embedded inside a byte stream we don't need it anyway, so ignore. | 374 | // and as it's embedded inside a byte stream we don't need it anyway, so ignore. |
374 | break; | 375 | break; |
375 | 376 | ||
diff --git a/OpenSim/Framework/Serialization/External/LandDataSerializer.cs b/OpenSim/Framework/Serialization/External/LandDataSerializer.cs index e42d56f..33ffd83 100644 --- a/OpenSim/Framework/Serialization/External/LandDataSerializer.cs +++ b/OpenSim/Framework/Serialization/External/LandDataSerializer.cs | |||
@@ -178,6 +178,7 @@ namespace OpenSim.Framework.Serialization.External | |||
178 | 178 | ||
179 | using (XmlTextReader reader = new XmlTextReader(new StringReader(serializedLandData))) | 179 | using (XmlTextReader reader = new XmlTextReader(new StringReader(serializedLandData))) |
180 | { | 180 | { |
181 | reader.ProhibitDtd = true; | ||
181 | reader.ReadStartElement("LandData"); | 182 | reader.ReadStartElement("LandData"); |
182 | 183 | ||
183 | ExternalRepresentationUtils.ExecuteReadProcessors<LandData>(landData, m_ldProcessors, reader); | 184 | ExternalRepresentationUtils.ExecuteReadProcessors<LandData>(landData, m_ldProcessors, reader); |
diff --git a/OpenSim/Framework/Serialization/External/OspResolver.cs b/OpenSim/Framework/Serialization/External/OspResolver.cs index fa7160f..a1e9d55 100644 --- a/OpenSim/Framework/Serialization/External/OspResolver.cs +++ b/OpenSim/Framework/Serialization/External/OspResolver.cs | |||
@@ -35,13 +35,13 @@ using OpenSim.Services.Interfaces; | |||
35 | namespace OpenSim.Framework.Serialization | 35 | namespace OpenSim.Framework.Serialization |
36 | { | 36 | { |
37 | /// <summary> | 37 | /// <summary> |
38 | /// Resolves OpenSim Profile Anchors (OSPA). An OSPA is a string used to provide information for | 38 | /// Resolves OpenSim Profile Anchors (OSPA). An OSPA is a string used to provide information for |
39 | /// identifying user profiles or supplying a simple name if no profile is available. | 39 | /// identifying user profiles or supplying a simple name if no profile is available. |
40 | /// </summary> | 40 | /// </summary> |
41 | public class OspResolver | 41 | public class OspResolver |
42 | { | 42 | { |
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
44 | 44 | ||
45 | public const string OSPA_PREFIX = "ospa:"; | 45 | public const string OSPA_PREFIX = "ospa:"; |
46 | public const string OSPA_NAME_KEY = "n"; | 46 | public const string OSPA_NAME_KEY = "n"; |
47 | public const string OSPA_NAME_VALUE_SEPARATOR = " "; | 47 | public const string OSPA_NAME_VALUE_SEPARATOR = " "; |
@@ -76,7 +76,7 @@ namespace OpenSim.Framework.Serialization | |||
76 | 76 | ||
77 | return null; | 77 | return null; |
78 | } | 78 | } |
79 | 79 | ||
80 | /// <summary> | 80 | /// <summary> |
81 | /// Make an OSPA given a user name | 81 | /// Make an OSPA given a user name |
82 | /// </summary> | 82 | /// </summary> |
@@ -89,17 +89,17 @@ namespace OpenSim.Framework.Serialization | |||
89 | 89 | ||
90 | // m_log.DebugFormat("[OSP RESOLVER]: Made OSPA {0} for {1} {2}", ospa, firstName, lastName); | 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); | 91 | // System.Console.WriteLine("[OSP RESOLVER]: Made OSPA {0} for {1} {2}", ospa, firstName, lastName); |
92 | 92 | ||
93 | return ospa; | 93 | return ospa; |
94 | } | 94 | } |
95 | 95 | ||
96 | /// <summary> | 96 | /// <summary> |
97 | /// Resolve an osp string into the most suitable internal OpenSim identifier. | 97 | /// Resolve an osp string into the most suitable internal OpenSim identifier. |
98 | /// </summary> | 98 | /// </summary> |
99 | /// | 99 | /// |
100 | /// In some cases this will be a UUID if a suitable profile exists on the system. In other cases, this may | 100 | /// In some cases this will be a UUID if a suitable profile exists on the system. In other cases, this may |
101 | /// just return the same identifier after creating a temporary profile. | 101 | /// just return the same identifier after creating a temporary profile. |
102 | /// | 102 | /// |
103 | /// <param name="ospa"></param> | 103 | /// <param name="ospa"></param> |
104 | /// <param name="commsManager"></param> | 104 | /// <param name="commsManager"></param> |
105 | /// <returns> | 105 | /// <returns> |
@@ -111,14 +111,14 @@ namespace OpenSim.Framework.Serialization | |||
111 | if (!ospa.StartsWith(OSPA_PREFIX)) | 111 | if (!ospa.StartsWith(OSPA_PREFIX)) |
112 | { | 112 | { |
113 | // m_log.DebugFormat("[OSP RESOLVER]: ResolveOspa() got unrecognized format [{0}]", ospa); | 113 | // m_log.DebugFormat("[OSP RESOLVER]: ResolveOspa() got unrecognized format [{0}]", ospa); |
114 | return UUID.Zero; | 114 | return UUID.Zero; |
115 | } | 115 | } |
116 | 116 | ||
117 | // m_log.DebugFormat("[OSP RESOLVER]: Resolving {0}", ospa); | 117 | // m_log.DebugFormat("[OSP RESOLVER]: Resolving {0}", ospa); |
118 | 118 | ||
119 | string ospaMeat = ospa.Substring(OSPA_PREFIX.Length); | 119 | string ospaMeat = ospa.Substring(OSPA_PREFIX.Length); |
120 | string[] ospaTuples = ospaMeat.Split(OSPA_TUPLE_SEPARATOR_ARRAY); | 120 | string[] ospaTuples = ospaMeat.Split(OSPA_TUPLE_SEPARATOR_ARRAY); |
121 | 121 | ||
122 | foreach (string tuple in ospaTuples) | 122 | foreach (string tuple in ospaTuples) |
123 | { | 123 | { |
124 | int tupleSeparatorIndex = tuple.IndexOf(OSPA_PAIR_SEPARATOR); | 124 | int tupleSeparatorIndex = tuple.IndexOf(OSPA_PAIR_SEPARATOR); |
@@ -128,17 +128,17 @@ namespace OpenSim.Framework.Serialization | |||
128 | m_log.WarnFormat("[OSP RESOLVER]: Ignoring non-tuple component {0} in OSPA {1}", tuple, ospa); | 128 | m_log.WarnFormat("[OSP RESOLVER]: Ignoring non-tuple component {0} in OSPA {1}", tuple, ospa); |
129 | continue; | 129 | continue; |
130 | } | 130 | } |
131 | 131 | ||
132 | string key = tuple.Remove(tupleSeparatorIndex).Trim(); | 132 | string key = tuple.Remove(tupleSeparatorIndex).Trim(); |
133 | string value = tuple.Substring(tupleSeparatorIndex + 1).Trim(); | 133 | string value = tuple.Substring(tupleSeparatorIndex + 1).Trim(); |
134 | 134 | ||
135 | if (OSPA_NAME_KEY == key) | 135 | if (OSPA_NAME_KEY == key) |
136 | return ResolveOspaName(value, userService); | 136 | return ResolveOspaName(value, userService); |
137 | } | 137 | } |
138 | 138 | ||
139 | return UUID.Zero; | 139 | return UUID.Zero; |
140 | } | 140 | } |
141 | 141 | ||
142 | /// <summary> | 142 | /// <summary> |
143 | /// Hash a profile name into a UUID | 143 | /// Hash a profile name into a UUID |
144 | /// </summary> | 144 | /// </summary> |
@@ -148,7 +148,7 @@ namespace OpenSim.Framework.Serialization | |||
148 | { | 148 | { |
149 | return new UUID(Utils.MD5(Encoding.Unicode.GetBytes(name)), 0); | 149 | return new UUID(Utils.MD5(Encoding.Unicode.GetBytes(name)), 0); |
150 | } | 150 | } |
151 | 151 | ||
152 | /// <summary> | 152 | /// <summary> |
153 | /// Resolve an OSPI name by querying existing persistent user profiles. If there is no persistent user profile | 153 | /// Resolve an OSPI name by querying existing persistent user profiles. If there is no persistent user profile |
154 | /// then a temporary user profile is inserted in the cache. | 154 | /// then a temporary user profile is inserted in the cache. |
@@ -164,13 +164,13 @@ namespace OpenSim.Framework.Serialization | |||
164 | return UUID.Zero; | 164 | return UUID.Zero; |
165 | 165 | ||
166 | int nameSeparatorIndex = name.IndexOf(OSPA_NAME_VALUE_SEPARATOR); | 166 | int nameSeparatorIndex = name.IndexOf(OSPA_NAME_VALUE_SEPARATOR); |
167 | 167 | ||
168 | if (nameSeparatorIndex < 0) | 168 | if (nameSeparatorIndex < 0) |
169 | { | 169 | { |
170 | m_log.WarnFormat("[OSP RESOLVER]: Ignoring unseparated name {0}", name); | 170 | m_log.WarnFormat("[OSP RESOLVER]: Ignoring unseparated name {0}", name); |
171 | return UUID.Zero; | 171 | return UUID.Zero; |
172 | } | 172 | } |
173 | 173 | ||
174 | string firstName = name.Remove(nameSeparatorIndex).TrimEnd(); | 174 | string firstName = name.Remove(nameSeparatorIndex).TrimEnd(); |
175 | string lastName = name.Substring(nameSeparatorIndex + 1).TrimStart(); | 175 | string lastName = name.Substring(nameSeparatorIndex + 1).TrimStart(); |
176 | 176 | ||
@@ -178,14 +178,14 @@ namespace OpenSim.Framework.Serialization | |||
178 | if (account != null) | 178 | if (account != null) |
179 | { | 179 | { |
180 | // m_log.DebugFormat( | 180 | // m_log.DebugFormat( |
181 | // "[OSP RESOLVER]: Found user account with uuid {0} for {1} {2}", | 181 | // "[OSP RESOLVER]: Found user account with uuid {0} for {1} {2}", |
182 | // account.PrincipalID, firstName, lastName); | 182 | // account.PrincipalID, firstName, lastName); |
183 | 183 | ||
184 | return account.PrincipalID; | 184 | return account.PrincipalID; |
185 | } | 185 | } |
186 | // else | 186 | // else |
187 | // { | 187 | // { |
188 | // m_log.DebugFormat("[OSP RESOLVER]: No resolved OSPA user account for {0}", name); | 188 | // m_log.DebugFormat("[OSP RESOLVER]: No resolved OSPA user account for {0}", name); |
189 | // } | 189 | // } |
190 | 190 | ||
191 | // XXX: Disable temporary user profile creation for now as implementation is incomplete - justincc | 191 | // XXX: Disable temporary user profile creation for now as implementation is incomplete - justincc |
@@ -194,11 +194,11 @@ namespace OpenSim.Framework.Serialization | |||
194 | tempUserProfile.FirstName = firstName; | 194 | tempUserProfile.FirstName = firstName; |
195 | tempUserProfile.SurName = lastName; | 195 | tempUserProfile.SurName = lastName; |
196 | tempUserProfile.ID = HashName(tempUserProfile.Name); | 196 | tempUserProfile.ID = HashName(tempUserProfile.Name); |
197 | 197 | ||
198 | m_log.DebugFormat( | 198 | m_log.DebugFormat( |
199 | "[OSP RESOLVER]: Adding temporary user profile for {0} {1}", tempUserProfile.Name, tempUserProfile.ID); | 199 | "[OSP RESOLVER]: Adding temporary user profile for {0} {1}", tempUserProfile.Name, tempUserProfile.ID); |
200 | commsManager.UserService.AddTemporaryUserProfile(tempUserProfile); | 200 | commsManager.UserService.AddTemporaryUserProfile(tempUserProfile); |
201 | 201 | ||
202 | return tempUserProfile.ID; | 202 | return tempUserProfile.ID; |
203 | */ | 203 | */ |
204 | 204 | ||
diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index 19468c3..fd21f3e 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs | |||
@@ -50,7 +50,7 @@ namespace OpenSim.Framework.Serialization.External | |||
50 | { | 50 | { |
51 | return Deserialize(Encoding.ASCII.GetString(serializedSettings, 0, serializedSettings.Length)); | 51 | return Deserialize(Encoding.ASCII.GetString(serializedSettings, 0, serializedSettings.Length)); |
52 | } | 52 | } |
53 | 53 | ||
54 | /// <summary> | 54 | /// <summary> |
55 | /// Deserialize settings | 55 | /// Deserialize settings |
56 | /// </summary> | 56 | /// </summary> |
@@ -60,14 +60,15 @@ namespace OpenSim.Framework.Serialization.External | |||
60 | public static RegionSettings Deserialize(string serializedSettings) | 60 | public static RegionSettings Deserialize(string serializedSettings) |
61 | { | 61 | { |
62 | RegionSettings settings = new RegionSettings(); | 62 | RegionSettings settings = new RegionSettings(); |
63 | 63 | ||
64 | StringReader sr = new StringReader(serializedSettings); | 64 | StringReader sr = new StringReader(serializedSettings); |
65 | XmlTextReader xtr = new XmlTextReader(sr); | 65 | XmlTextReader xtr = new XmlTextReader(sr); |
66 | 66 | xtr.ProhibitDtd = true; | |
67 | |||
67 | xtr.ReadStartElement("RegionSettings"); | 68 | xtr.ReadStartElement("RegionSettings"); |
68 | 69 | ||
69 | xtr.ReadStartElement("General"); | 70 | xtr.ReadStartElement("General"); |
70 | 71 | ||
71 | while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) | 72 | while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) |
72 | { | 73 | { |
73 | switch (xtr.Name) | 74 | switch (xtr.Name) |
@@ -113,10 +114,10 @@ namespace OpenSim.Framework.Serialization.External | |||
113 | break; | 114 | break; |
114 | } | 115 | } |
115 | } | 116 | } |
116 | 117 | ||
117 | xtr.ReadEndElement(); | 118 | xtr.ReadEndElement(); |
118 | xtr.ReadStartElement("GroundTextures"); | 119 | xtr.ReadStartElement("GroundTextures"); |
119 | 120 | ||
120 | while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) | 121 | while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) |
121 | { | 122 | { |
122 | switch (xtr.Name) | 123 | switch (xtr.Name) |
@@ -159,10 +160,10 @@ namespace OpenSim.Framework.Serialization.External | |||
159 | break; | 160 | break; |
160 | } | 161 | } |
161 | } | 162 | } |
162 | 163 | ||
163 | xtr.ReadEndElement(); | 164 | xtr.ReadEndElement(); |
164 | xtr.ReadStartElement("Terrain"); | 165 | xtr.ReadStartElement("Terrain"); |
165 | 166 | ||
166 | while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) | 167 | while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) |
167 | { | 168 | { |
168 | switch (xtr.Name) | 169 | switch (xtr.Name) |
@@ -212,19 +213,19 @@ namespace OpenSim.Framework.Serialization.External | |||
212 | 213 | ||
213 | xtr.Close(); | 214 | xtr.Close(); |
214 | sr.Close(); | 215 | sr.Close(); |
215 | 216 | ||
216 | return settings; | 217 | return settings; |
217 | } | 218 | } |
218 | 219 | ||
219 | public static string Serialize(RegionSettings settings) | 220 | public static string Serialize(RegionSettings settings) |
220 | { | 221 | { |
221 | StringWriter sw = new StringWriter(); | 222 | StringWriter sw = new StringWriter(); |
222 | XmlTextWriter xtw = new XmlTextWriter(sw); | 223 | XmlTextWriter xtw = new XmlTextWriter(sw); |
223 | xtw.Formatting = Formatting.Indented; | 224 | xtw.Formatting = Formatting.Indented; |
224 | xtw.WriteStartDocument(); | 225 | xtw.WriteStartDocument(); |
225 | 226 | ||
226 | xtw.WriteStartElement("RegionSettings"); | 227 | xtw.WriteStartElement("RegionSettings"); |
227 | 228 | ||
228 | xtw.WriteStartElement("General"); | 229 | xtw.WriteStartElement("General"); |
229 | xtw.WriteElementString("AllowDamage", settings.AllowDamage.ToString()); | 230 | xtw.WriteElementString("AllowDamage", settings.AllowDamage.ToString()); |
230 | xtw.WriteElementString("AllowLandResell", settings.AllowLandResell.ToString()); | 231 | xtw.WriteElementString("AllowLandResell", settings.AllowLandResell.ToString()); |
@@ -255,7 +256,7 @@ namespace OpenSim.Framework.Serialization.External | |||
255 | xtw.WriteElementString("ElevationHighSE", settings.Elevation2SE.ToString()); | 256 | xtw.WriteElementString("ElevationHighSE", settings.Elevation2SE.ToString()); |
256 | xtw.WriteElementString("ElevationHighNE", settings.Elevation2NE.ToString()); | 257 | xtw.WriteElementString("ElevationHighNE", settings.Elevation2NE.ToString()); |
257 | xtw.WriteEndElement(); | 258 | xtw.WriteEndElement(); |
258 | 259 | ||
259 | xtw.WriteStartElement("Terrain"); | 260 | xtw.WriteStartElement("Terrain"); |
260 | xtw.WriteElementString("WaterHeight", settings.WaterHeight.ToString()); | 261 | xtw.WriteElementString("WaterHeight", settings.WaterHeight.ToString()); |
261 | xtw.WriteElementString("TerrainRaiseLimit", settings.TerrainRaiseLimit.ToString()); | 262 | xtw.WriteElementString("TerrainRaiseLimit", settings.TerrainRaiseLimit.ToString()); |
@@ -275,12 +276,12 @@ namespace OpenSim.Framework.Serialization.External | |||
275 | xtw.WriteElementString("SpawnPoint", sp.ToString()); | 276 | xtw.WriteElementString("SpawnPoint", sp.ToString()); |
276 | } | 277 | } |
277 | xtw.WriteEndElement(); | 278 | xtw.WriteEndElement(); |
278 | 279 | ||
279 | xtw.WriteEndElement(); | 280 | xtw.WriteEndElement(); |
280 | 281 | ||
281 | xtw.Close(); | 282 | xtw.Close(); |
282 | sw.Close(); | 283 | sw.Close(); |
283 | 284 | ||
284 | return sw.ToString(); | 285 | return sw.ToString(); |
285 | } | 286 | } |
286 | } | 287 | } |
diff --git a/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs b/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs index 994cede..12194ad 100644 --- a/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs +++ b/OpenSim/Framework/Serialization/External/UserInventoryItemSerializer.cs | |||
@@ -36,9 +36,9 @@ using log4net; | |||
36 | using OpenMetaverse; | 36 | using OpenMetaverse; |
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Services.Interfaces; | 38 | using OpenSim.Services.Interfaces; |
39 | 39 | ||
40 | namespace OpenSim.Framework.Serialization.External | 40 | namespace OpenSim.Framework.Serialization.External |
41 | { | 41 | { |
42 | /// <summary> | 42 | /// <summary> |
43 | /// Serialize and deserialize user inventory items as an external format. | 43 | /// Serialize and deserialize user inventory items as an external format. |
44 | /// </summary> | 44 | /// </summary> |
@@ -49,14 +49,14 @@ namespace OpenSim.Framework.Serialization.External | |||
49 | private static Dictionary<string, Action<InventoryItemBase, XmlReader>> m_InventoryItemXmlProcessors | 49 | private static Dictionary<string, Action<InventoryItemBase, XmlReader>> m_InventoryItemXmlProcessors |
50 | = new Dictionary<string, Action<InventoryItemBase, XmlReader>>(); | 50 | = new Dictionary<string, Action<InventoryItemBase, XmlReader>>(); |
51 | 51 | ||
52 | #region InventoryItemBase Processor initialization | 52 | #region InventoryItemBase Processor initialization |
53 | static UserInventoryItemSerializer() | 53 | static UserInventoryItemSerializer() |
54 | { | 54 | { |
55 | m_InventoryItemXmlProcessors.Add("Name", ProcessName); | 55 | m_InventoryItemXmlProcessors.Add("Name", ProcessName); |
56 | m_InventoryItemXmlProcessors.Add("ID", ProcessID); | 56 | m_InventoryItemXmlProcessors.Add("ID", ProcessID); |
57 | m_InventoryItemXmlProcessors.Add("InvType", ProcessInvType); | 57 | m_InventoryItemXmlProcessors.Add("InvType", ProcessInvType); |
58 | m_InventoryItemXmlProcessors.Add("CreatorUUID", ProcessCreatorUUID); | 58 | m_InventoryItemXmlProcessors.Add("CreatorUUID", ProcessCreatorUUID); |
59 | m_InventoryItemXmlProcessors.Add("CreatorID", ProcessCreatorID); | 59 | m_InventoryItemXmlProcessors.Add("CreatorID", ProcessCreatorID); |
60 | m_InventoryItemXmlProcessors.Add("CreatorData", ProcessCreatorData); | 60 | m_InventoryItemXmlProcessors.Add("CreatorData", ProcessCreatorData); |
61 | m_InventoryItemXmlProcessors.Add("CreationDate", ProcessCreationDate); | 61 | m_InventoryItemXmlProcessors.Add("CreationDate", ProcessCreationDate); |
62 | m_InventoryItemXmlProcessors.Add("Owner", ProcessOwner); | 62 | m_InventoryItemXmlProcessors.Add("Owner", ProcessOwner); |
@@ -73,7 +73,7 @@ namespace OpenSim.Framework.Serialization.External | |||
73 | m_InventoryItemXmlProcessors.Add("GroupID", ProcessGroupID); | 73 | m_InventoryItemXmlProcessors.Add("GroupID", ProcessGroupID); |
74 | m_InventoryItemXmlProcessors.Add("GroupOwned", ProcessGroupOwned); | 74 | m_InventoryItemXmlProcessors.Add("GroupOwned", ProcessGroupOwned); |
75 | } | 75 | } |
76 | #endregion | 76 | #endregion |
77 | 77 | ||
78 | #region InventoryItemBase Processors | 78 | #region InventoryItemBase Processors |
79 | private static void ProcessName(InventoryItemBase item, XmlReader reader) | 79 | private static void ProcessName(InventoryItemBase item, XmlReader reader) |
@@ -189,7 +189,7 @@ namespace OpenSim.Framework.Serialization.External | |||
189 | { | 189 | { |
190 | return Deserialize(Encoding.ASCII.GetString(serialization, 0, serialization.Length)); | 190 | return Deserialize(Encoding.ASCII.GetString(serialization, 0, serialization.Length)); |
191 | } | 191 | } |
192 | 192 | ||
193 | /// <summary> | 193 | /// <summary> |
194 | /// Deserialize settings | 194 | /// Deserialize settings |
195 | /// </summary> | 195 | /// </summary> |
@@ -202,6 +202,8 @@ namespace OpenSim.Framework.Serialization.External | |||
202 | 202 | ||
203 | using (XmlTextReader reader = new XmlTextReader(new StringReader(serialization))) | 203 | using (XmlTextReader reader = new XmlTextReader(new StringReader(serialization))) |
204 | { | 204 | { |
205 | reader.ProhibitDtd = true; | ||
206 | |||
205 | reader.ReadStartElement("InventoryItem"); | 207 | reader.ReadStartElement("InventoryItem"); |
206 | 208 | ||
207 | ExternalRepresentationUtils.ExecuteReadProcessors<InventoryItemBase>( | 209 | ExternalRepresentationUtils.ExecuteReadProcessors<InventoryItemBase>( |
@@ -212,8 +214,8 @@ namespace OpenSim.Framework.Serialization.External | |||
212 | 214 | ||
213 | //m_log.DebugFormat("[XXX]: parsed InventoryItemBase {0} - {1}", obj.Name, obj.UUID); | 215 | //m_log.DebugFormat("[XXX]: parsed InventoryItemBase {0} - {1}", obj.Name, obj.UUID); |
214 | return item; | 216 | return item; |
215 | } | 217 | } |
216 | 218 | ||
217 | public static string Serialize(InventoryItemBase inventoryItem, Dictionary<string, object> options, IUserAccountService userAccountService) | 219 | public static string Serialize(InventoryItemBase inventoryItem, Dictionary<string, object> options, IUserAccountService userAccountService) |
218 | { | 220 | { |
219 | StringWriter sw = new StringWriter(); | 221 | StringWriter sw = new StringWriter(); |
@@ -294,11 +296,11 @@ namespace OpenSim.Framework.Serialization.External | |||
294 | } | 296 | } |
295 | 297 | ||
296 | writer.WriteEndElement(); | 298 | writer.WriteEndElement(); |
297 | 299 | ||
298 | writer.Close(); | 300 | writer.Close(); |
299 | sw.Close(); | 301 | sw.Close(); |
300 | 302 | ||
301 | return sw.ToString(); | 303 | return sw.ToString(); |
302 | } | 304 | } |
303 | } | 305 | } |
304 | } | 306 | } |
diff --git a/OpenSim/Framework/Serialization/External/UserProfileSerializer.cs b/OpenSim/Framework/Serialization/External/UserProfileSerializer.cs index c685a15..34eaa99 100644 --- a/OpenSim/Framework/Serialization/External/UserProfileSerializer.cs +++ b/OpenSim/Framework/Serialization/External/UserProfileSerializer.cs | |||
@@ -42,31 +42,31 @@ namespace OpenSim.Framework.Serialization.External | |||
42 | { | 42 | { |
43 | public const int MAJOR_VERSION = 0; | 43 | public const int MAJOR_VERSION = 0; |
44 | public const int MINOR_VERSION = 1; | 44 | public const int MINOR_VERSION = 1; |
45 | 45 | ||
46 | public static string Serialize(UUID userID, string firstName, string lastName) | 46 | public static string Serialize(UUID userID, string firstName, string lastName) |
47 | { | 47 | { |
48 | StringWriter sw = new StringWriter(); | 48 | StringWriter sw = new StringWriter(); |
49 | XmlTextWriter xtw = new XmlTextWriter(sw); | 49 | XmlTextWriter xtw = new XmlTextWriter(sw); |
50 | xtw.Formatting = Formatting.Indented; | 50 | xtw.Formatting = Formatting.Indented; |
51 | xtw.WriteStartDocument(); | 51 | xtw.WriteStartDocument(); |
52 | 52 | ||
53 | xtw.WriteStartElement("user_profile"); | 53 | xtw.WriteStartElement("user_profile"); |
54 | xtw.WriteAttributeString("major_version", MAJOR_VERSION.ToString()); | 54 | xtw.WriteAttributeString("major_version", MAJOR_VERSION.ToString()); |
55 | xtw.WriteAttributeString("minor_version", MINOR_VERSION.ToString()); | 55 | xtw.WriteAttributeString("minor_version", MINOR_VERSION.ToString()); |
56 | 56 | ||
57 | xtw.WriteElementString("name", firstName + " " + lastName); | 57 | xtw.WriteElementString("name", firstName + " " + lastName); |
58 | xtw.WriteElementString("id", userID.ToString()); | 58 | xtw.WriteElementString("id", userID.ToString()); |
59 | xtw.WriteElementString("about", ""); | 59 | xtw.WriteElementString("about", ""); |
60 | 60 | ||
61 | // Not sure if we're storing this yet, need to take a look | 61 | // Not sure if we're storing this yet, need to take a look |
62 | // xtw.WriteElementString("Url", profile.Url); | 62 | // xtw.WriteElementString("Url", profile.Url); |
63 | // or, indeed, interests | 63 | // or, indeed, interests |
64 | 64 | ||
65 | xtw.WriteEndElement(); | 65 | xtw.WriteEndElement(); |
66 | 66 | ||
67 | xtw.Close(); | 67 | xtw.Close(); |
68 | sw.Close(); | 68 | sw.Close(); |
69 | 69 | ||
70 | return sw.ToString(); | 70 | return sw.ToString(); |
71 | } | 71 | } |
72 | } | 72 | } |
diff --git a/OpenSim/Framework/Serialization/Properties/AssemblyInfo.cs b/OpenSim/Framework/Serialization/Properties/AssemblyInfo.cs index acec20f..7dfb87b 100644 --- a/OpenSim/Framework/Serialization/Properties/AssemblyInfo.cs +++ b/OpenSim/Framework/Serialization/Properties/AssemblyInfo.cs | |||
@@ -2,7 +2,7 @@ | |||
2 | using System.Runtime.CompilerServices; | 2 | using System.Runtime.CompilerServices; |
3 | using System.Runtime.InteropServices; | 3 | using System.Runtime.InteropServices; |
4 | 4 | ||
5 | // General Information about an assembly is controlled through the following | 5 | // General Information about an assembly is controlled through the following |
6 | // set of attributes. Change these attribute values to modify the information | 6 | // set of attributes. Change these attribute values to modify the information |
7 | // associated with an assembly. | 7 | // associated with an assembly. |
8 | [assembly: AssemblyTitle("OpenSim.Framework.Serialization")] | 8 | [assembly: AssemblyTitle("OpenSim.Framework.Serialization")] |
@@ -14,8 +14,8 @@ using System.Runtime.InteropServices; | |||
14 | [assembly: AssemblyTrademark("")] | 14 | [assembly: AssemblyTrademark("")] |
15 | [assembly: AssemblyCulture("")] | 15 | [assembly: AssemblyCulture("")] |
16 | 16 | ||
17 | // Setting ComVisible to false makes the types in this assembly not visible | 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 | 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. | 19 | // COM, set the ComVisible attribute to true on that type. |
20 | [assembly: ComVisible(false)] | 20 | [assembly: ComVisible(false)] |
21 | 21 | ||
@@ -25,9 +25,9 @@ using System.Runtime.InteropServices; | |||
25 | // Version information for an assembly consists of the following four values: | 25 | // Version information for an assembly consists of the following four values: |
26 | // | 26 | // |
27 | // Major Version | 27 | // Major Version |
28 | // Minor Version | 28 | // Minor Version |
29 | // Build Number | 29 | // Build Number |
30 | // Revision | 30 | // Revision |
31 | // | 31 | // |
32 | [assembly: AssemblyVersion("0.8.3.*")] | 32 | [assembly: AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] |
33 | 33 | ||
diff --git a/OpenSim/Framework/Serialization/TarArchiveWriter.cs b/OpenSim/Framework/Serialization/TarArchiveWriter.cs index 2a3bc48..a5c3d0a 100644 --- a/OpenSim/Framework/Serialization/TarArchiveWriter.cs +++ b/OpenSim/Framework/Serialization/TarArchiveWriter.cs | |||
@@ -113,7 +113,7 @@ namespace OpenSim.Framework.Serialization | |||
113 | lock (m_bw) | 113 | lock (m_bw) |
114 | { | 114 | { |
115 | m_bw.Write(finalZeroPadding); | 115 | m_bw.Write(finalZeroPadding); |
116 | 116 | ||
117 | m_bw.Flush(); | 117 | m_bw.Flush(); |
118 | m_bw.Close(); | 118 | m_bw.Close(); |
119 | } | 119 | } |
@@ -149,7 +149,7 @@ namespace OpenSim.Framework.Serialization | |||
149 | { | 149 | { |
150 | // m_log.DebugFormat( | 150 | // m_log.DebugFormat( |
151 | // "[TAR ARCHIVE WRITER]: Data for {0} is {1} bytes", filePath, (null == data ? "null" : data.Length.ToString())); | 151 | // "[TAR ARCHIVE WRITER]: Data for {0} is {1} bytes", filePath, (null == data ? "null" : data.Length.ToString())); |
152 | 152 | ||
153 | byte[] header = new byte[512]; | 153 | byte[] header = new byte[512]; |
154 | 154 | ||
155 | // file path field (100) | 155 | // file path field (100) |
@@ -208,18 +208,18 @@ namespace OpenSim.Framework.Serialization | |||
208 | { | 208 | { |
209 | // Write out header | 209 | // Write out header |
210 | m_bw.Write(header); | 210 | m_bw.Write(header); |
211 | 211 | ||
212 | // Write out data | 212 | // Write out data |
213 | // An IOException occurs if we try to write out an empty array in Mono 2.6 | 213 | // An IOException occurs if we try to write out an empty array in Mono 2.6 |
214 | if (data.Length > 0) | 214 | if (data.Length > 0) |
215 | m_bw.Write(data); | 215 | m_bw.Write(data); |
216 | 216 | ||
217 | if (data.Length % 512 != 0) | 217 | if (data.Length % 512 != 0) |
218 | { | 218 | { |
219 | int paddingRequired = 512 - (data.Length % 512); | 219 | int paddingRequired = 512 - (data.Length % 512); |
220 | 220 | ||
221 | //m_log.DebugFormat("[TAR ARCHIVE WRITER]: Padding data with {0} bytes", paddingRequired); | 221 | //m_log.DebugFormat("[TAR ARCHIVE WRITER]: Padding data with {0} bytes", paddingRequired); |
222 | 222 | ||
223 | byte[] padding = new byte[paddingRequired]; | 223 | byte[] padding = new byte[paddingRequired]; |
224 | m_bw.Write(padding); | 224 | m_bw.Write(padding); |
225 | } | 225 | } |
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 5ce978e..81dd357 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs | |||
@@ -65,11 +65,12 @@ namespace OpenSim.Framework.Servers | |||
65 | /// This will control a periodic log printout of the current 'show stats' (if they are active) for this | 65 | /// This will control a periodic log printout of the current 'show stats' (if they are active) for this |
66 | /// server. | 66 | /// server. |
67 | /// </summary> | 67 | /// </summary> |
68 | |||
68 | private int m_periodDiagnosticTimerMS = 60 * 60 * 1000; | 69 | private int m_periodDiagnosticTimerMS = 60 * 60 * 1000; |
69 | private Timer m_periodicDiagnosticsTimer = new Timer(60 * 60 * 1000); | 70 | private Timer m_periodicDiagnosticsTimer = new Timer(60 * 60 * 1000); |
70 | 71 | ||
71 | /// <summary> | 72 | /// <summary> |
72 | /// Random uuid for private data | 73 | /// Random uuid for private data |
73 | /// </summary> | 74 | /// </summary> |
74 | protected string m_osSecret = String.Empty; | 75 | protected string m_osSecret = String.Empty; |
75 | 76 | ||
@@ -83,9 +84,8 @@ namespace OpenSim.Framework.Servers | |||
83 | { | 84 | { |
84 | // Random uuid for private data | 85 | // Random uuid for private data |
85 | m_osSecret = UUID.Random().ToString(); | 86 | m_osSecret = UUID.Random().ToString(); |
86 | |||
87 | } | 87 | } |
88 | 88 | ||
89 | /// <summary> | 89 | /// <summary> |
90 | /// Must be overriden by child classes for their own server specific startup behaviour. | 90 | /// Must be overriden by child classes for their own server specific startup behaviour. |
91 | /// </summary> | 91 | /// </summary> |
@@ -104,26 +104,33 @@ namespace OpenSim.Framework.Servers | |||
104 | m_periodicDiagnosticsTimer.Interval = m_periodDiagnosticTimerMS; | 104 | m_periodicDiagnosticsTimer.Interval = m_periodDiagnosticTimerMS; |
105 | m_periodicDiagnosticsTimer.Enabled = true; | 105 | m_periodicDiagnosticsTimer.Enabled = true; |
106 | } | 106 | } |
107 | } | 107 | } |
108 | 108 | ||
109 | protected override void ShutdownSpecific() | 109 | protected override void ShutdownSpecific() |
110 | { | 110 | { |
111 | m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting..."); | 111 | Watchdog.Enabled = false; |
112 | base.ShutdownSpecific(); | ||
113 | |||
114 | MainServer.Stop(); | ||
115 | |||
116 | Thread.Sleep(5000); | ||
117 | Util.StopThreadPool(); | ||
118 | WorkManager.Stop(); | ||
112 | 119 | ||
120 | Thread.Sleep(1000); | ||
113 | RemovePIDFile(); | 121 | RemovePIDFile(); |
114 | 122 | ||
115 | base.ShutdownSpecific(); | 123 | m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting..."); |
116 | 124 | ||
117 | if (!SuppressExit) | 125 | if (!SuppressExit) |
118 | System.Diagnostics.Process.GetCurrentProcess().Kill(); | 126 | Environment.Exit(0); |
119 | //// Environment.Exit(0); | ||
120 | } | 127 | } |
121 | 128 | ||
122 | /// <summary> | 129 | /// <summary> |
123 | /// Provides a list of help topics that are available. Overriding classes should append their topics to the | 130 | /// Provides a list of help topics that are available. Overriding classes should append their topics to the |
124 | /// information returned when the base method is called. | 131 | /// information returned when the base method is called. |
125 | /// </summary> | 132 | /// </summary> |
126 | /// | 133 | /// |
127 | /// <returns> | 134 | /// <returns> |
128 | /// A list of strings that represent different help topics on which more information is available | 135 | /// A list of strings that represent different help topics on which more information is available |
129 | /// </returns> | 136 | /// </returns> |
@@ -147,20 +154,38 @@ namespace OpenSim.Framework.Servers | |||
147 | /// Performs initialisation of the scene, such as loading configuration from disk. | 154 | /// Performs initialisation of the scene, such as loading configuration from disk. |
148 | /// </summary> | 155 | /// </summary> |
149 | public virtual void Startup() | 156 | public virtual void Startup() |
150 | { | 157 | { |
151 | StartupSpecific(); | 158 | m_log.Info("[STARTUP]: Beginning startup processing"); |
152 | 159 | ||
160 | m_log.Info("[STARTUP]: version: " + m_version + Environment.NewLine); | ||
161 | // clr version potentially is more confusing than helpful, since it doesn't tell us if we're running under Mono/MS .NET and | ||
162 | // the clr version number doesn't match the project version number under Mono. | ||
163 | //m_log.Info("[STARTUP]: Virtual machine runtime version: " + Environment.Version + Environment.NewLine); | ||
164 | m_log.InfoFormat( | ||
165 | "[STARTUP]: Operating system version: {0}, .NET platform {1}, {2}-bit\n", | ||
166 | Environment.OSVersion, Environment.OSVersion.Platform, Util.Is64BitProcess() ? "64" : "32"); | ||
167 | |||
168 | try | ||
169 | { | ||
170 | StartupSpecific(); | ||
171 | } | ||
172 | catch(Exception e) | ||
173 | { | ||
174 | m_log.Fatal("Fatal error: " + e.ToString()); | ||
175 | Environment.Exit(1); | ||
176 | } | ||
177 | |||
153 | TimeSpan timeTaken = DateTime.Now - m_startuptime; | 178 | TimeSpan timeTaken = DateTime.Now - m_startuptime; |
154 | 179 | ||
155 | MainConsole.Instance.OutputFormat( | 180 | // MainConsole.Instance.OutputFormat( |
156 | "PLEASE WAIT FOR LOGINS TO BE ENABLED ON REGIONS ONCE SCRIPTS HAVE STARTED. Non-script portion of startup took {0}m {1}s.", | 181 | // "PLEASE WAIT FOR LOGINS TO BE ENABLED ON REGIONS ONCE SCRIPTS HAVE STARTED. Non-script portion of startup took {0}m {1}s.", |
157 | timeTaken.Minutes, timeTaken.Seconds); | 182 | // timeTaken.Minutes, timeTaken.Seconds); |
158 | } | 183 | } |
159 | 184 | ||
160 | public string osSecret | 185 | public string osSecret |
161 | { | 186 | { |
162 | // Secret uuid for the simulator | 187 | // Secret uuid for the simulator |
163 | get { return m_osSecret; } | 188 | get { return m_osSecret; } |
164 | } | 189 | } |
165 | 190 | ||
166 | public string StatReport(IOSHttpRequest httpRequest) | 191 | public string StatReport(IOSHttpRequest httpRequest) |
@@ -169,8 +194,8 @@ namespace OpenSim.Framework.Servers | |||
169 | if (httpRequest.Query.ContainsKey("callback")) | 194 | if (httpRequest.Query.ContainsKey("callback")) |
170 | { | 195 | { |
171 | return httpRequest.Query["callback"].ToString() + "(" + StatsManager.SimExtraStats.XReport((DateTime.Now - m_startuptime).ToString() , m_version) + ");"; | 196 | return httpRequest.Query["callback"].ToString() + "(" + StatsManager.SimExtraStats.XReport((DateTime.Now - m_startuptime).ToString() , m_version) + ");"; |
172 | } | 197 | } |
173 | else | 198 | else |
174 | { | 199 | { |
175 | return StatsManager.SimExtraStats.XReport((DateTime.Now - m_startuptime).ToString() , m_version); | 200 | return StatsManager.SimExtraStats.XReport((DateTime.Now - m_startuptime).ToString() , m_version); |
176 | } | 201 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index f252bd5..f4ba02f 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
58 | 58 | ||
59 | /// <summary> | 59 | /// <summary> |
60 | /// This is a pending websocket request before it got an sucessful upgrade response. | 60 | /// This is a pending websocket request before it got an sucessful upgrade response. |
61 | /// The consumer must call handler.HandshakeAndUpgrade() to signal to the handler to | 61 | /// The consumer must call handler.HandshakeAndUpgrade() to signal to the handler to |
62 | /// start the connection and optionally provide an origin authentication method. | 62 | /// start the connection and optionally provide an origin authentication method. |
63 | /// </summary> | 63 | /// </summary> |
64 | /// <param name="servicepath"></param> | 64 | /// <param name="servicepath"></param> |
@@ -104,7 +104,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
104 | new Dictionary<string, PollServiceEventArgs>(); | 104 | new Dictionary<string, PollServiceEventArgs>(); |
105 | 105 | ||
106 | protected Dictionary<string, WebSocketRequestDelegate> m_WebSocketHandlers = | 106 | protected Dictionary<string, WebSocketRequestDelegate> m_WebSocketHandlers = |
107 | new Dictionary<string, WebSocketRequestDelegate>(); | 107 | new Dictionary<string, WebSocketRequestDelegate>(); |
108 | 108 | ||
109 | protected uint m_port; | 109 | protected uint m_port; |
110 | protected uint m_sslport; | 110 | protected uint m_sslport; |
@@ -253,7 +253,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
253 | return new List<string>(m_rpcHandlers.Keys); | 253 | return new List<string>(m_rpcHandlers.Keys); |
254 | } | 254 | } |
255 | 255 | ||
256 | // JsonRPC | 256 | // JsonRPC |
257 | public bool AddJsonRPCHandler(string method, JsonRPCMethod handler) | 257 | public bool AddJsonRPCHandler(string method, JsonRPCMethod handler) |
258 | { | 258 | { |
259 | lock(jsonRpcHandlers) | 259 | lock(jsonRpcHandlers) |
@@ -399,10 +399,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
399 | 399 | ||
400 | Stream requestStream = req.InputStream; | 400 | Stream requestStream = req.InputStream; |
401 | 401 | ||
402 | string requestBody; | ||
402 | Encoding encoding = Encoding.UTF8; | 403 | Encoding encoding = Encoding.UTF8; |
403 | StreamReader reader = new StreamReader(requestStream, encoding); | 404 | using(StreamReader reader = new StreamReader(requestStream, encoding)) |
404 | 405 | requestBody = reader.ReadToEnd(); | |
405 | string requestBody = reader.ReadToEnd(); | ||
406 | 406 | ||
407 | Hashtable keysvals = new Hashtable(); | 407 | Hashtable keysvals = new Hashtable(); |
408 | Hashtable headervals = new Hashtable(); | 408 | Hashtable headervals = new Hashtable(); |
@@ -458,10 +458,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
458 | dWebSocketRequestDelegate(req.Url.AbsolutePath, new WebSocketHttpServerHandler(req, context, 8192)); | 458 | dWebSocketRequestDelegate(req.Url.AbsolutePath, new WebSocketHttpServerHandler(req, context, 8192)); |
459 | return; | 459 | return; |
460 | } | 460 | } |
461 | 461 | ||
462 | OSHttpResponse resp = new OSHttpResponse(new HttpResponse(context, request),context); | 462 | OSHttpResponse resp = new OSHttpResponse(new HttpResponse(context, request),context); |
463 | resp.ReuseContext = true; | 463 | resp.ReuseContext = true; |
464 | HandleRequest(req, resp); | 464 | // resp.ReuseContext = false; |
465 | HandleRequest(req, resp); | ||
465 | 466 | ||
466 | // !!!HACK ALERT!!! | 467 | // !!!HACK ALERT!!! |
467 | // There seems to be a bug in the underlying http code that makes subsequent requests | 468 | // There seems to be a bug in the underlying http code that makes subsequent requests |
@@ -552,7 +553,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
552 | LogIncomingToStreamHandler(request, requestHandler); | 553 | LogIncomingToStreamHandler(request, requestHandler); |
553 | 554 | ||
554 | response.ContentType = requestHandler.ContentType; // Lets do this defaulting before in case handler has varying content type. | 555 | response.ContentType = requestHandler.ContentType; // Lets do this defaulting before in case handler has varying content type. |
555 | 556 | ||
556 | if (requestHandler is IStreamedRequestHandler) | 557 | if (requestHandler is IStreamedRequestHandler) |
557 | { | 558 | { |
558 | IStreamedRequestHandler streamedRequestHandler = requestHandler as IStreamedRequestHandler; | 559 | IStreamedRequestHandler streamedRequestHandler = requestHandler as IStreamedRequestHandler; |
@@ -565,13 +566,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
565 | IGenericHTTPHandler HTTPRequestHandler = requestHandler as IGenericHTTPHandler; | 566 | IGenericHTTPHandler HTTPRequestHandler = requestHandler as IGenericHTTPHandler; |
566 | Stream requestStream = request.InputStream; | 567 | Stream requestStream = request.InputStream; |
567 | 568 | ||
569 | string requestBody; | ||
568 | Encoding encoding = Encoding.UTF8; | 570 | Encoding encoding = Encoding.UTF8; |
569 | StreamReader reader = new StreamReader(requestStream, encoding); | 571 | using(StreamReader reader = new StreamReader(requestStream, encoding)) |
570 | 572 | requestBody = reader.ReadToEnd(); | |
571 | string requestBody = reader.ReadToEnd(); | ||
572 | |||
573 | reader.Close(); | ||
574 | //requestStream.Close(); | ||
575 | 573 | ||
576 | Hashtable keysvals = new Hashtable(); | 574 | Hashtable keysvals = new Hashtable(); |
577 | Hashtable headervals = new Hashtable(); | 575 | Hashtable headervals = new Hashtable(); |
@@ -628,16 +626,16 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
628 | case "text/html": | 626 | case "text/html": |
629 | if (DebugLevel >= 3) | 627 | if (DebugLevel >= 3) |
630 | LogIncomingToContentTypeHandler(request); | 628 | LogIncomingToContentTypeHandler(request); |
631 | 629 | ||
632 | buffer = HandleHTTPRequest(request, response); | 630 | buffer = HandleHTTPRequest(request, response); |
633 | break; | 631 | break; |
634 | 632 | ||
635 | case "application/llsd+xml": | 633 | case "application/llsd+xml": |
636 | case "application/xml+llsd": | 634 | case "application/xml+llsd": |
637 | case "application/llsd+json": | 635 | case "application/llsd+json": |
638 | if (DebugLevel >= 3) | 636 | if (DebugLevel >= 3) |
639 | LogIncomingToContentTypeHandler(request); | 637 | LogIncomingToContentTypeHandler(request); |
640 | 638 | ||
641 | buffer = HandleLLSDRequests(request, response); | 639 | buffer = HandleLLSDRequests(request, response); |
642 | break; | 640 | break; |
643 | 641 | ||
@@ -647,7 +645,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
647 | 645 | ||
648 | buffer = HandleJsonRpcRequests(request, response); | 646 | buffer = HandleJsonRpcRequests(request, response); |
649 | break; | 647 | break; |
650 | 648 | ||
651 | case "text/xml": | 649 | case "text/xml": |
652 | case "application/xml": | 650 | case "application/xml": |
653 | case "application/json": | 651 | case "application/json": |
@@ -664,7 +662,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
664 | { | 662 | { |
665 | if (DebugLevel >= 3) | 663 | if (DebugLevel >= 3) |
666 | LogIncomingToContentTypeHandler(request); | 664 | LogIncomingToContentTypeHandler(request); |
667 | 665 | ||
668 | buffer = HandleLLSDRequests(request, response); | 666 | buffer = HandleLLSDRequests(request, response); |
669 | } | 667 | } |
670 | // m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); | 668 | // m_log.DebugFormat("[BASE HTTP SERVER]: Checking for HTTP Handler for request {0}", request.RawUrl); |
@@ -672,23 +670,24 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
672 | { | 670 | { |
673 | if (DebugLevel >= 3) | 671 | if (DebugLevel >= 3) |
674 | LogIncomingToContentTypeHandler(request); | 672 | LogIncomingToContentTypeHandler(request); |
675 | 673 | ||
676 | buffer = HandleHTTPRequest(request, response); | 674 | buffer = HandleHTTPRequest(request, response); |
677 | } | 675 | } |
678 | else | 676 | else |
679 | { | 677 | { |
680 | if (DebugLevel >= 3) | 678 | if (DebugLevel >= 3) |
681 | LogIncomingToXmlRpcHandler(request); | 679 | LogIncomingToXmlRpcHandler(request); |
682 | 680 | ||
683 | // generic login request. | 681 | // generic login request. |
684 | buffer = HandleXmlRpcRequests(request, response); | 682 | buffer = HandleXmlRpcRequests(request, response); |
685 | } | 683 | } |
686 | 684 | ||
687 | break; | 685 | break; |
688 | } | 686 | } |
689 | } | 687 | } |
690 | 688 | ||
691 | request.InputStream.Close(); | 689 | if(request.InputStream.CanRead) |
690 | request.InputStream.Dispose(); | ||
692 | 691 | ||
693 | if (buffer != null) | 692 | if (buffer != null) |
694 | { | 693 | { |
@@ -759,7 +758,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
759 | // Every month or so this will wrap and give bad numbers, not really a problem | 758 | // Every month or so this will wrap and give bad numbers, not really a problem |
760 | // since its just for reporting | 759 | // since its just for reporting |
761 | int tickdiff = requestEndTick - requestStartTick; | 760 | int tickdiff = requestEndTick - requestStartTick; |
762 | if (tickdiff > 3000 && requestHandler != null && requestHandler.Name != "GetTexture") | 761 | if (tickdiff > 3000 && (requestHandler == null || requestHandler.Name == null || requestHandler.Name != "GetTexture")) |
763 | { | 762 | { |
764 | m_log.InfoFormat( | 763 | m_log.InfoFormat( |
765 | "[LOGHTTP] Slow handling of {0} {1} {2} {3} {4} from {5} took {6}ms", | 764 | "[LOGHTTP] Slow handling of {0} {1} {2} {3} {4} from {5} took {6}ms", |
@@ -970,7 +969,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
970 | // private bool TryGetAgentHandler(OSHttpRequest request, OSHttpResponse response, out IHttpAgentHandler agentHandler) | 969 | // private bool TryGetAgentHandler(OSHttpRequest request, OSHttpResponse response, out IHttpAgentHandler agentHandler) |
971 | // { | 970 | // { |
972 | // agentHandler = null; | 971 | // agentHandler = null; |
973 | // | 972 | // |
974 | // lock (m_agentHandlers) | 973 | // lock (m_agentHandlers) |
975 | // { | 974 | // { |
976 | // foreach (IHttpAgentHandler handler in m_agentHandlers.Values) | 975 | // foreach (IHttpAgentHandler handler in m_agentHandlers.Values) |
@@ -996,7 +995,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
996 | { | 995 | { |
997 | String requestBody; | 996 | String requestBody; |
998 | 997 | ||
999 | Stream requestStream = request.InputStream; | 998 | Stream requestStream = Util.Copy(request.InputStream); |
1000 | Stream innerStream = null; | 999 | Stream innerStream = null; |
1001 | try | 1000 | try |
1002 | { | 1001 | { |
@@ -1007,9 +1006,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1007 | } | 1006 | } |
1008 | 1007 | ||
1009 | using (StreamReader reader = new StreamReader(requestStream, Encoding.UTF8)) | 1008 | using (StreamReader reader = new StreamReader(requestStream, Encoding.UTF8)) |
1010 | { | ||
1011 | requestBody = reader.ReadToEnd(); | 1009 | requestBody = reader.ReadToEnd(); |
1012 | } | 1010 | |
1013 | } | 1011 | } |
1014 | finally | 1012 | finally |
1015 | { | 1013 | { |
@@ -1024,6 +1022,19 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1024 | string responseString = String.Empty; | 1022 | string responseString = String.Empty; |
1025 | XmlRpcRequest xmlRprcRequest = null; | 1023 | XmlRpcRequest xmlRprcRequest = null; |
1026 | 1024 | ||
1025 | bool gridproxy = false; | ||
1026 | if (requestBody.Contains("encoding=\"utf-8")) | ||
1027 | { | ||
1028 | int channelindx = -1; | ||
1029 | int optionsindx = requestBody.IndexOf(">options<"); | ||
1030 | if(optionsindx >0) | ||
1031 | { | ||
1032 | channelindx = requestBody.IndexOf(">channel<"); | ||
1033 | if (optionsindx < channelindx) | ||
1034 | gridproxy = true; | ||
1035 | } | ||
1036 | } | ||
1037 | |||
1027 | try | 1038 | try |
1028 | { | 1039 | { |
1029 | xmlRprcRequest = (XmlRpcRequest) (new XmlRpcRequestDeserializer()).Deserialize(requestBody); | 1040 | xmlRprcRequest = (XmlRpcRequest) (new XmlRpcRequestDeserializer()).Deserialize(requestBody); |
@@ -1081,6 +1092,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1081 | } | 1092 | } |
1082 | xmlRprcRequest.Params.Add(request.Headers.Get(xff)); // Param[3] | 1093 | xmlRprcRequest.Params.Add(request.Headers.Get(xff)); // Param[3] |
1083 | 1094 | ||
1095 | if (gridproxy) | ||
1096 | xmlRprcRequest.Params.Add("gridproxy"); // Param[4] | ||
1084 | try | 1097 | try |
1085 | { | 1098 | { |
1086 | xmlRpcResponse = method(xmlRprcRequest, request.RemoteIPEndPoint); | 1099 | xmlRpcResponse = method(xmlRprcRequest, request.RemoteIPEndPoint); |
@@ -1154,7 +1167,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1154 | return buffer; | 1167 | return buffer; |
1155 | } | 1168 | } |
1156 | 1169 | ||
1157 | // JsonRpc (v2.0 only) | 1170 | // JsonRpc (v2.0 only) |
1158 | // Batch requests not yet supported | 1171 | // Batch requests not yet supported |
1159 | private byte[] HandleJsonRpcRequests(OSHttpRequest request, OSHttpResponse response) | 1172 | private byte[] HandleJsonRpcRequests(OSHttpRequest request, OSHttpResponse response) |
1160 | { | 1173 | { |
@@ -1171,7 +1184,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1171 | jsonRpcResponse.Error.Code = ErrorCode.InternalError; | 1184 | jsonRpcResponse.Error.Code = ErrorCode.InternalError; |
1172 | jsonRpcResponse.Error.Message = e.Message; | 1185 | jsonRpcResponse.Error.Message = e.Message; |
1173 | } | 1186 | } |
1174 | 1187 | ||
1175 | requestStream.Close(); | 1188 | requestStream.Close(); |
1176 | 1189 | ||
1177 | if (jsonRpcRequest != null) | 1190 | if (jsonRpcRequest != null) |
@@ -1236,7 +1249,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1236 | string responseData = string.Empty; | 1249 | string responseData = string.Empty; |
1237 | 1250 | ||
1238 | responseData = jsonRpcResponse.Serialize(); | 1251 | responseData = jsonRpcResponse.Serialize(); |
1239 | 1252 | ||
1240 | byte[] buffer = Encoding.UTF8.GetBytes(responseData); | 1253 | byte[] buffer = Encoding.UTF8.GetBytes(responseData); |
1241 | return buffer; | 1254 | return buffer; |
1242 | } | 1255 | } |
@@ -1246,12 +1259,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1246 | //m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request"); | 1259 | //m_log.Warn("[BASE HTTP SERVER]: We've figured out it's a LLSD Request"); |
1247 | Stream requestStream = request.InputStream; | 1260 | Stream requestStream = request.InputStream; |
1248 | 1261 | ||
1262 | string requestBody; | ||
1249 | Encoding encoding = Encoding.UTF8; | 1263 | Encoding encoding = Encoding.UTF8; |
1250 | StreamReader reader = new StreamReader(requestStream, encoding); | 1264 | using(StreamReader reader = new StreamReader(requestStream, encoding)) |
1251 | 1265 | requestBody= reader.ReadToEnd(); | |
1252 | string requestBody = reader.ReadToEnd(); | ||
1253 | reader.Close(); | ||
1254 | requestStream.Close(); | ||
1255 | 1266 | ||
1256 | //m_log.DebugFormat("[OGP]: {0}:{1}", request.RawUrl, requestBody); | 1267 | //m_log.DebugFormat("[OGP]: {0}:{1}", request.RawUrl, requestBody); |
1257 | response.KeepAlive = true; | 1268 | response.KeepAlive = true; |
@@ -1516,7 +1527,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1516 | } | 1527 | } |
1517 | } | 1528 | } |
1518 | } | 1529 | } |
1519 | 1530 | ||
1520 | if (String.IsNullOrEmpty(bestMatch)) | 1531 | if (String.IsNullOrEmpty(bestMatch)) |
1521 | { | 1532 | { |
1522 | llsdHandler = null; | 1533 | llsdHandler = null; |
@@ -1575,15 +1586,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1575 | byte[] buffer; | 1586 | byte[] buffer; |
1576 | 1587 | ||
1577 | Stream requestStream = request.InputStream; | 1588 | Stream requestStream = request.InputStream; |
1578 | 1589 | string requestBody; | |
1579 | Encoding encoding = Encoding.UTF8; | 1590 | Encoding encoding = Encoding.UTF8; |
1580 | StreamReader reader = new StreamReader(requestStream, encoding); | 1591 | using(StreamReader reader = new StreamReader(requestStream, encoding)) |
1581 | 1592 | requestBody = reader.ReadToEnd(); | |
1582 | string requestBody = reader.ReadToEnd(); | ||
1583 | // avoid warning for now | ||
1584 | reader.ReadToEnd(); | ||
1585 | reader.Close(); | ||
1586 | requestStream.Close(); | ||
1587 | 1593 | ||
1588 | Hashtable keysvals = new Hashtable(); | 1594 | Hashtable keysvals = new Hashtable(); |
1589 | Hashtable headervals = new Hashtable(); | 1595 | Hashtable headervals = new Hashtable(); |
@@ -1732,10 +1738,40 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1732 | 1738 | ||
1733 | internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) | 1739 | internal byte[] DoHTTPGruntWork(Hashtable responsedata, OSHttpResponse response) |
1734 | { | 1740 | { |
1735 | //m_log.Info("[BASE HTTP SERVER]: Doing HTTP Grunt work with response"); | 1741 | int responsecode; |
1736 | int responsecode = (int)responsedata["int_response_code"]; | 1742 | string responseString = String.Empty; |
1737 | string responseString = (string)responsedata["str_response_string"]; | 1743 | byte[] responseData = null; |
1738 | string contentType = (string)responsedata["content_type"]; | 1744 | string contentType; |
1745 | |||
1746 | if (responsedata == null) | ||
1747 | { | ||
1748 | responsecode = 500; | ||
1749 | responseString = "No response could be obtained"; | ||
1750 | contentType = "text/plain"; | ||
1751 | responsedata = new Hashtable(); | ||
1752 | } | ||
1753 | else | ||
1754 | { | ||
1755 | try | ||
1756 | { | ||
1757 | //m_log.Info("[BASE HTTP SERVER]: Doing HTTP Grunt work with response"); | ||
1758 | responsecode = (int)responsedata["int_response_code"]; | ||
1759 | if (responsedata["bin_response_data"] != null) | ||
1760 | responseData = (byte[])responsedata["bin_response_data"]; | ||
1761 | else | ||
1762 | responseString = (string)responsedata["str_response_string"]; | ||
1763 | contentType = (string)responsedata["content_type"]; | ||
1764 | if (responseString == null) | ||
1765 | responseString = String.Empty; | ||
1766 | } | ||
1767 | catch | ||
1768 | { | ||
1769 | responsecode = 500; | ||
1770 | responseString = "No response could be obtained"; | ||
1771 | contentType = "text/plain"; | ||
1772 | responsedata = new Hashtable(); | ||
1773 | } | ||
1774 | } | ||
1739 | 1775 | ||
1740 | if (responsedata.ContainsKey("error_status_text")) | 1776 | if (responsedata.ContainsKey("error_status_text")) |
1741 | { | 1777 | { |
@@ -1745,16 +1781,19 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1745 | { | 1781 | { |
1746 | response.ProtocolVersion = (string)responsedata["http_protocol_version"]; | 1782 | response.ProtocolVersion = (string)responsedata["http_protocol_version"]; |
1747 | } | 1783 | } |
1748 | 1784 | /* | |
1749 | if (responsedata.ContainsKey("keepalive")) | 1785 | if (responsedata.ContainsKey("keepalive")) |
1750 | { | 1786 | { |
1751 | bool keepalive = (bool)responsedata["keepalive"]; | 1787 | bool keepalive = (bool)responsedata["keepalive"]; |
1752 | response.KeepAlive = keepalive; | 1788 | response.KeepAlive = keepalive; |
1753 | |||
1754 | } | 1789 | } |
1755 | 1790 | ||
1756 | if (responsedata.ContainsKey("reusecontext")) | 1791 | if (responsedata.ContainsKey("reusecontext")) |
1757 | response.ReuseContext = (bool) responsedata["reusecontext"]; | 1792 | response.ReuseContext = (bool) responsedata["reusecontext"]; |
1793 | */ | ||
1794 | // disable this things | ||
1795 | response.KeepAlive = false; | ||
1796 | response.ReuseContext = false; | ||
1758 | 1797 | ||
1759 | // Cross-Origin Resource Sharing with simple requests | 1798 | // Cross-Origin Resource Sharing with simple requests |
1760 | if (responsedata.ContainsKey("access_control_allow_origin")) | 1799 | if (responsedata.ContainsKey("access_control_allow_origin")) |
@@ -1768,8 +1807,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1768 | contentType = "text/html"; | 1807 | contentType = "text/html"; |
1769 | } | 1808 | } |
1770 | 1809 | ||
1810 | |||
1811 | |||
1771 | // The client ignores anything but 200 here for web login, so ensure that this is 200 for that | 1812 | // The client ignores anything but 200 here for web login, so ensure that this is 200 for that |
1772 | 1813 | ||
1814 | |||
1773 | response.StatusCode = responsecode; | 1815 | response.StatusCode = responsecode; |
1774 | 1816 | ||
1775 | if (responsecode == (int)OSHttpStatusCode.RedirectMovedPermanently) | 1817 | if (responsecode == (int)OSHttpStatusCode.RedirectMovedPermanently) |
@@ -1780,25 +1822,40 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1780 | 1822 | ||
1781 | response.AddHeader("Content-Type", contentType); | 1823 | response.AddHeader("Content-Type", contentType); |
1782 | 1824 | ||
1825 | if (responsedata.ContainsKey("headers")) | ||
1826 | { | ||
1827 | Hashtable headerdata = (Hashtable)responsedata["headers"]; | ||
1828 | |||
1829 | foreach (string header in headerdata.Keys) | ||
1830 | response.AddHeader(header, headerdata[header].ToString()); | ||
1831 | } | ||
1832 | |||
1783 | byte[] buffer; | 1833 | byte[] buffer; |
1784 | 1834 | ||
1785 | if (!(contentType.Contains("image") | 1835 | if (responseData != null) |
1786 | || contentType.Contains("x-shockwave-flash") | ||
1787 | || contentType.Contains("application/x-oar") | ||
1788 | || contentType.Contains("application/vnd.ll.mesh"))) | ||
1789 | { | 1836 | { |
1790 | // Text | 1837 | buffer = responseData; |
1791 | buffer = Encoding.UTF8.GetBytes(responseString); | ||
1792 | } | 1838 | } |
1793 | else | 1839 | else |
1794 | { | 1840 | { |
1795 | // Binary! | 1841 | if (!(contentType.Contains("image") |
1796 | buffer = Convert.FromBase64String(responseString); | 1842 | || contentType.Contains("x-shockwave-flash") |
1797 | } | 1843 | || contentType.Contains("application/x-oar") |
1844 | || contentType.Contains("application/vnd.ll.mesh"))) | ||
1845 | { | ||
1846 | // Text | ||
1847 | buffer = Encoding.UTF8.GetBytes(responseString); | ||
1848 | } | ||
1849 | else | ||
1850 | { | ||
1851 | // Binary! | ||
1852 | buffer = Convert.FromBase64String(responseString); | ||
1853 | } | ||
1798 | 1854 | ||
1799 | response.SendChunked = false; | 1855 | response.SendChunked = false; |
1800 | response.ContentLength64 = buffer.Length; | 1856 | response.ContentLength64 = buffer.Length; |
1801 | response.ContentEncoding = Encoding.UTF8; | 1857 | response.ContentEncoding = Encoding.UTF8; |
1858 | } | ||
1802 | 1859 | ||
1803 | return buffer; | 1860 | return buffer; |
1804 | } | 1861 | } |
@@ -1831,8 +1888,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1831 | response.SendChunked = false; | 1888 | response.SendChunked = false; |
1832 | response.ContentLength64 = buffer.Length; | 1889 | response.ContentLength64 = buffer.Length; |
1833 | response.ContentEncoding = Encoding.UTF8; | 1890 | response.ContentEncoding = Encoding.UTF8; |
1834 | 1891 | ||
1835 | 1892 | ||
1836 | return buffer; | 1893 | return buffer; |
1837 | } | 1894 | } |
1838 | 1895 | ||
@@ -1886,7 +1943,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1886 | m_httpListener2.Start(64); | 1943 | m_httpListener2.Start(64); |
1887 | 1944 | ||
1888 | // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events | 1945 | // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events |
1889 | PollServiceRequestManager = new PollServiceRequestManager(this, performPollResponsesAsync, 3, 25000); | 1946 | |
1947 | PollServiceRequestManager = new PollServiceRequestManager(this, performPollResponsesAsync, 2, 25000); | ||
1890 | PollServiceRequestManager.Start(); | 1948 | PollServiceRequestManager.Start(); |
1891 | 1949 | ||
1892 | HTTPDRunning = true; | 1950 | HTTPDRunning = true; |
@@ -1908,7 +1966,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1908 | throw e; | 1966 | throw e; |
1909 | } | 1967 | } |
1910 | 1968 | ||
1911 | m_requestsProcessedStat | 1969 | m_requestsProcessedStat |
1912 | = new Stat( | 1970 | = new Stat( |
1913 | "HTTPRequestsServed", | 1971 | "HTTPRequestsServed", |
1914 | "Number of inbound HTTP requests processed", | 1972 | "Number of inbound HTTP requests processed", |
@@ -1920,7 +1978,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1920 | MeasuresOfInterest.AverageChangeOverTime, | 1978 | MeasuresOfInterest.AverageChangeOverTime, |
1921 | stat => stat.Value = RequestNumber, | 1979 | stat => stat.Value = RequestNumber, |
1922 | StatVerbosity.Debug); | 1980 | StatVerbosity.Debug); |
1923 | 1981 | ||
1924 | StatsManager.RegisterStat(m_requestsProcessedStat); | 1982 | StatsManager.RegisterStat(m_requestsProcessedStat); |
1925 | } | 1983 | } |
1926 | 1984 | ||
@@ -1937,7 +1995,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1937 | 1995 | ||
1938 | public void httpServerException(object source, Exception exception) | 1996 | public void httpServerException(object source, Exception exception) |
1939 | { | 1997 | { |
1940 | m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1} ", source.ToString(), exception.Message), exception); | 1998 | if (source.ToString() == "HttpServer.HttpListener" && exception.ToString().StartsWith("Mono.Security.Protocol.Tls.TlsException")) |
1999 | return; | ||
2000 | m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString()); | ||
1941 | /* | 2001 | /* |
1942 | if (HTTPDRunning)// && NotSocketErrors > 5) | 2002 | if (HTTPDRunning)// && NotSocketErrors > 5) |
1943 | { | 2003 | { |
@@ -1957,7 +2017,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1957 | 2017 | ||
1958 | try | 2018 | try |
1959 | { | 2019 | { |
1960 | PollServiceRequestManager.Stop(); | 2020 | if(PollServiceRequestManager != null) |
2021 | PollServiceRequestManager.Stop(); | ||
1961 | 2022 | ||
1962 | m_httpListener2.ExceptionThrown -= httpServerException; | 2023 | m_httpListener2.ExceptionThrown -= httpServerException; |
1963 | //m_httpListener2.DisconnectHandler = null; | 2024 | //m_httpListener2.DisconnectHandler = null; |
@@ -1984,6 +2045,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1984 | 2045 | ||
1985 | public void RemoveHTTPHandler(string httpMethod, string path) | 2046 | public void RemoveHTTPHandler(string httpMethod, string path) |
1986 | { | 2047 | { |
2048 | if (path == null) return; // Caps module isn't loaded, tries to remove handler where path = null | ||
1987 | lock (m_HTTPHandlers) | 2049 | lock (m_HTTPHandlers) |
1988 | { | 2050 | { |
1989 | if (httpMethod != null && httpMethod.Length == 0) | 2051 | if (httpMethod != null && httpMethod.Length == 0) |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs index d4a1ec3..01d95e9 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs | |||
@@ -69,13 +69,13 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
69 | { | 69 | { |
70 | StatsManager.RegisterStat( | 70 | StatsManager.RegisterStat( |
71 | new Stat( | 71 | new Stat( |
72 | "requests", | 72 | "requests", |
73 | "requests", | 73 | "requests", |
74 | "Number of requests received by this service endpoint", | 74 | "Number of requests received by this service endpoint", |
75 | "requests", | 75 | "requests", |
76 | "service", | 76 | "service", |
77 | string.Format("{0}:{1}", httpMethod, path), | 77 | string.Format("{0}:{1}", httpMethod, path), |
78 | StatType.Pull, | 78 | StatType.Pull, |
79 | MeasuresOfInterest.AverageChangeOverTime, | 79 | MeasuresOfInterest.AverageChangeOverTime, |
80 | s => s.Value = RequestsReceived, | 80 | s => s.Value = RequestsReceived, |
81 | StatVerbosity.Debug)); | 81 | StatVerbosity.Debug)); |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs index 41aa19b..7fc9f0b 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs | |||
@@ -47,7 +47,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
47 | : base(httpMethod, path, name, description) {} | 47 | : base(httpMethod, path, name, description) {} |
48 | 48 | ||
49 | protected BaseStreamHandler(string httpMethod, string path, IServiceAuth auth) | 49 | protected BaseStreamHandler(string httpMethod, string path, IServiceAuth auth) |
50 | : base(httpMethod, path, null, null) | 50 | : base(httpMethod, path, null, null) |
51 | { | 51 | { |
52 | m_Auth = auth; | 52 | m_Auth = auth; |
53 | } | 53 | } |
@@ -62,7 +62,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
62 | HttpStatusCode statusCode; | 62 | HttpStatusCode statusCode; |
63 | 63 | ||
64 | if (!m_Auth.Authenticate(httpRequest.Headers, httpResponse.AddHeader, out statusCode)) | 64 | if (!m_Auth.Authenticate(httpRequest.Headers, httpResponse.AddHeader, out statusCode)) |
65 | { | 65 | { |
66 | httpResponse.StatusCode = (int)statusCode; | 66 | httpResponse.StatusCode = (int)statusCode; |
67 | httpResponse.ContentType = "text/plain"; | 67 | httpResponse.ContentType = "text/plain"; |
68 | return new byte[0]; | 68 | return new byte[0]; |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandlerBasicDOSProtector.cs b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandlerBasicDOSProtector.cs index 1b88545..9619e03 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandlerBasicDOSProtector.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandlerBasicDOSProtector.cs | |||
@@ -37,7 +37,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
37 | /// </remarks> | 37 | /// </remarks> |
38 | public abstract class BaseStreamHandlerBasicDOSProtector : BaseRequestHandler, IStreamedRequestHandler | 38 | public abstract class BaseStreamHandlerBasicDOSProtector : BaseRequestHandler, IStreamedRequestHandler |
39 | { | 39 | { |
40 | 40 | ||
41 | private readonly BasicDosProtectorOptions _options; | 41 | private readonly BasicDosProtectorOptions _options; |
42 | private readonly BasicDOSProtector _dosProtector; | 42 | private readonly BasicDOSProtector _dosProtector; |
43 | 43 | ||
@@ -63,7 +63,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
63 | result = ThrottledRequest(path, request, httpRequest, httpResponse); | 63 | result = ThrottledRequest(path, request, httpRequest, httpResponse); |
64 | if (_options.MaxConcurrentSessions > 0) | 64 | if (_options.MaxConcurrentSessions > 0) |
65 | _dosProtector.ProcessEnd(clientstring, endpoint); | 65 | _dosProtector.ProcessEnd(clientstring, endpoint); |
66 | 66 | ||
67 | RequestsHandled++; | 67 | RequestsHandled++; |
68 | 68 | ||
69 | return result; | 69 | return result; |
@@ -81,7 +81,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
81 | return new byte[0]; | 81 | return new byte[0]; |
82 | } | 82 | } |
83 | 83 | ||
84 | 84 | ||
85 | private string GetRemoteAddr(IOSHttpRequest httpRequest) | 85 | private string GetRemoteAddr(IOSHttpRequest httpRequest) |
86 | { | 86 | { |
87 | string remoteaddr = string.Empty; | 87 | string remoteaddr = string.Empty; |
@@ -101,7 +101,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
101 | clientstring = GetRemoteAddr(httpRequest); | 101 | clientstring = GetRemoteAddr(httpRequest); |
102 | 102 | ||
103 | return clientstring; | 103 | return clientstring; |
104 | 104 | ||
105 | } | 105 | } |
106 | } | 106 | } |
107 | } | 107 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/GenericHTTPBasicDOSProtector.cs b/OpenSim/Framework/Servers/HttpServer/GenericHTTPBasicDOSProtector.cs index cd4b8ff..98d33e4 100644 --- a/OpenSim/Framework/Servers/HttpServer/GenericHTTPBasicDOSProtector.cs +++ b/OpenSim/Framework/Servers/HttpServer/GenericHTTPBasicDOSProtector.cs | |||
@@ -33,7 +33,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
33 | { | 33 | { |
34 | private readonly GenericHTTPMethod _normalMethod; | 34 | private readonly GenericHTTPMethod _normalMethod; |
35 | private readonly GenericHTTPMethod _throttledMethod; | 35 | private readonly GenericHTTPMethod _throttledMethod; |
36 | 36 | ||
37 | private readonly BasicDosProtectorOptions _options; | 37 | private readonly BasicDosProtectorOptions _options; |
38 | private readonly BasicDOSProtector _dosProtector; | 38 | private readonly BasicDOSProtector _dosProtector; |
39 | 39 | ||
@@ -41,7 +41,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
41 | { | 41 | { |
42 | _normalMethod = normalMethod; | 42 | _normalMethod = normalMethod; |
43 | _throttledMethod = throttledMethod; | 43 | _throttledMethod = throttledMethod; |
44 | 44 | ||
45 | _options = options; | 45 | _options = options; |
46 | _dosProtector = new BasicDOSProtector(_options); | 46 | _dosProtector = new BasicDOSProtector(_options); |
47 | } | 47 | } |
@@ -60,7 +60,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
60 | 60 | ||
61 | return process; | 61 | return process; |
62 | } | 62 | } |
63 | 63 | ||
64 | private string GetRemoteAddr(Hashtable request) | 64 | private string GetRemoteAddr(Hashtable request) |
65 | { | 65 | { |
66 | string remoteaddr = ""; | 66 | string remoteaddr = ""; |
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs index d162bc1..3a04074 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IHttpServer.cs | |||
@@ -45,26 +45,26 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
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. |
51 | /// </summary> | 51 | /// </summary> |
52 | /// <remarks> | 52 | /// <remarks> |
53 | /// This handler can actually be invoked either as | 53 | /// This handler can actually be invoked either as |
54 | /// | 54 | /// |
55 | /// http://<hostname>:<port>/?method=<methodName> | 55 | /// http://<hostname>:<port>/?method=<methodName> |
56 | /// | 56 | /// |
57 | /// or | 57 | /// or |
58 | /// | 58 | /// |
59 | /// http://<hostname>:<port><method> | 59 | /// http://<hostname>:<port><method> |
60 | /// | 60 | /// |
61 | /// if the method name starts with a slash. For example, AddHTTPHandler("/object/", ...) on a standalone region | 61 | /// if the method name starts with a slash. For example, AddHTTPHandler("/object/", ...) on a standalone region |
62 | /// server will register a handler that can be invoked with either | 62 | /// server will register a handler that can be invoked with either |
63 | /// | 63 | /// |
64 | /// http://localhost:9000/?method=/object/ | 64 | /// http://localhost:9000/?method=/object/ |
65 | /// | 65 | /// |
66 | /// or | 66 | /// or |
67 | /// | 67 | /// |
68 | /// http://localhost:9000/object/ | 68 | /// http://localhost:9000/object/ |
69 | /// | 69 | /// |
70 | /// In addition, the handler invoked by the HTTP server for any request is the one when best matches the request | 70 | /// In addition, the handler invoked by the HTTP server for any request is the one when best matches the request |
@@ -87,7 +87,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
87 | /// <param name="handler">handle the LLSD response</param> | 87 | /// <param name="handler">handle the LLSD response</param> |
88 | /// <returns></returns> | 88 | /// <returns></returns> |
89 | bool AddLLSDHandler(string path, LLSDMethod handler); | 89 | bool AddLLSDHandler(string path, LLSDMethod handler); |
90 | 90 | ||
91 | /// <summary> | 91 | /// <summary> |
92 | /// Add a stream handler to the http server. If the handler already exists, then nothing happens. | 92 | /// Add a stream handler to the http server. If the handler already exists, then nothing happens. |
93 | /// </summary> | 93 | /// </summary> |
@@ -98,7 +98,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
98 | bool AddXmlRPCHandler(string method, XmlRpcMethod handler, bool keepAlive); | 98 | bool AddXmlRPCHandler(string method, XmlRpcMethod handler, bool keepAlive); |
99 | 99 | ||
100 | bool AddJsonRPCHandler(string method, JsonRPCMethod handler); | 100 | bool AddJsonRPCHandler(string method, JsonRPCMethod handler); |
101 | 101 | ||
102 | /// <summary> | 102 | /// <summary> |
103 | /// Websocket HTTP server handlers. | 103 | /// Websocket HTTP server handlers. |
104 | /// </summary> | 104 | /// </summary> |
@@ -108,7 +108,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
108 | 108 | ||
109 | 109 | ||
110 | void RemoveWebSocketHandler(string servicepath); | 110 | void RemoveWebSocketHandler(string servicepath); |
111 | 111 | ||
112 | /// <summary> | 112 | /// <summary> |
113 | /// Gets the XML RPC handler for given method name | 113 | /// Gets the XML RPC handler for given method name |
114 | /// </summary> | 114 | /// </summary> |
@@ -125,7 +125,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
125 | // /// <param name="handler"></param> | 125 | // /// <param name="handler"></param> |
126 | // /// <returns></returns> | 126 | // /// <returns></returns> |
127 | // bool RemoveAgentHandler(string agent, IHttpAgentHandler handler); | 127 | // bool RemoveAgentHandler(string agent, IHttpAgentHandler handler); |
128 | 128 | ||
129 | /// <summary> | 129 | /// <summary> |
130 | /// Remove an HTTP handler | 130 | /// Remove an HTTP handler |
131 | /// </summary> | 131 | /// </summary> |
@@ -134,15 +134,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
134 | void RemoveHTTPHandler(string httpMethod, string path); | 134 | void RemoveHTTPHandler(string httpMethod, string path); |
135 | 135 | ||
136 | void RemovePollServiceHTTPHandler(string httpMethod, string path); | 136 | void RemovePollServiceHTTPHandler(string httpMethod, string path); |
137 | 137 | ||
138 | bool RemoveLLSDHandler(string path, LLSDMethod handler); | 138 | bool RemoveLLSDHandler(string path, LLSDMethod handler); |
139 | 139 | ||
140 | void RemoveStreamHandler(string httpMethod, string path); | 140 | void RemoveStreamHandler(string httpMethod, string path); |
141 | 141 | ||
142 | void RemoveXmlRPCHandler(string method); | 142 | void RemoveXmlRPCHandler(string method); |
143 | 143 | ||
144 | void RemoveJsonRPCHandler(string method); | 144 | void RemoveJsonRPCHandler(string method); |
145 | 145 | ||
146 | string GetHTTP404(string host); | 146 | string GetHTTP404(string host); |
147 | 147 | ||
148 | string GetHTTP500(); | 148 | string GetHTTP500(); |
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs index b8541cb..62d92fb 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs | |||
@@ -83,7 +83,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
83 | { | 83 | { |
84 | void Handle(string path, Stream request, Stream response, IOSHttpRequest httpReqbuest, IOSHttpResponse httpResponse); | 84 | void Handle(string path, Stream request, Stream response, IOSHttpRequest httpReqbuest, IOSHttpResponse httpResponse); |
85 | } | 85 | } |
86 | 86 | ||
87 | public interface IGenericHTTPHandler : IRequestHandler | 87 | public interface IGenericHTTPHandler : IRequestHandler |
88 | { | 88 | { |
89 | Hashtable Handle(string path, Hashtable request); | 89 | Hashtable Handle(string path, Hashtable request); |
diff --git a/OpenSim/Framework/Servers/HttpServer/JsonRpcRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/JsonRpcRequestManager.cs index 2fe1a7d..411ee31 100644 --- a/OpenSim/Framework/Servers/HttpServer/JsonRpcRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/JsonRpcRequestManager.cs | |||
@@ -43,7 +43,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
43 | public class JsonRpcRequestManager | 43 | public class JsonRpcRequestManager |
44 | { | 44 | { |
45 | static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 45 | static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
46 | 46 | ||
47 | public JsonRpcRequestManager() | 47 | public JsonRpcRequestManager() |
48 | { | 48 | { |
49 | } | 49 | } |
@@ -77,6 +77,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
77 | if (parameters == null) | 77 | if (parameters == null) |
78 | throw new ArgumentNullException("parameters"); | 78 | throw new ArgumentNullException("parameters"); |
79 | 79 | ||
80 | if(string.IsNullOrWhiteSpace(uri)) | ||
81 | return false; | ||
82 | |||
80 | OSDMap request = new OSDMap(); | 83 | OSDMap request = new OSDMap(); |
81 | request.Add("jsonrpc", OSD.FromString("2.0")); | 84 | request.Add("jsonrpc", OSD.FromString("2.0")); |
82 | request.Add("id", OSD.FromString(jsonId)); | 85 | request.Add("id", OSD.FromString(jsonId)); |
@@ -185,6 +188,6 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
185 | 188 | ||
186 | return true; | 189 | return true; |
187 | } | 190 | } |
188 | 191 | ||
189 | } | 192 | } |
190 | } | 193 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/JsonRpcResponse.cs b/OpenSim/Framework/Servers/HttpServer/JsonRpcResponse.cs index 2c50587..91d284b 100644 --- a/OpenSim/Framework/Servers/HttpServer/JsonRpcResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/JsonRpcResponse.cs | |||
@@ -144,7 +144,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
144 | { | 144 | { |
145 | 145 | ||
146 | } | 146 | } |
147 | return result; | 147 | return result; |
148 | } | 148 | } |
149 | } | 149 | } |
150 | } | 150 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs index 05ec6dc..1a6b8cf 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs | |||
@@ -155,11 +155,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
155 | private string _userAgent; | 155 | private string _userAgent; |
156 | 156 | ||
157 | internal IHttpRequest IHttpRequest | 157 | internal IHttpRequest IHttpRequest |
158 | { | 158 | { |
159 | get { return _request; } | 159 | get { return _request; } |
160 | } | 160 | } |
161 | 161 | ||
162 | internal IHttpClientContext IHttpClientContext | 162 | internal IHttpClientContext IHttpClientContext |
163 | { | 163 | { |
164 | get { return _context; } | 164 | get { return _context; } |
165 | } | 165 | } |
@@ -192,19 +192,19 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
192 | // ignore | 192 | // ignore |
193 | } | 193 | } |
194 | } | 194 | } |
195 | 195 | ||
196 | if (null != req.Headers["content-type"]) | 196 | if (null != req.Headers["content-type"]) |
197 | _contentType = _request.Headers["content-type"]; | 197 | _contentType = _request.Headers["content-type"]; |
198 | if (null != req.Headers["user-agent"]) | 198 | if (null != req.Headers["user-agent"]) |
199 | _userAgent = req.Headers["user-agent"]; | 199 | _userAgent = req.Headers["user-agent"]; |
200 | 200 | ||
201 | if (null != req.Headers["remote_addr"]) | 201 | if (null != req.Headers["remote_addr"]) |
202 | { | 202 | { |
203 | try | 203 | try |
204 | { | 204 | { |
205 | IPAddress addr = IPAddress.Parse(req.Headers["remote_addr"]); | 205 | IPAddress addr = IPAddress.Parse(req.Headers["remote_addr"]); |
206 | // sometimes req.Headers["remote_port"] returns a comma separated list, so use | 206 | // sometimes req.Headers["remote_port"] returns a comma separated list, so use |
207 | // the first one in the list and log it | 207 | // the first one in the list and log it |
208 | string[] strPorts = req.Headers["remote_port"].Split(new char[] { ',' }); | 208 | string[] strPorts = req.Headers["remote_port"].Split(new char[] { ',' }); |
209 | if (strPorts.Length > 1) | 209 | if (strPorts.Length > 1) |
210 | { | 210 | { |
@@ -216,7 +216,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
216 | } | 216 | } |
217 | catch (FormatException) | 217 | catch (FormatException) |
218 | { | 218 | { |
219 | _log.ErrorFormat("[OSHttpRequest]: format exception on addr/port {0}:{1}, ignoring", | 219 | _log.ErrorFormat("[OSHttpRequest]: format exception on addr/port {0}:{1}, ignoring", |
220 | req.Headers["remote_addr"], req.Headers["remote_port"]); | 220 | req.Headers["remote_addr"], req.Headers["remote_port"]); |
221 | } | 221 | } |
222 | } | 222 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs index 89fb5d4..d7744fc 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs | |||
@@ -115,7 +115,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
115 | 115 | ||
116 | public bool KeepAlive | 116 | public bool KeepAlive |
117 | { | 117 | { |
118 | get | 118 | get |
119 | { | 119 | { |
120 | return _httpResponse.Connection == ConnectionType.KeepAlive; | 120 | return _httpResponse.Connection == ConnectionType.KeepAlive; |
121 | } | 121 | } |
@@ -148,6 +148,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
148 | _httpResponse.Connection = ConnectionType.Close; | 148 | _httpResponse.Connection = ConnectionType.Close; |
149 | _httpResponse.KeepAlive = 0; | 149 | _httpResponse.KeepAlive = 0; |
150 | } | 150 | } |
151 | |||
151 | else | 152 | else |
152 | { | 153 | { |
153 | _httpResponse.Connection = ConnectionType.KeepAlive; | 154 | _httpResponse.Connection = ConnectionType.KeepAlive; |
@@ -320,6 +321,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
320 | public void Send() | 321 | public void Send() |
321 | { | 322 | { |
322 | _httpResponse.Body.Flush(); | 323 | _httpResponse.Body.Flush(); |
324 | |||
323 | _httpResponse.Send(); | 325 | _httpResponse.Send(); |
324 | } | 326 | } |
325 | 327 | ||
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs index a736c8b..88e3068 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs | |||
@@ -91,7 +91,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
91 | /// 300 Redirect: different presentation forms available, take a pick | 91 | /// 300 Redirect: different presentation forms available, take a pick |
92 | /// </summary> | 92 | /// </summary> |
93 | RedirectMultipleChoices = 300, | 93 | RedirectMultipleChoices = 300, |
94 | 94 | ||
95 | /// <summary> | 95 | /// <summary> |
96 | /// 301 Redirect: requested resource has moved and now lives somewhere else | 96 | /// 301 Redirect: requested resource has moved and now lives somewhere else |
97 | /// </summary> | 97 | /// </summary> |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs index 9477100..7150aad 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs | |||
@@ -46,13 +46,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
46 | public RequestMethod Request; | 46 | public RequestMethod Request; |
47 | public UUID Id; | 47 | public UUID Id; |
48 | public int TimeOutms; | 48 | public int TimeOutms; |
49 | public EventType Type; | 49 | public EventType Type; |
50 | 50 | ||
51 | public enum EventType : int | 51 | public enum EventType : int |
52 | { | 52 | { |
53 | LongPoll = 0, | 53 | Poll = 0, |
54 | LslHttp = 1, | 54 | LslHttp = 1, |
55 | Inventory = 2 | 55 | Inventory = 2, |
56 | Texture = 3, | ||
57 | Mesh = 4 | ||
56 | } | 58 | } |
57 | 59 | ||
58 | public string Url { get; set; } | 60 | public string Url { get; set; } |
@@ -80,7 +82,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
80 | NoEvents = pNoEvents; | 82 | NoEvents = pNoEvents; |
81 | Id = pId; | 83 | Id = pId; |
82 | TimeOutms = pTimeOutms; | 84 | TimeOutms = pTimeOutms; |
83 | Type = EventType.LongPoll; | 85 | Type = EventType.Poll; |
84 | } | 86 | } |
85 | } | 87 | } |
86 | } | 88 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs index caf0e98..fefcb20 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | ||
30 | using System.Reflection; | 31 | using System.Reflection; |
31 | using System.Text; | 32 | using System.Text; |
32 | using HttpServer; | 33 | using HttpServer; |
@@ -44,6 +45,24 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
44 | public readonly IHttpRequest Request; | 45 | public readonly IHttpRequest Request; |
45 | public readonly int RequestTime; | 46 | public readonly int RequestTime; |
46 | public readonly UUID RequestID; | 47 | public readonly UUID RequestID; |
48 | public int contextHash; | ||
49 | |||
50 | private void GenContextHash() | ||
51 | { | ||
52 | Random rnd = new Random(); | ||
53 | contextHash = 0; | ||
54 | if (Request.Headers["remote_addr"] != null) | ||
55 | contextHash = (Request.Headers["remote_addr"]).GetHashCode() << 16; | ||
56 | else | ||
57 | contextHash = rnd.Next() << 16; | ||
58 | if (Request.Headers["remote_port"] != null) | ||
59 | { | ||
60 | string[] strPorts = Request.Headers["remote_port"].Split(new char[] { ',' }); | ||
61 | contextHash += Int32.Parse(strPorts[0]); | ||
62 | } | ||
63 | else | ||
64 | contextHash += rnd.Next() & 0xffff; | ||
65 | } | ||
47 | 66 | ||
48 | public PollServiceHttpRequest( | 67 | public PollServiceHttpRequest( |
49 | PollServiceEventArgs pPollServiceArgs, IHttpClientContext pHttpContext, IHttpRequest pRequest) | 68 | PollServiceEventArgs pPollServiceArgs, IHttpClientContext pHttpContext, IHttpRequest pRequest) |
@@ -53,6 +72,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
53 | Request = pRequest; | 72 | Request = pRequest; |
54 | RequestTime = System.Environment.TickCount; | 73 | RequestTime = System.Environment.TickCount; |
55 | RequestID = UUID.Random(); | 74 | RequestID = UUID.Random(); |
75 | GenContextHash(); | ||
56 | } | 76 | } |
57 | 77 | ||
58 | internal void DoHTTPGruntWork(BaseHttpServer server, Hashtable responsedata) | 78 | internal void DoHTTPGruntWork(BaseHttpServer server, Hashtable responsedata) |
@@ -62,36 +82,69 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
62 | 82 | ||
63 | byte[] buffer = server.DoHTTPGruntWork(responsedata, response); | 83 | byte[] buffer = server.DoHTTPGruntWork(responsedata, response); |
64 | 84 | ||
85 | if(Request.Body.CanRead) | ||
86 | Request.Body.Dispose(); | ||
87 | |||
65 | response.SendChunked = false; | 88 | response.SendChunked = false; |
66 | response.ContentLength64 = buffer.Length; | 89 | response.ContentLength64 = buffer.Length; |
67 | response.ContentEncoding = Encoding.UTF8; | 90 | response.ContentEncoding = Encoding.UTF8; |
91 | response.ReuseContext = false; | ||
68 | 92 | ||
69 | try | 93 | try |
70 | { | 94 | { |
71 | response.OutputStream.Write(buffer, 0, buffer.Length); | 95 | response.OutputStream.Write(buffer, 0, buffer.Length); |
96 | response.OutputStream.Flush(); | ||
97 | response.Send(); | ||
98 | buffer = null; | ||
72 | } | 99 | } |
73 | catch (Exception ex) | 100 | catch (Exception ex) |
74 | { | 101 | { |
75 | m_log.Warn("[POLL SERVICE WORKER THREAD]: Error ", ex); | 102 | m_log.Warn("[POLL SERVICE WORKER THREAD]: Error ", ex); |
76 | } | 103 | } |
77 | finally | 104 | |
105 | PollServiceArgs.RequestsHandled++; | ||
106 | } | ||
107 | |||
108 | internal void DoHTTPstop(BaseHttpServer server) | ||
109 | { | ||
110 | OSHttpResponse response | ||
111 | = new OSHttpResponse(new HttpResponse(HttpContext, Request), HttpContext); | ||
112 | |||
113 | if(Request.Body.CanRead) | ||
114 | Request.Body.Dispose(); | ||
115 | |||
116 | response.SendChunked = false; | ||
117 | response.ContentLength64 = 0; | ||
118 | response.ContentEncoding = Encoding.UTF8; | ||
119 | response.ReuseContext = false; | ||
120 | response.KeepAlive = false; | ||
121 | response.SendChunked = false; | ||
122 | response.StatusCode = 503; | ||
123 | |||
124 | try | ||
78 | { | 125 | { |
79 | //response.OutputStream.Close(); | 126 | response.OutputStream.Flush(); |
80 | try | 127 | response.Send(); |
81 | { | ||
82 | response.OutputStream.Flush(); | ||
83 | response.Send(); | ||
84 | |||
85 | //if (!response.KeepAlive && response.ReuseContext) | ||
86 | // response.FreeContext(); | ||
87 | } | ||
88 | catch (Exception e) | ||
89 | { | ||
90 | m_log.Warn("[POLL SERVICE WORKER THREAD]: Error ", e); | ||
91 | } | ||
92 | |||
93 | PollServiceArgs.RequestsHandled++; | ||
94 | } | 128 | } |
129 | catch (Exception e) | ||
130 | { | ||
131 | } | ||
132 | } | ||
133 | } | ||
134 | |||
135 | class PollServiceHttpRequestComparer : IEqualityComparer<PollServiceHttpRequest> | ||
136 | { | ||
137 | public bool Equals(PollServiceHttpRequest b1, PollServiceHttpRequest b2) | ||
138 | { | ||
139 | if (b1.contextHash != b2.contextHash) | ||
140 | return false; | ||
141 | bool b = Object.ReferenceEquals(b1.HttpContext, b2.HttpContext); | ||
142 | return b; | ||
143 | } | ||
144 | |||
145 | public int GetHashCode(PollServiceHttpRequest b2) | ||
146 | { | ||
147 | return (int)b2.contextHash; | ||
95 | } | 148 | } |
96 | } | 149 | } |
97 | } \ No newline at end of file | 150 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index 28bba70..c6a3e65 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |||
@@ -44,200 +44,183 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
44 | { | 44 | { |
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
46 | 46 | ||
47 | /// <summary> | ||
48 | /// Is the poll service request manager running? | ||
49 | /// </summary> | ||
50 | /// <remarks> | ||
51 | /// Can be running either synchronously or asynchronously | ||
52 | /// </remarks> | ||
53 | public bool IsRunning { get; private set; } | ||
54 | |||
55 | /// <summary> | ||
56 | /// Is the poll service performing responses asynchronously (with its own threads) or synchronously (via | ||
57 | /// external calls)? | ||
58 | /// </summary> | ||
59 | public bool PerformResponsesAsync { get; private set; } | ||
60 | |||
61 | /// <summary> | ||
62 | /// Number of responses actually processed and sent to viewer (or aborted due to error). | ||
63 | /// </summary> | ||
64 | public int ResponsesProcessed { get; private set; } | ||
65 | |||
66 | private readonly BaseHttpServer m_server; | 47 | private readonly BaseHttpServer m_server; |
67 | 48 | ||
49 | private Dictionary<PollServiceHttpRequest, Queue<PollServiceHttpRequest>> m_bycontext; | ||
68 | private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>(); | 50 | private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>(); |
69 | private static List<PollServiceHttpRequest> m_longPollRequests = new List<PollServiceHttpRequest>(); | 51 | private static Queue<PollServiceHttpRequest> m_retryRequests = new Queue<PollServiceHttpRequest>(); |
70 | 52 | ||
71 | private uint m_WorkerThreadCount = 0; | 53 | private uint m_WorkerThreadCount = 0; |
72 | private Thread[] m_workerThreads; | 54 | private Thread[] m_workerThreads; |
55 | private Thread m_retrysThread; | ||
73 | 56 | ||
74 | private SmartThreadPool m_threadPool = new SmartThreadPool(20000, 12, 2); | 57 | private bool m_running = false; |
75 | 58 | ||
76 | // private int m_timeout = 1000; // increase timeout 250; now use the event one | 59 | private SmartThreadPool m_threadPool; |
77 | 60 | ||
78 | public PollServiceRequestManager( | 61 | public PollServiceRequestManager( |
79 | BaseHttpServer pSrv, bool performResponsesAsync, uint pWorkerThreadCount, int pTimeout) | 62 | BaseHttpServer pSrv, bool performResponsesAsync, uint pWorkerThreadCount, int pTimeout) |
80 | { | 63 | { |
81 | m_server = pSrv; | 64 | m_server = pSrv; |
82 | PerformResponsesAsync = performResponsesAsync; | ||
83 | m_WorkerThreadCount = pWorkerThreadCount; | 65 | m_WorkerThreadCount = pWorkerThreadCount; |
84 | m_workerThreads = new Thread[m_WorkerThreadCount]; | 66 | m_workerThreads = new Thread[m_WorkerThreadCount]; |
85 | 67 | ||
86 | StatsManager.RegisterStat( | 68 | PollServiceHttpRequestComparer preqCp = new PollServiceHttpRequestComparer(); |
87 | new Stat( | 69 | m_bycontext = new Dictionary<PollServiceHttpRequest, Queue<PollServiceHttpRequest>>(preqCp); |
88 | "QueuedPollResponses", | 70 | |
89 | "Number of poll responses queued for processing.", | 71 | STPStartInfo startInfo = new STPStartInfo(); |
90 | "", | 72 | startInfo.IdleTimeout = 30000; |
91 | "", | 73 | startInfo.MaxWorkerThreads = 20; |
92 | "httpserver", | 74 | startInfo.MinWorkerThreads = 1; |
93 | m_server.Port.ToString(), | 75 | startInfo.ThreadPriority = ThreadPriority.Normal; |
94 | StatType.Pull, | 76 | startInfo.StartSuspended = true; |
95 | MeasuresOfInterest.AverageChangeOverTime, | 77 | startInfo.ThreadPoolName = "PoolService"; |
96 | stat => stat.Value = m_requests.Count(), | 78 | |
97 | StatVerbosity.Debug)); | 79 | m_threadPool = new SmartThreadPool(startInfo); |
98 | |||
99 | StatsManager.RegisterStat( | ||
100 | new Stat( | ||
101 | "ProcessedPollResponses", | ||
102 | "Number of poll responses processed.", | ||
103 | "", | ||
104 | "", | ||
105 | "httpserver", | ||
106 | m_server.Port.ToString(), | ||
107 | StatType.Pull, | ||
108 | MeasuresOfInterest.AverageChangeOverTime, | ||
109 | stat => stat.Value = ResponsesProcessed, | ||
110 | StatVerbosity.Debug)); | ||
111 | } | 80 | } |
112 | 81 | ||
113 | public void Start() | 82 | public void Start() |
114 | { | 83 | { |
115 | IsRunning = true; | 84 | m_running = true; |
116 | 85 | m_threadPool.Start(); | |
117 | if (PerformResponsesAsync) | 86 | //startup worker threads |
87 | for (uint i = 0; i < m_WorkerThreadCount; i++) | ||
118 | { | 88 | { |
119 | //startup worker threads | 89 | m_workerThreads[i] |
120 | for (uint i = 0; i < m_WorkerThreadCount; i++) | 90 | = WorkManager.StartThread( |
121 | { | 91 | PoolWorkerJob, |
122 | m_workerThreads[i] | 92 | string.Format("PollServiceWorkerThread {0}:{1}", i, m_server.Port), |
123 | = WorkManager.StartThread( | 93 | ThreadPriority.Normal, |
124 | PoolWorkerJob, | 94 | true, |
125 | string.Format("PollServiceWorkerThread{0}:{1}", i, m_server.Port), | 95 | false, |
126 | ThreadPriority.Normal, | 96 | null, |
127 | false, | 97 | int.MaxValue); |
128 | false, | ||
129 | null, | ||
130 | int.MaxValue); | ||
131 | } | ||
132 | |||
133 | WorkManager.StartThread( | ||
134 | this.CheckLongPollThreads, | ||
135 | string.Format("LongPollServiceWatcherThread:{0}", m_server.Port), | ||
136 | ThreadPriority.Normal, | ||
137 | false, | ||
138 | true, | ||
139 | null, | ||
140 | 1000 * 60 * 10); | ||
141 | } | 98 | } |
99 | |||
100 | m_retrysThread = WorkManager.StartThread( | ||
101 | this.CheckRetries, | ||
102 | string.Format("PollServiceWatcherThread:{0}", m_server.Port), | ||
103 | ThreadPriority.Normal, | ||
104 | true, | ||
105 | true, | ||
106 | null, | ||
107 | 1000 * 60 * 10); | ||
108 | |||
109 | |||
142 | } | 110 | } |
143 | 111 | ||
144 | private void ReQueueEvent(PollServiceHttpRequest req) | 112 | private void ReQueueEvent(PollServiceHttpRequest req) |
145 | { | 113 | { |
146 | if (IsRunning) | 114 | if (m_running) |
147 | { | 115 | { |
148 | // delay the enqueueing for 100ms. There's no need to have the event | 116 | lock (m_retryRequests) |
149 | // actively on the queue | 117 | m_retryRequests.Enqueue(req); |
150 | Timer t = new Timer(self => { | ||
151 | ((Timer)self).Dispose(); | ||
152 | m_requests.Enqueue(req); | ||
153 | }); | ||
154 | |||
155 | t.Change(100, Timeout.Infinite); | ||
156 | |||
157 | } | 118 | } |
158 | } | 119 | } |
159 | 120 | ||
160 | public void Enqueue(PollServiceHttpRequest req) | 121 | public void Enqueue(PollServiceHttpRequest req) |
161 | { | 122 | { |
162 | if (IsRunning) | 123 | lock (m_bycontext) |
163 | { | 124 | { |
164 | if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll) | 125 | Queue<PollServiceHttpRequest> ctxQeueue; |
126 | if (m_bycontext.TryGetValue(req, out ctxQeueue)) | ||
165 | { | 127 | { |
166 | lock (m_longPollRequests) | 128 | ctxQeueue.Enqueue(req); |
167 | m_longPollRequests.Add(req); | ||
168 | } | 129 | } |
169 | else | 130 | else |
170 | m_requests.Enqueue(req); | 131 | { |
132 | ctxQeueue = new Queue<PollServiceHttpRequest>(); | ||
133 | m_bycontext[req] = ctxQeueue; | ||
134 | EnqueueInt(req); | ||
135 | } | ||
171 | } | 136 | } |
172 | } | 137 | } |
173 | 138 | ||
174 | private void CheckLongPollThreads() | 139 | public void byContextDequeue(PollServiceHttpRequest req) |
175 | { | 140 | { |
176 | // The only purpose of this thread is to check the EQs for events. | 141 | Queue<PollServiceHttpRequest> ctxQeueue; |
177 | // If there are events, that thread will be placed in the "ready-to-serve" queue, m_requests. | 142 | lock (m_bycontext) |
178 | // If there are no events, that thread will be back to its "waiting" queue, m_longPollRequests. | ||
179 | // All other types of tasks (Inventory handlers, http-in, etc) don't have the long-poll nature, | ||
180 | // so if they aren't ready to be served by a worker thread (no events), they are placed | ||
181 | // directly back in the "ready-to-serve" queue by the worker thread. | ||
182 | while (IsRunning) | ||
183 | { | 143 | { |
184 | Thread.Sleep(500); | 144 | if (m_bycontext.TryGetValue(req, out ctxQeueue)) |
185 | Watchdog.UpdateThread(); | ||
186 | |||
187 | // List<PollServiceHttpRequest> not_ready = new List<PollServiceHttpRequest>(); | ||
188 | lock (m_longPollRequests) | ||
189 | { | 145 | { |
190 | if (m_longPollRequests.Count > 0 && IsRunning) | 146 | if (ctxQeueue.Count > 0) |
147 | { | ||
148 | PollServiceHttpRequest newreq = ctxQeueue.Dequeue(); | ||
149 | EnqueueInt(newreq); | ||
150 | } | ||
151 | else | ||
191 | { | 152 | { |
192 | List<PollServiceHttpRequest> ready = m_longPollRequests.FindAll(req => | 153 | m_bycontext.Remove(req); |
193 | (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id) || // there are events in this EQ | 154 | } |
194 | (Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) // no events, but timeout | 155 | } |
195 | ); | 156 | } |
157 | } | ||
196 | 158 | ||
197 | ready.ForEach(req => | 159 | public void EnqueueInt(PollServiceHttpRequest req) |
198 | { | 160 | { |
199 | m_requests.Enqueue(req); | 161 | if (m_running) |
200 | m_longPollRequests.Remove(req); | 162 | m_requests.Enqueue(req); |
201 | }); | 163 | } |
202 | 164 | ||
203 | } | 165 | private void CheckRetries() |
166 | { | ||
167 | while (m_running) | ||
204 | 168 | ||
169 | { | ||
170 | Thread.Sleep(100); // let the world move .. back to faster rate | ||
171 | Watchdog.UpdateThread(); | ||
172 | lock (m_retryRequests) | ||
173 | { | ||
174 | while (m_retryRequests.Count > 0 && m_running) | ||
175 | m_requests.Enqueue(m_retryRequests.Dequeue()); | ||
205 | } | 176 | } |
206 | } | 177 | } |
207 | } | 178 | } |
208 | 179 | ||
209 | public void Stop() | 180 | public void Stop() |
210 | { | 181 | { |
211 | IsRunning = false; | 182 | m_running = false; |
212 | // m_timeout = -10000; // cause all to expire | 183 | |
213 | Thread.Sleep(1000); // let the world move | 184 | Thread.Sleep(100); // let the world move |
214 | 185 | ||
215 | foreach (Thread t in m_workerThreads) | 186 | foreach (Thread t in m_workerThreads) |
216 | Watchdog.AbortThread(t.ManagedThreadId); | 187 | Watchdog.AbortThread(t.ManagedThreadId); |
217 | 188 | ||
218 | PollServiceHttpRequest wreq; | 189 | m_threadPool.Shutdown(); |
190 | |||
191 | // any entry in m_bycontext should have a active request on the other queues | ||
192 | // so just delete contents to easy GC | ||
193 | foreach (Queue<PollServiceHttpRequest> qu in m_bycontext.Values) | ||
194 | qu.Clear(); | ||
195 | m_bycontext.Clear(); | ||
219 | 196 | ||
220 | lock (m_longPollRequests) | 197 | try |
198 | { | ||
199 | foreach (PollServiceHttpRequest req in m_retryRequests) | ||
200 | { | ||
201 | req.DoHTTPstop(m_server); | ||
202 | } | ||
203 | } | ||
204 | catch | ||
221 | { | 205 | { |
222 | if (m_longPollRequests.Count > 0 && IsRunning) | ||
223 | m_longPollRequests.ForEach(req => m_requests.Enqueue(req)); | ||
224 | } | 206 | } |
225 | 207 | ||
208 | PollServiceHttpRequest wreq; | ||
209 | |||
210 | m_retryRequests.Clear(); | ||
211 | |||
226 | while (m_requests.Count() > 0) | 212 | while (m_requests.Count() > 0) |
227 | { | 213 | { |
228 | try | 214 | try |
229 | { | 215 | { |
230 | wreq = m_requests.Dequeue(0); | 216 | wreq = m_requests.Dequeue(0); |
231 | ResponsesProcessed++; | 217 | wreq.DoHTTPstop(m_server); |
232 | wreq.DoHTTPGruntWork( | ||
233 | m_server, wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id)); | ||
234 | } | 218 | } |
235 | catch | 219 | catch |
236 | { | 220 | { |
237 | } | 221 | } |
238 | } | 222 | } |
239 | 223 | ||
240 | m_longPollRequests.Clear(); | ||
241 | m_requests.Clear(); | 224 | m_requests.Clear(); |
242 | } | 225 | } |
243 | 226 | ||
@@ -245,87 +228,69 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
245 | 228 | ||
246 | private void PoolWorkerJob() | 229 | private void PoolWorkerJob() |
247 | { | 230 | { |
248 | while (IsRunning) | 231 | while (m_running) |
249 | { | 232 | { |
233 | PollServiceHttpRequest req = m_requests.Dequeue(4500); | ||
250 | Watchdog.UpdateThread(); | 234 | Watchdog.UpdateThread(); |
251 | WaitPerformResponse(); | 235 | if (req != null) |
252 | } | ||
253 | } | ||
254 | |||
255 | public void WaitPerformResponse() | ||
256 | { | ||
257 | PollServiceHttpRequest req = m_requests.Dequeue(5000); | ||
258 | // m_log.DebugFormat("[YYY]: Dequeued {0}", (req == null ? "null" : req.PollServiceArgs.Type.ToString())); | ||
259 | |||
260 | if (req != null) | ||
261 | { | ||
262 | try | ||
263 | { | 236 | { |
264 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) | 237 | try |
265 | { | 238 | { |
266 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); | 239 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) |
267 | |||
268 | if (responsedata == null) | ||
269 | return; | ||
270 | |||
271 | // This is the event queue. | ||
272 | // Even if we're not running we can still perform responses by explicit request. | ||
273 | if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll | ||
274 | || !PerformResponsesAsync) | ||
275 | { | ||
276 | try | ||
277 | { | ||
278 | ResponsesProcessed++; | ||
279 | req.DoHTTPGruntWork(m_server, responsedata); | ||
280 | } | ||
281 | catch (ObjectDisposedException e) // Browser aborted before we could read body, server closed the stream | ||
282 | { | ||
283 | // Ignore it, no need to reply | ||
284 | m_log.Error(e); | ||
285 | } | ||
286 | } | ||
287 | else | ||
288 | { | 240 | { |
241 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); | ||
242 | |||
289 | m_threadPool.QueueWorkItem(x => | 243 | m_threadPool.QueueWorkItem(x => |
290 | { | 244 | { |
291 | try | 245 | try |
292 | { | 246 | { |
293 | ResponsesProcessed++; | ||
294 | req.DoHTTPGruntWork(m_server, responsedata); | 247 | req.DoHTTPGruntWork(m_server, responsedata); |
295 | } | 248 | } |
296 | catch (ObjectDisposedException e) // Browser aborted before we could read body, server closed the stream | 249 | catch (ObjectDisposedException) |
297 | { | 250 | { |
298 | // Ignore it, no need to reply | ||
299 | m_log.Error(e); | ||
300 | } | 251 | } |
301 | catch (Exception e) | 252 | finally |
302 | { | 253 | { |
303 | m_log.Error(e); | 254 | byContextDequeue(req); |
304 | } | 255 | } |
305 | |||
306 | return null; | 256 | return null; |
307 | }, null); | 257 | }, null); |
308 | } | 258 | } |
309 | } | ||
310 | else | ||
311 | { | ||
312 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | ||
313 | { | ||
314 | ResponsesProcessed++; | ||
315 | req.DoHTTPGruntWork( | ||
316 | m_server, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
317 | } | ||
318 | else | 259 | else |
319 | { | 260 | { |
320 | ReQueueEvent(req); | 261 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) |
262 | { | ||
263 | m_threadPool.QueueWorkItem(x => | ||
264 | { | ||
265 | try | ||
266 | { | ||
267 | req.DoHTTPGruntWork(m_server, | ||
268 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
269 | } | ||
270 | catch (ObjectDisposedException) | ||
271 | { | ||
272 | // Ignore it, no need to reply | ||
273 | } | ||
274 | finally | ||
275 | { | ||
276 | byContextDequeue(req); | ||
277 | } | ||
278 | return null; | ||
279 | }, null); | ||
280 | } | ||
281 | else | ||
282 | { | ||
283 | ReQueueEvent(req); | ||
284 | } | ||
321 | } | 285 | } |
322 | } | 286 | } |
323 | } | 287 | catch (Exception e) |
324 | catch (Exception e) | 288 | { |
325 | { | 289 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); |
326 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); | 290 | } |
327 | } | 291 | } |
328 | } | 292 | } |
329 | } | 293 | } |
294 | |||
330 | } | 295 | } |
331 | } \ No newline at end of file | 296 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/Properties/AssemblyInfo.cs b/OpenSim/Framework/Servers/HttpServer/Properties/AssemblyInfo.cs index 5e630dc..9b663ba 100644 --- a/OpenSim/Framework/Servers/HttpServer/Properties/AssemblyInfo.cs +++ b/OpenSim/Framework/Servers/HttpServer/Properties/AssemblyInfo.cs | |||
@@ -2,7 +2,7 @@ | |||
2 | using System.Runtime.CompilerServices; | 2 | using System.Runtime.CompilerServices; |
3 | using System.Runtime.InteropServices; | 3 | using System.Runtime.InteropServices; |
4 | 4 | ||
5 | // General Information about an assembly is controlled through the following | 5 | // General Information about an assembly is controlled through the following |
6 | // set of attributes. Change these attribute values to modify the information | 6 | // set of attributes. Change these attribute values to modify the information |
7 | // associated with an assembly. | 7 | // associated with an assembly. |
8 | [assembly: AssemblyTitle("OpenSim.Framework.Servers.HttpServer")] | 8 | [assembly: AssemblyTitle("OpenSim.Framework.Servers.HttpServer")] |
@@ -14,8 +14,8 @@ using System.Runtime.InteropServices; | |||
14 | [assembly: AssemblyTrademark("")] | 14 | [assembly: AssemblyTrademark("")] |
15 | [assembly: AssemblyCulture("")] | 15 | [assembly: AssemblyCulture("")] |
16 | 16 | ||
17 | // Setting ComVisible to false makes the types in this assembly not visible | 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 | 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. | 19 | // COM, set the ComVisible attribute to true on that type. |
20 | [assembly: ComVisible(false)] | 20 | [assembly: ComVisible(false)] |
21 | 21 | ||
@@ -25,9 +25,9 @@ using System.Runtime.InteropServices; | |||
25 | // Version information for an assembly consists of the following four values: | 25 | // Version information for an assembly consists of the following four values: |
26 | // | 26 | // |
27 | // Major Version | 27 | // Major Version |
28 | // Minor Version | 28 | // Minor Version |
29 | // Build Number | 29 | // Build Number |
30 | // Revision | 30 | // Revision |
31 | // | 31 | // |
32 | [assembly: AssemblyVersion("0.8.3.*")] | 32 | [assembly: AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] |
33 | 33 | ||
diff --git a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs index bd55657..67fc14e 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs | |||
@@ -54,6 +54,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
54 | TRequest deserial; | 54 | TRequest deserial; |
55 | using (XmlTextReader xmlReader = new XmlTextReader(request)) | 55 | using (XmlTextReader xmlReader = new XmlTextReader(request)) |
56 | { | 56 | { |
57 | xmlReader.ProhibitDtd = true; | ||
58 | |||
57 | XmlSerializer deserializer = new XmlSerializer(typeof (TRequest)); | 59 | XmlSerializer deserializer = new XmlSerializer(typeof (TRequest)); |
58 | deserial = (TRequest) deserializer.Deserialize(xmlReader); | 60 | deserial = (TRequest) deserializer.Deserialize(xmlReader); |
59 | } | 61 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs index ad69cd2..158befa 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs | |||
@@ -210,6 +210,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
210 | { | 210 | { |
211 | try | 211 | try |
212 | { | 212 | { |
213 | xmlReader.ProhibitDtd = true; | ||
214 | |||
213 | XmlSerializer deserializer = new XmlSerializer(typeof(RestSessionObject<TRequest>)); | 215 | XmlSerializer deserializer = new XmlSerializer(typeof(RestSessionObject<TRequest>)); |
214 | deserial = (RestSessionObject<TRequest>)deserializer.Deserialize(xmlReader); | 216 | deserial = (RestSessionObject<TRequest>)deserializer.Deserialize(xmlReader); |
215 | } | 217 | } |
@@ -269,6 +271,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
269 | { | 271 | { |
270 | try | 272 | try |
271 | { | 273 | { |
274 | xmlReader.ProhibitDtd = true; | ||
275 | |||
272 | XmlSerializer deserializer = new XmlSerializer(typeof(TRequest)); | 276 | XmlSerializer deserializer = new XmlSerializer(typeof(TRequest)); |
273 | deserial = (TRequest)deserializer.Deserialize(xmlReader); | 277 | deserial = (TRequest)deserializer.Deserialize(xmlReader); |
274 | } | 278 | } |
@@ -291,5 +295,5 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
291 | serializer.Serialize(xmlWriter, response); | 295 | serializer.Serialize(xmlWriter, response); |
292 | } | 296 | } |
293 | } | 297 | } |
294 | } | 298 | } |
295 | } \ No newline at end of file | 299 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs index 0305dee..dfc2715 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs | |||
@@ -50,11 +50,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
50 | 50 | ||
51 | protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 51 | protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) |
52 | { | 52 | { |
53 | string requestBody; | ||
53 | Encoding encoding = Encoding.UTF8; | 54 | Encoding encoding = Encoding.UTF8; |
54 | StreamReader streamReader = new StreamReader(request, encoding); | 55 | using(StreamReader streamReader = new StreamReader(request,encoding)) |
55 | 56 | requestBody = streamReader.ReadToEnd(); | |
56 | string requestBody = streamReader.ReadToEnd(); | ||
57 | streamReader.Close(); | ||
58 | 57 | ||
59 | string param = GetParam(path); | 58 | string param = GetParam(path); |
60 | string responseString = m_restMethod(requestBody, path, param, httpRequest, httpResponse); | 59 | string responseString = m_restMethod(requestBody, path, param, httpRequest, httpResponse); |
diff --git a/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs b/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs index c2925e3..c8af90f 100644 --- a/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs | |||
@@ -75,7 +75,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
75 | public event PongDelegate OnPong; | 75 | public event PongDelegate OnPong; |
76 | 76 | ||
77 | /// <summary> | 77 | /// <summary> |
78 | /// This is a regular HTTP Request... This may be removed in the future. | 78 | /// This is a regular HTTP Request... This may be removed in the future. |
79 | /// </summary> | 79 | /// </summary> |
80 | // public event RegularHttpRequestDelegate OnRegularHttpRequest; | 80 | // public event RegularHttpRequestDelegate OnRegularHttpRequest; |
81 | 81 | ||
@@ -93,9 +93,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
93 | /// When the websocket is closed, this will be fired. | 93 | /// When the websocket is closed, this will be fired. |
94 | /// </summary> | 94 | /// </summary> |
95 | public event CloseDelegate OnClose; | 95 | public event CloseDelegate OnClose; |
96 | 96 | ||
97 | /// <summary> | 97 | /// <summary> |
98 | /// Set this delegate to allow your module to validate the origin of the | 98 | /// Set this delegate to allow your module to validate the origin of the |
99 | /// Websocket request. Primary line of defense against cross site scripting | 99 | /// Websocket request. Primary line of defense against cross site scripting |
100 | /// </summary> | 100 | /// </summary> |
101 | public ValidateHandshake HandshakeValidateMethodOverride = null; | 101 | public ValidateHandshake HandshakeValidateMethodOverride = null; |
@@ -181,7 +181,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
181 | { | 181 | { |
182 | throw new InvalidOperationException("The socket has been shutdown"); | 182 | throw new InvalidOperationException("The socket has been shutdown"); |
183 | } | 183 | } |
184 | } | 184 | } |
185 | set | 185 | set |
186 | { | 186 | { |
187 | if (_networkContext != null && _networkContext.Socket != null) | 187 | if (_networkContext != null && _networkContext.Socket != null) |
@@ -194,8 +194,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
194 | } | 194 | } |
195 | 195 | ||
196 | /// <summary> | 196 | /// <summary> |
197 | /// This triggers the websocket to start the upgrade process... | 197 | /// This triggers the websocket to start the upgrade process... |
198 | /// This is a Generalized Networking 'common sense' helper method. Some people expect to call Start() instead | 198 | /// This is a Generalized Networking 'common sense' helper method. Some people expect to call Start() instead |
199 | /// of the more context appropriate HandshakeAndUpgrade() | 199 | /// of the more context appropriate HandshakeAndUpgrade() |
200 | /// </summary> | 200 | /// </summary> |
201 | public void Start() | 201 | public void Start() |
@@ -261,7 +261,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
261 | acceptKey = GenerateAcceptKey(websocketKey); | 261 | acceptKey = GenerateAcceptKey(websocketKey); |
262 | string rawaccept = string.Format(HandshakeAcceptText, acceptKey); | 262 | string rawaccept = string.Format(HandshakeAcceptText, acceptKey); |
263 | SendUpgradeSuccess(rawaccept); | 263 | SendUpgradeSuccess(rawaccept); |
264 | 264 | ||
265 | 265 | ||
266 | } | 266 | } |
267 | else | 267 | else |
@@ -282,7 +282,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
282 | } | 282 | } |
283 | 283 | ||
284 | /// <summary> | 284 | /// <summary> |
285 | /// Generates a handshake response key string based on the client's | 285 | /// Generates a handshake response key string based on the client's |
286 | /// provided key to prove to the client that we're allowing the Websocket | 286 | /// provided key to prove to the client that we're allowing the Websocket |
287 | /// upgrade of our own free will and we were not coerced into doing it. | 287 | /// upgrade of our own free will and we were not coerced into doing it. |
288 | /// </summary> | 288 | /// </summary> |
@@ -298,7 +298,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
298 | SHA1 hashobj = SHA1.Create(); | 298 | SHA1 hashobj = SHA1.Create(); |
299 | string ret = Convert.ToBase64String(hashobj.ComputeHash(Encoding.UTF8.GetBytes(acceptkey))); | 299 | string ret = Convert.ToBase64String(hashobj.ComputeHash(Encoding.UTF8.GetBytes(acceptkey))); |
300 | hashobj.Clear(); | 300 | hashobj.Clear(); |
301 | 301 | ||
302 | return ret; | 302 | return ret; |
303 | } | 303 | } |
304 | 304 | ||
@@ -310,11 +310,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
310 | { | 310 | { |
311 | // Create a new websocket state so we can keep track of data in between network reads. | 311 | // Create a new websocket state so we can keep track of data in between network reads. |
312 | WebSocketState socketState = new WebSocketState() { ReceivedBytes = new List<byte>(), Header = WebsocketFrameHeader.HeaderDefault(), FrameComplete = true}; | 312 | WebSocketState socketState = new WebSocketState() { ReceivedBytes = new List<byte>(), Header = WebsocketFrameHeader.HeaderDefault(), FrameComplete = true}; |
313 | 313 | ||
314 | byte[] bhandshakeResponse = Encoding.UTF8.GetBytes(pHandshakeResponse); | 314 | byte[] bhandshakeResponse = Encoding.UTF8.GetBytes(pHandshakeResponse); |
315 | 315 | ||
316 | 316 | ||
317 | 317 | ||
318 | 318 | ||
319 | try | 319 | try |
320 | { | 320 | { |
@@ -324,7 +324,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
324 | } | 324 | } |
325 | // Begin reading the TCP stream before writing the Upgrade success message to the other side of the stream. | 325 | // Begin reading the TCP stream before writing the Upgrade success message to the other side of the stream. |
326 | _networkContext.Stream.BeginRead(_buffer, 0, _bufferLength, OnReceive, socketState); | 326 | _networkContext.Stream.BeginRead(_buffer, 0, _bufferLength, OnReceive, socketState); |
327 | 327 | ||
328 | // Write the upgrade handshake success message | 328 | // Write the upgrade handshake success message |
329 | _networkContext.Stream.Write(bhandshakeResponse, 0, bhandshakeResponse.Length); | 329 | _networkContext.Stream.Write(bhandshakeResponse, 0, bhandshakeResponse.Length); |
330 | _networkContext.Stream.Flush(); | 330 | _networkContext.Stream.Flush(); |
@@ -345,7 +345,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
345 | catch (ObjectDisposedException) | 345 | catch (ObjectDisposedException) |
346 | { | 346 | { |
347 | Close(string.Empty); | 347 | Close(string.Empty); |
348 | } | 348 | } |
349 | } | 349 | } |
350 | 350 | ||
351 | /// <summary> | 351 | /// <summary> |
@@ -369,7 +369,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
369 | 369 | ||
370 | /// <summary> | 370 | /// <summary> |
371 | /// This is our ugly Async OnReceive event handler. | 371 | /// This is our ugly Async OnReceive event handler. |
372 | /// This chunks the input stream based on the length of the provided buffer and processes out | 372 | /// This chunks the input stream based on the length of the provided buffer and processes out |
373 | /// as many frames as it can. It then moves the unprocessed data to the beginning of the buffer. | 373 | /// as many frames as it can. It then moves the unprocessed data to the beginning of the buffer. |
374 | /// </summary> | 374 | /// </summary> |
375 | /// <param name="ar">Our Async State from beginread</param> | 375 | /// <param name="ar">Our Async State from beginread</param> |
@@ -390,7 +390,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
390 | 390 | ||
391 | if (_bufferPosition > _bufferLength) | 391 | if (_bufferPosition > _bufferLength) |
392 | { | 392 | { |
393 | // Message too big for chunksize.. not sure how this happened... | 393 | // Message too big for chunksize.. not sure how this happened... |
394 | //Close(string.Empty); | 394 | //Close(string.Empty); |
395 | } | 395 | } |
396 | 396 | ||
@@ -413,7 +413,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
413 | if (pheader.PayloadLen > (ulong) _maxPayloadBytes) | 413 | if (pheader.PayloadLen > (ulong) _maxPayloadBytes) |
414 | { | 414 | { |
415 | Close("Invalid Payload size"); | 415 | Close("Invalid Payload size"); |
416 | 416 | ||
417 | return; | 417 | return; |
418 | } | 418 | } |
419 | if (pheader.PayloadLen > 0) | 419 | if (pheader.PayloadLen > 0) |
@@ -487,7 +487,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
487 | _socketState.ReceivedBytes.Clear(); | 487 | _socketState.ReceivedBytes.Clear(); |
488 | _socketState.ExpectedBytes = 0; | 488 | _socketState.ExpectedBytes = 0; |
489 | // do some processing | 489 | // do some processing |
490 | } | 490 | } |
491 | } | 491 | } |
492 | } | 492 | } |
493 | if (offset > 0) | 493 | if (offset > 0) |
@@ -504,7 +504,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
504 | } | 504 | } |
505 | else | 505 | else |
506 | { | 506 | { |
507 | // We can't read the stream anymore... | 507 | // We can't read the stream anymore... |
508 | } | 508 | } |
509 | } | 509 | } |
510 | catch (IOException) | 510 | catch (IOException) |
@@ -533,7 +533,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
533 | textMessageFrame.Header.Opcode = WebSocketReader.OpCode.Text; | 533 | textMessageFrame.Header.Opcode = WebSocketReader.OpCode.Text; |
534 | textMessageFrame.Header.IsEnd = true; | 534 | textMessageFrame.Header.IsEnd = true; |
535 | SendSocket(textMessageFrame.ToBytes()); | 535 | SendSocket(textMessageFrame.ToBytes()); |
536 | 536 | ||
537 | } | 537 | } |
538 | 538 | ||
539 | public void SendData(byte[] data) | 539 | public void SendData(byte[] data) |
@@ -657,7 +657,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
657 | SendSocket(pongFrame.ToBytes()); | 657 | SendSocket(pongFrame.ToBytes()); |
658 | break; | 658 | break; |
659 | case WebSocketReader.OpCode.Pong: | 659 | case WebSocketReader.OpCode.Pong: |
660 | 660 | ||
661 | PongDelegate pongD = OnPong; | 661 | PongDelegate pongD = OnPong; |
662 | if (pongD != null) | 662 | if (pongD != null) |
663 | { | 663 | { |
@@ -701,7 +701,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
701 | { | 701 | { |
702 | textD(this, new WebsocketTextEventArgs() { Data = Encoding.UTF8.GetString(psocketState.ReceivedBytes.ToArray()) }); | 702 | textD(this, new WebsocketTextEventArgs() { Data = Encoding.UTF8.GetString(psocketState.ReceivedBytes.ToArray()) }); |
703 | } | 703 | } |
704 | 704 | ||
705 | // Send Done Event! | 705 | // Send Done Event! |
706 | } | 706 | } |
707 | break; | 707 | break; |
@@ -719,7 +719,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
719 | { | 719 | { |
720 | if (psocketState.ContinuationFrame.Header.Opcode == WebSocketReader.OpCode.Text) | 720 | if (psocketState.ContinuationFrame.Header.Opcode == WebSocketReader.OpCode.Text) |
721 | { | 721 | { |
722 | // Send Done event | 722 | // Send Done event |
723 | TextDelegate textD = OnText; | 723 | TextDelegate textD = OnText; |
724 | if (textD != null) | 724 | if (textD != null) |
725 | { | 725 | { |
@@ -744,9 +744,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
744 | break; | 744 | break; |
745 | case WebSocketReader.OpCode.Close: | 745 | case WebSocketReader.OpCode.Close: |
746 | Close(string.Empty); | 746 | Close(string.Empty); |
747 | 747 | ||
748 | break; | 748 | break; |
749 | 749 | ||
750 | } | 750 | } |
751 | psocketState.Header.SetDefault(); | 751 | psocketState.Header.SetDefault(); |
752 | psocketState.ReceivedBytes.Clear(); | 752 | psocketState.ReceivedBytes.Clear(); |
@@ -837,12 +837,12 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
837 | } | 837 | } |
838 | 838 | ||
839 | /// <summary> | 839 | /// <summary> |
840 | /// Attempts to read a header off the provided buffer. Returns true, exports a WebSocketFrameheader, | 840 | /// Attempts to read a header off the provided buffer. Returns true, exports a WebSocketFrameheader, |
841 | /// and an int to move the buffer forward when it reads a header. False when it can't read a header | 841 | /// and an int to move the buffer forward when it reads a header. False when it can't read a header |
842 | /// </summary> | 842 | /// </summary> |
843 | /// <param name="pBuffer">Bytes read from the stream</param> | 843 | /// <param name="pBuffer">Bytes read from the stream</param> |
844 | /// <param name="pOffset">Starting place in the stream to begin trying to read from</param> | 844 | /// <param name="pOffset">Starting place in the stream to begin trying to read from</param> |
845 | /// <param name="length">Lenth in the stream to try and read from. Provided for cases where the | 845 | /// <param name="length">Lenth in the stream to try and read from. Provided for cases where the |
846 | /// buffer's length is larger then the data in it</param> | 846 | /// buffer's length is larger then the data in it</param> |
847 | /// <param name="oHeader">Outputs the read WebSocket frame header</param> | 847 | /// <param name="oHeader">Outputs the read WebSocket frame header</param> |
848 | /// <param name="moveBuffer">Informs the calling stream to move the buffer forward</param> | 848 | /// <param name="moveBuffer">Informs the calling stream to move the buffer forward</param> |
@@ -897,7 +897,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
897 | oHeader.PayloadLen = BitConverter.ToUInt16(pBuffer, pOffset + index); | 897 | oHeader.PayloadLen = BitConverter.ToUInt16(pBuffer, pOffset + index); |
898 | index += 2; | 898 | index += 2; |
899 | break; | 899 | break; |
900 | case 127: // we got more this is a bigger frame | 900 | case 127: // we got more this is a bigger frame |
901 | // 8 bytes - uint64 - most significant bit 0 network byte order | 901 | // 8 bytes - uint64 - most significant bit 0 network byte order |
902 | minumheadersize += 8; | 902 | minumheadersize += 8; |
903 | if (length < minumheadersize) | 903 | if (length < minumheadersize) |
@@ -909,7 +909,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
909 | oHeader.PayloadLen = BitConverter.ToUInt64(pBuffer, pOffset + index); | 909 | oHeader.PayloadLen = BitConverter.ToUInt64(pBuffer, pOffset + index); |
910 | index += 8; | 910 | index += 8; |
911 | break; | 911 | break; |
912 | 912 | ||
913 | } | 913 | } |
914 | //oHeader.PayloadLeft = oHeader.PayloadLen; // Start the count in case it's chunked over the network. This is different then frame fragmentation | 914 | //oHeader.PayloadLeft = oHeader.PayloadLen; // Start the count in case it's chunked over the network. This is different then frame fragmentation |
915 | if (oHeader.IsMasked) | 915 | if (oHeader.IsMasked) |
@@ -937,9 +937,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
937 | /* | 937 | /* |
938 | * RFC6455 | 938 | * RFC6455 |
939 | nib 0 1 2 3 4 5 6 7 | 939 | nib 0 1 2 3 4 5 6 7 |
940 | byt 0 1 2 3 | 940 | byt 0 1 2 3 |
941 | dec 0 1 2 3 | 941 | dec 0 1 2 3 |
942 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 942 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
943 | +-+-+-+-+-------+-+-------------+-------------------------------+ | 943 | +-+-+-+-+-------+-+-------------+-------------------------------+ |
944 | |F|R|R|R| opcode|M| Payload len | Extended payload length | | 944 | |F|R|R|R| opcode|M| Payload len | Extended payload length | |
945 | |I|S|S|S| (4) |A| (7) | (16/64) + | 945 | |I|S|S|S| (4) |A| (7) | (16/64) + |
@@ -963,7 +963,7 @@ dec 0 1 2 3 | |||
963 | public static readonly WebSocketFrame DefaultFrame = new WebSocketFrame(){Header = new WebsocketFrameHeader(),WebSocketPayload = new byte[0]}; | 963 | public static readonly WebSocketFrame DefaultFrame = new WebSocketFrame(){Header = new WebsocketFrameHeader(),WebSocketPayload = new byte[0]}; |
964 | public WebsocketFrameHeader Header; | 964 | public WebsocketFrameHeader Header; |
965 | public byte[] WebSocketPayload; | 965 | public byte[] WebSocketPayload; |
966 | 966 | ||
967 | public byte[] ToBytes() | 967 | public byte[] ToBytes() |
968 | { | 968 | { |
969 | Header.PayloadLen = (ulong)WebSocketPayload.Length; | 969 | Header.PayloadLen = (ulong)WebSocketPayload.Length; |
@@ -991,7 +991,7 @@ dec 0 1 2 3 | |||
991 | public int Mask; | 991 | public int Mask; |
992 | /* | 992 | /* |
993 | byt 0 1 2 3 | 993 | byt 0 1 2 3 |
994 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 994 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
995 | +---------------+---------------+---------------+---------------+ | 995 | +---------------+---------------+---------------+---------------+ |
996 | | Octal 1 | Octal 2 | Octal 3 | Octal 4 | | 996 | | Octal 1 | Octal 2 | Octal 3 | Octal 4 | |
997 | +---------------+---------------+---------------+---------------+ | 997 | +---------------+---------------+---------------+---------------+ |
@@ -1002,11 +1002,11 @@ byt 0 1 2 3 | |||
1002 | 1002 | ||
1003 | public UInt64 PayloadLen; | 1003 | public UInt64 PayloadLen; |
1004 | //public UInt64 PayloadLeft; | 1004 | //public UInt64 PayloadLeft; |
1005 | // Payload is X + Y | 1005 | // Payload is X + Y |
1006 | //public UInt64 ExtensionDataLength; | 1006 | //public UInt64 ExtensionDataLength; |
1007 | //public UInt64 ApplicationDataLength; | 1007 | //public UInt64 ApplicationDataLength; |
1008 | public static readonly WebsocketFrameHeader ZeroHeader = WebsocketFrameHeader.HeaderDefault(); | 1008 | public static readonly WebsocketFrameHeader ZeroHeader = WebsocketFrameHeader.HeaderDefault(); |
1009 | 1009 | ||
1010 | public void SetDefault() | 1010 | public void SetDefault() |
1011 | { | 1011 | { |
1012 | 1012 | ||
@@ -1025,16 +1025,16 @@ byt 0 1 2 3 | |||
1025 | /// <summary> | 1025 | /// <summary> |
1026 | /// Returns a byte array representing the Frame header | 1026 | /// Returns a byte array representing the Frame header |
1027 | /// </summary> | 1027 | /// </summary> |
1028 | /// <param name="payload">This is the frame data payload. The header describes the size of the payload. | 1028 | /// <param name="payload">This is the frame data payload. The header describes the size of the payload. |
1029 | /// If payload is null, a Zero sized payload is assumed</param> | 1029 | /// If payload is null, a Zero sized payload is assumed</param> |
1030 | /// <returns>Returns a byte array representing the frame header</returns> | 1030 | /// <returns>Returns a byte array representing the frame header</returns> |
1031 | public byte[] ToBytes(byte[] payload) | 1031 | public byte[] ToBytes(byte[] payload) |
1032 | { | 1032 | { |
1033 | List<byte> result = new List<byte>(); | 1033 | List<byte> result = new List<byte>(); |
1034 | 1034 | ||
1035 | // Squeeze in our opcode and our ending bit. | 1035 | // Squeeze in our opcode and our ending bit. |
1036 | result.Add((byte)((byte)Opcode | (IsEnd?0x80:0x00) )); | 1036 | result.Add((byte)((byte)Opcode | (IsEnd?0x80:0x00) )); |
1037 | 1037 | ||
1038 | // Again with the three different byte interpretations of size.. | 1038 | // Again with the three different byte interpretations of size.. |
1039 | 1039 | ||
1040 | //bytesize | 1040 | //bytesize |
@@ -1056,7 +1056,7 @@ byt 0 1 2 3 | |||
1056 | Array.Reverse(payloadLengthByte); | 1056 | Array.Reverse(payloadLengthByte); |
1057 | result.AddRange(payloadLengthByte); | 1057 | result.AddRange(payloadLengthByte); |
1058 | } | 1058 | } |
1059 | 1059 | ||
1060 | // Only add a payload if it's not null | 1060 | // Only add a payload if it's not null |
1061 | if (payload != null) | 1061 | if (payload != null) |
1062 | { | 1062 | { |
@@ -1155,5 +1155,5 @@ byt 0 1 2 3 | |||
1155 | 1155 | ||
1156 | } | 1156 | } |
1157 | 1157 | ||
1158 | 1158 | ||
1159 | } | 1159 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/XmlRpcBasicDOSProtector.cs b/OpenSim/Framework/Servers/HttpServer/XmlRpcBasicDOSProtector.cs index f212208..6b2c0ab 100644 --- a/OpenSim/Framework/Servers/HttpServer/XmlRpcBasicDOSProtector.cs +++ b/OpenSim/Framework/Servers/HttpServer/XmlRpcBasicDOSProtector.cs | |||
@@ -36,7 +36,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
36 | { | 36 | { |
37 | private readonly XmlRpcMethod _normalMethod; | 37 | private readonly XmlRpcMethod _normalMethod; |
38 | private readonly XmlRpcMethod _throttledMethod; | 38 | private readonly XmlRpcMethod _throttledMethod; |
39 | 39 | ||
40 | private readonly BasicDosProtectorOptions _options; | 40 | private readonly BasicDosProtectorOptions _options; |
41 | private readonly BasicDOSProtector _dosProtector; | 41 | private readonly BasicDOSProtector _dosProtector; |
42 | 42 | ||
@@ -44,7 +44,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
44 | { | 44 | { |
45 | _normalMethod = normalMethod; | 45 | _normalMethod = normalMethod; |
46 | _throttledMethod = throttledMethod; | 46 | _throttledMethod = throttledMethod; |
47 | 47 | ||
48 | _options = options; | 48 | _options = options; |
49 | _dosProtector = new BasicDOSProtector(_options); | 49 | _dosProtector = new BasicDOSProtector(_options); |
50 | 50 | ||
@@ -87,5 +87,5 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
87 | 87 | ||
88 | } | 88 | } |
89 | 89 | ||
90 | 90 | ||
91 | } | 91 | } |
diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs index 57931d4..9b1d906 100644 --- a/OpenSim/Framework/Servers/MainServer.cs +++ b/OpenSim/Framework/Servers/MainServer.cs | |||
@@ -223,11 +223,11 @@ namespace OpenSim.Framework.Servers | |||
223 | { | 223 | { |
224 | handlers.AppendFormat( | 224 | handlers.AppendFormat( |
225 | "Registered HTTP Handlers for server at {0}:{1}\n", httpServer.ListenIPAddress, httpServer.Port); | 225 | "Registered HTTP Handlers for server at {0}:{1}\n", httpServer.ListenIPAddress, httpServer.Port); |
226 | 226 | ||
227 | handlers.AppendFormat("* XMLRPC:\n"); | 227 | handlers.AppendFormat("* XMLRPC:\n"); |
228 | foreach (String s in httpServer.GetXmlRpcHandlerKeys()) | 228 | foreach (String s in httpServer.GetXmlRpcHandlerKeys()) |
229 | handlers.AppendFormat("\t{0}\n", s); | 229 | handlers.AppendFormat("\t{0}\n", s); |
230 | 230 | ||
231 | handlers.AppendFormat("* HTTP:\n"); | 231 | handlers.AppendFormat("* HTTP:\n"); |
232 | foreach (String s in httpServer.GetHTTPHandlerKeys()) | 232 | foreach (String s in httpServer.GetHTTPHandlerKeys()) |
233 | handlers.AppendFormat("\t{0}\n", s); | 233 | handlers.AppendFormat("\t{0}\n", s); |
@@ -235,19 +235,19 @@ namespace OpenSim.Framework.Servers | |||
235 | handlers.AppendFormat("* HTTP (poll):\n"); | 235 | handlers.AppendFormat("* HTTP (poll):\n"); |
236 | foreach (String s in httpServer.GetPollServiceHandlerKeys()) | 236 | foreach (String s in httpServer.GetPollServiceHandlerKeys()) |
237 | handlers.AppendFormat("\t{0}\n", s); | 237 | handlers.AppendFormat("\t{0}\n", s); |
238 | 238 | ||
239 | handlers.AppendFormat("* JSONRPC:\n"); | 239 | handlers.AppendFormat("* JSONRPC:\n"); |
240 | foreach (String s in httpServer.GetJsonRpcHandlerKeys()) | 240 | foreach (String s in httpServer.GetJsonRpcHandlerKeys()) |
241 | handlers.AppendFormat("\t{0}\n", s); | 241 | handlers.AppendFormat("\t{0}\n", s); |
242 | 242 | ||
243 | // handlers.AppendFormat("* Agent:\n"); | 243 | // handlers.AppendFormat("* Agent:\n"); |
244 | // foreach (String s in httpServer.GetAgentHandlerKeys()) | 244 | // foreach (String s in httpServer.GetAgentHandlerKeys()) |
245 | // handlers.AppendFormat("\t{0}\n", s); | 245 | // handlers.AppendFormat("\t{0}\n", s); |
246 | 246 | ||
247 | handlers.AppendFormat("* LLSD:\n"); | 247 | handlers.AppendFormat("* LLSD:\n"); |
248 | foreach (String s in httpServer.GetLLSDHandlerKeys()) | 248 | foreach (String s in httpServer.GetLLSDHandlerKeys()) |
249 | handlers.AppendFormat("\t{0}\n", s); | 249 | handlers.AppendFormat("\t{0}\n", s); |
250 | 250 | ||
251 | handlers.AppendFormat("* StreamHandlers ({0}):\n", httpServer.GetStreamHandlerKeys().Count); | 251 | handlers.AppendFormat("* StreamHandlers ({0}):\n", httpServer.GetStreamHandlerKeys().Count); |
252 | foreach (String s in httpServer.GetStreamHandlerKeys()) | 252 | foreach (String s in httpServer.GetStreamHandlerKeys()) |
253 | handlers.AppendFormat("\t{0}\n", s); | 253 | handlers.AppendFormat("\t{0}\n", s); |
@@ -334,7 +334,7 @@ namespace OpenSim.Framework.Servers | |||
334 | { | 334 | { |
335 | if (port == 0) | 335 | if (port == 0) |
336 | return Instance; | 336 | return Instance; |
337 | 337 | ||
338 | if (instance != null && port == Instance.Port) | 338 | if (instance != null && port == Instance.Port) |
339 | return Instance; | 339 | return Instance; |
340 | 340 | ||
@@ -353,5 +353,17 @@ namespace OpenSim.Framework.Servers | |||
353 | return m_Servers[port]; | 353 | return m_Servers[port]; |
354 | } | 354 | } |
355 | } | 355 | } |
356 | |||
357 | public static void Stop() | ||
358 | { | ||
359 | lock (m_Servers) | ||
360 | { | ||
361 | foreach (BaseHttpServer httpServer in m_Servers.Values) | ||
362 | { | ||
363 | httpServer.Stop(); | ||
364 | } | ||
365 | } | ||
366 | } | ||
367 | |||
356 | } | 368 | } |
357 | } \ No newline at end of file | 369 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/Properties/AssemblyInfo.cs b/OpenSim/Framework/Servers/Properties/AssemblyInfo.cs index 792c62e..4469e7c 100644 --- a/OpenSim/Framework/Servers/Properties/AssemblyInfo.cs +++ b/OpenSim/Framework/Servers/Properties/AssemblyInfo.cs | |||
@@ -2,7 +2,7 @@ | |||
2 | using System.Runtime.CompilerServices; | 2 | using System.Runtime.CompilerServices; |
3 | using System.Runtime.InteropServices; | 3 | using System.Runtime.InteropServices; |
4 | 4 | ||
5 | // General Information about an assembly is controlled through the following | 5 | // General Information about an assembly is controlled through the following |
6 | // set of attributes. Change these attribute values to modify the information | 6 | // set of attributes. Change these attribute values to modify the information |
7 | // associated with an assembly. | 7 | // associated with an assembly. |
8 | [assembly: AssemblyTitle("OpenSim.Framework.Servers")] | 8 | [assembly: AssemblyTitle("OpenSim.Framework.Servers")] |
@@ -14,8 +14,8 @@ using System.Runtime.InteropServices; | |||
14 | [assembly: AssemblyTrademark("")] | 14 | [assembly: AssemblyTrademark("")] |
15 | [assembly: AssemblyCulture("")] | 15 | [assembly: AssemblyCulture("")] |
16 | 16 | ||
17 | // Setting ComVisible to false makes the types in this assembly not visible | 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 | 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. | 19 | // COM, set the ComVisible attribute to true on that type. |
20 | [assembly: ComVisible(false)] | 20 | [assembly: ComVisible(false)] |
21 | 21 | ||
@@ -25,7 +25,7 @@ using System.Runtime.InteropServices; | |||
25 | // Version information for an assembly consists of the following four values: | 25 | // Version information for an assembly consists of the following four values: |
26 | // | 26 | // |
27 | // Major Version | 27 | // Major Version |
28 | // Minor Version | 28 | // Minor Version |
29 | // Build Number | 29 | // Build Number |
30 | // Revision | 30 | // Revision |
31 | // | 31 | // |
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs index 07a09e6..3c2dce8 100644 --- a/OpenSim/Framework/Servers/ServerBase.cs +++ b/OpenSim/Framework/Servers/ServerBase.cs | |||
@@ -56,7 +56,8 @@ namespace OpenSim.Framework.Servers | |||
56 | protected ICommandConsole m_console; | 56 | protected ICommandConsole m_console; |
57 | 57 | ||
58 | protected OpenSimAppender m_consoleAppender; | 58 | protected OpenSimAppender m_consoleAppender; |
59 | protected FileAppender m_logFileAppender; | 59 | protected FileAppender m_logFileAppender; |
60 | protected FileAppender m_statsLogFileAppender; | ||
60 | 61 | ||
61 | protected DateTime m_startuptime; | 62 | protected DateTime m_startuptime; |
62 | protected string m_startupDirectory = Environment.CurrentDirectory; | 63 | protected string m_startupDirectory = Environment.CurrentDirectory; |
@@ -81,7 +82,7 @@ namespace OpenSim.Framework.Servers | |||
81 | { | 82 | { |
82 | if (File.Exists(path)) | 83 | if (File.Exists(path)) |
83 | m_log.ErrorFormat( | 84 | m_log.ErrorFormat( |
84 | "[SERVER BASE]: Previous pid file {0} still exists on startup. Possibly previously unclean shutdown.", | 85 | "[SERVER BASE]: Previous pid file {0} still exists on startup. Possibly previously unclean shutdown.", |
85 | path); | 86 | path); |
86 | 87 | ||
87 | try | 88 | try |
@@ -103,7 +104,7 @@ namespace OpenSim.Framework.Servers | |||
103 | m_log.Warn(string.Format("[SERVER BASE]: Could not create PID file at {0} ", path), e); | 104 | m_log.Warn(string.Format("[SERVER BASE]: Could not create PID file at {0} ", path), e); |
104 | } | 105 | } |
105 | } | 106 | } |
106 | 107 | ||
107 | protected void RemovePIDFile() | 108 | protected void RemovePIDFile() |
108 | { | 109 | { |
109 | if (m_pidFile != String.Empty) | 110 | if (m_pidFile != String.Empty) |
@@ -156,6 +157,10 @@ namespace OpenSim.Framework.Servers | |||
156 | { | 157 | { |
157 | m_logFileAppender = (FileAppender)appender; | 158 | m_logFileAppender = (FileAppender)appender; |
158 | } | 159 | } |
160 | else if (appender.Name == "StatsLogFileAppender") | ||
161 | { | ||
162 | m_statsLogFileAppender = (FileAppender)appender; | ||
163 | } | ||
159 | } | 164 | } |
160 | 165 | ||
161 | if (null == m_consoleAppender) | 166 | if (null == m_consoleAppender) |
@@ -166,11 +171,11 @@ namespace OpenSim.Framework.Servers | |||
166 | { | 171 | { |
167 | // FIXME: This should be done through an interface rather than casting. | 172 | // FIXME: This should be done through an interface rather than casting. |
168 | m_consoleAppender.Console = (ConsoleBase)m_console; | 173 | m_consoleAppender.Console = (ConsoleBase)m_console; |
169 | 174 | ||
170 | // If there is no threshold set then the threshold is effectively everything. | 175 | // If there is no threshold set then the threshold is effectively everything. |
171 | if (null == m_consoleAppender.Threshold) | 176 | if (null == m_consoleAppender.Threshold) |
172 | m_consoleAppender.Threshold = Level.All; | 177 | m_consoleAppender.Threshold = Level.All; |
173 | 178 | ||
174 | Notice(String.Format("Console log level is {0}", m_consoleAppender.Threshold)); | 179 | Notice(String.Format("Console log level is {0}", m_consoleAppender.Threshold)); |
175 | } | 180 | } |
176 | 181 | ||
@@ -185,6 +190,18 @@ namespace OpenSim.Framework.Servers | |||
185 | 190 | ||
186 | m_log.InfoFormat("[SERVER BASE]: Logging started to file {0}", m_logFileAppender.File); | 191 | m_log.InfoFormat("[SERVER BASE]: Logging started to file {0}", m_logFileAppender.File); |
187 | } | 192 | } |
193 | |||
194 | if (m_statsLogFileAppender != null && startupConfig != null) | ||
195 | { | ||
196 | string cfgStatsFileName = startupConfig.GetString("StatsLogFile", null); | ||
197 | if (cfgStatsFileName != null) | ||
198 | { | ||
199 | m_statsLogFileAppender.File = cfgStatsFileName; | ||
200 | m_statsLogFileAppender.ActivateOptions(); | ||
201 | } | ||
202 | |||
203 | m_log.InfoFormat("[SERVER BASE]: Stats Logging started to file {0}", m_statsLogFileAppender.File); | ||
204 | } | ||
188 | } | 205 | } |
189 | 206 | ||
190 | /// <summary> | 207 | /// <summary> |
@@ -205,11 +222,11 @@ namespace OpenSim.Framework.Servers | |||
205 | "General", false, "show uptime", "show uptime", "Show server uptime", HandleShow); | 222 | "General", false, "show uptime", "show uptime", "Show server uptime", HandleShow); |
206 | 223 | ||
207 | m_console.Commands.AddCommand( | 224 | m_console.Commands.AddCommand( |
208 | "General", false, "get log level", "get log level", "Get the current console logging level", | 225 | "General", false, "get log level", "get log level", "Get the current console logging level", |
209 | (mod, cmd) => ShowLogLevel()); | 226 | (mod, cmd) => ShowLogLevel()); |
210 | 227 | ||
211 | m_console.Commands.AddCommand( | 228 | m_console.Commands.AddCommand( |
212 | "General", false, "set log level", "set log level <level>", | 229 | "General", false, "set log level", "set log level <level>", |
213 | "Set the console logging level for this session.", HandleSetLogLevel); | 230 | "Set the console logging level for this session.", HandleSetLogLevel); |
214 | 231 | ||
215 | m_console.Commands.AddCommand( | 232 | m_console.Commands.AddCommand( |
@@ -222,14 +239,14 @@ namespace OpenSim.Framework.Servers | |||
222 | "config get [<section>] [<key>]", | 239 | "config get [<section>] [<key>]", |
223 | "Synonym for config show", | 240 | "Synonym for config show", |
224 | HandleConfig); | 241 | HandleConfig); |
225 | 242 | ||
226 | m_console.Commands.AddCommand( | 243 | m_console.Commands.AddCommand( |
227 | "General", false, "config show", | 244 | "General", false, "config show", |
228 | "config show [<section>] [<key>]", | 245 | "config show [<section>] [<key>]", |
229 | "Show config information", | 246 | "Show config information", |
230 | "If neither section nor field are specified, then the whole current configuration is printed." + Environment.NewLine | 247 | "If neither section nor field are specified, then the whole current configuration is printed." + Environment.NewLine |
231 | + "If a section is given but not a field, then all fields in that section are printed.", | 248 | + "If a section is given but not a field, then all fields in that section are printed.", |
232 | HandleConfig); | 249 | HandleConfig); |
233 | 250 | ||
234 | m_console.Commands.AddCommand( | 251 | m_console.Commands.AddCommand( |
235 | "General", false, "config save", | 252 | "General", false, "config save", |
@@ -258,18 +275,6 @@ namespace OpenSim.Framework.Servers | |||
258 | (string module, string[] args) => Notice(GetThreadsReport())); | 275 | (string module, string[] args) => Notice(GetThreadsReport())); |
259 | 276 | ||
260 | m_console.Commands.AddCommand ( | 277 | m_console.Commands.AddCommand ( |
261 | "Debug", false, "debug comms set", | ||
262 | "debug comms set serialosdreq true|false", | ||
263 | "Set comms parameters. For debug purposes.", | ||
264 | HandleDebugCommsSet); | ||
265 | |||
266 | m_console.Commands.AddCommand ( | ||
267 | "Debug", false, "debug comms status", | ||
268 | "debug comms status", | ||
269 | "Show current debug comms parameters.", | ||
270 | HandleDebugCommsStatus); | ||
271 | |||
272 | m_console.Commands.AddCommand ( | ||
273 | "Debug", false, "debug threadpool set", | 278 | "Debug", false, "debug threadpool set", |
274 | "debug threadpool set worker|iocp min|max <n>", | 279 | "debug threadpool set worker|iocp min|max <n>", |
275 | "Set threadpool parameters. For debug purposes.", | 280 | "Set threadpool parameters. For debug purposes.", |
@@ -280,7 +285,7 @@ namespace OpenSim.Framework.Servers | |||
280 | "debug threadpool status", | 285 | "debug threadpool status", |
281 | "Show current debug threadpool parameters.", | 286 | "Show current debug threadpool parameters.", |
282 | HandleDebugThreadpoolStatus); | 287 | HandleDebugThreadpoolStatus); |
283 | 288 | ||
284 | m_console.Commands.AddCommand( | 289 | m_console.Commands.AddCommand( |
285 | "Debug", false, "debug threadpool level", | 290 | "Debug", false, "debug threadpool level", |
286 | "debug threadpool level 0.." + Util.MAX_THREADPOOL_LEVEL, | 291 | "debug threadpool level 0.." + Util.MAX_THREADPOOL_LEVEL, |
@@ -326,47 +331,13 @@ namespace OpenSim.Framework.Servers | |||
326 | 331 | ||
327 | public void RegisterCommonComponents(IConfigSource configSource) | 332 | public void RegisterCommonComponents(IConfigSource configSource) |
328 | { | 333 | { |
329 | IConfig networkConfig = configSource.Configs["Network"]; | 334 | // IConfig networkConfig = configSource.Configs["Network"]; |
330 | 335 | ||
331 | if (networkConfig != null) | ||
332 | { | ||
333 | WebUtil.SerializeOSDRequestsPerEndpoint = networkConfig.GetBoolean("SerializeOSDRequests", false); | ||
334 | } | ||
335 | |||
336 | m_serverStatsCollector = new ServerStatsCollector(); | 336 | m_serverStatsCollector = new ServerStatsCollector(); |
337 | m_serverStatsCollector.Initialise(configSource); | 337 | m_serverStatsCollector.Initialise(configSource); |
338 | m_serverStatsCollector.Start(); | 338 | m_serverStatsCollector.Start(); |
339 | } | 339 | } |
340 | 340 | ||
341 | private void HandleDebugCommsStatus(string module, string[] args) | ||
342 | { | ||
343 | Notice("serialosdreq is {0}", WebUtil.SerializeOSDRequestsPerEndpoint); | ||
344 | } | ||
345 | |||
346 | private void HandleDebugCommsSet(string module, string[] args) | ||
347 | { | ||
348 | if (args.Length != 5) | ||
349 | { | ||
350 | Notice("Usage: debug comms set serialosdreq true|false"); | ||
351 | return; | ||
352 | } | ||
353 | |||
354 | if (args[3] != "serialosdreq") | ||
355 | { | ||
356 | Notice("Usage: debug comms set serialosdreq true|false"); | ||
357 | return; | ||
358 | } | ||
359 | |||
360 | bool setSerializeOsdRequests; | ||
361 | |||
362 | if (!ConsoleUtil.TryParseConsoleBool(m_console, args[4], out setSerializeOsdRequests)) | ||
363 | return; | ||
364 | |||
365 | WebUtil.SerializeOSDRequestsPerEndpoint = setSerializeOsdRequests; | ||
366 | |||
367 | Notice("serialosdreq is now {0}", setSerializeOsdRequests); | ||
368 | } | ||
369 | |||
370 | private void HandleShowThreadpoolCallsActive(string module, string[] args) | 341 | private void HandleShowThreadpoolCallsActive(string module, string[] args) |
371 | { | 342 | { |
372 | List<KeyValuePair<string, int>> calls = Util.GetFireAndForgetCallsInProgress().ToList(); | 343 | List<KeyValuePair<string, int>> calls = Util.GetFireAndForgetCallsInProgress().ToList(); |
@@ -432,7 +403,7 @@ namespace OpenSim.Framework.Servers | |||
432 | 403 | ||
433 | ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads); | 404 | ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads); |
434 | Notice("Available worker threads: {0}", workerThreads); | 405 | Notice("Available worker threads: {0}", workerThreads); |
435 | Notice("Available IOCP threads: {0}", iocpThreads); | 406 | Notice("Available IOCP threads: {0}", iocpThreads); |
436 | } | 407 | } |
437 | 408 | ||
438 | private void HandleDebugThreadpoolSet(string module, string[] args) | 409 | private void HandleDebugThreadpoolSet(string module, string[] args) |
@@ -488,7 +459,7 @@ namespace OpenSim.Framework.Servers | |||
488 | fail = true; | 459 | fail = true; |
489 | } | 460 | } |
490 | } | 461 | } |
491 | 462 | ||
492 | if (fail) | 463 | if (fail) |
493 | { | 464 | { |
494 | Notice("ERROR: Could not set {0} {1} threads to {2}", poolType, bound, newThreads); | 465 | Notice("ERROR: Could not set {0} {1} threads to {2}", poolType, bound, newThreads); |
@@ -582,7 +553,7 @@ namespace OpenSim.Framework.Servers | |||
582 | if (cmdparams.Length > 0) | 553 | if (cmdparams.Length > 0) |
583 | { | 554 | { |
584 | string firstParam = cmdparams[0].ToLower(); | 555 | string firstParam = cmdparams[0].ToLower(); |
585 | 556 | ||
586 | switch (firstParam) | 557 | switch (firstParam) |
587 | { | 558 | { |
588 | case "set": | 559 | case "set": |
@@ -633,12 +604,12 @@ namespace OpenSim.Framework.Servers | |||
633 | { | 604 | { |
634 | Notice("[{0}]", config.Name); | 605 | Notice("[{0}]", config.Name); |
635 | foreach (string key in config.GetKeys()) | 606 | foreach (string key in config.GetKeys()) |
636 | Notice(" {0} = {1}", key, config.GetString(key)); | 607 | Notice(" {0} = {1}", key, config.GetString(key)); |
637 | } | 608 | } |
638 | else | 609 | else |
639 | { | 610 | { |
640 | Notice( | 611 | Notice( |
641 | "config get {0} {1} : {2}", | 612 | "config get {0} {1} : {2}", |
642 | cmdparams[1], cmdparams[2], config.GetString(cmdparams[2])); | 613 | cmdparams[1], cmdparams[2], config.GetString(cmdparams[2])); |
643 | } | 614 | } |
644 | } | 615 | } |
@@ -692,10 +663,10 @@ namespace OpenSim.Framework.Servers | |||
692 | } | 663 | } |
693 | 664 | ||
694 | string rawLevel = cmd[3]; | 665 | string rawLevel = cmd[3]; |
695 | 666 | ||
696 | ILoggerRepository repository = LogManager.GetRepository(); | 667 | ILoggerRepository repository = LogManager.GetRepository(); |
697 | Level consoleLevel = repository.LevelMap[rawLevel]; | 668 | Level consoleLevel = repository.LevelMap[rawLevel]; |
698 | 669 | ||
699 | if (consoleLevel != null) | 670 | if (consoleLevel != null) |
700 | m_consoleAppender.Threshold = consoleLevel; | 671 | m_consoleAppender.Threshold = consoleLevel; |
701 | else | 672 | else |
@@ -770,9 +741,9 @@ namespace OpenSim.Framework.Servers | |||
770 | protected void ShowInfo() | 741 | protected void ShowInfo() |
771 | { | 742 | { |
772 | Notice(GetVersionText()); | 743 | Notice(GetVersionText()); |
773 | Notice("Startup directory: " + m_startupDirectory); | 744 | Notice("Startup directory: " + m_startupDirectory); |
774 | if (null != m_consoleAppender) | 745 | if (null != m_consoleAppender) |
775 | Notice(String.Format("Console log level: {0}", m_consoleAppender.Threshold)); | 746 | Notice(String.Format("Console log level: {0}", m_consoleAppender.Threshold)); |
776 | } | 747 | } |
777 | 748 | ||
778 | /// <summary> | 749 | /// <summary> |
@@ -842,7 +813,7 @@ namespace OpenSim.Framework.Servers | |||
842 | { | 813 | { |
843 | StreamReader RevisionFile = File.OpenText(svnRevisionFileName); | 814 | StreamReader RevisionFile = File.OpenText(svnRevisionFileName); |
844 | buildVersion = RevisionFile.ReadLine(); | 815 | buildVersion = RevisionFile.ReadLine(); |
845 | buildVersion.Trim(); | 816 | buildVersion = buildVersion.Trim(); |
846 | RevisionFile.Close(); | 817 | RevisionFile.Close(); |
847 | } | 818 | } |
848 | 819 | ||
@@ -871,9 +842,9 @@ namespace OpenSim.Framework.Servers | |||
871 | } | 842 | } |
872 | } | 843 | } |
873 | 844 | ||
874 | protected string GetVersionText() | 845 | public string GetVersionText() |
875 | { | 846 | { |
876 | return String.Format("Version: {0} (SIMULATION/{1} - SIMULATION/{2})", | 847 | return String.Format("Version: {0} (SIMULATION/{1} - SIMULATION/{2})", |
877 | m_version, VersionInfo.SimulationServiceVersionSupportedMin, VersionInfo.SimulationServiceVersionSupportedMax); | 848 | m_version, VersionInfo.SimulationServiceVersionSupportedMin, VersionInfo.SimulationServiceVersionSupportedMax); |
878 | } | 849 | } |
879 | 850 | ||
@@ -898,7 +869,7 @@ namespace OpenSim.Framework.Servers | |||
898 | foreach (Watchdog.ThreadWatchdogInfo twi in threads) | 869 | foreach (Watchdog.ThreadWatchdogInfo twi in threads) |
899 | { | 870 | { |
900 | Thread t = twi.Thread; | 871 | Thread t = twi.Thread; |
901 | 872 | ||
902 | sb.AppendFormat( | 873 | sb.AppendFormat( |
903 | reportFormat, | 874 | reportFormat, |
904 | t.ManagedThreadId, | 875 | t.ManagedThreadId, |
@@ -911,16 +882,12 @@ namespace OpenSim.Framework.Servers | |||
911 | sb.Append("\n"); | 882 | sb.Append("\n"); |
912 | } | 883 | } |
913 | 884 | ||
914 | sb.Append("\n"); | 885 | sb.Append(GetThreadPoolReport()); |
915 | 886 | ||
916 | // For some reason mono 2.6.7 returns an empty threads set! Not going to confuse people by reporting | 887 | sb.Append("\n"); |
917 | // zero active threads. | ||
918 | int totalThreads = Process.GetCurrentProcess().Threads.Count; | 888 | int totalThreads = Process.GetCurrentProcess().Threads.Count; |
919 | if (totalThreads > 0) | 889 | if (totalThreads > 0) |
920 | sb.AppendFormat("Total threads active: {0}\n\n", totalThreads); | 890 | sb.AppendFormat("Total process threads active: {0}\n\n", totalThreads); |
921 | |||
922 | sb.Append("Main threadpool (excluding script engine pools)\n"); | ||
923 | sb.Append(GetThreadPoolReport()); | ||
924 | 891 | ||
925 | return sb.ToString(); | 892 | return sb.ToString(); |
926 | } | 893 | } |
@@ -931,15 +898,46 @@ namespace OpenSim.Framework.Servers | |||
931 | /// <returns></returns> | 898 | /// <returns></returns> |
932 | public static string GetThreadPoolReport() | 899 | public static string GetThreadPoolReport() |
933 | { | 900 | { |
901 | |||
902 | StringBuilder sb = new StringBuilder(); | ||
903 | |||
904 | // framework pool is alwasy active | ||
905 | int maxWorkers; | ||
906 | int minWorkers; | ||
907 | int curWorkers; | ||
908 | int maxComp; | ||
909 | int minComp; | ||
910 | int curComp; | ||
911 | |||
912 | try | ||
913 | { | ||
914 | ThreadPool.GetMaxThreads(out maxWorkers, out maxComp); | ||
915 | ThreadPool.GetMinThreads(out minWorkers, out minComp); | ||
916 | ThreadPool.GetAvailableThreads(out curWorkers, out curComp); | ||
917 | curWorkers = maxWorkers - curWorkers; | ||
918 | curComp = maxComp - curComp; | ||
919 | |||
920 | sb.Append("\nFramework main threadpool \n"); | ||
921 | sb.AppendFormat("workers: {0} ({1} / {2})\n", curWorkers, maxWorkers, minWorkers); | ||
922 | sb.AppendFormat("Completion: {0} ({1} / {2})\n", curComp, maxComp, minComp); | ||
923 | } | ||
924 | catch { } | ||
925 | |||
926 | if ( | ||
927 | Util.FireAndForgetMethod == FireAndForgetMethod.QueueUserWorkItem | ||
928 | || Util.FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem) | ||
929 | { | ||
930 | sb.AppendFormat("\nThread pool used: Framework main threadpool\n"); | ||
931 | return sb.ToString(); | ||
932 | } | ||
933 | |||
934 | string threadPoolUsed = null; | 934 | string threadPoolUsed = null; |
935 | int maxThreads = 0; | 935 | int maxThreads = 0; |
936 | int minThreads = 0; | 936 | int minThreads = 0; |
937 | int allocatedThreads = 0; | 937 | int allocatedThreads = 0; |
938 | int inUseThreads = 0; | 938 | int inUseThreads = 0; |
939 | int waitingCallbacks = 0; | 939 | int waitingCallbacks = 0; |
940 | int completionPortThreads = 0; | ||
941 | 940 | ||
942 | StringBuilder sb = new StringBuilder(); | ||
943 | if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool) | 941 | if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool) |
944 | { | 942 | { |
945 | STPInfo stpi = Util.GetSmartThreadPoolInfo(); | 943 | STPInfo stpi = Util.GetSmartThreadPoolInfo(); |
@@ -955,22 +953,10 @@ namespace OpenSim.Framework.Servers | |||
955 | waitingCallbacks = stpi.WaitingCallbacks; | 953 | waitingCallbacks = stpi.WaitingCallbacks; |
956 | } | 954 | } |
957 | } | 955 | } |
958 | else if ( | 956 | |
959 | Util.FireAndForgetMethod == FireAndForgetMethod.QueueUserWorkItem | ||
960 | || Util.FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem) | ||
961 | { | ||
962 | threadPoolUsed = "BuiltInThreadPool"; | ||
963 | ThreadPool.GetMaxThreads(out maxThreads, out completionPortThreads); | ||
964 | ThreadPool.GetMinThreads(out minThreads, out completionPortThreads); | ||
965 | int availableThreads; | ||
966 | ThreadPool.GetAvailableThreads(out availableThreads, out completionPortThreads); | ||
967 | inUseThreads = maxThreads - availableThreads; | ||
968 | allocatedThreads = -1; | ||
969 | waitingCallbacks = -1; | ||
970 | } | ||
971 | |||
972 | if (threadPoolUsed != null) | 957 | if (threadPoolUsed != null) |
973 | { | 958 | { |
959 | sb.Append("\nThreadpool (excluding script engine pools)\n"); | ||
974 | sb.AppendFormat("Thread pool used : {0}\n", threadPoolUsed); | 960 | sb.AppendFormat("Thread pool used : {0}\n", threadPoolUsed); |
975 | sb.AppendFormat("Max threads : {0}\n", maxThreads); | 961 | sb.AppendFormat("Max threads : {0}\n", maxThreads); |
976 | sb.AppendFormat("Min threads : {0}\n", minThreads); | 962 | sb.AppendFormat("Min threads : {0}\n", minThreads); |
@@ -1005,7 +991,7 @@ namespace OpenSim.Framework.Servers | |||
1005 | MainConsole.Instance.OutputFormat("Aborted thread with id {0}", threadId); | 991 | MainConsole.Instance.OutputFormat("Aborted thread with id {0}", threadId); |
1006 | else | 992 | else |
1007 | MainConsole.Instance.OutputFormat("ERROR - Thread with id {0} not found in managed threads", threadId); | 993 | MainConsole.Instance.OutputFormat("ERROR - Thread with id {0} not found in managed threads", threadId); |
1008 | } | 994 | } |
1009 | 995 | ||
1010 | /// <summary> | 996 | /// <summary> |
1011 | /// Console output is only possible if a console has been established. | 997 | /// Console output is only possible if a console has been established. |
@@ -1020,13 +1006,13 @@ namespace OpenSim.Framework.Servers | |||
1020 | m_console.Output(msg); | 1006 | m_console.Output(msg); |
1021 | } | 1007 | } |
1022 | } | 1008 | } |
1023 | 1009 | ||
1024 | /// <summary> | 1010 | /// <summary> |
1025 | /// Console output is only possible if a console has been established. | 1011 | /// Console output is only possible if a console has been established. |
1026 | /// That is something that cannot be determined within this class. So | 1012 | /// That is something that cannot be determined within this class. So |
1027 | /// all attempts to use the console MUST be verified. | 1013 | /// all attempts to use the console MUST be verified. |
1028 | /// </summary> | 1014 | /// </summary> |
1029 | /// <param name="format"></param> | 1015 | /// <param name="format"></param> |
1030 | /// <param name="components"></param> | 1016 | /// <param name="components"></param> |
1031 | protected void Notice(string format, params object[] components) | 1017 | protected void Notice(string format, params object[] components) |
1032 | { | 1018 | { |
diff --git a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs index 5c0e0df..e5f7043 100644 --- a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs +++ b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs | |||
@@ -39,9 +39,331 @@ using OpenSim.Tests.Common; | |||
39 | 39 | ||
40 | namespace OpenSim.Framework.Servers.Tests | 40 | namespace OpenSim.Framework.Servers.Tests |
41 | { | 41 | { |
42 | /* | ||
43 | |||
42 | [TestFixture] | 44 | [TestFixture] |
43 | public class OSHttpTests : OpenSimTestCase | 45 | public class OSHttpTests : OpenSimTestCase |
44 | { | 46 | { |
47 | // we need an IHttpClientContext for our tests | ||
48 | public class TestHttpClientContext: IHttpClientContext | ||
49 | { | ||
50 | private bool _secured; | ||
51 | public bool IsSecured | ||
52 | { | ||
53 | get { return _secured; } | ||
54 | } | ||
55 | public bool Secured | ||
56 | { | ||
57 | get { return _secured; } | ||
58 | } | ||
59 | |||
60 | public TestHttpClientContext(bool secured) | ||
61 | { | ||
62 | _secured = secured; | ||
63 | } | ||
64 | |||
65 | public void Disconnect(SocketError error) {} | ||
66 | public void Respond(string httpVersion, HttpStatusCode statusCode, string reason, string body) {} | ||
67 | public void Respond(string httpVersion, HttpStatusCode statusCode, string reason) {} | ||
68 | public void Respond(string body) {} | ||
69 | public void Send(byte[] buffer) {} | ||
70 | public void Send(byte[] buffer, int offset, int size) {} | ||
71 | public void Respond(string httpVersion, HttpStatusCode statusCode, string reason, string body, string contentType) {} | ||
72 | public void Close() { } | ||
73 | public bool EndWhenDone { get { return false;} set { return;}} | ||
74 | |||
75 | public HTTPNetworkContext GiveMeTheNetworkStreamIKnowWhatImDoing() | ||
76 | { | ||
77 | return new HTTPNetworkContext(); | ||
78 | } | ||
79 | |||
80 | public event EventHandler<DisconnectedEventArgs> Disconnected = delegate { }; | ||
81 | /// <summary> | ||
82 | /// A request have been received in the context. | ||
83 | /// </summary> | ||
84 | public event EventHandler<RequestEventArgs> RequestReceived = delegate { }; | ||
85 | |||
86 | public bool CanSend { get { return true; } } | ||
87 | public string RemoteEndPoint { get { return ""; } } | ||
88 | public string RemoteEndPointAddress { get { return ""; } } | ||
89 | public string RemoteEndPointPort { get { return ""; } } | ||
90 | } | ||
91 | |||
92 | public class TestHttpRequest: IHttpRequest | ||
93 | { | ||
94 | private string _uriPath; | ||
95 | public bool BodyIsComplete | ||
96 | { | ||
97 | get { return true; } | ||
98 | } | ||
99 | public string[] AcceptTypes | ||
100 | { | ||
101 | get {return _acceptTypes; } | ||
102 | } | ||
103 | private string[] _acceptTypes; | ||
104 | public Stream Body | ||
105 | { | ||
106 | get { return _body; } | ||
107 | set { _body = value;} | ||
108 | } | ||
109 | private Stream _body; | ||
110 | public ConnectionType Connection | ||
111 | { | ||
112 | get { return _connection; } | ||
113 | set { _connection = value; } | ||
114 | } | ||
115 | private ConnectionType _connection; | ||
116 | public int ContentLength | ||
117 | { | ||
118 | get { return _contentLength; } | ||
119 | set { _contentLength = value; } | ||
120 | } | ||
121 | private int _contentLength; | ||
122 | public NameValueCollection Headers | ||
123 | { | ||
124 | get { return _headers; } | ||
125 | } | ||
126 | private NameValueCollection _headers = new NameValueCollection(); | ||
127 | public string HttpVersion | ||
128 | { | ||
129 | get { return _httpVersion; } | ||
130 | set { _httpVersion = value; } | ||
131 | } | ||
132 | private string _httpVersion = null; | ||
133 | public string Method | ||
134 | { | ||
135 | get { return _method; } | ||
136 | set { _method = value; } | ||
137 | } | ||
138 | private string _method = null; | ||
139 | public HttpInput QueryString | ||
140 | { | ||
141 | get { return _queryString; } | ||
142 | } | ||
143 | private HttpInput _queryString = null; | ||
144 | public Uri Uri | ||
145 | { | ||
146 | get { return _uri; } | ||
147 | set { _uri = value; } | ||
148 | } | ||
149 | private Uri _uri = null; | ||
150 | public string[] UriParts | ||
151 | { | ||
152 | get { return _uri.Segments; } | ||
153 | } | ||
154 | public HttpParam Param | ||
155 | { | ||
156 | get { return null; } | ||
157 | } | ||
158 | public HttpForm Form | ||
159 | { | ||
160 | get { return null; } | ||
161 | } | ||
162 | public bool IsAjax | ||
163 | { | ||
164 | get { return false; } | ||
165 | } | ||
166 | public RequestCookies Cookies | ||
167 | { | ||
168 | get { return null; } | ||
169 | } | ||
170 | |||
171 | public TestHttpRequest() {} | ||
172 | |||
173 | public TestHttpRequest(string contentEncoding, string contentType, string userAgent, | ||
174 | string remoteAddr, string remotePort, string[] acceptTypes, | ||
175 | ConnectionType connectionType, int contentLength, Uri uri) | ||
176 | { | ||
177 | _headers["content-encoding"] = contentEncoding; | ||
178 | _headers["content-type"] = contentType; | ||
179 | _headers["user-agent"] = userAgent; | ||
180 | _headers["remote_addr"] = remoteAddr; | ||
181 | _headers["remote_port"] = remotePort; | ||
182 | |||
183 | _acceptTypes = acceptTypes; | ||
184 | _connection = connectionType; | ||
185 | _contentLength = contentLength; | ||
186 | _uri = uri; | ||
187 | } | ||
188 | |||
189 | public void DecodeBody(FormDecoderProvider providers) {} | ||
190 | public void SetCookies(RequestCookies cookies) {} | ||
191 | public void AddHeader(string name, string value) | ||
192 | { | ||
193 | _headers.Add(name, value); | ||
194 | } | ||
195 | public int AddToBody(byte[] bytes, int offset, int length) | ||
196 | { | ||
197 | return 0; | ||
198 | } | ||
199 | public void Clear() {} | ||
200 | |||
201 | public object Clone() | ||
202 | { | ||
203 | TestHttpRequest clone = new TestHttpRequest(); | ||
204 | clone._acceptTypes = _acceptTypes; | ||
205 | clone._connection = _connection; | ||
206 | clone._contentLength = _contentLength; | ||
207 | clone._uri = _uri; | ||
208 | clone._headers = new NameValueCollection(_headers); | ||
209 | |||
210 | return clone; | ||
211 | } | ||
212 | public IHttpResponse CreateResponse(IHttpClientContext context) | ||
213 | { | ||
214 | return new HttpResponse(context, this); | ||
215 | } | ||
216 | /// <summary> | ||
217 | /// Path and query (will be merged with the host header) and put in Uri | ||
218 | /// </summary> | ||
219 | /// <see cref="Uri"/> | ||
220 | public string UriPath | ||
221 | { | ||
222 | get { return _uriPath; } | ||
223 | set | ||
224 | { | ||
225 | _uriPath = value; | ||
226 | |||
227 | } | ||
228 | } | ||
229 | |||
230 | } | ||
231 | |||
232 | public class TestHttpResponse: IHttpResponse | ||
233 | { | ||
234 | public Stream Body | ||
235 | { | ||
236 | get { return _body; } | ||
237 | |||
238 | set { _body = value; } | ||
239 | } | ||
240 | private Stream _body; | ||
241 | |||
242 | public string ProtocolVersion | ||
243 | { | ||
244 | get { return _protocolVersion; } | ||
245 | set { _protocolVersion = value; } | ||
246 | } | ||
247 | private string _protocolVersion; | ||
248 | |||
249 | public bool Chunked | ||
250 | { | ||
251 | get { return _chunked; } | ||
252 | |||
253 | set { _chunked = value; } | ||
254 | } | ||
255 | private bool _chunked; | ||
256 | |||
257 | public ConnectionType Connection | ||
258 | { | ||
259 | get { return _connection; } | ||
260 | |||
261 | set { _connection = value; } | ||
262 | } | ||
263 | private ConnectionType _connection; | ||
264 | |||
265 | public Encoding Encoding | ||
266 | { | ||
267 | get { return _encoding; } | ||
268 | |||
269 | set { _encoding = value; } | ||
270 | } | ||
271 | private Encoding _encoding; | ||
272 | |||
273 | public int KeepAlive | ||
274 | { | ||
275 | get { return _keepAlive; } | ||
276 | |||
277 | set { _keepAlive = value; } | ||
278 | } | ||
279 | private int _keepAlive; | ||
280 | |||
281 | public HttpStatusCode Status | ||
282 | { | ||
283 | get { return _status; } | ||
284 | |||
285 | set { _status = value; } | ||
286 | } | ||
287 | private HttpStatusCode _status; | ||
288 | |||
289 | public string Reason | ||
290 | { | ||
291 | get { return _reason; } | ||
292 | |||
293 | set { _reason = value; } | ||
294 | } | ||
295 | private string _reason; | ||
296 | |||
297 | public long ContentLength | ||
298 | { | ||
299 | get { return _contentLength; } | ||
300 | |||
301 | set { _contentLength = value; } | ||
302 | } | ||
303 | private long _contentLength; | ||
304 | |||
305 | public string ContentType | ||
306 | { | ||
307 | get { return _contentType; } | ||
308 | |||
309 | set { _contentType = value; } | ||
310 | } | ||
311 | private string _contentType; | ||
312 | |||
313 | public bool HeadersSent | ||
314 | { | ||
315 | get { return _headersSent; } | ||
316 | } | ||
317 | private bool _headersSent; | ||
318 | |||
319 | public bool Sent | ||
320 | { | ||
321 | get { return _sent; } | ||
322 | } | ||
323 | private bool _sent; | ||
324 | |||
325 | public ResponseCookies Cookies | ||
326 | { | ||
327 | get { return _cookies; } | ||
328 | } | ||
329 | private ResponseCookies _cookies = null; | ||
330 | |||
331 | public TestHttpResponse() | ||
332 | { | ||
333 | _headersSent = false; | ||
334 | _sent = false; | ||
335 | } | ||
336 | |||
337 | public void AddHeader(string name, string value) {} | ||
338 | public void Send() | ||
339 | { | ||
340 | if (!_headersSent) SendHeaders(); | ||
341 | if (_sent) throw new InvalidOperationException("stuff already sent"); | ||
342 | _sent = true; | ||
343 | } | ||
344 | |||
345 | public void SendBody(byte[] buffer, int offset, int count) | ||
346 | { | ||
347 | if (!_headersSent) SendHeaders(); | ||
348 | _sent = true; | ||
349 | } | ||
350 | public void SendBody(byte[] buffer) | ||
351 | { | ||
352 | if (!_headersSent) SendHeaders(); | ||
353 | _sent = true; | ||
354 | } | ||
355 | |||
356 | public void SendHeaders() | ||
357 | { | ||
358 | if (_headersSent) throw new InvalidOperationException("headers already sent"); | ||
359 | _headersSent = true; | ||
360 | } | ||
361 | |||
362 | public void Redirect(Uri uri) {} | ||
363 | public void Redirect(string url) {} | ||
364 | } | ||
365 | |||
366 | |||
45 | public OSHttpRequest req0; | 367 | public OSHttpRequest req0; |
46 | public OSHttpRequest req1; | 368 | public OSHttpRequest req1; |
47 | 369 | ||
@@ -52,22 +374,22 @@ namespace OpenSim.Framework.Servers.Tests | |||
52 | [TestFixtureSetUp] | 374 | [TestFixtureSetUp] |
53 | public void Init() | 375 | public void Init() |
54 | { | 376 | { |
55 | TestHttpRequest threq0 = new TestHttpRequest("utf-8", "text/xml", "OpenSim Test Agent", "192.168.0.1", "4711", | 377 | TestHttpRequest threq0 = new TestHttpRequest("utf-8", "text/xml", "OpenSim Test Agent", "192.168.0.1", "4711", |
56 | new string[] {"text/xml"}, | 378 | new string[] {"text/xml"}, |
57 | ConnectionType.KeepAlive, 4711, | 379 | ConnectionType.KeepAlive, 4711, |
58 | new Uri("http://127.0.0.1/admin/inventory/Dr+Who/Tardis")); | 380 | new Uri("http://127.0.0.1/admin/inventory/Dr+Who/Tardis")); |
59 | threq0.Method = "GET"; | 381 | threq0.Method = "GET"; |
60 | threq0.HttpVersion = HttpHelper.HTTP10; | 382 | threq0.HttpVersion = HttpHelper.HTTP10; |
61 | 383 | ||
62 | TestHttpRequest threq1 = new TestHttpRequest("utf-8", "text/xml", "OpenSim Test Agent", "192.168.0.1", "4711", | 384 | TestHttpRequest threq1 = new TestHttpRequest("utf-8", "text/xml", "OpenSim Test Agent", "192.168.0.1", "4711", |
63 | new string[] {"text/xml"}, | 385 | new string[] {"text/xml"}, |
64 | ConnectionType.KeepAlive, 4711, | 386 | ConnectionType.KeepAlive, 4711, |
65 | new Uri("http://127.0.0.1/admin/inventory/Dr+Who/Tardis?a=0&b=1&c=2")); | 387 | new Uri("http://127.0.0.1/admin/inventory/Dr+Who/Tardis?a=0&b=1&c=2")); |
66 | threq1.Method = "POST"; | 388 | threq1.Method = "POST"; |
67 | threq1.HttpVersion = HttpHelper.HTTP11; | 389 | threq1.HttpVersion = HttpHelper.HTTP11; |
68 | threq1.Headers["x-wuff"] = "wuffwuff"; | 390 | threq1.Headers["x-wuff"] = "wuffwuff"; |
69 | threq1.Headers["www-authenticate"] = "go away"; | 391 | threq1.Headers["www-authenticate"] = "go away"; |
70 | 392 | ||
71 | req0 = new OSHttpRequest(new TestHttpClientContext(false), threq0); | 393 | req0 = new OSHttpRequest(new TestHttpClientContext(false), threq0); |
72 | req1 = new OSHttpRequest(new TestHttpClientContext(false), threq1); | 394 | req1 = new OSHttpRequest(new TestHttpClientContext(false), threq1); |
73 | 395 | ||
@@ -113,4 +435,5 @@ namespace OpenSim.Framework.Servers.Tests | |||
113 | Assert.That(rsp0.ContentType, Is.EqualTo("text/xml")); | 435 | Assert.That(rsp0.ContentType, Is.EqualTo("text/xml")); |
114 | } | 436 | } |
115 | } | 437 | } |
116 | } \ No newline at end of file | 438 | */ |
439 | } | ||
diff --git a/OpenSim/Framework/Servers/Tests/VersionInfoTests.cs b/OpenSim/Framework/Servers/Tests/VersionInfoTests.cs index 2d72cb8..480f2bb 100644 --- a/OpenSim/Framework/Servers/Tests/VersionInfoTests.cs +++ b/OpenSim/Framework/Servers/Tests/VersionInfoTests.cs | |||
@@ -47,7 +47,7 @@ namespace OpenSim.Framework.Servers.Tests | |||
47 | { | 47 | { |
48 | foreach (VersionInfo.Flavour flavour in Enum.GetValues(typeof(VersionInfo.Flavour))) | 48 | foreach (VersionInfo.Flavour flavour in Enum.GetValues(typeof(VersionInfo.Flavour))) |
49 | { | 49 | { |
50 | Assert.AreEqual(VersionInfo.VERSIONINFO_VERSION_LENGTH, VersionInfo.GetVersionString("0.0.0", "0", flavour).Length, "0.0.0/" + flavour + " failed"); | 50 | Assert.AreEqual(VersionInfo.VERSIONINFO_VERSION_LENGTH, VersionInfo.GetVersionString("0.0.0", flavour).Length, "0.0.0/" + flavour + " failed"); |
51 | } | 51 | } |
52 | } | 52 | } |
53 | } | 53 | } |
diff --git a/OpenSim/Framework/ServiceAuth/BasicHttpAuthentication.cs b/OpenSim/Framework/ServiceAuth/BasicHttpAuthentication.cs index 512ac4f..9126cfb 100644 --- a/OpenSim/Framework/ServiceAuth/BasicHttpAuthentication.cs +++ b/OpenSim/Framework/ServiceAuth/BasicHttpAuthentication.cs | |||
@@ -56,7 +56,7 @@ namespace OpenSim.Framework.ServiceAuth | |||
56 | { | 56 | { |
57 | // remove_me = section; | 57 | // remove_me = section; |
58 | m_Username = Util.GetConfigVarFromSections<string>(config, "HttpAuthUsername", new string[] { "Network", section }, string.Empty); | 58 | m_Username = Util.GetConfigVarFromSections<string>(config, "HttpAuthUsername", new string[] { "Network", section }, string.Empty); |
59 | m_Password = Util.GetConfigVarFromSections<string>(config, "HttpAuthPassword", new string[] { "Network", section }, string.Empty); | 59 | m_Password = Util.GetConfigVarFromSections<string>(config, "HttpAuthPassword", new string[] { "Network", section }, string.Empty); |
60 | string str = m_Username + ":" + m_Password; | 60 | string str = m_Username + ":" + m_Password; |
61 | byte[] encData_byte = Util.UTF8.GetBytes(str); | 61 | byte[] encData_byte = Util.UTF8.GetBytes(str); |
62 | 62 | ||
diff --git a/OpenSim/Framework/ServiceAuth/CompoundAuthentication.cs b/OpenSim/Framework/ServiceAuth/CompoundAuthentication.cs index a49952c..79d6ff4 100644 --- a/OpenSim/Framework/ServiceAuth/CompoundAuthentication.cs +++ b/OpenSim/Framework/ServiceAuth/CompoundAuthentication.cs | |||
@@ -56,7 +56,7 @@ namespace OpenSim.Framework.ServiceAuth | |||
56 | m_authentications.Remove(auth); | 56 | m_authentications.Remove(auth); |
57 | } | 57 | } |
58 | 58 | ||
59 | public void AddAuthorization(NameValueCollection headers) | 59 | public void AddAuthorization(NameValueCollection headers) |
60 | { | 60 | { |
61 | foreach (IServiceAuth auth in m_authentications) | 61 | foreach (IServiceAuth auth in m_authentications) |
62 | auth.AddAuthorization(headers); | 62 | auth.AddAuthorization(headers); |
diff --git a/OpenSim/Framework/SimStats.cs b/OpenSim/Framework/SimStats.cs index 3d8f32f..f19a270 100644 --- a/OpenSim/Framework/SimStats.cs +++ b/OpenSim/Framework/SimStats.cs | |||
@@ -32,7 +32,7 @@ namespace OpenSim.Framework | |||
32 | { | 32 | { |
33 | /// <summary> | 33 | /// <summary> |
34 | /// Enapsulate statistics for a simulator/scene. | 34 | /// Enapsulate statistics for a simulator/scene. |
35 | /// | 35 | /// |
36 | /// TODO: This looks very much like the OpenMetaverse SimStatsPacket. It should be much more generic stats | 36 | /// TODO: This looks very much like the OpenMetaverse SimStatsPacket. It should be much more generic stats |
37 | /// storage. | 37 | /// storage. |
38 | /// </summary> | 38 | /// </summary> |
@@ -49,25 +49,31 @@ namespace OpenSim.Framework | |||
49 | get { return m_regionY; } | 49 | get { return m_regionY; } |
50 | } | 50 | } |
51 | private uint m_regionY; | 51 | private uint m_regionY; |
52 | 52 | ||
53 | public SimStatsPacket.RegionBlock RegionBlock | 53 | public SimStatsPacket.RegionBlock RegionBlock |
54 | { | 54 | { |
55 | get { return m_regionBlock; } | 55 | get { return m_regionBlock; } |
56 | } | 56 | } |
57 | private SimStatsPacket.RegionBlock m_regionBlock; | 57 | private SimStatsPacket.RegionBlock m_regionBlock; |
58 | 58 | ||
59 | public SimStatsPacket.StatBlock[] StatsBlock | 59 | public SimStatsPacket.StatBlock[] StatsBlock |
60 | { | 60 | { |
61 | get { return m_statsBlock; } | 61 | get { return m_statsBlock; } |
62 | } | 62 | } |
63 | private SimStatsPacket.StatBlock[] m_statsBlock; | 63 | private SimStatsPacket.StatBlock[] m_statsBlock; |
64 | 64 | ||
65 | public SimStatsPacket.StatBlock[] ExtraStatsBlock | ||
66 | { | ||
67 | get { return m_extraStatsBlock; } | ||
68 | } | ||
69 | private SimStatsPacket.StatBlock[] m_extraStatsBlock; | ||
70 | |||
65 | public uint RegionFlags | 71 | public uint RegionFlags |
66 | { | 72 | { |
67 | get { return m_regionFlags; } | 73 | get { return m_regionFlags; } |
68 | } | 74 | } |
69 | private uint m_regionFlags; | 75 | private uint m_regionFlags; |
70 | 76 | ||
71 | public uint ObjectCapacity | 77 | public uint ObjectCapacity |
72 | { | 78 | { |
73 | get { return m_objectCapacity; } | 79 | get { return m_objectCapacity; } |
@@ -79,10 +85,11 @@ namespace OpenSim.Framework | |||
79 | get { return regionUUID; } | 85 | get { return regionUUID; } |
80 | } | 86 | } |
81 | private UUID regionUUID; | 87 | private UUID regionUUID; |
82 | 88 | ||
83 | public SimStats( | 89 | public SimStats( |
84 | uint regionX, uint regionY, uint regionFlags, uint objectCapacity, | 90 | uint regionX, uint regionY, uint regionFlags, uint objectCapacity, |
85 | SimStatsPacket.RegionBlock regionBlock, SimStatsPacket.StatBlock[] statsBlock, UUID pRUUID) | 91 | SimStatsPacket.RegionBlock regionBlock, SimStatsPacket.StatBlock[] statsBlock, |
92 | SimStatsPacket.StatBlock[] ExtraStatsBlock, UUID pRUUID) | ||
86 | { | 93 | { |
87 | regionUUID = pRUUID; | 94 | regionUUID = pRUUID; |
88 | m_regionX = regionX; | 95 | m_regionX = regionX; |
@@ -91,6 +98,7 @@ namespace OpenSim.Framework | |||
91 | m_objectCapacity = objectCapacity; | 98 | m_objectCapacity = objectCapacity; |
92 | m_regionBlock = regionBlock; | 99 | m_regionBlock = regionBlock; |
93 | m_statsBlock = statsBlock; | 100 | m_statsBlock = statsBlock; |
101 | m_extraStatsBlock = ExtraStatsBlock; | ||
94 | } | 102 | } |
95 | } | 103 | } |
96 | } | 104 | } |
diff --git a/OpenSim/Framework/TaskInventoryDictionary.cs b/OpenSim/Framework/TaskInventoryDictionary.cs index 8af2c41..223d91f 100644 --- a/OpenSim/Framework/TaskInventoryDictionary.cs +++ b/OpenSim/Framework/TaskInventoryDictionary.cs | |||
@@ -27,9 +27,13 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Threading; | ||
31 | using System.Reflection; | ||
30 | using System.Xml; | 32 | using System.Xml; |
33 | using System.Diagnostics; | ||
31 | using System.Xml.Schema; | 34 | using System.Xml.Schema; |
32 | using System.Xml.Serialization; | 35 | using System.Xml.Serialization; |
36 | using log4net; | ||
33 | using OpenMetaverse; | 37 | using OpenMetaverse; |
34 | 38 | ||
35 | namespace OpenSim.Framework | 39 | namespace OpenSim.Framework |
@@ -47,6 +51,187 @@ namespace OpenSim.Framework | |||
47 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 51 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 52 | ||
49 | private static XmlSerializer tiiSerializer = new XmlSerializer(typeof (TaskInventoryItem)); | 53 | private static XmlSerializer tiiSerializer = new XmlSerializer(typeof (TaskInventoryItem)); |
54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
55 | |||
56 | private Thread LockedByThread; | ||
57 | // private string WriterStack; | ||
58 | |||
59 | // private Dictionary<Thread, string> ReadLockers = | ||
60 | // new Dictionary<Thread, string>(); | ||
61 | |||
62 | /// <value> | ||
63 | /// An advanced lock for inventory data | ||
64 | /// </value> | ||
65 | private volatile System.Threading.ReaderWriterLockSlim m_itemLock = new System.Threading.ReaderWriterLockSlim(); | ||
66 | |||
67 | |||
68 | ~TaskInventoryDictionary() | ||
69 | { | ||
70 | m_itemLock.Dispose(); | ||
71 | m_itemLock = null; | ||
72 | } | ||
73 | |||
74 | /// <summary> | ||
75 | /// Are we readlocked by the calling thread? | ||
76 | /// </summary> | ||
77 | public bool IsReadLockedByMe() | ||
78 | { | ||
79 | if (m_itemLock.RecursiveReadCount > 0) | ||
80 | { | ||
81 | return true; | ||
82 | } | ||
83 | else | ||
84 | { | ||
85 | return false; | ||
86 | } | ||
87 | } | ||
88 | |||
89 | /// <summary> | ||
90 | /// Lock our inventory list for reading (many can read, one can write) | ||
91 | /// </summary> | ||
92 | public void LockItemsForRead(bool locked) | ||
93 | { | ||
94 | if (locked) | ||
95 | { | ||
96 | if (m_itemLock.IsWriteLockHeld && LockedByThread != null) | ||
97 | { | ||
98 | if (!LockedByThread.IsAlive) | ||
99 | { | ||
100 | //Locked by dead thread, reset. | ||
101 | m_itemLock = new System.Threading.ReaderWriterLockSlim(); | ||
102 | } | ||
103 | } | ||
104 | |||
105 | if (m_itemLock.RecursiveReadCount > 0) | ||
106 | { | ||
107 | m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue."); | ||
108 | try | ||
109 | { | ||
110 | // That call stack is useful for end users only. RealProgrammers need a full dump. Commented. | ||
111 | // StackTrace stackTrace = new StackTrace(); // get call stack | ||
112 | // StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) | ||
113 | // | ||
114 | // // write call stack method names | ||
115 | // foreach (StackFrame stackFrame in stackFrames) | ||
116 | // { | ||
117 | // m_log.Error("[SceneObjectGroup.m_parts] "+(stackFrame.GetMethod().Name)); // write method name | ||
118 | // } | ||
119 | |||
120 | // The below is far more useful | ||
121 | // System.Console.WriteLine("------------------------------------------"); | ||
122 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | ||
123 | // System.Console.WriteLine("------------------------------------------"); | ||
124 | // foreach (KeyValuePair<Thread, string> kvp in ReadLockers) | ||
125 | // { | ||
126 | // System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); | ||
127 | // System.Console.WriteLine("------------------------------------------"); | ||
128 | // } | ||
129 | } | ||
130 | catch | ||
131 | {} | ||
132 | m_itemLock.ExitReadLock(); | ||
133 | } | ||
134 | if (m_itemLock.RecursiveWriteCount > 0) | ||
135 | { | ||
136 | m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); | ||
137 | // try | ||
138 | // { | ||
139 | // System.Console.WriteLine("------------------------------------------"); | ||
140 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | ||
141 | // System.Console.WriteLine("------------------------------------------"); | ||
142 | // System.Console.WriteLine("Locker's call stack:\n" + WriterStack); | ||
143 | // System.Console.WriteLine("------------------------------------------"); | ||
144 | // } | ||
145 | // catch | ||
146 | // {} | ||
147 | m_itemLock.ExitWriteLock(); | ||
148 | } | ||
149 | |||
150 | while (!m_itemLock.TryEnterReadLock(60000)) | ||
151 | { | ||
152 | m_log.Error("Thread lock detected while trying to aquire READ lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); | ||
153 | //if (m_itemLock.IsWriteLockHeld) | ||
154 | //{ | ||
155 | m_itemLock = new System.Threading.ReaderWriterLockSlim(); | ||
156 | // System.Console.WriteLine("------------------------------------------"); | ||
157 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | ||
158 | // System.Console.WriteLine("------------------------------------------"); | ||
159 | // System.Console.WriteLine("Locker's call stack:\n" + WriterStack); | ||
160 | // System.Console.WriteLine("------------------------------------------"); | ||
161 | // LockedByThread = null; | ||
162 | // ReadLockers.Clear(); | ||
163 | //} | ||
164 | } | ||
165 | // ReadLockers[Thread.CurrentThread] = Environment.StackTrace; | ||
166 | } | ||
167 | else | ||
168 | { | ||
169 | if (m_itemLock.RecursiveReadCount>0) | ||
170 | { | ||
171 | m_itemLock.ExitReadLock(); | ||
172 | } | ||
173 | // if (m_itemLock.RecursiveReadCount == 0) | ||
174 | // ReadLockers.Remove(Thread.CurrentThread); | ||
175 | } | ||
176 | } | ||
177 | |||
178 | /// <summary> | ||
179 | /// Lock our inventory list for writing (many can read, one can write) | ||
180 | /// </summary> | ||
181 | public void LockItemsForWrite(bool locked) | ||
182 | { | ||
183 | if (locked) | ||
184 | { | ||
185 | //Enter a write lock, wait indefinately for one to open. | ||
186 | if (m_itemLock.RecursiveReadCount > 0) | ||
187 | { | ||
188 | m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue."); | ||
189 | m_itemLock.ExitReadLock(); | ||
190 | } | ||
191 | if (m_itemLock.RecursiveWriteCount > 0) | ||
192 | { | ||
193 | m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); | ||
194 | |||
195 | m_itemLock.ExitWriteLock(); | ||
196 | } | ||
197 | while (!m_itemLock.TryEnterWriteLock(60000)) | ||
198 | { | ||
199 | if (m_itemLock.IsWriteLockHeld) | ||
200 | { | ||
201 | m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); | ||
202 | // System.Console.WriteLine("------------------------------------------"); | ||
203 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | ||
204 | // System.Console.WriteLine("------------------------------------------"); | ||
205 | // System.Console.WriteLine("Locker's call stack:\n" + WriterStack); | ||
206 | // System.Console.WriteLine("------------------------------------------"); | ||
207 | } | ||
208 | else | ||
209 | { | ||
210 | m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by a reader. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); | ||
211 | // System.Console.WriteLine("------------------------------------------"); | ||
212 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | ||
213 | // System.Console.WriteLine("------------------------------------------"); | ||
214 | // foreach (KeyValuePair<Thread, string> kvp in ReadLockers) | ||
215 | // { | ||
216 | // System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); | ||
217 | // System.Console.WriteLine("------------------------------------------"); | ||
218 | // } | ||
219 | } | ||
220 | m_itemLock = new System.Threading.ReaderWriterLockSlim(); | ||
221 | // ReadLockers.Clear(); | ||
222 | } | ||
223 | |||
224 | LockedByThread = Thread.CurrentThread; | ||
225 | // WriterStack = Environment.StackTrace; | ||
226 | } | ||
227 | else | ||
228 | { | ||
229 | if (m_itemLock.RecursiveWriteCount > 0) | ||
230 | { | ||
231 | m_itemLock.ExitWriteLock(); | ||
232 | } | ||
233 | } | ||
234 | } | ||
50 | 235 | ||
51 | #region ICloneable Members | 236 | #region ICloneable Members |
52 | 237 | ||
@@ -54,14 +239,13 @@ namespace OpenSim.Framework | |||
54 | { | 239 | { |
55 | TaskInventoryDictionary clone = new TaskInventoryDictionary(); | 240 | TaskInventoryDictionary clone = new TaskInventoryDictionary(); |
56 | 241 | ||
57 | lock (this) | 242 | m_itemLock.EnterReadLock(); |
243 | foreach (UUID uuid in Keys) | ||
58 | { | 244 | { |
59 | foreach (UUID uuid in Keys) | 245 | clone.Add(uuid, (TaskInventoryItem) this[uuid].Clone()); |
60 | { | ||
61 | clone.Add(uuid, (TaskInventoryItem) this[uuid].Clone()); | ||
62 | } | ||
63 | } | 246 | } |
64 | 247 | m_itemLock.ExitReadLock(); | |
248 | |||
65 | return clone; | 249 | return clone; |
66 | } | 250 | } |
67 | 251 | ||
diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index 307cb75..1cc32b3 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs | |||
@@ -59,6 +59,7 @@ namespace OpenSim.Framework | |||
59 | private int _invType = 0; | 59 | private int _invType = 0; |
60 | private UUID _itemID = UUID.Zero; | 60 | private UUID _itemID = UUID.Zero; |
61 | private UUID _lastOwnerID = UUID.Zero; | 61 | private UUID _lastOwnerID = UUID.Zero; |
62 | private UUID _rezzerID = UUID.Zero; | ||
62 | private string _name = String.Empty; | 63 | private string _name = String.Empty; |
63 | private uint _nextOwnerMask = FULL_MASK_PERMISSIONS_GENERAL; | 64 | private uint _nextOwnerMask = FULL_MASK_PERMISSIONS_GENERAL; |
64 | private UUID _ownerID = UUID.Zero; | 65 | private UUID _ownerID = UUID.Zero; |
@@ -254,6 +255,16 @@ namespace OpenSim.Framework | |||
254 | } | 255 | } |
255 | } | 256 | } |
256 | 257 | ||
258 | public UUID RezzerID | ||
259 | { | ||
260 | get { | ||
261 | return _rezzerID; | ||
262 | } | ||
263 | set { | ||
264 | _rezzerID = value; | ||
265 | } | ||
266 | } | ||
267 | |||
257 | public string Name { | 268 | public string Name { |
258 | get { | 269 | get { |
259 | return _name; | 270 | return _name; |
diff --git a/OpenSim/Framework/TerrainData.cs b/OpenSim/Framework/TerrainData.cs index 6b1be4e..5cec2b5 100644 --- a/OpenSim/Framework/TerrainData.cs +++ b/OpenSim/Framework/TerrainData.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.IO; | 30 | using System.IO; |
31 | using System.IO.Compression; | ||
31 | using System.Reflection; | 32 | using System.Reflection; |
32 | 33 | ||
33 | using OpenMetaverse; | 34 | using OpenMetaverse; |
@@ -48,6 +49,7 @@ namespace OpenSim.Framework | |||
48 | 49 | ||
49 | public abstract float this[int x, int y] { get; set; } | 50 | public abstract float this[int x, int y] { get; set; } |
50 | // Someday terrain will have caves | 51 | // Someday terrain will have caves |
52 | // at most holes :p | ||
51 | public abstract float this[int x, int y, int z] { get; set; } | 53 | public abstract float this[int x, int y, int z] { get; set; } |
52 | 54 | ||
53 | public abstract bool IsTaintedAt(int xx, int yy); | 55 | public abstract bool IsTaintedAt(int xx, int yy); |
@@ -72,8 +74,8 @@ namespace OpenSim.Framework | |||
72 | return new HeightmapTerrainData(pSizeX, pSizeY, pSizeZ, pFormatCode, pBlob); | 74 | return new HeightmapTerrainData(pSizeX, pSizeY, pSizeZ, pFormatCode, pBlob); |
73 | } | 75 | } |
74 | 76 | ||
75 | // return a special compressed representation of the heightmap in ints | 77 | // return a special compressed representation of the heightmap in ushort |
76 | public abstract int[] GetCompressedMap(); | 78 | public abstract float[] GetCompressedMap(); |
77 | public abstract float CompressionFactor { get; } | 79 | public abstract float CompressionFactor { get; } |
78 | 80 | ||
79 | public abstract float[] GetFloatsSerialized(); | 81 | public abstract float[] GetFloatsSerialized(); |
@@ -94,14 +96,18 @@ namespace OpenSim.Framework | |||
94 | { | 96 | { |
95 | // Terrain is 'double[256,256]' | 97 | // Terrain is 'double[256,256]' |
96 | Legacy256 = 11, | 98 | Legacy256 = 11, |
99 | |||
97 | // Terrain is 'int32, int32, float[,]' where the ints are X and Y dimensions | 100 | // Terrain is 'int32, int32, float[,]' where the ints are X and Y dimensions |
98 | // The dimensions are presumed to be multiples of 16 and, more likely, multiples of 256. | 101 | // The dimensions are presumed to be multiples of 16 and, more likely, multiples of 256. |
99 | Variable2D = 22, | 102 | Variable2D = 22, |
103 | Variable2DGzip = 23, | ||
104 | |||
100 | // Terrain is 'int32, int32, int32, int16[]' where the ints are X and Y dimensions | 105 | // Terrain is 'int32, int32, int32, int16[]' where the ints are X and Y dimensions |
101 | // and third int is the 'compression factor'. The heights are compressed as | 106 | // and third int is the 'compression factor'. The heights are compressed as |
102 | // "int compressedHeight = (int)(height * compressionFactor);" | 107 | // "ushort compressedHeight = (ushort)(height * compressionFactor);" |
103 | // The dimensions are presumed to be multiples of 16 and, more likely, multiples of 256. | 108 | // The dimensions are presumed to be multiples of 16 and, more likely, multiples of 256. |
104 | Compressed2D = 27, | 109 | Compressed2D = 27, |
110 | |||
105 | // A revision that is not listed above or any revision greater than this value is 'Legacy256'. | 111 | // A revision that is not listed above or any revision greater than this value is 'Legacy256'. |
106 | RevisionHigh = 1234 | 112 | RevisionHigh = 1234 |
107 | } | 113 | } |
@@ -109,7 +115,7 @@ namespace OpenSim.Framework | |||
109 | // Version of terrain that is a heightmap. | 115 | // Version of terrain that is a heightmap. |
110 | // This should really be 'LLOptimizedHeightmapTerrainData' as it includes knowledge | 116 | // This should really be 'LLOptimizedHeightmapTerrainData' as it includes knowledge |
111 | // of 'patches' which are 16x16 terrain areas which can be sent separately to the viewer. | 117 | // of 'patches' which are 16x16 terrain areas which can be sent separately to the viewer. |
112 | // The heighmap is kept as an array of integers. The integer values are converted to | 118 | // The heighmap is kept as an array of ushorts. The ushort values are converted to |
113 | // and from floats by TerrainCompressionFactor. | 119 | // and from floats by TerrainCompressionFactor. |
114 | public class HeightmapTerrainData : TerrainData | 120 | public class HeightmapTerrainData : TerrainData |
115 | { | 121 | { |
@@ -119,12 +125,12 @@ namespace OpenSim.Framework | |||
119 | // TerrainData.this[x, y] | 125 | // TerrainData.this[x, y] |
120 | public override float this[int x, int y] | 126 | public override float this[int x, int y] |
121 | { | 127 | { |
122 | get { return FromCompressedHeight(m_heightmap[x, y]); } | 128 | get { return m_heightmap[x, y]; } |
123 | set { | 129 | set |
124 | int newVal = ToCompressedHeight(value); | 130 | { |
125 | if (m_heightmap[x, y] != newVal) | 131 | if (m_heightmap[x, y] != value) |
126 | { | 132 | { |
127 | m_heightmap[x, y] = newVal; | 133 | m_heightmap[x, y] = value; |
128 | m_taint[x / Constants.TerrainPatchSize, y / Constants.TerrainPatchSize] = true; | 134 | m_taint[x / Constants.TerrainPatchSize, y / Constants.TerrainPatchSize] = true; |
129 | } | 135 | } |
130 | } | 136 | } |
@@ -164,10 +170,9 @@ namespace OpenSim.Framework | |||
164 | // TerrainData.ClearLand(float) | 170 | // TerrainData.ClearLand(float) |
165 | public override void ClearLand(float pHeight) | 171 | public override void ClearLand(float pHeight) |
166 | { | 172 | { |
167 | int flatHeight = ToCompressedHeight(pHeight); | ||
168 | for (int xx = 0; xx < SizeX; xx++) | 173 | for (int xx = 0; xx < SizeX; xx++) |
169 | for (int yy = 0; yy < SizeY; yy++) | 174 | for (int yy = 0; yy < SizeY; yy++) |
170 | m_heightmap[xx, yy] = flatHeight; | 175 | m_heightmap[xx, yy] = pHeight; |
171 | } | 176 | } |
172 | 177 | ||
173 | // Return 'true' of the patch that contains these region coordinates has been modified. | 178 | // Return 'true' of the patch that contains these region coordinates has been modified. |
@@ -177,13 +182,15 @@ namespace OpenSim.Framework | |||
177 | { | 182 | { |
178 | int tx = xx / Constants.TerrainPatchSize; | 183 | int tx = xx / Constants.TerrainPatchSize; |
179 | int ty = yy / Constants.TerrainPatchSize; | 184 | int ty = yy / Constants.TerrainPatchSize; |
180 | bool ret = m_taint[tx, ty]; | 185 | bool ret = m_taint[tx, ty]; |
181 | if (ret && clearOnTest) | 186 | if (ret && clearOnTest) |
182 | m_taint[tx, ty] = false; | 187 | m_taint[tx, ty] = false; |
183 | return ret; | 188 | return ret; |
184 | } | 189 | } |
185 | 190 | ||
186 | // Old form that clears the taint flag when we check it. | 191 | // Old form that clears the taint flag when we check it. |
192 | // ubit: this dangerus naming should be only check without clear | ||
193 | // keeping for old modules outthere | ||
187 | public override bool IsTaintedAt(int xx, int yy) | 194 | public override bool IsTaintedAt(int xx, int yy) |
188 | { | 195 | { |
189 | return IsTaintedAt(xx, yy, true /* clearOnTest */); | 196 | return IsTaintedAt(xx, yy, true /* clearOnTest */); |
@@ -194,6 +201,7 @@ namespace OpenSim.Framework | |||
194 | public override bool GetDatabaseBlob(out int DBRevisionCode, out Array blob) | 201 | public override bool GetDatabaseBlob(out int DBRevisionCode, out Array blob) |
195 | { | 202 | { |
196 | bool ret = false; | 203 | bool ret = false; |
204 | /* save all as Variable2DGzip | ||
197 | if (SizeX == Constants.RegionSize && SizeY == Constants.RegionSize) | 205 | if (SizeX == Constants.RegionSize && SizeY == Constants.RegionSize) |
198 | { | 206 | { |
199 | DBRevisionCode = (int)DBTerrainRevision.Legacy256; | 207 | DBRevisionCode = (int)DBTerrainRevision.Legacy256; |
@@ -202,10 +210,13 @@ namespace OpenSim.Framework | |||
202 | } | 210 | } |
203 | else | 211 | else |
204 | { | 212 | { |
205 | DBRevisionCode = (int)DBTerrainRevision.Compressed2D; | 213 | */ |
206 | blob = ToCompressedTerrainSerialization(); | 214 | DBRevisionCode = (int)DBTerrainRevision.Variable2DGzip; |
215 | // DBRevisionCode = (int)DBTerrainRevision.Variable2D; | ||
216 | blob = ToCompressedTerrainSerializationV2DGzip(); | ||
217 | // blob = ToCompressedTerrainSerializationV2D(); | ||
207 | ret = true; | 218 | ret = true; |
208 | } | 219 | // } |
209 | return ret; | 220 | return ret; |
210 | } | 221 | } |
211 | 222 | ||
@@ -214,9 +225,9 @@ namespace OpenSim.Framework | |||
214 | public override float CompressionFactor { get { return m_compressionFactor; } } | 225 | public override float CompressionFactor { get { return m_compressionFactor; } } |
215 | 226 | ||
216 | // TerrainData.GetCompressedMap | 227 | // TerrainData.GetCompressedMap |
217 | public override int[] GetCompressedMap() | 228 | public override float[] GetCompressedMap() |
218 | { | 229 | { |
219 | int[] newMap = new int[SizeX * SizeY]; | 230 | float[] newMap = new float[SizeX * SizeY]; |
220 | 231 | ||
221 | int ind = 0; | 232 | int ind = 0; |
222 | for (int xx = 0; xx < SizeX; xx++) | 233 | for (int xx = 0; xx < SizeX; xx++) |
@@ -230,7 +241,7 @@ namespace OpenSim.Framework | |||
230 | public override TerrainData Clone() | 241 | public override TerrainData Clone() |
231 | { | 242 | { |
232 | HeightmapTerrainData ret = new HeightmapTerrainData(SizeX, SizeY, SizeZ); | 243 | HeightmapTerrainData ret = new HeightmapTerrainData(SizeX, SizeY, SizeZ); |
233 | ret.m_heightmap = (int[,])this.m_heightmap.Clone(); | 244 | ret.m_heightmap = (float[,])this.m_heightmap.Clone(); |
234 | return ret; | 245 | return ret; |
235 | } | 246 | } |
236 | 247 | ||
@@ -247,7 +258,7 @@ namespace OpenSim.Framework | |||
247 | for (int jj = 0; jj < SizeY; jj++) | 258 | for (int jj = 0; jj < SizeY; jj++) |
248 | for (int ii = 0; ii < SizeX; ii++) | 259 | for (int ii = 0; ii < SizeX; ii++) |
249 | { | 260 | { |
250 | heights[idx++] = FromCompressedHeight(m_heightmap[ii, jj]); | 261 | heights[idx++] = m_heightmap[ii, jj]; |
251 | } | 262 | } |
252 | 263 | ||
253 | return heights; | 264 | return heights; |
@@ -259,7 +270,7 @@ namespace OpenSim.Framework | |||
259 | double[,] ret = new double[SizeX, SizeY]; | 270 | double[,] ret = new double[SizeX, SizeY]; |
260 | for (int xx = 0; xx < SizeX; xx++) | 271 | for (int xx = 0; xx < SizeX; xx++) |
261 | for (int yy = 0; yy < SizeY; yy++) | 272 | for (int yy = 0; yy < SizeY; yy++) |
262 | ret[xx, yy] = FromCompressedHeight(m_heightmap[xx, yy]); | 273 | ret[xx, yy] = (double)m_heightmap[xx, yy]; |
263 | 274 | ||
264 | return ret; | 275 | return ret; |
265 | } | 276 | } |
@@ -267,19 +278,40 @@ namespace OpenSim.Framework | |||
267 | 278 | ||
268 | // ============================================================= | 279 | // ============================================================= |
269 | 280 | ||
270 | private int[,] m_heightmap; | 281 | private float[,] m_heightmap; |
271 | // Remember subregions of the heightmap that has changed. | 282 | // Remember subregions of the heightmap that has changed. |
272 | private bool[,] m_taint; | 283 | private bool[,] m_taint; |
273 | 284 | ||
274 | // To save space (especially for large regions), keep the height as a short integer | ||
275 | // that is coded as the float height times the compression factor (usually '100' | 285 | // that is coded as the float height times the compression factor (usually '100' |
276 | // to make for two decimal points). | 286 | // to make for two decimal points). |
277 | public int ToCompressedHeight(double pHeight) | 287 | public short ToCompressedHeightshort(float pHeight) |
278 | { | 288 | { |
279 | return (int)(pHeight * CompressionFactor); | 289 | // clamp into valid range |
290 | pHeight *= CompressionFactor; | ||
291 | if (pHeight < short.MinValue) | ||
292 | return short.MinValue; | ||
293 | else if (pHeight > short.MaxValue) | ||
294 | return short.MaxValue; | ||
295 | return (short)pHeight; | ||
280 | } | 296 | } |
281 | 297 | ||
282 | public float FromCompressedHeight(int pHeight) | 298 | public ushort ToCompressedHeightushort(float pHeight) |
299 | { | ||
300 | // clamp into valid range | ||
301 | pHeight *= CompressionFactor; | ||
302 | if (pHeight < ushort.MinValue) | ||
303 | return ushort.MinValue; | ||
304 | else if (pHeight > ushort.MaxValue) | ||
305 | return ushort.MaxValue; | ||
306 | return (ushort)pHeight; | ||
307 | } | ||
308 | |||
309 | public float FromCompressedHeight(short pHeight) | ||
310 | { | ||
311 | return ((float)pHeight) / CompressionFactor; | ||
312 | } | ||
313 | |||
314 | public float FromCompressedHeight(ushort pHeight) | ||
283 | { | 315 | { |
284 | return ((float)pHeight) / CompressionFactor; | 316 | return ((float)pHeight) / CompressionFactor; |
285 | } | 317 | } |
@@ -293,12 +325,12 @@ namespace OpenSim.Framework | |||
293 | SizeZ = (int)Constants.RegionHeight; | 325 | SizeZ = (int)Constants.RegionHeight; |
294 | m_compressionFactor = 100.0f; | 326 | m_compressionFactor = 100.0f; |
295 | 327 | ||
296 | m_heightmap = new int[SizeX, SizeY]; | 328 | m_heightmap = new float[SizeX, SizeY]; |
297 | for (int ii = 0; ii < SizeX; ii++) | 329 | for (int ii = 0; ii < SizeX; ii++) |
298 | { | 330 | { |
299 | for (int jj = 0; jj < SizeY; jj++) | 331 | for (int jj = 0; jj < SizeY; jj++) |
300 | { | 332 | { |
301 | m_heightmap[ii, jj] = ToCompressedHeight(pTerrain[ii, jj]); | 333 | m_heightmap[ii, jj] = (float)pTerrain[ii, jj]; |
302 | 334 | ||
303 | } | 335 | } |
304 | } | 336 | } |
@@ -315,14 +347,15 @@ namespace OpenSim.Framework | |||
315 | SizeY = pY; | 347 | SizeY = pY; |
316 | SizeZ = pZ; | 348 | SizeZ = pZ; |
317 | m_compressionFactor = 100.0f; | 349 | m_compressionFactor = 100.0f; |
318 | m_heightmap = new int[SizeX, SizeY]; | 350 | m_heightmap = new float[SizeX, SizeY]; |
319 | m_taint = new bool[SizeX / Constants.TerrainPatchSize, SizeY / Constants.TerrainPatchSize]; | 351 | m_taint = new bool[SizeX / Constants.TerrainPatchSize, SizeY / Constants.TerrainPatchSize]; |
320 | // m_log.DebugFormat("{0} new by dimensions. sizeX={1}, sizeY={2}, sizeZ={3}", LogHeader, SizeX, SizeY, SizeZ); | 352 | // m_log.DebugFormat("{0} new by dimensions. sizeX={1}, sizeY={2}, sizeZ={3}", LogHeader, SizeX, SizeY, SizeZ); |
321 | ClearTaint(); | 353 | ClearTaint(); |
322 | ClearLand(0f); | 354 | ClearLand(0f); |
323 | } | 355 | } |
324 | 356 | ||
325 | public HeightmapTerrainData(int[] cmap, float pCompressionFactor, int pX, int pY, int pZ) : this(pX, pY, pZ) | 357 | public HeightmapTerrainData(float[] cmap, float pCompressionFactor, int pX, int pY, int pZ) |
358 | : this(pX, pY, pZ) | ||
326 | { | 359 | { |
327 | m_compressionFactor = pCompressionFactor; | 360 | m_compressionFactor = pCompressionFactor; |
328 | int ind = 0; | 361 | int ind = 0; |
@@ -333,12 +366,22 @@ namespace OpenSim.Framework | |||
333 | } | 366 | } |
334 | 367 | ||
335 | // Create a heighmap from a database blob | 368 | // Create a heighmap from a database blob |
336 | public HeightmapTerrainData(int pSizeX, int pSizeY, int pSizeZ, int pFormatCode, byte[] pBlob) : this(pSizeX, pSizeY, pSizeZ) | 369 | public HeightmapTerrainData(int pSizeX, int pSizeY, int pSizeZ, int pFormatCode, byte[] pBlob) |
370 | : this(pSizeX, pSizeY, pSizeZ) | ||
337 | { | 371 | { |
338 | switch ((DBTerrainRevision)pFormatCode) | 372 | switch ((DBTerrainRevision)pFormatCode) |
339 | { | 373 | { |
374 | case DBTerrainRevision.Variable2DGzip: | ||
375 | FromCompressedTerrainSerializationV2DGZip(pBlob); | ||
376 | m_log.DebugFormat("{0} HeightmapTerrainData create from Variable2DGzip serialization. Size=<{1},{2}>", LogHeader, SizeX, SizeY); | ||
377 | break; | ||
378 | |||
379 | case DBTerrainRevision.Variable2D: | ||
380 | FromCompressedTerrainSerializationV2D(pBlob); | ||
381 | m_log.DebugFormat("{0} HeightmapTerrainData create from Variable2D serialization. Size=<{1},{2}>", LogHeader, SizeX, SizeY); | ||
382 | break; | ||
340 | case DBTerrainRevision.Compressed2D: | 383 | case DBTerrainRevision.Compressed2D: |
341 | FromCompressedTerrainSerialization(pBlob); | 384 | FromCompressedTerrainSerialization2D(pBlob); |
342 | m_log.DebugFormat("{0} HeightmapTerrainData create from Compressed2D serialization. Size=<{1},{2}>", LogHeader, SizeX, SizeY); | 385 | m_log.DebugFormat("{0} HeightmapTerrainData create from Compressed2D serialization. Size=<{1},{2}>", LogHeader, SizeX, SizeY); |
343 | break; | 386 | break; |
344 | default: | 387 | default: |
@@ -373,50 +416,116 @@ namespace OpenSim.Framework | |||
373 | return ret; | 416 | return ret; |
374 | } | 417 | } |
375 | 418 | ||
376 | // Just create an array of doubles. Presumes the caller implicitly knows the size. | 419 | // Presumes the caller implicitly knows the size. |
377 | public void FromLegacyTerrainSerialization(byte[] pBlob) | 420 | public void FromLegacyTerrainSerialization(byte[] pBlob) |
378 | { | 421 | { |
379 | // In case database info doesn't match real terrain size, initialize the whole terrain. | 422 | // In case database info doesn't match real terrain size, initialize the whole terrain. |
380 | ClearLand(); | 423 | ClearLand(); |
381 | 424 | ||
382 | using (MemoryStream mstr = new MemoryStream(pBlob)) | 425 | try |
383 | { | 426 | { |
384 | using (BinaryReader br = new BinaryReader(mstr)) | 427 | using (MemoryStream mstr = new MemoryStream(pBlob)) |
385 | { | 428 | { |
386 | for (int xx = 0; xx < (int)Constants.RegionSize; xx++) | 429 | using (BinaryReader br = new BinaryReader(mstr)) |
387 | { | 430 | { |
388 | for (int yy = 0; yy < (int)Constants.RegionSize; yy++) | 431 | for (int xx = 0; xx < (int)Constants.RegionSize; xx++) |
389 | { | 432 | { |
390 | float val = (float)br.ReadDouble(); | 433 | for (int yy = 0; yy < (int)Constants.RegionSize; yy++) |
391 | if (xx < SizeX && yy < SizeY) | 434 | { |
392 | m_heightmap[xx, yy] = ToCompressedHeight(val); | 435 | float val = (float)br.ReadDouble(); |
436 | |||
437 | if (xx < SizeX && yy < SizeY) | ||
438 | m_heightmap[xx, yy] = val; | ||
439 | } | ||
393 | } | 440 | } |
394 | } | 441 | } |
395 | } | 442 | } |
396 | ClearTaint(); | ||
397 | } | 443 | } |
444 | catch | ||
445 | { | ||
446 | ClearLand(); | ||
447 | } | ||
448 | ClearTaint(); | ||
449 | } | ||
450 | |||
451 | |||
452 | // stores as variable2D | ||
453 | // int32 sizeX | ||
454 | // int32 sizeY | ||
455 | // float[,] array | ||
456 | |||
457 | public Array ToCompressedTerrainSerializationV2D() | ||
458 | { | ||
459 | Array ret = null; | ||
460 | try | ||
461 | { | ||
462 | using (MemoryStream str = new MemoryStream((2 * sizeof(Int32)) + (SizeX * SizeY * sizeof(float)))) | ||
463 | { | ||
464 | using (BinaryWriter bw = new BinaryWriter(str)) | ||
465 | { | ||
466 | bw.Write((Int32)SizeX); | ||
467 | bw.Write((Int32)SizeY); | ||
468 | for (int yy = 0; yy < SizeY; yy++) | ||
469 | for (int xx = 0; xx < SizeX; xx++) | ||
470 | { | ||
471 | // reduce to 1cm resolution | ||
472 | float val = (float)Math.Round(m_heightmap[xx, yy],2,MidpointRounding.ToEven); | ||
473 | bw.Write(val); | ||
474 | } | ||
475 | } | ||
476 | ret = str.ToArray(); | ||
477 | } | ||
478 | } | ||
479 | catch | ||
480 | { | ||
481 | |||
482 | } | ||
483 | |||
484 | m_log.DebugFormat("{0} V2D {1} bytes", | ||
485 | LogHeader, ret.Length); | ||
486 | |||
487 | return ret; | ||
398 | } | 488 | } |
399 | 489 | ||
400 | // See the reader below. | 490 | // as above with Gzip compression |
401 | public Array ToCompressedTerrainSerialization() | 491 | public Array ToCompressedTerrainSerializationV2DGzip() |
402 | { | 492 | { |
403 | Array ret = null; | 493 | Array ret = null; |
404 | using (MemoryStream str = new MemoryStream((3 * sizeof(Int32)) + (SizeX * SizeY * sizeof(Int16)))) | 494 | try |
405 | { | 495 | { |
406 | using (BinaryWriter bw = new BinaryWriter(str)) | 496 | using (MemoryStream inp = new MemoryStream((2 * sizeof(Int32)) + (SizeX * SizeY * sizeof(float)))) |
407 | { | 497 | { |
408 | bw.Write((Int32)DBTerrainRevision.Compressed2D); | 498 | using (BinaryWriter bw = new BinaryWriter(inp)) |
409 | bw.Write((Int32)SizeX); | 499 | { |
410 | bw.Write((Int32)SizeY); | 500 | bw.Write((Int32)SizeX); |
411 | bw.Write((Int32)CompressionFactor); | 501 | bw.Write((Int32)SizeY); |
412 | for (int yy = 0; yy < SizeY; yy++) | 502 | for (int yy = 0; yy < SizeY; yy++) |
413 | for (int xx = 0; xx < SizeX; xx++) | 503 | for (int xx = 0; xx < SizeX; xx++) |
504 | { | ||
505 | bw.Write((float)m_heightmap[xx, yy]); | ||
506 | } | ||
507 | |||
508 | bw.Flush(); | ||
509 | inp.Seek(0, SeekOrigin.Begin); | ||
510 | |||
511 | using (MemoryStream outputStream = new MemoryStream()) | ||
414 | { | 512 | { |
415 | bw.Write((Int16)m_heightmap[xx, yy]); | 513 | using (GZipStream compressionStream = new GZipStream(outputStream, CompressionMode.Compress)) |
514 | { | ||
515 | inp.CopyStream(compressionStream, int.MaxValue); | ||
516 | compressionStream.Close(); | ||
517 | ret = outputStream.ToArray(); | ||
518 | } | ||
416 | } | 519 | } |
520 | } | ||
417 | } | 521 | } |
418 | ret = str.ToArray(); | ||
419 | } | 522 | } |
523 | catch | ||
524 | { | ||
525 | |||
526 | } | ||
527 | m_log.DebugFormat("{0} V2DGzip {1} bytes", | ||
528 | LogHeader, ret.Length); | ||
420 | return ret; | 529 | return ret; |
421 | } | 530 | } |
422 | 531 | ||
@@ -426,7 +535,7 @@ namespace OpenSim.Framework | |||
426 | // the forth int is the compression factor for the following int16s | 535 | // the forth int is the compression factor for the following int16s |
427 | // This is just sets heightmap info. The actual size of the region was set on this instance's | 536 | // This is just sets heightmap info. The actual size of the region was set on this instance's |
428 | // creation and any heights not initialized by theis blob are set to the default height. | 537 | // creation and any heights not initialized by theis blob are set to the default height. |
429 | public void FromCompressedTerrainSerialization(byte[] pBlob) | 538 | public void FromCompressedTerrainSerialization2D(byte[] pBlob) |
430 | { | 539 | { |
431 | Int32 hmFormatCode, hmSizeX, hmSizeY, hmCompressionFactor; | 540 | Int32 hmFormatCode, hmSizeX, hmSizeY, hmCompressionFactor; |
432 | 541 | ||
@@ -448,7 +557,7 @@ namespace OpenSim.Framework | |||
448 | { | 557 | { |
449 | for (int xx = 0; xx < hmSizeX; xx++) | 558 | for (int xx = 0; xx < hmSizeX; xx++) |
450 | { | 559 | { |
451 | Int16 val = br.ReadInt16(); | 560 | float val = FromCompressedHeight(br.ReadInt16()); |
452 | if (xx < SizeX && yy < SizeY) | 561 | if (xx < SizeX && yy < SizeY) |
453 | m_heightmap[xx, yy] = val; | 562 | m_heightmap[xx, yy] = val; |
454 | } | 563 | } |
@@ -456,9 +565,112 @@ namespace OpenSim.Framework | |||
456 | } | 565 | } |
457 | ClearTaint(); | 566 | ClearTaint(); |
458 | 567 | ||
459 | m_log.InfoFormat("{0} Read compressed 2d heightmap. Heightmap size=<{1},{2}>. Region size=<{3},{4}>. CompFact={5}", | 568 | m_log.DebugFormat("{0} Read (compressed2D) heightmap. Heightmap size=<{1},{2}>. Region size=<{3},{4}>. CompFact={5}", |
460 | LogHeader, hmSizeX, hmSizeY, SizeX, SizeY, hmCompressionFactor); | 569 | LogHeader, hmSizeX, hmSizeY, SizeX, SizeY, hmCompressionFactor); |
461 | } | 570 | } |
462 | } | 571 | } |
572 | |||
573 | // Initialize heightmap from blob consisting of: | ||
574 | // int32, int32, int32, float[] | ||
575 | // where the first int32 is format code, next two int32s are the X and y of heightmap data | ||
576 | // This is just sets heightmap info. The actual size of the region was set on this instance's | ||
577 | // creation and any heights not initialized by theis blob are set to the default height. | ||
578 | public void FromCompressedTerrainSerializationV2D(byte[] pBlob) | ||
579 | { | ||
580 | Int32 hmSizeX, hmSizeY; | ||
581 | try | ||
582 | { | ||
583 | using (MemoryStream mstr = new MemoryStream(pBlob)) | ||
584 | { | ||
585 | using (BinaryReader br = new BinaryReader(mstr)) | ||
586 | { | ||
587 | hmSizeX = br.ReadInt32(); | ||
588 | hmSizeY = br.ReadInt32(); | ||
589 | |||
590 | // In case database info doesn't match real terrain size, initialize the whole terrain. | ||
591 | ClearLand(); | ||
592 | |||
593 | for (int yy = 0; yy < hmSizeY; yy++) | ||
594 | { | ||
595 | for (int xx = 0; xx < hmSizeX; xx++) | ||
596 | { | ||
597 | float val = br.ReadSingle(); | ||
598 | if (xx < SizeX && yy < SizeY) | ||
599 | m_heightmap[xx, yy] = val; | ||
600 | } | ||
601 | } | ||
602 | } | ||
603 | } | ||
604 | } | ||
605 | catch (Exception e) | ||
606 | { | ||
607 | ClearTaint(); | ||
608 | m_log.ErrorFormat("{0} 2D error: {1} - terrain may be damaged", | ||
609 | LogHeader, e.Message); | ||
610 | return; | ||
611 | } | ||
612 | ClearTaint(); | ||
613 | |||
614 | m_log.DebugFormat("{0} V2D Heightmap size=<{1},{2}>. Region size=<{3},{4}>", | ||
615 | LogHeader, hmSizeX, hmSizeY, SizeX, SizeY); | ||
616 | |||
617 | } | ||
618 | |||
619 | // as above but Gzip compressed | ||
620 | public void FromCompressedTerrainSerializationV2DGZip(byte[] pBlob) | ||
621 | { | ||
622 | m_log.InfoFormat("{0} VD2Gzip {1} bytes input", | ||
623 | LogHeader, pBlob.Length); | ||
624 | |||
625 | Int32 hmSizeX, hmSizeY; | ||
626 | |||
627 | try | ||
628 | { | ||
629 | using (MemoryStream outputStream = new MemoryStream()) | ||
630 | { | ||
631 | using (MemoryStream inputStream = new MemoryStream(pBlob)) | ||
632 | { | ||
633 | using (GZipStream decompressionStream = new GZipStream(inputStream, CompressionMode.Decompress)) | ||
634 | { | ||
635 | decompressionStream.Flush(); | ||
636 | decompressionStream.CopyTo(outputStream); | ||
637 | } | ||
638 | } | ||
639 | |||
640 | outputStream.Seek(0, SeekOrigin.Begin); | ||
641 | |||
642 | using (BinaryReader br = new BinaryReader(outputStream)) | ||
643 | { | ||
644 | hmSizeX = br.ReadInt32(); | ||
645 | hmSizeY = br.ReadInt32(); | ||
646 | |||
647 | // In case database info doesn't match real terrain size, initialize the whole terrain. | ||
648 | ClearLand(); | ||
649 | |||
650 | for (int yy = 0; yy < hmSizeY; yy++) | ||
651 | { | ||
652 | for (int xx = 0; xx < hmSizeX; xx++) | ||
653 | { | ||
654 | float val = br.ReadSingle(); | ||
655 | if (xx < SizeX && yy < SizeY) | ||
656 | m_heightmap[xx, yy] = val; | ||
657 | } | ||
658 | } | ||
659 | } | ||
660 | } | ||
661 | } | ||
662 | catch( Exception e) | ||
663 | { | ||
664 | ClearTaint(); | ||
665 | m_log.ErrorFormat("{0} V2DGzip error: {1} - terrain may be damaged", | ||
666 | LogHeader, e.Message); | ||
667 | return; | ||
668 | } | ||
669 | |||
670 | ClearTaint(); | ||
671 | m_log.DebugFormat("{0} V2DGzip. Heightmap size=<{1},{2}>. Region size=<{3},{4}>", | ||
672 | LogHeader, hmSizeX, hmSizeY, SizeX, SizeY); | ||
673 | |||
674 | } | ||
463 | } | 675 | } |
464 | } | 676 | } |
diff --git a/OpenSim/Framework/Tests/AgentCircuitDataTest.cs b/OpenSim/Framework/Tests/AgentCircuitDataTest.cs index 95e9439..5ad0030 100644 --- a/OpenSim/Framework/Tests/AgentCircuitDataTest.cs +++ b/OpenSim/Framework/Tests/AgentCircuitDataTest.cs | |||
@@ -96,7 +96,7 @@ namespace OpenSim.Framework.Tests | |||
96 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOOT_SIZE] = 45; | 96 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOOT_SIZE] = 45; |
97 | 97 | ||
98 | 98 | ||
99 | // head | 99 | // head |
100 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SIZE] = 255; | 100 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SIZE] = 255; |
101 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SQUASH_STRETCH_HEAD] = 0; // head stretch | 101 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SQUASH_STRETCH_HEAD] = 0; // head stretch |
102 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SHAPE] = 155; | 102 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SHAPE] = 155; |
@@ -106,7 +106,7 @@ namespace OpenSim.Framework.Tests | |||
106 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FACE_SHEAR] = 127; | 106 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FACE_SHEAR] = 127; |
107 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOREHEAD_ANGLE] = 104; | 107 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOREHEAD_ANGLE] = 104; |
108 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BIG_BROW] = 94; | 108 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BIG_BROW] = 94; |
109 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_PUFFY_UPPER_CHEEKS] = 0; // upper cheeks | 109 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_PUFFY_UPPER_CHEEKS] = 0; // upper cheeks |
110 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DOUBLE_CHIN] = 122; // lower cheeks | 110 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DOUBLE_CHIN] = 122; // lower cheeks |
111 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIGH_CHEEK_BONES] = 130; | 111 | VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIGH_CHEEK_BONES] = 130; |
112 | 112 | ||
@@ -232,7 +232,7 @@ namespace OpenSim.Framework.Tests | |||
232 | /// <summary> | 232 | /// <summary> |
233 | /// Test to ensure that the serialization format is the same and the underlying types don't change without notice | 233 | /// Test to ensure that the serialization format is the same and the underlying types don't change without notice |
234 | /// oldSerialization is just a json serialization of the OSDMap packed for the AgentCircuitData. | 234 | /// oldSerialization is just a json serialization of the OSDMap packed for the AgentCircuitData. |
235 | /// The idea is that if the current json serializer cannot parse the old serialization, then the underlying types | 235 | /// The idea is that if the current json serializer cannot parse the old serialization, then the underlying types |
236 | /// have changed and are incompatible. | 236 | /// have changed and are incompatible. |
237 | /// </summary> | 237 | /// </summary> |
238 | [Test] | 238 | [Test] |
@@ -311,14 +311,15 @@ namespace OpenSim.Framework.Tests | |||
311 | Agent1Data.SessionID = SessionId; | 311 | Agent1Data.SessionID = SessionId; |
312 | Agent1Data.startpos = StartPos; | 312 | Agent1Data.startpos = StartPos; |
313 | 313 | ||
314 | EntityTransferContext ctx = new EntityTransferContext(); | ||
314 | OSDMap map2; | 315 | OSDMap map2; |
315 | OSDMap map = Agent1Data.PackAgentCircuitData(); | 316 | OSDMap map = Agent1Data.PackAgentCircuitData(ctx); |
316 | try | 317 | try |
317 | { | 318 | { |
318 | string str = OSDParser.SerializeJsonString(map); | 319 | string str = OSDParser.SerializeJsonString(map); |
319 | //System.Console.WriteLine(str); | 320 | //System.Console.WriteLine(str); |
320 | map2 = (OSDMap) OSDParser.DeserializeJson(str); | 321 | map2 = (OSDMap) OSDParser.DeserializeJson(str); |
321 | } | 322 | } |
322 | catch (System.NullReferenceException) | 323 | catch (System.NullReferenceException) |
323 | { | 324 | { |
324 | //spurious litjson errors :P | 325 | //spurious litjson errors :P |
diff --git a/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs b/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs index ae132c8..b572afc 100644 --- a/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs +++ b/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs | |||
@@ -183,7 +183,7 @@ namespace OpenSim.Framework.Tests | |||
183 | 183 | ||
184 | resp = agentCircuitManager.AuthenticateSession(UUID.Random(), AgentId1, circuitcode1); | 184 | resp = agentCircuitManager.AuthenticateSession(UUID.Random(), AgentId1, circuitcode1); |
185 | Assert.That(!resp.Authorised); | 185 | Assert.That(!resp.Authorised); |
186 | 186 | ||
187 | resp = agentCircuitManager.AuthenticateSession(SessionId1, AgentId1, circuitcode2); | 187 | resp = agentCircuitManager.AuthenticateSession(SessionId1, AgentId1, circuitcode2); |
188 | Assert.That(!resp.Authorised); | 188 | Assert.That(!resp.Authorised); |
189 | 189 | ||
diff --git a/OpenSim/Framework/Tests/AnimationTests.cs b/OpenSim/Framework/Tests/AnimationTests.cs index d8f17d0..daf8611 100644 --- a/OpenSim/Framework/Tests/AnimationTests.cs +++ b/OpenSim/Framework/Tests/AnimationTests.cs | |||
@@ -84,7 +84,7 @@ namespace OpenSim.Framework.Tests | |||
84 | anim4.AnimID = anim2.AnimID; | 84 | anim4.AnimID = anim2.AnimID; |
85 | anim4.ObjectID = anim2.ObjectID; | 85 | anim4.ObjectID = anim2.ObjectID; |
86 | anim4.SequenceNum = anim2.SequenceNum; | 86 | anim4.SequenceNum = anim2.SequenceNum; |
87 | 87 | ||
88 | Assert.That(anim4.ObjectID == objUUID2 && anim4.AnimID == animUUID2 && anim4.SequenceNum == 1, "void constructor and manual field population failed to set the properties correctly."); | 88 | Assert.That(anim4.ObjectID == objUUID2 && anim4.AnimID == animUUID2 && anim4.SequenceNum == 1, "void constructor and manual field population failed to set the properties correctly."); |
89 | } | 89 | } |
90 | } | 90 | } |
diff --git a/OpenSim/Framework/Tests/CacheTests.cs b/OpenSim/Framework/Tests/CacheTests.cs index c709860..a92ff3c 100644 --- a/OpenSim/Framework/Tests/CacheTests.cs +++ b/OpenSim/Framework/Tests/CacheTests.cs | |||
@@ -70,7 +70,7 @@ namespace OpenSim.Framework.Tests | |||
70 | Assert.That(citem == null, "Item should not be in Cache"); | 70 | Assert.That(citem == null, "Item should not be in Cache"); |
71 | } | 71 | } |
72 | 72 | ||
73 | 73 | ||
74 | [Test] | 74 | [Test] |
75 | public void ExpireItemManually() | 75 | public void ExpireItemManually() |
76 | { | 76 | { |
@@ -96,7 +96,7 @@ namespace OpenSim.Framework.Tests | |||
96 | cachedItem.Store(foo); | 96 | cachedItem.Store(foo); |
97 | cache.Store(cacheItemUUID.ToString(), cachedItem); | 97 | cache.Store(cacheItemUUID.ToString(), cachedItem); |
98 | cache.Clear(); | 98 | cache.Clear(); |
99 | 99 | ||
100 | object citem = cache.Get(cacheItemUUID.ToString()); | 100 | object citem = cache.Get(cacheItemUUID.ToString()); |
101 | Assert.That(citem == null, "Item should not be in Cache because we manually invalidated it"); | 101 | Assert.That(citem == null, "Item should not be in Cache because we manually invalidated it"); |
102 | } | 102 | } |
diff --git a/OpenSim/Framework/Tests/LocationTest.cs b/OpenSim/Framework/Tests/LocationTest.cs index 3d5d1d2..5e84026 100644 --- a/OpenSim/Framework/Tests/LocationTest.cs +++ b/OpenSim/Framework/Tests/LocationTest.cs | |||
@@ -85,6 +85,6 @@ namespace OpenSim.Framework.Tests | |||
85 | Assert.That(TestLocation2.Equals(cln), "Cloned object failed .Equals(obj) Test"); | 85 | Assert.That(TestLocation2.Equals(cln), "Cloned object failed .Equals(obj) Test"); |
86 | 86 | ||
87 | } | 87 | } |
88 | 88 | ||
89 | } | 89 | } |
90 | } | 90 | } |
diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs index 3f0a031..bde7056 100644 --- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs +++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs | |||
@@ -110,13 +110,14 @@ namespace OpenSim.Framework.Tests | |||
110 | && position2.Center == position1.Center | 110 | && position2.Center == position1.Center |
111 | && position2.RegionHandle == position1.RegionHandle | 111 | && position2.RegionHandle == position1.RegionHandle |
112 | && position2.Far == position1.Far | 112 | && position2.Far == position1.Far |
113 | 113 | ||
114 | ,"Copy From ChildAgentDataUpdate failed"); | 114 | ,"Copy From ChildAgentDataUpdate failed"); |
115 | 115 | ||
116 | position2 = new AgentPosition(); | 116 | position2 = new AgentPosition(); |
117 | 117 | ||
118 | Assert.IsFalse(position2.AgentID == position1.AgentID, "Test Error, position2 should be a blank uninitialized AgentPosition"); | 118 | Assert.IsFalse(position2.AgentID == position1.AgentID, "Test Error, position2 should be a blank uninitialized AgentPosition"); |
119 | position2.Unpack(position1.Pack(), null); | 119 | EntityTransferContext ctx = new EntityTransferContext(); |
120 | position2.Unpack(position1.Pack(ctx), null, ctx); | ||
120 | 121 | ||
121 | Assert.IsTrue(position2.AgentID == position1.AgentID, "Agent ID didn't unpack the same way it packed"); | 122 | Assert.IsTrue(position2.AgentID == position1.AgentID, "Agent ID didn't unpack the same way it packed"); |
122 | Assert.IsTrue(position2.Position == position1.Position, "Position didn't unpack the same way it packed"); | 123 | Assert.IsTrue(position2.Position == position1.Position, "Position didn't unpack the same way it packed"); |
@@ -147,13 +148,13 @@ namespace OpenSim.Framework.Tests | |||
147 | // string time = settings.LoadedCreationTime; | 148 | // string time = settings.LoadedCreationTime; |
148 | 149 | ||
149 | Assert.That(m_RegionSettingsOnSaveEventFired, "RegionSettings Save Event didn't Fire"); | 150 | Assert.That(m_RegionSettingsOnSaveEventFired, "RegionSettings Save Event didn't Fire"); |
150 | 151 | ||
151 | } | 152 | } |
152 | public void RegionSaveFired(RegionSettings settings) | 153 | public void RegionSaveFired(RegionSettings settings) |
153 | { | 154 | { |
154 | m_RegionSettingsOnSaveEventFired = true; | 155 | m_RegionSettingsOnSaveEventFired = true; |
155 | } | 156 | } |
156 | 157 | ||
157 | [Test] | 158 | [Test] |
158 | public void InventoryItemBaseConstructorTest01() | 159 | public void InventoryItemBaseConstructorTest01() |
159 | { | 160 | { |
@@ -163,7 +164,7 @@ namespace OpenSim.Framework.Tests | |||
163 | 164 | ||
164 | UUID ItemID = UUID.Random(); | 165 | UUID ItemID = UUID.Random(); |
165 | UUID OwnerID = UUID.Random(); | 166 | UUID OwnerID = UUID.Random(); |
166 | 167 | ||
167 | InventoryItemBase b2 = new InventoryItemBase(ItemID); | 168 | InventoryItemBase b2 = new InventoryItemBase(ItemID); |
168 | Assert.That(b2.ID == ItemID, "ID constructor should create an inventory item with ID = ItemID"); | 169 | Assert.That(b2.ID == ItemID, "ID constructor should create an inventory item with ID = ItemID"); |
169 | Assert.That(b2.Owner == UUID.Zero, "ID constructor should create an inventory item with Owner = UUID.Zero"); | 170 | Assert.That(b2.Owner == UUID.Zero, "ID constructor should create an inventory item with Owner = UUID.Zero"); |
@@ -218,12 +219,12 @@ namespace OpenSim.Framework.Tests | |||
218 | BannedHostNameMask = string.Empty, | 219 | BannedHostNameMask = string.Empty, |
219 | BannedUserID = bannedUserId} | 220 | BannedUserID = bannedUserId} |
220 | ); | 221 | ); |
221 | Assert.IsTrue(es.IsBanned(bannedUserId), "User Should be banned but is not."); | 222 | Assert.IsTrue(es.IsBanned(bannedUserId, 32), "User Should be banned but is not."); |
222 | Assert.IsFalse(es.IsBanned(UUID.Zero), "User Should not be banned but is."); | 223 | Assert.IsFalse(es.IsBanned(UUID.Zero, 32), "User Should not be banned but is."); |
223 | 224 | ||
224 | es.RemoveBan(bannedUserId); | 225 | es.RemoveBan(bannedUserId); |
225 | 226 | ||
226 | Assert.IsFalse(es.IsBanned(bannedUserId), "User Should not be banned but is."); | 227 | Assert.IsFalse(es.IsBanned(bannedUserId, 32), "User Should not be banned but is."); |
227 | 228 | ||
228 | es.AddEstateManager(UUID.Zero); | 229 | es.AddEstateManager(UUID.Zero); |
229 | 230 | ||
@@ -267,7 +268,7 @@ namespace OpenSim.Framework.Tests | |||
267 | Assert.That(fld.ID == uuid1, "ID,Owner constructor failed to save value in ID field."); | 268 | Assert.That(fld.ID == uuid1, "ID,Owner constructor failed to save value in ID field."); |
268 | Assert.That(fld.Owner == uuid2, "ID,Owner constructor failed to save value in ID field."); | 269 | Assert.That(fld.Owner == uuid2, "ID,Owner constructor failed to save value in ID field."); |
269 | } | 270 | } |
270 | 271 | ||
271 | [Test] | 272 | [Test] |
272 | public void AsssetBaseConstructorTest01() | 273 | public void AsssetBaseConstructorTest01() |
273 | { | 274 | { |
@@ -303,6 +304,6 @@ namespace OpenSim.Framework.Tests | |||
303 | Culture.SetCurrentCulture(); | 304 | Culture.SetCurrentCulture(); |
304 | Assert.That(Thread.CurrentThread.CurrentCulture.Name == ci.Name, "SetCurrentCulture failed to set thread culture to en-US"); | 305 | Assert.That(Thread.CurrentThread.CurrentCulture.Name == ci.Name, "SetCurrentCulture failed to set thread culture to en-US"); |
305 | 306 | ||
306 | } | 307 | } |
307 | } | 308 | } |
308 | } \ No newline at end of file | 309 | } |
diff --git a/OpenSim/Framework/Tests/PrimeNumberHelperTests.cs b/OpenSim/Framework/Tests/PrimeNumberHelperTests.cs index 82e13e5..cc30fb9 100644 --- a/OpenSim/Framework/Tests/PrimeNumberHelperTests.cs +++ b/OpenSim/Framework/Tests/PrimeNumberHelperTests.cs | |||
@@ -127,9 +127,9 @@ namespace OpenSim.Framework.Tests | |||
127 | 127 | ||
128 | int[] nonprimes = { | 128 | int[] nonprimes = { |
129 | 4, 6, 8, 10, 14, 16, 18, 22, 28, 30, 36, 40, 42, 46, 52, 58, 60, 66, 70, 72, 78, 82, 88, | 129 | 4, 6, 8, 10, 14, 16, 18, 22, 28, 30, 36, 40, 42, 46, 52, 58, 60, 66, 70, 72, 78, 82, 88, |
130 | 96, 366, 372, 378, 382, 388, 396, 400, 408, 418, 420, 430, 432, 438, 442, 448, 456, 460, 462, | 130 | 96, 366, 372, 378, 382, 388, 396, 400, 408, 418, 420, 430, 432, 438, 442, 448, 456, 460, 462, |
131 | 466, 478, 486, 490, 498, 502, 508, 856, 858, 862, 876, 880, 882, 886, 906, 910, 918, 928, 936, | 131 | 466, 478, 486, 490, 498, 502, 508, 856, 858, 862, 876, 880, 882, 886, 906, 910, 918, 928, 936, |
132 | 940, 946, 952, 966, 970, 976, 982, 990, 996, 1008, 1740, 1746, 1752, 1758, 4650, 4656, 4662, | 132 | 940, 946, 952, 966, 970, 976, 982, 990, 996, 1008, 1740, 1746, 1752, 1758, 4650, 4656, 4662, |
133 | 4672, 4678, 4690, 7740, 7752, 7756, 7758, 7788, 7792, 7816, 7822, 7828, 7840, 7852, 7866, 7872, | 133 | 4672, 4678, 4690, 7740, 7752, 7756, 7758, 7788, 7792, 7816, 7822, 7828, 7840, 7852, 7866, 7872, |
134 | 7876, 7878, 7882, 7900, 7906, 7918 | 134 | 7876, 7878, 7882, 7900, 7906, 7918 |
135 | }; | 135 | }; |
diff --git a/OpenSim/Framework/Tests/UtilTest.cs b/OpenSim/Framework/Tests/UtilTest.cs index cfe3139..b3d79ee 100644 --- a/OpenSim/Framework/Tests/UtilTest.cs +++ b/OpenSim/Framework/Tests/UtilTest.cs | |||
@@ -59,12 +59,12 @@ namespace OpenSim.Framework.Tests | |||
59 | Assert.That(Util.GetMagnitude(v2), | 59 | Assert.That(Util.GetMagnitude(v2), |
60 | new DoubleToleranceConstraint(expectedMagnitude, lowPrecisionTolerance), | 60 | new DoubleToleranceConstraint(expectedMagnitude, lowPrecisionTolerance), |
61 | "Magnitude of vector was incorrect."); | 61 | "Magnitude of vector was incorrect."); |
62 | 62 | /* | |
63 | TestDelegate d = delegate() { Util.GetNormalizedVector(v1); }; | 63 | TestDelegate d = delegate() { Util.GetNormalizedVector(v1); }; |
64 | bool causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); | 64 | bool causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); |
65 | Assert.That(causesArgumentException, Is.True, | 65 | Assert.That(causesArgumentException, Is.True, |
66 | "Getting magnitude of null vector did not cause argument exception."); | 66 | "Getting magnitude of null vector did not cause argument exception."); |
67 | 67 | */ | |
68 | Vector3 expectedNormalizedVector = new Vector3(.577f, .577f, .577f); | 68 | Vector3 expectedNormalizedVector = new Vector3(.577f, .577f, .577f); |
69 | double expectedNormalizedMagnitude = 1; | 69 | double expectedNormalizedMagnitude = 1; |
70 | Vector3 normalizedVector = Util.GetNormalizedVector(v2); | 70 | Vector3 normalizedVector = Util.GetNormalizedVector(v2); |
@@ -92,7 +92,7 @@ namespace OpenSim.Framework.Tests | |||
92 | Assert.That(Util.GetMagnitude(v2), | 92 | Assert.That(Util.GetMagnitude(v2), |
93 | new DoubleToleranceConstraint(expectedMagnitude, lowPrecisionTolerance), | 93 | new DoubleToleranceConstraint(expectedMagnitude, lowPrecisionTolerance), |
94 | "Magnitude of vector was incorrect."); | 94 | "Magnitude of vector was incorrect."); |
95 | 95 | /* | |
96 | TestDelegate d = delegate() { Util.GetNormalizedVector(v1); }; | 96 | TestDelegate d = delegate() { Util.GetNormalizedVector(v1); }; |
97 | bool causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); | 97 | bool causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); |
98 | Assert.That(causesArgumentException, Is.True, | 98 | Assert.That(causesArgumentException, Is.True, |
@@ -102,6 +102,7 @@ namespace OpenSim.Framework.Tests | |||
102 | causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); | 102 | causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); |
103 | Assert.That(causesArgumentException, Is.True, | 103 | Assert.That(causesArgumentException, Is.True, |
104 | "Getting magnitude of null vector did not cause argument exception."); | 104 | "Getting magnitude of null vector did not cause argument exception."); |
105 | */ | ||
105 | } | 106 | } |
106 | 107 | ||
107 | //Lets test a simple case of <0,0,0> and <-5,-5,-5> | 108 | //Lets test a simple case of <0,0,0> and <-5,-5,-5> |
@@ -120,12 +121,12 @@ namespace OpenSim.Framework.Tests | |||
120 | Assert.That(Util.GetMagnitude(v2), | 121 | Assert.That(Util.GetMagnitude(v2), |
121 | new DoubleToleranceConstraint(expectedMagnitude, lowPrecisionTolerance), | 122 | new DoubleToleranceConstraint(expectedMagnitude, lowPrecisionTolerance), |
122 | "Magnitude of vector was incorrect."); | 123 | "Magnitude of vector was incorrect."); |
123 | 124 | /* | |
124 | TestDelegate d = delegate() { Util.GetNormalizedVector(v1); }; | 125 | TestDelegate d = delegate() { Util.GetNormalizedVector(v1); }; |
125 | bool causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); | 126 | bool causesArgumentException = TestHelpers.AssertThisDelegateCausesArgumentException(d); |
126 | Assert.That(causesArgumentException, Is.True, | 127 | Assert.That(causesArgumentException, Is.True, |
127 | "Getting magnitude of null vector did not cause argument exception."); | 128 | "Getting magnitude of null vector did not cause argument exception."); |
128 | 129 | */ | |
129 | Vector3 expectedNormalizedVector = new Vector3(-.577f, -.577f, -.577f); | 130 | Vector3 expectedNormalizedVector = new Vector3(-.577f, -.577f, -.577f); |
130 | double expectedNormalizedMagnitude = 1; | 131 | double expectedNormalizedMagnitude = 1; |
131 | Vector3 normalizedVector = Util.GetNormalizedVector(v2); | 132 | Vector3 normalizedVector = Util.GetNormalizedVector(v2); |
@@ -232,7 +233,7 @@ namespace OpenSim.Framework.Tests | |||
232 | "application/vnd.ll.clothing", | 233 | "application/vnd.ll.clothing", |
233 | "application/vnd.ll.gesture" | 234 | "application/vnd.ll.gesture" |
234 | }; | 235 | }; |
235 | 236 | ||
236 | for (int i=0;i<inventorytypes.Length;i++) | 237 | for (int i=0;i<inventorytypes.Length;i++) |
237 | { | 238 | { |
238 | Assert.AreEqual(invcontenttypes[i], SLUtil.SLInvTypeToContentType(inventorytypes[i]), | 239 | Assert.AreEqual(invcontenttypes[i], SLUtil.SLInvTypeToContentType(inventorytypes[i]), |
diff --git a/OpenSim/Framework/ThrottleOutPacketType.cs b/OpenSim/Framework/ThrottleOutPacketType.cs index ca4b126..87899f0 100644 --- a/OpenSim/Framework/ThrottleOutPacketType.cs +++ b/OpenSim/Framework/ThrottleOutPacketType.cs | |||
@@ -47,6 +47,8 @@ namespace OpenSim.Framework | |||
47 | Texture = 5, | 47 | Texture = 5, |
48 | /// <summary>Non-texture assets</summary> | 48 | /// <summary>Non-texture assets</summary> |
49 | Asset = 6, | 49 | Asset = 6, |
50 | |||
51 | HighPriority = 128, | ||
50 | } | 52 | } |
51 | 53 | ||
52 | [Flags] | 54 | [Flags] |
diff --git a/OpenSim/Framework/UserProfileData.cs b/OpenSim/Framework/UserProfileData.cs index 266ccf0..d8fa629 100644 --- a/OpenSim/Framework/UserProfileData.cs +++ b/OpenSim/Framework/UserProfileData.cs | |||
@@ -159,12 +159,12 @@ namespace OpenSim.Framework | |||
159 | /// </summary> | 159 | /// </summary> |
160 | public virtual ulong HomeRegion | 160 | public virtual ulong HomeRegion |
161 | { | 161 | { |
162 | get | 162 | get |
163 | { | 163 | { |
164 | return Util.RegionWorldLocToHandle(Util.RegionToWorldLoc(m_homeRegionX), Util.RegionToWorldLoc(m_homeRegionY)); | 164 | return Util.RegionWorldLocToHandle(Util.RegionToWorldLoc(m_homeRegionX), Util.RegionToWorldLoc(m_homeRegionY)); |
165 | // return Utils.UIntsToLong( m_homeRegionX * (uint)Constants.RegionSize, m_homeRegionY * (uint)Constants.RegionSize); | 165 | // return Utils.UIntsToLong( m_homeRegionX * (uint)Constants.RegionSize, m_homeRegionY * (uint)Constants.RegionSize); |
166 | } | 166 | } |
167 | 167 | ||
168 | set | 168 | set |
169 | { | 169 | { |
170 | uint regionWorldLocX, regionWorldLocY; | 170 | uint regionWorldLocX, regionWorldLocY; |
@@ -212,7 +212,7 @@ namespace OpenSim.Framework | |||
212 | get { return m_surname; } | 212 | get { return m_surname; } |
213 | set { m_surname = value; } | 213 | set { m_surname = value; } |
214 | } | 214 | } |
215 | 215 | ||
216 | /// <value> | 216 | /// <value> |
217 | /// The concatentation of the various name components. | 217 | /// The concatentation of the various name components. |
218 | /// </value> | 218 | /// </value> |
diff --git a/OpenSim/Framework/UserProfiles.cs b/OpenSim/Framework/UserProfiles.cs index 98ab651..7c6a6fe 100644 --- a/OpenSim/Framework/UserProfiles.cs +++ b/OpenSim/Framework/UserProfiles.cs | |||
@@ -27,6 +27,8 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using OpenMetaverse; | 29 | using OpenMetaverse; |
30 | using System.Collections.Generic; | ||
31 | |||
30 | 32 | ||
31 | namespace OpenSim.Framework | 33 | namespace OpenSim.Framework |
32 | { | 34 | { |
@@ -48,7 +50,7 @@ namespace OpenSim.Framework | |||
48 | public byte Flags = 0; | 50 | public byte Flags = 0; |
49 | public int Price = 0; | 51 | public int Price = 0; |
50 | } | 52 | } |
51 | 53 | ||
52 | public class UserProfileProperties | 54 | public class UserProfileProperties |
53 | { | 55 | { |
54 | public UUID UserId = UUID.Zero; | 56 | public UUID UserId = UUID.Zero; |
@@ -66,7 +68,7 @@ namespace OpenSim.Framework | |||
66 | public UUID FirstLifeImageId = UUID.Zero; | 68 | public UUID FirstLifeImageId = UUID.Zero; |
67 | public string FirstLifeText = string.Empty; | 69 | public string FirstLifeText = string.Empty; |
68 | } | 70 | } |
69 | 71 | ||
70 | public class UserProfilePick | 72 | public class UserProfilePick |
71 | { | 73 | { |
72 | public UUID PickId = UUID.Zero; | 74 | public UUID PickId = UUID.Zero; |
@@ -84,7 +86,7 @@ namespace OpenSim.Framework | |||
84 | public int SortOrder = 0; | 86 | public int SortOrder = 0; |
85 | public bool Enabled = false; | 87 | public bool Enabled = false; |
86 | } | 88 | } |
87 | 89 | ||
88 | public class UserProfileNotes | 90 | public class UserProfileNotes |
89 | { | 91 | { |
90 | public UUID UserId; | 92 | public UUID UserId; |
@@ -99,7 +101,7 @@ namespace OpenSim.Framework | |||
99 | public bool Visible = false; | 101 | public bool Visible = false; |
100 | public string EMail = string.Empty; | 102 | public string EMail = string.Empty; |
101 | } | 103 | } |
102 | 104 | ||
103 | public class UserAccountProperties | 105 | public class UserAccountProperties |
104 | { | 106 | { |
105 | public string EmailAddress = string.Empty; | 107 | public string EmailAddress = string.Empty; |
@@ -108,13 +110,13 @@ namespace OpenSim.Framework | |||
108 | public string Password = string.Empty; | 110 | public string Password = string.Empty; |
109 | public string UserId = string.Empty; | 111 | public string UserId = string.Empty; |
110 | } | 112 | } |
111 | 113 | ||
112 | public class UserAccountAuth | 114 | public class UserAccountAuth |
113 | { | 115 | { |
114 | public string UserId = UUID.Zero.ToString(); | 116 | public string UserId = UUID.Zero.ToString(); |
115 | public string Password = string.Empty; | 117 | public string Password = string.Empty; |
116 | } | 118 | } |
117 | 119 | ||
118 | public class UserAppData | 120 | public class UserAppData |
119 | { | 121 | { |
120 | public string TagId = string.Empty; | 122 | public string TagId = string.Empty; |
@@ -122,5 +124,18 @@ namespace OpenSim.Framework | |||
122 | public string UserId = UUID.Zero.ToString(); | 124 | public string UserId = UUID.Zero.ToString(); |
123 | public string DataVal = string.Empty; | 125 | public string DataVal = string.Empty; |
124 | } | 126 | } |
127 | |||
128 | public class UserProfileCacheEntry | ||
129 | { | ||
130 | public Dictionary<UUID, string> picksList; | ||
131 | public Dictionary<UUID, UserProfilePick> picks; | ||
132 | public Dictionary<UUID, string> classifiedsLists; | ||
133 | public Dictionary<UUID, UserClassifiedAdd> classifieds; | ||
134 | public UserProfileProperties props; | ||
135 | public string born; | ||
136 | public byte[] membershipType; | ||
137 | public uint flags; | ||
138 | public HashSet<IClientAPI> ClientsWaitingProps; | ||
139 | } | ||
125 | } | 140 | } |
126 | 141 | ||
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index b5c3e75..7093010 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -59,17 +59,41 @@ namespace OpenSim.Framework | |||
59 | { | 59 | { |
60 | [Flags] | 60 | [Flags] |
61 | public enum PermissionMask : uint | 61 | public enum PermissionMask : uint |
62 | { | 62 | { |
63 | None = 0, | 63 | None = 0, |
64 | Transfer = 1 << 13, | 64 | |
65 | Modify = 1 << 14, | 65 | // folded perms |
66 | Copy = 1 << 15, | 66 | FoldedTransfer = 1, |
67 | Export = 1 << 16, | 67 | FoldedModify = 1 << 1, |
68 | Move = 1 << 19, | 68 | FoldedCopy = 1 << 2, |
69 | Damage = 1 << 20, | 69 | FoldedExport = 1 << 3, |
70 | |||
71 | // DO NOT USE THIS FOR NEW WORK. IT IS DEPRECATED AND | ||
72 | // EXISTS ONLY TO REACT TO EXISTING OBJECTS HAVING IT. | ||
73 | // NEW CODE SHOULD NEVER SET THIS BIT! | ||
74 | // Use InventoryItemFlags.ObjectSlamPerm in the Flags field of | ||
75 | // this legacy slam bit. It comes from prior incomplete | ||
76 | // understanding of the code and the prohibition on | ||
77 | // reading viewer code that used to be in place. | ||
78 | Slam = (1 << 4), | ||
79 | |||
80 | FoldedMask = 0x0f, | ||
81 | |||
82 | FoldingShift = 13 , // number of bit shifts from normal perm to folded or back (same as Transfer shift below) | ||
83 | // when doing as a block | ||
84 | |||
85 | Transfer = 1 << 13, // 0x02000 | ||
86 | Modify = 1 << 14, // 0x04000 | ||
87 | Copy = 1 << 15, // 0x08000 | ||
88 | Export = 1 << 16, // 0x10000 | ||
89 | Move = 1 << 19, // 0x80000 | ||
90 | Damage = 1 << 20, // 0x100000 does not seem to be in use | ||
70 | // All does not contain Export, which is special and must be | 91 | // All does not contain Export, which is special and must be |
71 | // explicitly given | 92 | // explicitly given |
72 | All = (1 << 13) | (1 << 14) | (1 << 15) | (1 << 19) | 93 | All = 0x8e000, |
94 | AllAndExport = 0x9e000, | ||
95 | AllEffective = 0x9e000, | ||
96 | UnfoldedMask = 0x1e000 | ||
73 | } | 97 | } |
74 | 98 | ||
75 | /// <summary> | 99 | /// <summary> |
@@ -103,7 +127,7 @@ namespace OpenSim.Framework | |||
103 | public STPStartInfo STPStartInfo { get; set; } | 127 | public STPStartInfo STPStartInfo { get; set; } |
104 | public WIGStartInfo WIGStartInfo { get; set; } | 128 | public WIGStartInfo WIGStartInfo { get; set; } |
105 | public bool IsIdle { get; set; } | 129 | public bool IsIdle { get; set; } |
106 | public bool IsShuttingDown { get; set; } | 130 | public bool IsShuttingDown { get; set; } |
107 | public int MaxThreads { get; set; } | 131 | public int MaxThreads { get; set; } |
108 | public int MinThreads { get; set; } | 132 | public int MinThreads { get; set; } |
109 | public int InUseThreads { get; set; } | 133 | public int InUseThreads { get; set; } |
@@ -131,10 +155,16 @@ namespace OpenSim.Framework | |||
131 | 155 | ||
132 | public static readonly int MAX_THREADPOOL_LEVEL = 3; | 156 | public static readonly int MAX_THREADPOOL_LEVEL = 3; |
133 | 157 | ||
158 | public static double TimeStampClockPeriodMS; | ||
159 | public static double TimeStampClockPeriod; | ||
160 | |||
134 | static Util() | 161 | static Util() |
135 | { | 162 | { |
136 | LogThreadPool = 0; | 163 | LogThreadPool = 0; |
137 | LogOverloads = true; | 164 | LogOverloads = true; |
165 | TimeStampClockPeriod = 1.0D/ (double)Stopwatch.Frequency; | ||
166 | TimeStampClockPeriodMS = 1e3 * TimeStampClockPeriod; | ||
167 | m_log.InfoFormat("[UTIL] TimeStamp clock with period of {0}ms", Math.Round(TimeStampClockPeriodMS,6,MidpointRounding.AwayFromZero)); | ||
138 | } | 168 | } |
139 | 169 | ||
140 | private static uint nextXferID = 5000; | 170 | private static uint nextXferID = 5000; |
@@ -217,7 +247,7 @@ namespace OpenSim.Framework | |||
217 | public static Encoding UTF8NoBomEncoding = new UTF8Encoding(false); | 247 | public static Encoding UTF8NoBomEncoding = new UTF8Encoding(false); |
218 | 248 | ||
219 | /// <value> | 249 | /// <value> |
220 | /// Well known UUID for the blank texture used in the Linden SL viewer version 1.20 (and hopefully onwards) | 250 | /// Well known UUID for the blank texture used in the Linden SL viewer version 1.20 (and hopefully onwards) |
221 | /// </value> | 251 | /// </value> |
222 | public static UUID BLANK_TEXTURE_UUID = new UUID("5748decc-f629-461c-9a36-a35a221fe21f"); | 252 | public static UUID BLANK_TEXTURE_UUID = new UUID("5748decc-f629-461c-9a36-a35a221fe21f"); |
223 | 253 | ||
@@ -267,14 +297,12 @@ namespace OpenSim.Framework | |||
267 | /// </summary> | 297 | /// </summary> |
268 | /// <param name="a">A 3d vector</param> | 298 | /// <param name="a">A 3d vector</param> |
269 | /// <returns>A new vector which is normalized form of the vector</returns> | 299 | /// <returns>A new vector which is normalized form of the vector</returns> |
270 | /// <remarks>The vector paramater cannot be <0,0,0></remarks> | 300 | |
271 | public static Vector3 GetNormalizedVector(Vector3 a) | 301 | public static Vector3 GetNormalizedVector(Vector3 a) |
272 | { | 302 | { |
273 | if (IsZeroVector(a)) | 303 | Vector3 v = new Vector3(a.X, a.Y, a.Z); |
274 | throw new ArgumentException("Vector paramater cannot be a zero vector."); | 304 | v.Normalize(); |
275 | 305 | return v; | |
276 | float Mag = (float) GetMagnitude(a); | ||
277 | return new Vector3(a.X / Mag, a.Y / Mag, a.Z / Mag); | ||
278 | } | 306 | } |
279 | 307 | ||
280 | /// <summary> | 308 | /// <summary> |
@@ -357,47 +385,185 @@ namespace OpenSim.Framework | |||
357 | return Utils.UIntsToLong(X, Y); | 385 | return Utils.UIntsToLong(X, Y); |
358 | } | 386 | } |
359 | 387 | ||
360 | // Regions are identified with a 'handle' made up of its region coordinates packed into a ulong. | 388 | // Regions are identified with a 'handle' made up of its world coordinates packed into a ulong. |
361 | // Several places rely on the ability to extract a region's location from its handle. | 389 | // Region handles are based on the coordinate of the region corner with lower X and Y |
362 | // Note the location is in 'world coordinates' (see below). | 390 | // var regions need more work than this to get that right corner from a generic world position |
363 | // Region handles are based on the lowest coordinate of the region so trim the passed x,y to be the regions 0,0. | 391 | // this corner must be on a grid point |
364 | public static ulong RegionWorldLocToHandle(uint X, uint Y) | 392 | public static ulong RegionWorldLocToHandle(uint X, uint Y) |
365 | { | 393 | { |
366 | return Utils.UIntsToLong(X, Y); | 394 | ulong handle = X & 0xffffff00; // make sure it matchs grid coord points. |
395 | handle <<= 32; // to higher half | ||
396 | handle |= (Y & 0xffffff00); | ||
397 | return handle; | ||
367 | } | 398 | } |
368 | 399 | ||
369 | public static ulong RegionLocToHandle(uint X, uint Y) | 400 | public static ulong RegionGridLocToHandle(uint X, uint Y) |
370 | { | 401 | { |
371 | return Utils.UIntsToLong(Util.RegionToWorldLoc(X), Util.RegionToWorldLoc(Y)); | 402 | ulong handle = X; |
403 | handle <<= 40; // shift to higher half and mult by 256) | ||
404 | handle |= (Y << 8); // mult by 256) | ||
405 | return handle; | ||
372 | } | 406 | } |
373 | 407 | ||
374 | public static void RegionHandleToWorldLoc(ulong handle, out uint X, out uint Y) | 408 | public static void RegionHandleToWorldLoc(ulong handle, out uint X, out uint Y) |
375 | { | 409 | { |
376 | X = (uint)(handle >> 32); | 410 | X = (uint)(handle >> 32); |
377 | Y = (uint)(handle & (ulong)uint.MaxValue); | 411 | Y = (uint)(handle & 0xfffffffful); |
378 | } | 412 | } |
379 | 413 | ||
380 | public static void RegionHandleToRegionLoc(ulong handle, out uint X, out uint Y) | 414 | public static void RegionHandleToRegionLoc(ulong handle, out uint X, out uint Y) |
381 | { | 415 | { |
382 | uint worldX, worldY; | 416 | X = (uint)(handle >> 40) & 0x00ffffffu; // bring from higher half, divide by 256 and clean |
383 | RegionHandleToWorldLoc(handle, out worldX, out worldY); | 417 | Y = (uint)(handle >> 8) & 0x00ffffffu; // divide by 256 and clean |
384 | X = WorldToRegionLoc(worldX); | 418 | // if you trust the uint cast then the clean can be removed. |
385 | Y = WorldToRegionLoc(worldY); | ||
386 | } | 419 | } |
387 | 420 | ||
388 | // A region location can be 'world coordinates' (meters from zero) or 'region coordinates' | 421 | // A region location can be 'world coordinates' (meters) or 'region grid coordinates' |
389 | // (number of regions from zero). This measurement of regions relies on the legacy 256 region size. | 422 | // grid coordinates have a fixed step of 256m as defined by viewers |
390 | // These routines exist to make what is being converted explicit so the next person knows what was meant. | ||
391 | // Convert a region's 'world coordinate' to its 'region coordinate'. | ||
392 | public static uint WorldToRegionLoc(uint worldCoord) | 423 | public static uint WorldToRegionLoc(uint worldCoord) |
393 | { | 424 | { |
394 | return worldCoord / Constants.RegionSize; | 425 | return worldCoord >> 8; |
395 | } | 426 | } |
396 | 427 | ||
397 | // Convert a region's 'region coordinate' to its 'world coordinate'. | 428 | // Convert a region's 'region grid coordinate' to its 'world coordinate'. |
398 | public static uint RegionToWorldLoc(uint regionCoord) | 429 | public static uint RegionToWorldLoc(uint regionCoord) |
399 | { | 430 | { |
400 | return regionCoord * Constants.RegionSize; | 431 | return regionCoord << 8; |
432 | } | ||
433 | |||
434 | |||
435 | public static bool checkServiceURI(string uristr, out string serviceURI) | ||
436 | { | ||
437 | serviceURI = string.Empty; | ||
438 | try | ||
439 | { | ||
440 | Uri uri = new Uri(uristr); | ||
441 | serviceURI = uri.AbsoluteUri; | ||
442 | if(uri.Port == 80) | ||
443 | serviceURI = serviceURI.Trim(new char[] { '/', ' ' }) +":80/"; | ||
444 | else if(uri.Port == 443) | ||
445 | serviceURI = serviceURI.Trim(new char[] { '/', ' ' }) +":443/"; | ||
446 | return true; | ||
447 | } | ||
448 | catch | ||
449 | { | ||
450 | serviceURI = string.Empty; | ||
451 | } | ||
452 | return false; | ||
453 | } | ||
454 | |||
455 | public static bool buildHGRegionURI(string inputName, out string serverURI, out string regionName) | ||
456 | { | ||
457 | serverURI = string.Empty; | ||
458 | regionName = string.Empty; | ||
459 | |||
460 | inputName = inputName.Trim(); | ||
461 | |||
462 | if (!inputName.StartsWith("http") && !inputName.StartsWith("https")) | ||
463 | { | ||
464 | // Formats: grid.example.com:8002:region name | ||
465 | // grid.example.com:region name | ||
466 | // grid.example.com:8002 | ||
467 | // grid.example.com | ||
468 | |||
469 | string host; | ||
470 | uint port = 80; | ||
471 | |||
472 | string[] parts = inputName.Split(new char[] { ':' }); | ||
473 | int indx; | ||
474 | if(parts.Length == 0) | ||
475 | return false; | ||
476 | if (parts.Length == 1) | ||
477 | { | ||
478 | indx = inputName.IndexOf('/'); | ||
479 | if (indx < 0) | ||
480 | serverURI = "http://"+ inputName + "/"; | ||
481 | else | ||
482 | { | ||
483 | serverURI = "http://"+ inputName.Substring(0,indx + 1); | ||
484 | if(indx + 2 < inputName.Length) | ||
485 | regionName = inputName.Substring(indx + 1); | ||
486 | } | ||
487 | } | ||
488 | else | ||
489 | { | ||
490 | host = parts[0]; | ||
491 | |||
492 | if (parts.Length >= 2) | ||
493 | { | ||
494 | indx = parts[1].IndexOf('/'); | ||
495 | if(indx < 0) | ||
496 | { | ||
497 | // If it's a number then assume it's a port. Otherwise, it's a region name. | ||
498 | if (!UInt32.TryParse(parts[1], out port)) | ||
499 | { | ||
500 | port = 80; | ||
501 | regionName = parts[1]; | ||
502 | } | ||
503 | } | ||
504 | else | ||
505 | { | ||
506 | string portstr = parts[1].Substring(0, indx); | ||
507 | if(indx + 2 < parts[1].Length) | ||
508 | regionName = parts[1].Substring(indx + 1); | ||
509 | if (!UInt32.TryParse(portstr, out port)) | ||
510 | port = 80; | ||
511 | } | ||
512 | } | ||
513 | // always take the last one | ||
514 | if (parts.Length >= 3) | ||
515 | { | ||
516 | regionName = parts[2]; | ||
517 | } | ||
518 | |||
519 | serverURI = "http://"+ host +":"+ port.ToString() + "/"; | ||
520 | } | ||
521 | } | ||
522 | else | ||
523 | { | ||
524 | // Formats: http://grid.example.com region name | ||
525 | // http://grid.example.com "region name" | ||
526 | // http://grid.example.com | ||
527 | |||
528 | string[] parts = inputName.Split(new char[] { ' ' }); | ||
529 | |||
530 | if (parts.Length == 0) | ||
531 | return false; | ||
532 | |||
533 | serverURI = parts[0]; | ||
534 | |||
535 | int indx = serverURI.LastIndexOf('/'); | ||
536 | if(indx > 10) | ||
537 | { | ||
538 | if(indx + 2 < inputName.Length) | ||
539 | regionName = inputName.Substring(indx + 1); | ||
540 | serverURI = inputName.Substring(0, indx + 1); | ||
541 | } | ||
542 | else if (parts.Length >= 2) | ||
543 | { | ||
544 | regionName = inputName.Substring(serverURI.Length); | ||
545 | } | ||
546 | } | ||
547 | |||
548 | // use better code for sanity check | ||
549 | Uri uri; | ||
550 | try | ||
551 | { | ||
552 | uri = new Uri(serverURI); | ||
553 | } | ||
554 | catch | ||
555 | { | ||
556 | return false; | ||
557 | } | ||
558 | |||
559 | if(!string.IsNullOrEmpty(regionName)) | ||
560 | regionName = regionName.Trim(new char[] { '"', ' ' }); | ||
561 | serverURI = uri.AbsoluteUri; | ||
562 | if(uri.Port == 80) | ||
563 | serverURI = serverURI.Trim(new char[] { '/', ' ' }) +":80/"; | ||
564 | else if(uri.Port == 443) | ||
565 | serverURI = serverURI.Trim(new char[] { '/', ' ' }) +":443/"; | ||
566 | return true; | ||
401 | } | 567 | } |
402 | 568 | ||
403 | public static T Clamp<T>(T x, T min, T max) | 569 | public static T Clamp<T>(T x, T min, T max) |
@@ -505,6 +671,7 @@ namespace OpenSim.Framework | |||
505 | public static string GetFormattedXml(string rawXml) | 671 | public static string GetFormattedXml(string rawXml) |
506 | { | 672 | { |
507 | XmlDocument xd = new XmlDocument(); | 673 | XmlDocument xd = new XmlDocument(); |
674 | xd.XmlResolver=null; | ||
508 | xd.LoadXml(rawXml); | 675 | xd.LoadXml(rawXml); |
509 | 676 | ||
510 | StringBuilder sb = new StringBuilder(); | 677 | StringBuilder sb = new StringBuilder(); |
@@ -641,19 +808,25 @@ namespace OpenSim.Framework | |||
641 | /// </summary> | 808 | /// </summary> |
642 | /// <param name="data"></param> | 809 | /// <param name="data"></param> |
643 | /// <returns></returns> | 810 | /// <returns></returns> |
811 | |||
644 | public static string Md5Hash(string data) | 812 | public static string Md5Hash(string data) |
645 | { | 813 | { |
646 | byte[] dataMd5 = ComputeMD5Hash(data); | 814 | return Md5Hash(data, Encoding.Default); |
815 | } | ||
816 | |||
817 | public static string Md5Hash(string data, Encoding encoding) | ||
818 | { | ||
819 | byte[] dataMd5 = ComputeMD5Hash(data, encoding); | ||
647 | StringBuilder sb = new StringBuilder(); | 820 | StringBuilder sb = new StringBuilder(); |
648 | for (int i = 0; i < dataMd5.Length; i++) | 821 | for (int i = 0; i < dataMd5.Length; i++) |
649 | sb.AppendFormat("{0:x2}", dataMd5[i]); | 822 | sb.AppendFormat("{0:x2}", dataMd5[i]); |
650 | return sb.ToString(); | 823 | return sb.ToString(); |
651 | } | 824 | } |
652 | 825 | ||
653 | private static byte[] ComputeMD5Hash(string data) | 826 | private static byte[] ComputeMD5Hash(string data, Encoding encoding) |
654 | { | 827 | { |
655 | MD5 md5 = MD5.Create(); | 828 | MD5 md5 = MD5.Create(); |
656 | return md5.ComputeHash(Encoding.Default.GetBytes(data)); | 829 | return md5.ComputeHash(encoding.GetBytes(data)); |
657 | } | 830 | } |
658 | 831 | ||
659 | /// <summary> | 832 | /// <summary> |
@@ -661,6 +834,12 @@ namespace OpenSim.Framework | |||
661 | /// </summary> | 834 | /// </summary> |
662 | /// <param name="data"></param> | 835 | /// <param name="data"></param> |
663 | /// <returns></returns> | 836 | /// <returns></returns> |
837 | |||
838 | public static string SHA1Hash(string data, Encoding enc) | ||
839 | { | ||
840 | return SHA1Hash(enc.GetBytes(data)); | ||
841 | } | ||
842 | |||
664 | public static string SHA1Hash(string data) | 843 | public static string SHA1Hash(string data) |
665 | { | 844 | { |
666 | return SHA1Hash(Encoding.Default.GetBytes(data)); | 845 | return SHA1Hash(Encoding.Default.GetBytes(data)); |
@@ -679,8 +858,10 @@ namespace OpenSim.Framework | |||
679 | 858 | ||
680 | private static byte[] ComputeSHA1Hash(byte[] src) | 859 | private static byte[] ComputeSHA1Hash(byte[] src) |
681 | { | 860 | { |
682 | SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider(); | 861 | byte[] ret; |
683 | return SHA1.ComputeHash(src); | 862 | using(SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider()) |
863 | ret = SHA1.ComputeHash(src); | ||
864 | return ret; | ||
684 | } | 865 | } |
685 | 866 | ||
686 | public static int fast_distance2d(int x, int y) | 867 | public static int fast_distance2d(int x, int y) |
@@ -713,18 +894,27 @@ namespace OpenSim.Framework | |||
713 | /// <param name="newx">New region x-coord</param> | 894 | /// <param name="newx">New region x-coord</param> |
714 | /// <param name="oldy">Old region y-coord</param> | 895 | /// <param name="oldy">Old region y-coord</param> |
715 | /// <param name="newy">New region y-coord</param> | 896 | /// <param name="newy">New region y-coord</param> |
716 | /// <returns></returns> | 897 | /// <returns></returns> |
717 | public static bool IsOutsideView(float drawdist, uint oldx, uint newx, uint oldy, uint newy) | 898 | public static bool IsOutsideView(float drawdist, uint oldx, uint newx, uint oldy, uint newy, |
718 | { | 899 | int oldsizex, int oldsizey, int newsizex, int newsizey) |
719 | int dd = (int)((drawdist + Constants.RegionSize - 1) / Constants.RegionSize); | 900 | { |
720 | 901 | // we still need to make sure we see new region 1stNeighbors | |
721 | int startX = (int)oldx - dd; | 902 | drawdist--; |
722 | int startY = (int)oldy - dd; | 903 | oldx *= Constants.RegionSize; |
904 | newx *= Constants.RegionSize; | ||
905 | if (oldx + oldsizex + drawdist < newx) | ||
906 | return true; | ||
907 | if (newx + newsizex + drawdist < oldx) | ||
908 | return true; | ||
723 | 909 | ||
724 | int endX = (int)oldx + dd; | 910 | oldy *= Constants.RegionSize; |
725 | int endY = (int)oldy + dd; | 911 | newy *= Constants.RegionSize; |
912 | if (oldy + oldsizey + drawdist < newy) | ||
913 | return true; | ||
914 | if (newy + newsizey + drawdist < oldy) | ||
915 | return true; | ||
726 | 916 | ||
727 | return (newx < startX || endX < newx || newy < startY || endY < newy); | 917 | return false; |
728 | } | 918 | } |
729 | 919 | ||
730 | public static string FieldToString(byte[] bytes) | 920 | public static string FieldToString(byte[] bytes) |
@@ -804,6 +994,18 @@ namespace OpenSim.Framework | |||
804 | return output.ToString(); | 994 | return output.ToString(); |
805 | } | 995 | } |
806 | 996 | ||
997 | private static ExpiringCache<string,IPAddress> dnscache = new ExpiringCache<string, IPAddress>(); | ||
998 | |||
999 | /// <summary> | ||
1000 | /// Converts a URL to a IPAddress | ||
1001 | /// </summary> | ||
1002 | /// <param name="url">URL Standard Format</param> | ||
1003 | /// <returns>A resolved IP Address</returns> | ||
1004 | public static IPAddress GetHostFromURL(string url) | ||
1005 | { | ||
1006 | return GetHostFromDNS(url.Split(new char[] {'/', ':'})[3]); | ||
1007 | } | ||
1008 | |||
807 | /// <summary> | 1009 | /// <summary> |
808 | /// Returns a IP address from a specified DNS, favouring IPv4 addresses. | 1010 | /// Returns a IP address from a specified DNS, favouring IPv4 addresses. |
809 | /// </summary> | 1011 | /// </summary> |
@@ -811,38 +1013,128 @@ namespace OpenSim.Framework | |||
811 | /// <returns>An IP address, or null</returns> | 1013 | /// <returns>An IP address, or null</returns> |
812 | public static IPAddress GetHostFromDNS(string dnsAddress) | 1014 | public static IPAddress GetHostFromDNS(string dnsAddress) |
813 | { | 1015 | { |
814 | // Is it already a valid IP? No need to look it up. | 1016 | if(String.IsNullOrWhiteSpace(dnsAddress)) |
815 | IPAddress ipa; | 1017 | return null; |
816 | if (IPAddress.TryParse(dnsAddress, out ipa)) | ||
817 | return ipa; | ||
818 | 1018 | ||
819 | IPAddress[] hosts = null; | 1019 | IPAddress ia = null; |
1020 | if(dnscache.TryGetValue(dnsAddress, out ia) && ia != null) | ||
1021 | { | ||
1022 | dnscache.AddOrUpdate(dnsAddress, ia, 300); | ||
1023 | return ia; | ||
1024 | } | ||
820 | 1025 | ||
821 | // Not an IP, lookup required | 1026 | ia = null; |
1027 | // If it is already an IP, don't let GetHostEntry see it | ||
1028 | if (IPAddress.TryParse(dnsAddress, out ia) && ia != null) | ||
1029 | { | ||
1030 | if (ia.Equals(IPAddress.Any) || ia.Equals(IPAddress.IPv6Any)) | ||
1031 | return null; | ||
1032 | dnscache.AddOrUpdate(dnsAddress, ia, 300); | ||
1033 | return ia; | ||
1034 | } | ||
1035 | |||
1036 | IPHostEntry IPH; | ||
822 | try | 1037 | try |
823 | { | 1038 | { |
824 | hosts = Dns.GetHostEntry(dnsAddress).AddressList; | 1039 | IPH = Dns.GetHostEntry(dnsAddress); |
825 | } | 1040 | } |
826 | catch (Exception e) | 1041 | catch // (SocketException e) |
1042 | { | ||
1043 | return null; | ||
1044 | } | ||
1045 | |||
1046 | if(IPH == null || IPH.AddressList.Length == 0) | ||
1047 | return null; | ||
1048 | |||
1049 | ia = null; | ||
1050 | foreach (IPAddress Adr in IPH.AddressList) | ||
827 | { | 1051 | { |
828 | m_log.WarnFormat("[UTIL]: An error occurred while resolving host name {0}, {1}", dnsAddress, e); | 1052 | if (ia == null) |
1053 | ia = Adr; | ||
829 | 1054 | ||
830 | // Still going to throw the exception on for now, since this was what was happening in the first place | 1055 | if (Adr.AddressFamily == AddressFamily.InterNetwork) |
831 | throw e; | 1056 | { |
1057 | ia = Adr; | ||
1058 | break; | ||
1059 | } | ||
832 | } | 1060 | } |
1061 | if(ia != null) | ||
1062 | dnscache.AddOrUpdate(dnsAddress, ia, 300); | ||
1063 | return ia; | ||
1064 | } | ||
833 | 1065 | ||
834 | foreach (IPAddress host in hosts) | 1066 | public static IPEndPoint getEndPoint(IPAddress ia, int port) |
1067 | { | ||
1068 | if(ia == null) | ||
1069 | return null; | ||
1070 | |||
1071 | IPEndPoint newEP = null; | ||
1072 | try | ||
1073 | { | ||
1074 | newEP = new IPEndPoint(ia, port); | ||
1075 | } | ||
1076 | catch | ||
1077 | { | ||
1078 | newEP = null; | ||
1079 | } | ||
1080 | return newEP; | ||
1081 | } | ||
1082 | |||
1083 | public static IPEndPoint getEndPoint(string hostname, int port) | ||
1084 | { | ||
1085 | if(String.IsNullOrWhiteSpace(hostname)) | ||
1086 | return null; | ||
1087 | |||
1088 | IPAddress ia = null; | ||
1089 | if(dnscache.TryGetValue(hostname, out ia) && ia != null) | ||
1090 | { | ||
1091 | dnscache.AddOrUpdate(hostname, ia, 300); | ||
1092 | return getEndPoint(ia, port); | ||
1093 | } | ||
1094 | |||
1095 | ia = null; | ||
1096 | |||
1097 | // If it is already an IP, don't let GetHostEntry see it | ||
1098 | if (IPAddress.TryParse(hostname, out ia) && ia != null) | ||
1099 | { | ||
1100 | if (ia.Equals(IPAddress.Any) || ia.Equals(IPAddress.IPv6Any)) | ||
1101 | return null; | ||
1102 | |||
1103 | dnscache.AddOrUpdate(hostname, ia, 300); | ||
1104 | return getEndPoint(ia, port); | ||
1105 | } | ||
1106 | |||
1107 | |||
1108 | IPHostEntry IPH; | ||
1109 | try | ||
1110 | { | ||
1111 | IPH = Dns.GetHostEntry(hostname); | ||
1112 | } | ||
1113 | catch // (SocketException e) | ||
1114 | { | ||
1115 | return null; | ||
1116 | } | ||
1117 | |||
1118 | if(IPH == null || IPH.AddressList.Length == 0) | ||
1119 | return null; | ||
1120 | |||
1121 | ia = null; | ||
1122 | foreach (IPAddress Adr in IPH.AddressList) | ||
835 | { | 1123 | { |
836 | if (host.AddressFamily == AddressFamily.InterNetwork) | 1124 | if (ia == null) |
1125 | ia = Adr; | ||
1126 | |||
1127 | if (Adr.AddressFamily == AddressFamily.InterNetwork) | ||
837 | { | 1128 | { |
838 | return host; | 1129 | ia = Adr; |
1130 | break; | ||
839 | } | 1131 | } |
840 | } | 1132 | } |
841 | 1133 | ||
842 | if (hosts.Length > 0) | 1134 | if(ia != null) |
843 | return hosts[0]; | 1135 | dnscache.AddOrUpdate(hostname, ia, 300); |
844 | 1136 | ||
845 | return null; | 1137 | return getEndPoint(ia,port); |
846 | } | 1138 | } |
847 | 1139 | ||
848 | public static Uri GetURI(string protocol, string hostname, int port, string path) | 1140 | public static Uri GetURI(string protocol, string hostname, int port, string path) |
@@ -987,7 +1279,7 @@ namespace OpenSim.Framework | |||
987 | 1279 | ||
988 | public static string configDir() | 1280 | public static string configDir() |
989 | { | 1281 | { |
990 | return "../config"; | 1282 | return "."; |
991 | } | 1283 | } |
992 | 1284 | ||
993 | public static string dataDir() | 1285 | public static string dataDir() |
@@ -999,13 +1291,26 @@ namespace OpenSim.Framework | |||
999 | { | 1291 | { |
1000 | foreach (IAppender appender in LogManager.GetRepository().GetAppenders()) | 1292 | foreach (IAppender appender in LogManager.GetRepository().GetAppenders()) |
1001 | { | 1293 | { |
1002 | if (appender is FileAppender) | 1294 | if (appender is FileAppender && appender.Name == "LogFileAppender") |
1003 | { | 1295 | { |
1004 | return ((FileAppender)appender).File; | 1296 | return ((FileAppender)appender).File; |
1005 | } | 1297 | } |
1006 | } | 1298 | } |
1007 | 1299 | ||
1008 | return "../logs/OpenSim.log"; | 1300 | return "./OpenSim.log"; |
1301 | } | ||
1302 | |||
1303 | public static string statsLogFile() | ||
1304 | { | ||
1305 | foreach (IAppender appender in LogManager.GetRepository().GetAppenders()) | ||
1306 | { | ||
1307 | if (appender is FileAppender && appender.Name == "StatsLogFileAppender") | ||
1308 | { | ||
1309 | return ((FileAppender)appender).File; | ||
1310 | } | ||
1311 | } | ||
1312 | |||
1313 | return "./OpenSimStats.log"; | ||
1009 | } | 1314 | } |
1010 | 1315 | ||
1011 | public static string logDir() | 1316 | public static string logDir() |
@@ -1065,9 +1370,28 @@ namespace OpenSim.Framework | |||
1065 | } | 1370 | } |
1066 | } | 1371 | } |
1067 | 1372 | ||
1373 | public static string GetConfigVarWithDefaultSection(IConfigSource config, string varname, string section) | ||
1374 | { | ||
1375 | // First, check the Startup section, the default section | ||
1376 | IConfig cnf = config.Configs["Startup"]; | ||
1377 | if (cnf == null) | ||
1378 | return string.Empty; | ||
1379 | string val = cnf.GetString(varname, string.Empty); | ||
1380 | |||
1381 | // Then check for an overwrite of the default in the given section | ||
1382 | if (!string.IsNullOrEmpty(section)) | ||
1383 | { | ||
1384 | cnf = config.Configs[section]; | ||
1385 | if (cnf != null) | ||
1386 | val = cnf.GetString(varname, val); | ||
1387 | } | ||
1388 | |||
1389 | return val; | ||
1390 | } | ||
1391 | |||
1068 | /// <summary> | 1392 | /// <summary> |
1069 | /// Gets the value of a configuration variable by looking into | 1393 | /// Gets the value of a configuration variable by looking into |
1070 | /// multiple sections in order. The latter sections overwrite | 1394 | /// multiple sections in order. The latter sections overwrite |
1071 | /// any values previously found. | 1395 | /// any values previously found. |
1072 | /// </summary> | 1396 | /// </summary> |
1073 | /// <typeparam name="T">Type of the variable</typeparam> | 1397 | /// <typeparam name="T">Type of the variable</typeparam> |
@@ -1082,7 +1406,7 @@ namespace OpenSim.Framework | |||
1082 | 1406 | ||
1083 | /// <summary> | 1407 | /// <summary> |
1084 | /// Gets the value of a configuration variable by looking into | 1408 | /// Gets the value of a configuration variable by looking into |
1085 | /// multiple sections in order. The latter sections overwrite | 1409 | /// multiple sections in order. The latter sections overwrite |
1086 | /// any values previously found. | 1410 | /// any values previously found. |
1087 | /// </summary> | 1411 | /// </summary> |
1088 | /// <remarks> | 1412 | /// <remarks> |
@@ -1138,7 +1462,7 @@ namespace OpenSim.Framework | |||
1138 | ConfigSource.ExpandKeyValues(); | 1462 | ConfigSource.ExpandKeyValues(); |
1139 | } | 1463 | } |
1140 | } | 1464 | } |
1141 | 1465 | ||
1142 | public static T ReadSettingsFromIniFile<T>(IConfig config, T settingsClass) | 1466 | public static T ReadSettingsFromIniFile<T>(IConfig config, T settingsClass) |
1143 | { | 1467 | { |
1144 | Type settingsType = settingsClass.GetType(); | 1468 | Type settingsType = settingsClass.GetType(); |
@@ -1249,7 +1573,7 @@ namespace OpenSim.Framework | |||
1249 | 1573 | ||
1250 | if (File.Exists(configFile)) | 1574 | if (File.Exists(configFile)) |
1251 | { | 1575 | { |
1252 | // Merge | 1576 | // Merge |
1253 | config.Merge(new IniConfigSource(configFile)); | 1577 | config.Merge(new IniConfigSource(configFile)); |
1254 | config.ExpandKeyValues(); | 1578 | config.ExpandKeyValues(); |
1255 | configFilePath = configFile; | 1579 | configFilePath = configFile; |
@@ -1388,6 +1712,46 @@ namespace OpenSim.Framework | |||
1388 | return ret; | 1712 | return ret; |
1389 | } | 1713 | } |
1390 | 1714 | ||
1715 | public static string Compress(string text) | ||
1716 | { | ||
1717 | byte[] buffer = Util.UTF8.GetBytes(text); | ||
1718 | MemoryStream memory = new MemoryStream(); | ||
1719 | using (GZipStream compressor = new GZipStream(memory, CompressionMode.Compress, true)) | ||
1720 | { | ||
1721 | compressor.Write(buffer, 0, buffer.Length); | ||
1722 | } | ||
1723 | |||
1724 | memory.Position = 0; | ||
1725 | |||
1726 | byte[] compressed = new byte[memory.Length]; | ||
1727 | memory.Read(compressed, 0, compressed.Length); | ||
1728 | |||
1729 | byte[] compressedBuffer = new byte[compressed.Length + 4]; | ||
1730 | Buffer.BlockCopy(compressed, 0, compressedBuffer, 4, compressed.Length); | ||
1731 | Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, compressedBuffer, 0, 4); | ||
1732 | return Convert.ToBase64String(compressedBuffer); | ||
1733 | } | ||
1734 | |||
1735 | public static string Decompress(string compressedText) | ||
1736 | { | ||
1737 | byte[] compressedBuffer = Convert.FromBase64String(compressedText); | ||
1738 | using (MemoryStream memory = new MemoryStream()) | ||
1739 | { | ||
1740 | int msgLength = BitConverter.ToInt32(compressedBuffer, 0); | ||
1741 | memory.Write(compressedBuffer, 4, compressedBuffer.Length - 4); | ||
1742 | |||
1743 | byte[] buffer = new byte[msgLength]; | ||
1744 | |||
1745 | memory.Position = 0; | ||
1746 | using (GZipStream decompressor = new GZipStream(memory, CompressionMode.Decompress)) | ||
1747 | { | ||
1748 | decompressor.Read(buffer, 0, buffer.Length); | ||
1749 | } | ||
1750 | |||
1751 | return Util.UTF8.GetString(buffer); | ||
1752 | } | ||
1753 | } | ||
1754 | |||
1391 | /// <summary> | 1755 | /// <summary> |
1392 | /// Copy data from one stream to another, leaving the read position of both streams at the beginning. | 1756 | /// Copy data from one stream to another, leaving the read position of both streams at the beginning. |
1393 | /// </summary> | 1757 | /// </summary> |
@@ -1405,7 +1769,7 @@ namespace OpenSim.Framework | |||
1405 | const int readSize = 256; | 1769 | const int readSize = 256; |
1406 | byte[] buffer = new byte[readSize]; | 1770 | byte[] buffer = new byte[readSize]; |
1407 | MemoryStream ms = new MemoryStream(); | 1771 | MemoryStream ms = new MemoryStream(); |
1408 | 1772 | ||
1409 | int count = inputStream.Read(buffer, 0, readSize); | 1773 | int count = inputStream.Read(buffer, 0, readSize); |
1410 | 1774 | ||
1411 | while (count > 0) | 1775 | while (count > 0) |
@@ -1485,12 +1849,16 @@ namespace OpenSim.Framework | |||
1485 | return new UUID(bytes, 0); | 1849 | return new UUID(bytes, 0); |
1486 | } | 1850 | } |
1487 | 1851 | ||
1488 | public static void ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y) | 1852 | public static bool ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y) |
1489 | { | 1853 | { |
1490 | byte[] bytes = parcelID.GetBytes(); | 1854 | byte[] bytes = parcelID.GetBytes(); |
1491 | regionHandle = Utils.BytesToUInt64(bytes); | 1855 | regionHandle = Utils.BytesToUInt64(bytes); |
1492 | x = Utils.BytesToUInt(bytes, 8) & 0xffff; | 1856 | x = Utils.BytesToUInt(bytes, 8) & 0xffff; |
1493 | y = Utils.BytesToUInt(bytes, 12) & 0xffff; | 1857 | y = Utils.BytesToUInt(bytes, 12) & 0xffff; |
1858 | // validation may fail, just reducing the odds of using a real UUID as encoded parcel | ||
1859 | return ( bytes[0] == 0 && bytes[4] == 0 && // handler x,y multiples of 256 | ||
1860 | bytes[9] < 64 && bytes[13] < 64 && // positions < 16km | ||
1861 | bytes[14] == 0 && bytes[15] == 0); | ||
1494 | } | 1862 | } |
1495 | 1863 | ||
1496 | public static void ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y, out uint z) | 1864 | public static void ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y, out uint z) |
@@ -1513,7 +1881,7 @@ namespace OpenSim.Framework | |||
1513 | x += rx; | 1881 | x += rx; |
1514 | y += ry; | 1882 | y += ry; |
1515 | } | 1883 | } |
1516 | 1884 | ||
1517 | /// <summary> | 1885 | /// <summary> |
1518 | /// Get operating system information if available. Returns only the first 45 characters of information | 1886 | /// Get operating system information if available. Returns only the first 45 characters of information |
1519 | /// </summary> | 1887 | /// </summary> |
@@ -1524,20 +1892,20 @@ namespace OpenSim.Framework | |||
1524 | { | 1892 | { |
1525 | string os = String.Empty; | 1893 | string os = String.Empty; |
1526 | 1894 | ||
1527 | if (Environment.OSVersion.Platform != PlatformID.Unix) | 1895 | // if (Environment.OSVersion.Platform != PlatformID.Unix) |
1528 | { | 1896 | // { |
1529 | os = Environment.OSVersion.ToString(); | 1897 | // os = Environment.OSVersion.ToString(); |
1530 | } | 1898 | // } |
1531 | else | 1899 | // else |
1532 | { | 1900 | // { |
1533 | os = ReadEtcIssue(); | 1901 | // os = ReadEtcIssue(); |
1534 | } | 1902 | // } |
1535 | 1903 | // | |
1536 | if (os.Length > 45) | 1904 | // if (os.Length > 45) |
1537 | { | 1905 | // { |
1538 | os = os.Substring(0, 45); | 1906 | // os = os.Substring(0, 45); |
1539 | } | 1907 | // } |
1540 | 1908 | ||
1541 | return os; | 1909 | return os; |
1542 | } | 1910 | } |
1543 | 1911 | ||
@@ -1579,6 +1947,8 @@ namespace OpenSim.Framework | |||
1579 | 1947 | ||
1580 | // hide the password in the connection string | 1948 | // hide the password in the connection string |
1581 | passPosition = connectionString.IndexOf("password", StringComparison.OrdinalIgnoreCase); | 1949 | passPosition = connectionString.IndexOf("password", StringComparison.OrdinalIgnoreCase); |
1950 | if (passPosition == -1) | ||
1951 | return connectionString; | ||
1582 | passPosition = connectionString.IndexOf("=", passPosition); | 1952 | passPosition = connectionString.IndexOf("=", passPosition); |
1583 | if (passPosition < connectionString.Length) | 1953 | if (passPosition < connectionString.Length) |
1584 | passPosition += 1; | 1954 | passPosition += 1; |
@@ -1645,7 +2015,7 @@ namespace OpenSim.Framework | |||
1645 | 2015 | ||
1646 | public static Guid GetHashGuid(string data, string salt) | 2016 | public static Guid GetHashGuid(string data, string salt) |
1647 | { | 2017 | { |
1648 | byte[] hash = ComputeMD5Hash(data + salt); | 2018 | byte[] hash = ComputeMD5Hash(data + salt, Encoding.Default); |
1649 | 2019 | ||
1650 | //string s = BitConverter.ToString(hash); | 2020 | //string s = BitConverter.ToString(hash); |
1651 | 2021 | ||
@@ -1747,7 +2117,7 @@ namespace OpenSim.Framework | |||
1747 | vol = vcomps[0]; | 2117 | vol = vcomps[0]; |
1748 | } | 2118 | } |
1749 | } | 2119 | } |
1750 | 2120 | ||
1751 | string[] comps = path.Split(new char[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries); | 2121 | string[] comps = path.Split(new char[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries); |
1752 | 2122 | ||
1753 | // Glob | 2123 | // Glob |
@@ -1792,6 +2162,32 @@ namespace OpenSim.Framework | |||
1792 | return found.ToArray(); | 2162 | return found.ToArray(); |
1793 | } | 2163 | } |
1794 | 2164 | ||
2165 | public static string ServerURI(string uri) | ||
2166 | { | ||
2167 | if (uri == string.Empty) | ||
2168 | return string.Empty; | ||
2169 | |||
2170 | // Get rid of eventual slashes at the end | ||
2171 | uri = uri.TrimEnd('/'); | ||
2172 | |||
2173 | IPAddress ipaddr1 = null; | ||
2174 | string port1 = ""; | ||
2175 | try | ||
2176 | { | ||
2177 | ipaddr1 = Util.GetHostFromURL(uri); | ||
2178 | } | ||
2179 | catch { } | ||
2180 | |||
2181 | try | ||
2182 | { | ||
2183 | port1 = uri.Split(new char[] { ':' })[2]; | ||
2184 | } | ||
2185 | catch { } | ||
2186 | |||
2187 | // We tried our best to convert the domain names to IP addresses | ||
2188 | return (ipaddr1 != null) ? "http://" + ipaddr1.ToString() + ":" + port1 : uri; | ||
2189 | } | ||
2190 | |||
1795 | /// <summary> | 2191 | /// <summary> |
1796 | /// Convert a string to a byte format suitable for transport in an LLUDP packet. The output is truncated to 256 bytes if necessary. | 2192 | /// Convert a string to a byte format suitable for transport in an LLUDP packet. The output is truncated to 256 bytes if necessary. |
1797 | /// </summary> | 2193 | /// </summary> |
@@ -1823,14 +2219,14 @@ namespace OpenSim.Framework | |||
1823 | 2219 | ||
1824 | if (!str.EndsWith("\0")) | 2220 | if (!str.EndsWith("\0")) |
1825 | str += "\0"; | 2221 | str += "\0"; |
1826 | 2222 | ||
1827 | // Because this is UTF-8 encoding and not ASCII, it's possible we | 2223 | // Because this is UTF-8 encoding and not ASCII, it's possible we |
1828 | // might have gotten an oversized array even after the string trim | 2224 | // might have gotten an oversized array even after the string trim |
1829 | byte[] data = UTF8.GetBytes(str); | 2225 | byte[] data = UTF8.GetBytes(str); |
1830 | 2226 | ||
1831 | if (data.Length > 256) | 2227 | if (data.Length > 255) //play safe |
1832 | { | 2228 | { |
1833 | int cut = 255; | 2229 | int cut = 254; |
1834 | if((data[cut] & 0x80 ) != 0 ) | 2230 | if((data[cut] & 0x80 ) != 0 ) |
1835 | { | 2231 | { |
1836 | while(cut > 0 && (data[cut] & 0xc0) != 0xc0) | 2232 | while(cut > 0 && (data[cut] & 0xc0) != 0xc0) |
@@ -1895,6 +2291,56 @@ namespace OpenSim.Framework | |||
1895 | } | 2291 | } |
1896 | 2292 | ||
1897 | /// <summary> | 2293 | /// <summary> |
2294 | /// Convert a string to a byte format suitable for transport in an LLUDP packet. The output is truncated to MaxLength bytes if necessary. | ||
2295 | /// </summary> | ||
2296 | /// <param name="str"> | ||
2297 | /// If null or empty, then an bytes[0] is returned. | ||
2298 | /// Using "\0" will return a conversion of the null character to a byte. This is not the same as bytes[0] | ||
2299 | /// </param> | ||
2300 | /// <param name="args"> | ||
2301 | /// Arguments to substitute into the string via the {} mechanism. | ||
2302 | /// </param> | ||
2303 | /// <returns></returns> | ||
2304 | public static byte[] StringToBytes(string str, int MaxLength, params object[] args) | ||
2305 | { | ||
2306 | return StringToBytes1024(string.Format(str, args), MaxLength); | ||
2307 | } | ||
2308 | |||
2309 | /// <summary> | ||
2310 | /// Convert a string to a byte format suitable for transport in an LLUDP packet. The output is truncated to MaxLength bytes if necessary. | ||
2311 | /// </summary> | ||
2312 | /// <param name="str"> | ||
2313 | /// If null or empty, then an bytes[0] is returned. | ||
2314 | /// Using "\0" will return a conversion of the null character to a byte. This is not the same as bytes[0] | ||
2315 | /// </param> | ||
2316 | /// <returns></returns> | ||
2317 | public static byte[] StringToBytes(string str, int MaxLength) | ||
2318 | { | ||
2319 | if (String.IsNullOrEmpty(str)) | ||
2320 | return Utils.EmptyBytes; | ||
2321 | |||
2322 | if (!str.EndsWith("\0")) | ||
2323 | str += "\0"; | ||
2324 | |||
2325 | // Because this is UTF-8 encoding and not ASCII, it's possible we | ||
2326 | // might have gotten an oversized array even after the string trim | ||
2327 | byte[] data = UTF8.GetBytes(str); | ||
2328 | |||
2329 | if (data.Length > MaxLength) | ||
2330 | { | ||
2331 | int cut = MaxLength - 1 ; | ||
2332 | if((data[cut] & 0x80 ) != 0 ) | ||
2333 | { | ||
2334 | while(cut > 0 && (data[cut] & 0xc0) != 0xc0) | ||
2335 | cut--; | ||
2336 | } | ||
2337 | Array.Resize<byte>(ref data, cut + 1); | ||
2338 | data[cut] = 0; | ||
2339 | } | ||
2340 | |||
2341 | return data; | ||
2342 | } | ||
2343 | /// <summary> | ||
1898 | /// Pretty format the hashtable contents to a single line. | 2344 | /// Pretty format the hashtable contents to a single line. |
1899 | /// </summary> | 2345 | /// </summary> |
1900 | /// <remarks> | 2346 | /// <remarks> |
@@ -2004,7 +2450,7 @@ namespace OpenSim.Framework | |||
2004 | 2450 | ||
2005 | STPStartInfo startInfo = new STPStartInfo(); | 2451 | STPStartInfo startInfo = new STPStartInfo(); |
2006 | startInfo.ThreadPoolName = "Util"; | 2452 | startInfo.ThreadPoolName = "Util"; |
2007 | startInfo.IdleTimeout = 2000; | 2453 | startInfo.IdleTimeout = 20000; |
2008 | startInfo.MaxWorkerThreads = maxThreads; | 2454 | startInfo.MaxWorkerThreads = maxThreads; |
2009 | startInfo.MinWorkerThreads = minThreads; | 2455 | startInfo.MinWorkerThreads = minThreads; |
2010 | 2456 | ||
@@ -2032,7 +2478,7 @@ namespace OpenSim.Framework | |||
2032 | throw new NotImplementedException(); | 2478 | throw new NotImplementedException(); |
2033 | } | 2479 | } |
2034 | } | 2480 | } |
2035 | 2481 | ||
2036 | /// <summary> | 2482 | /// <summary> |
2037 | /// Additional information about threads in the main thread pool. Used to time how long the | 2483 | /// Additional information about threads in the main thread pool. Used to time how long the |
2038 | /// thread has been running, and abort it if it has timed-out. | 2484 | /// thread has been running, and abort it if it has timed-out. |
@@ -2043,14 +2489,15 @@ namespace OpenSim.Framework | |||
2043 | public string StackTrace { get; set; } | 2489 | public string StackTrace { get; set; } |
2044 | private string context; | 2490 | private string context; |
2045 | public bool LogThread { get; set; } | 2491 | public bool LogThread { get; set; } |
2046 | 2492 | ||
2047 | public IWorkItemResult WorkItem { get; set; } | 2493 | public IWorkItemResult WorkItem { get; set; } |
2048 | public Thread Thread { get; set; } | 2494 | public Thread Thread { get; set; } |
2049 | public bool Running { get; set; } | 2495 | public bool Running { get; set; } |
2050 | public bool Aborted { get; set; } | 2496 | public bool Aborted { get; set; } |
2051 | private int started; | 2497 | private int started; |
2498 | public bool DoTimeout; | ||
2052 | 2499 | ||
2053 | public ThreadInfo(long threadFuncNum, string context) | 2500 | public ThreadInfo(long threadFuncNum, string context, bool dotimeout = true) |
2054 | { | 2501 | { |
2055 | ThreadFuncNum = threadFuncNum; | 2502 | ThreadFuncNum = threadFuncNum; |
2056 | this.context = context; | 2503 | this.context = context; |
@@ -2058,6 +2505,7 @@ namespace OpenSim.Framework | |||
2058 | Thread = null; | 2505 | Thread = null; |
2059 | Running = false; | 2506 | Running = false; |
2060 | Aborted = false; | 2507 | Aborted = false; |
2508 | DoTimeout = dotimeout; | ||
2061 | } | 2509 | } |
2062 | 2510 | ||
2063 | public void Started() | 2511 | public void Started() |
@@ -2128,7 +2576,7 @@ namespace OpenSim.Framework | |||
2128 | foreach (KeyValuePair<long, ThreadInfo> entry in activeThreads) | 2576 | foreach (KeyValuePair<long, ThreadInfo> entry in activeThreads) |
2129 | { | 2577 | { |
2130 | ThreadInfo t = entry.Value; | 2578 | ThreadInfo t = entry.Value; |
2131 | if (t.Running && !t.Aborted && (t.Elapsed() >= THREAD_TIMEOUT)) | 2579 | if (t.DoTimeout && t.Running && !t.Aborted && (t.Elapsed() >= THREAD_TIMEOUT)) |
2132 | { | 2580 | { |
2133 | m_log.WarnFormat("Timeout in threadfunc {0} ({1}) {2}", t.ThreadFuncNum, t.Thread.Name, t.GetStackTrace()); | 2581 | m_log.WarnFormat("Timeout in threadfunc {0} ({1}) {2}", t.ThreadFuncNum, t.Thread.Name, t.GetStackTrace()); |
2134 | t.Abort(); | 2582 | t.Abort(); |
@@ -2138,7 +2586,7 @@ namespace OpenSim.Framework | |||
2138 | 2586 | ||
2139 | // It's possible that the thread won't abort. To make sure the thread pool isn't | 2587 | // It's possible that the thread won't abort. To make sure the thread pool isn't |
2140 | // depleted, increase the pool size. | 2588 | // depleted, increase the pool size. |
2141 | m_ThreadPool.MaxThreads++; | 2589 | // m_ThreadPool.MaxThreads++; |
2142 | } | 2590 | } |
2143 | } | 2591 | } |
2144 | } | 2592 | } |
@@ -2148,7 +2596,7 @@ namespace OpenSim.Framework | |||
2148 | public static Dictionary<string, int> GetFireAndForgetCallsMade() | 2596 | public static Dictionary<string, int> GetFireAndForgetCallsMade() |
2149 | { | 2597 | { |
2150 | return new Dictionary<string, int>(m_fireAndForgetCallsMade); | 2598 | return new Dictionary<string, int>(m_fireAndForgetCallsMade); |
2151 | } | 2599 | } |
2152 | 2600 | ||
2153 | private static Dictionary<string, int> m_fireAndForgetCallsMade = new Dictionary<string, int>(); | 2601 | private static Dictionary<string, int> m_fireAndForgetCallsMade = new Dictionary<string, int>(); |
2154 | 2602 | ||
@@ -2168,11 +2616,11 @@ namespace OpenSim.Framework | |||
2168 | { | 2616 | { |
2169 | FireAndForget(callback, obj, null); | 2617 | FireAndForget(callback, obj, null); |
2170 | } | 2618 | } |
2171 | 2619 | ||
2172 | public static void FireAndForget(System.Threading.WaitCallback callback, object obj, string context) | 2620 | public static void FireAndForget(System.Threading.WaitCallback callback, object obj, string context, bool dotimeout = true) |
2173 | { | 2621 | { |
2174 | Interlocked.Increment(ref numTotalThreadFuncsCalled); | 2622 | Interlocked.Increment(ref numTotalThreadFuncsCalled); |
2175 | 2623 | /* | |
2176 | if (context != null) | 2624 | if (context != null) |
2177 | { | 2625 | { |
2178 | if (!m_fireAndForgetCallsMade.ContainsKey(context)) | 2626 | if (!m_fireAndForgetCallsMade.ContainsKey(context)) |
@@ -2185,25 +2633,25 @@ namespace OpenSim.Framework | |||
2185 | else | 2633 | else |
2186 | m_fireAndForgetCallsInProgress[context]++; | 2634 | m_fireAndForgetCallsInProgress[context]++; |
2187 | } | 2635 | } |
2188 | 2636 | */ | |
2189 | WaitCallback realCallback; | 2637 | WaitCallback realCallback; |
2190 | 2638 | ||
2191 | bool loggingEnabled = LogThreadPool > 0; | 2639 | bool loggingEnabled = LogThreadPool > 0; |
2192 | 2640 | ||
2193 | long threadFuncNum = Interlocked.Increment(ref nextThreadFuncNum); | 2641 | long threadFuncNum = Interlocked.Increment(ref nextThreadFuncNum); |
2194 | ThreadInfo threadInfo = new ThreadInfo(threadFuncNum, context); | 2642 | ThreadInfo threadInfo = new ThreadInfo(threadFuncNum, context, dotimeout); |
2195 | 2643 | ||
2196 | if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest) | 2644 | if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest) |
2197 | { | 2645 | { |
2198 | // If we're running regression tests, then we want any exceptions to rise up to the test code. | 2646 | // If we're running regression tests, then we want any exceptions to rise up to the test code. |
2199 | realCallback = | 2647 | realCallback = |
2200 | o => | 2648 | o => |
2201 | { | 2649 | { |
2202 | Culture.SetCurrentCulture(); | 2650 | Culture.SetCurrentCulture(); |
2203 | callback(o); | 2651 | callback(o); |
2204 | 2652 | ||
2205 | if (context != null) | 2653 | // if (context != null) |
2206 | m_fireAndForgetCallsInProgress[context]--; | 2654 | // m_fireAndForgetCallsInProgress[context]--; |
2207 | }; | 2655 | }; |
2208 | } | 2656 | } |
2209 | else | 2657 | else |
@@ -2229,7 +2677,6 @@ namespace OpenSim.Framework | |||
2229 | } | 2677 | } |
2230 | catch (ThreadAbortException e) | 2678 | catch (ThreadAbortException e) |
2231 | { | 2679 | { |
2232 | m_log.Error(string.Format("Aborted threadfunc {0} ", threadFuncNum), e); | ||
2233 | } | 2680 | } |
2234 | catch (Exception e) | 2681 | catch (Exception e) |
2235 | { | 2682 | { |
@@ -2244,8 +2691,8 @@ namespace OpenSim.Framework | |||
2244 | if ((loggingEnabled || (threadFuncOverloadMode == 1)) && threadInfo.LogThread) | 2691 | if ((loggingEnabled || (threadFuncOverloadMode == 1)) && threadInfo.LogThread) |
2245 | m_log.DebugFormat("Exit threadfunc {0} ({1})", threadFuncNum, FormatDuration(threadInfo.Elapsed())); | 2692 | m_log.DebugFormat("Exit threadfunc {0} ({1})", threadFuncNum, FormatDuration(threadInfo.Elapsed())); |
2246 | 2693 | ||
2247 | if (context != null) | 2694 | // if (context != null) |
2248 | m_fireAndForgetCallsInProgress[context]--; | 2695 | // m_fireAndForgetCallsInProgress[context]--; |
2249 | } | 2696 | } |
2250 | }; | 2697 | }; |
2251 | } | 2698 | } |
@@ -2253,6 +2700,7 @@ namespace OpenSim.Framework | |||
2253 | long numQueued = Interlocked.Increment(ref numQueuedThreadFuncs); | 2700 | long numQueued = Interlocked.Increment(ref numQueuedThreadFuncs); |
2254 | try | 2701 | try |
2255 | { | 2702 | { |
2703 | /* | ||
2256 | long numRunning = numRunningThreadFuncs; | 2704 | long numRunning = numRunningThreadFuncs; |
2257 | 2705 | ||
2258 | if (m_ThreadPool != null && LogOverloads) | 2706 | if (m_ThreadPool != null && LogOverloads) |
@@ -2285,6 +2733,7 @@ namespace OpenSim.Framework | |||
2285 | } | 2733 | } |
2286 | } | 2734 | } |
2287 | else | 2735 | else |
2736 | */ | ||
2288 | { | 2737 | { |
2289 | // Since we didn't log "Queue threadfunc", don't log "Run threadfunc" or "End threadfunc" either. | 2738 | // Since we didn't log "Queue threadfunc", don't log "Run threadfunc" or "End threadfunc" either. |
2290 | // Those log lines aren't useful when we don't know which function is running in the thread. | 2739 | // Those log lines aren't useful when we don't know which function is running in the thread. |
@@ -2342,7 +2791,7 @@ namespace OpenSim.Framework | |||
2342 | if (stackTrace.Contains("BeginFireQueueEmpty")) | 2791 | if (stackTrace.Contains("BeginFireQueueEmpty")) |
2343 | return false; | 2792 | return false; |
2344 | } | 2793 | } |
2345 | 2794 | ||
2346 | return true; | 2795 | return true; |
2347 | } | 2796 | } |
2348 | 2797 | ||
@@ -2355,7 +2804,7 @@ namespace OpenSim.Framework | |||
2355 | { | 2804 | { |
2356 | string src = Environment.StackTrace; | 2805 | string src = Environment.StackTrace; |
2357 | string[] lines = src.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); | 2806 | string[] lines = src.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); |
2358 | 2807 | ||
2359 | StringBuilder dest = new StringBuilder(src.Length); | 2808 | StringBuilder dest = new StringBuilder(src.Length); |
2360 | 2809 | ||
2361 | bool started = false; | 2810 | bool started = false; |
@@ -2400,11 +2849,11 @@ namespace OpenSim.Framework | |||
2400 | /// trace. And pausing another thread can cause a deadlock. This method attempts to | 2849 | /// trace. And pausing another thread can cause a deadlock. This method attempts to |
2401 | /// avoid deadlock by using a short timeout (200ms), after which it gives up and | 2850 | /// avoid deadlock by using a short timeout (200ms), after which it gives up and |
2402 | /// returns 'null' instead of the stack trace. | 2851 | /// returns 'null' instead of the stack trace. |
2403 | /// | 2852 | /// |
2404 | /// Take from: http://stackoverflow.com/a/14935378 | 2853 | /// Take from: http://stackoverflow.com/a/14935378 |
2405 | /// | 2854 | /// |
2406 | /// WARNING: this doesn't work in Mono. See https://bugzilla.novell.com/show_bug.cgi?id=571691 | 2855 | /// WARNING: this doesn't work in Mono. See https://bugzilla.novell.com/show_bug.cgi?id=571691 |
2407 | /// | 2856 | /// |
2408 | /// </remarks> | 2857 | /// </remarks> |
2409 | /// <returns>The stack trace, or null if failed to get it</returns> | 2858 | /// <returns>The stack trace, or null if failed to get it</returns> |
2410 | private static StackTrace GetStackTrace(Thread targetThread) | 2859 | private static StackTrace GetStackTrace(Thread targetThread) |
@@ -2500,12 +2949,22 @@ namespace OpenSim.Framework | |||
2500 | return stpi; | 2949 | return stpi; |
2501 | } | 2950 | } |
2502 | 2951 | ||
2952 | public static void StopThreadPool() | ||
2953 | { | ||
2954 | if (m_ThreadPool == null) | ||
2955 | return; | ||
2956 | SmartThreadPool pool = m_ThreadPool; | ||
2957 | m_ThreadPool = null; | ||
2958 | |||
2959 | try { pool.Shutdown(); } catch {} | ||
2960 | } | ||
2961 | |||
2503 | #endregion FireAndForget Threading Pattern | 2962 | #endregion FireAndForget Threading Pattern |
2504 | 2963 | ||
2505 | /// <summary> | 2964 | /// <summary> |
2506 | /// Environment.TickCount is an int but it counts all 32 bits so it goes positive | 2965 | /// Environment.TickCount is an int but it counts all 32 bits so it goes positive |
2507 | /// and negative every 24.9 days. This trims down TickCount so it doesn't wrap | 2966 | /// and negative every 24.9 days. This trims down TickCount so it doesn't wrap |
2508 | /// for the callers. | 2967 | /// for the callers. |
2509 | /// This trims it to a 12 day interval so don't let your frame time get too long. | 2968 | /// This trims it to a 12 day interval so don't let your frame time get too long. |
2510 | /// </summary> | 2969 | /// </summary> |
2511 | /// <returns></returns> | 2970 | /// <returns></returns> |
@@ -2513,6 +2972,7 @@ namespace OpenSim.Framework | |||
2513 | { | 2972 | { |
2514 | return Environment.TickCount & EnvironmentTickCountMask; | 2973 | return Environment.TickCount & EnvironmentTickCountMask; |
2515 | } | 2974 | } |
2975 | |||
2516 | const Int32 EnvironmentTickCountMask = 0x3fffffff; | 2976 | const Int32 EnvironmentTickCountMask = 0x3fffffff; |
2517 | 2977 | ||
2518 | /// <summary> | 2978 | /// <summary> |
@@ -2557,6 +3017,18 @@ namespace OpenSim.Framework | |||
2557 | return tcA - tcB; | 3017 | return tcA - tcB; |
2558 | } | 3018 | } |
2559 | 3019 | ||
3020 | // returns a timestamp in ms as double | ||
3021 | // using the time resolution avaiable to StopWatch | ||
3022 | public static double GetTimeStamp() | ||
3023 | { | ||
3024 | return (double)Stopwatch.GetTimestamp() * TimeStampClockPeriod; | ||
3025 | } | ||
3026 | |||
3027 | public static double GetTimeStampMS() | ||
3028 | { | ||
3029 | return (double)Stopwatch.GetTimestamp() * TimeStampClockPeriodMS; | ||
3030 | } | ||
3031 | |||
2560 | /// <summary> | 3032 | /// <summary> |
2561 | /// Formats a duration (given in milliseconds). | 3033 | /// Formats a duration (given in milliseconds). |
2562 | /// </summary> | 3034 | /// </summary> |
@@ -2855,7 +3327,7 @@ namespace OpenSim.Framework | |||
2855 | if (parts.Length == 2) | 3327 | if (parts.Length == 2) |
2856 | return CalcUniversalIdentifier(id, agentsURI, parts[0] + " " + parts[1]); | 3328 | return CalcUniversalIdentifier(id, agentsURI, parts[0] + " " + parts[1]); |
2857 | } | 3329 | } |
2858 | 3330 | ||
2859 | return CalcUniversalIdentifier(id, agentsURI, firstName + " " + lastName); | 3331 | return CalcUniversalIdentifier(id, agentsURI, firstName + " " + lastName); |
2860 | } | 3332 | } |
2861 | 3333 | ||
@@ -2940,6 +3412,7 @@ namespace OpenSim.Framework | |||
2940 | 3412 | ||
2941 | } | 3413 | } |
2942 | 3414 | ||
3415 | /* don't like this code | ||
2943 | public class DoubleQueue<T> where T:class | 3416 | public class DoubleQueue<T> where T:class |
2944 | { | 3417 | { |
2945 | private Queue<T> m_lowQueue = new Queue<T>(); | 3418 | private Queue<T> m_lowQueue = new Queue<T>(); |
@@ -2954,10 +3427,10 @@ namespace OpenSim.Framework | |||
2954 | 3427 | ||
2955 | public virtual int Count | 3428 | public virtual int Count |
2956 | { | 3429 | { |
2957 | get | 3430 | get |
2958 | { | 3431 | { |
2959 | lock (m_syncRoot) | 3432 | lock (m_syncRoot) |
2960 | return m_highQueue.Count + m_lowQueue.Count; | 3433 | return m_highQueue.Count + m_lowQueue.Count; |
2961 | } | 3434 | } |
2962 | } | 3435 | } |
2963 | 3436 | ||
@@ -3051,7 +3524,7 @@ namespace OpenSim.Framework | |||
3051 | } | 3524 | } |
3052 | } | 3525 | } |
3053 | } | 3526 | } |
3054 | 3527 | */ | |
3055 | public class BetterRandom | 3528 | public class BetterRandom |
3056 | { | 3529 | { |
3057 | private const int BufferSize = 1024; // must be a multiple of 4 | 3530 | private const int BufferSize = 1024; // must be a multiple of 4 |
diff --git a/OpenSim/Framework/VersionInfo.cs b/OpenSim/Framework/VersionInfo.cs index 1b9ec76..fc0fb1a 100644 --- a/OpenSim/Framework/VersionInfo.cs +++ b/OpenSim/Framework/VersionInfo.cs | |||
@@ -29,9 +29,10 @@ namespace OpenSim | |||
29 | { | 29 | { |
30 | public class VersionInfo | 30 | public class VersionInfo |
31 | { | 31 | { |
32 | public const string VersionNumber = "0.8.2.1"; | 32 | public const string VersionNumber = "0.9.0.1"; |
33 | private const string IG_BUILD_NUMBER = "1"; | 33 | public const string AssemblyVersionNumber = "0.9.0.*"; |
34 | private const Flavour VERSION_FLAVOUR = Flavour.IG; | 34 | |
35 | public const Flavour VERSION_FLAVOUR = Flavour.Release; | ||
35 | 36 | ||
36 | public enum Flavour | 37 | public enum Flavour |
37 | { | 38 | { |
@@ -42,26 +43,25 @@ namespace OpenSim | |||
42 | RC3, | 43 | RC3, |
43 | Release, | 44 | Release, |
44 | Post_Fixes, | 45 | Post_Fixes, |
45 | Extended, | 46 | Extended |
46 | IG | ||
47 | } | 47 | } |
48 | 48 | ||
49 | public static string Version | 49 | public static string Version |
50 | { | 50 | { |
51 | get { return GetVersionString(VersionNumber, IG_BUILD_NUMBER, VERSION_FLAVOUR); } | 51 | get { return GetVersionString(VersionNumber, VERSION_FLAVOUR); } |
52 | } | 52 | } |
53 | 53 | ||
54 | public static string GetVersionString(string versionNumber, string buildNumber, Flavour flavour) | 54 | public static string GetVersionString(string versionNumber, Flavour flavour) |
55 | { | 55 | { |
56 | string versionString = "OpenSim " + versionNumber + " " + flavour + " build " + buildNumber; | 56 | string versionString = "OpenSim " + versionNumber + " " + flavour; |
57 | return versionString.PadRight(VERSIONINFO_VERSION_LENGTH); | 57 | return versionString.PadRight(VERSIONINFO_VERSION_LENGTH); |
58 | } | 58 | } |
59 | 59 | ||
60 | public const int VERSIONINFO_VERSION_LENGTH = 39; | 60 | public const int VERSIONINFO_VERSION_LENGTH = 27; |
61 | 61 | ||
62 | /// <value> | 62 | /// <value> |
63 | /// This is the external interface version. It is separate from the OpenSimulator project version. | 63 | /// This is the external interface version. It is separate from the OpenSimulator project version. |
64 | /// | 64 | /// |
65 | /// </value> | 65 | /// </value> |
66 | /// Commented because it's not used anymore, see below for new | 66 | /// Commented because it's not used anymore, see below for new |
67 | /// versioning method. | 67 | /// versioning method. |
@@ -70,23 +70,23 @@ namespace OpenSim | |||
70 | /// <summary> | 70 | /// <summary> |
71 | /// This rules versioning regarding teleports, and compatibility between simulators in that regard. | 71 | /// This rules versioning regarding teleports, and compatibility between simulators in that regard. |
72 | /// </summary> | 72 | /// </summary> |
73 | /// | 73 | /// |
74 | /// <remarks> | 74 | /// <remarks> |
75 | /// The protocol version that we will use for outgoing transfers | 75 | /// The protocol version that we will use for outgoing transfers |
76 | /// Valid values are | 76 | /// Valid values are |
77 | /// "SIMULATION/0.3" | 77 | /// "SIMULATION/0.3" |
78 | /// - This is the latest, and it supports teleports to variable-sized regions | 78 | /// - This is the latest, and it supports teleports to variable-sized regions |
79 | /// - Older versions can teleport to this one, but only if the destination region | 79 | /// - Older versions can teleport to this one, but only if the destination region |
80 | /// is 256x256 | 80 | /// is 256x256 |
81 | /// "SIMULATION/0.2" | 81 | /// "SIMULATION/0.2" |
82 | /// - A source simulator which only implements "SIMULATION/0.1" can still teleport here | 82 | /// - A source simulator which only implements "SIMULATION/0.1" can still teleport here |
83 | /// - this protocol is more efficient than "SIMULATION/0.1" | 83 | /// - this protocol is more efficient than "SIMULATION/0.1" |
84 | /// "SIMULATION/0.1" | 84 | /// "SIMULATION/0.1" |
85 | /// - this is an older teleport protocol used in OpenSimulator 0.7.5 and before. | 85 | /// - this is an older teleport protocol used in OpenSimulator 0.7.5 and before. |
86 | /// </remarks> | 86 | /// </remarks> |
87 | public readonly static float SimulationServiceVersionAcceptedMin = 0.3f; | 87 | public readonly static float SimulationServiceVersionAcceptedMin = 0.3f; |
88 | public readonly static float SimulationServiceVersionAcceptedMax = 0.5f; | 88 | public readonly static float SimulationServiceVersionAcceptedMax = 0.6f; |
89 | public readonly static float SimulationServiceVersionSupportedMin = 0.3f; | 89 | public readonly static float SimulationServiceVersionSupportedMin = 0.3f; |
90 | public readonly static float SimulationServiceVersionSupportedMax = 0.5f; | 90 | public readonly static float SimulationServiceVersionSupportedMax = 0.6f; |
91 | } | 91 | } |
92 | } | 92 | } |
diff --git a/OpenSim/Framework/WearableCacheItem.cs b/OpenSim/Framework/WearableCacheItem.cs index 1aecf79..427e149 100644 --- a/OpenSim/Framework/WearableCacheItem.cs +++ b/OpenSim/Framework/WearableCacheItem.cs | |||
@@ -43,13 +43,14 @@ namespace OpenSim.Framework | |||
43 | 43 | ||
44 | public static WearableCacheItem[] GetDefaultCacheItem() | 44 | public static WearableCacheItem[] GetDefaultCacheItem() |
45 | { | 45 | { |
46 | int itemmax = 21; | 46 | int itemmax = AvatarAppearance.TEXTURE_COUNT; |
47 | WearableCacheItem[] retitems = new WearableCacheItem[itemmax]; | 47 | WearableCacheItem[] retitems = new WearableCacheItem[itemmax]; |
48 | for (uint i=0;i<itemmax;i++) | 48 | for (uint i=0;i<itemmax;i++) |
49 | retitems[i] = new WearableCacheItem() {CacheId = UUID.Zero, TextureID = UUID.Zero, TextureIndex = i + 1}; | 49 | retitems[i] = new WearableCacheItem() {CacheId = UUID.Zero, TextureID = UUID.Zero, TextureIndex = i}; |
50 | return retitems; | 50 | return retitems; |
51 | } | 51 | } |
52 | public static WearableCacheItem[] FromOSD(OSD pInput, IImprovedAssetCache dataCache) | 52 | |
53 | public static WearableCacheItem[] FromOSD(OSD pInput, IAssetCache dataCache) | ||
53 | { | 54 | { |
54 | List<WearableCacheItem> ret = new List<WearableCacheItem>(); | 55 | List<WearableCacheItem> ret = new List<WearableCacheItem>(); |
55 | if (pInput.Type == OSDType.Array) | 56 | if (pInput.Type == OSDType.Array) |
@@ -63,7 +64,7 @@ namespace OpenSim.Framework | |||
63 | CacheId = item["cacheid"].AsUUID(), | 64 | CacheId = item["cacheid"].AsUUID(), |
64 | TextureID = item["textureid"].AsUUID() | 65 | TextureID = item["textureid"].AsUUID() |
65 | }); | 66 | }); |
66 | 67 | ||
67 | if (dataCache != null && item.ContainsKey("assetdata")) | 68 | if (dataCache != null && item.ContainsKey("assetdata")) |
68 | { | 69 | { |
69 | AssetBase asset = new AssetBase(item["textureid"].AsUUID(),"BakedTexture",(sbyte)AssetType.Texture,UUID.Zero.ToString()); | 70 | AssetBase asset = new AssetBase(item["textureid"].AsUUID(),"BakedTexture",(sbyte)AssetType.Texture,UUID.Zero.ToString()); |
@@ -98,7 +99,8 @@ namespace OpenSim.Framework | |||
98 | return ret.ToArray(); | 99 | return ret.ToArray(); |
99 | 100 | ||
100 | } | 101 | } |
101 | public static OSD ToOSD(WearableCacheItem[] pcacheItems, IImprovedAssetCache dataCache) | 102 | |
103 | public static OSD ToOSD(WearableCacheItem[] pcacheItems, IAssetCache dataCache) | ||
102 | { | 104 | { |
103 | OSDArray arr = new OSDArray(); | 105 | OSDArray arr = new OSDArray(); |
104 | foreach (WearableCacheItem item in pcacheItems) | 106 | foreach (WearableCacheItem item in pcacheItems) |
@@ -111,7 +113,8 @@ namespace OpenSim.Framework | |||
111 | { | 113 | { |
112 | if (dataCache.Check(item.TextureID.ToString())) | 114 | if (dataCache.Check(item.TextureID.ToString())) |
113 | { | 115 | { |
114 | AssetBase assetItem = dataCache.Get(item.TextureID.ToString()); | 116 | AssetBase assetItem; |
117 | dataCache.Get(item.TextureID.ToString(), out assetItem); | ||
115 | if (assetItem != null) | 118 | if (assetItem != null) |
116 | { | 119 | { |
117 | itemmap.Add("assetdata", OSD.FromBinary(assetItem.Data)); | 120 | itemmap.Add("assetdata", OSD.FromBinary(assetItem.Data)); |
@@ -124,6 +127,68 @@ namespace OpenSim.Framework | |||
124 | } | 127 | } |
125 | return arr; | 128 | return arr; |
126 | } | 129 | } |
130 | |||
131 | public static OSDArray BakedToOSD(WearableCacheItem[] pcacheItems) | ||
132 | { | ||
133 | if (pcacheItems.Length < AvatarAppearance.BAKE_INDICES[AvatarAppearance.BAKE_INDICES.Length - 1]) | ||
134 | return null; | ||
135 | |||
136 | OSDArray arr = new OSDArray(); | ||
137 | |||
138 | for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) | ||
139 | { | ||
140 | int idx = AvatarAppearance.BAKE_INDICES[i]; | ||
141 | |||
142 | WearableCacheItem item = pcacheItems[idx]; | ||
143 | |||
144 | OSDMap itemmap = new OSDMap(); | ||
145 | itemmap.Add("textureindex", OSD.FromUInteger(item.TextureIndex)); | ||
146 | itemmap.Add("cacheid", OSD.FromUUID(item.CacheId)); | ||
147 | itemmap.Add("textureid", OSD.FromUUID(item.TextureID)); | ||
148 | /* | ||
149 | if (item.TextureAsset != null) | ||
150 | { | ||
151 | itemmap.Add("assetdata", OSD.FromBinary(item.TextureAsset.Data)); | ||
152 | itemmap.Add("assetcreator", OSD.FromString(item.TextureAsset.CreatorID)); | ||
153 | itemmap.Add("assetname", OSD.FromString(item.TextureAsset.Name)); | ||
154 | } | ||
155 | */ | ||
156 | arr.Add(itemmap); | ||
157 | } | ||
158 | return arr; | ||
159 | } | ||
160 | |||
161 | public static WearableCacheItem[] BakedFromOSD(OSD pInput) | ||
162 | { | ||
163 | WearableCacheItem[] pcache = WearableCacheItem.GetDefaultCacheItem(); | ||
164 | |||
165 | if (pInput.Type == OSDType.Array) | ||
166 | { | ||
167 | OSDArray itemarray = (OSDArray)pInput; | ||
168 | foreach (OSDMap item in itemarray) | ||
169 | { | ||
170 | int idx = (int)item["textureindex"].AsUInteger(); | ||
171 | if (idx < 0 || idx > pcache.Length) | ||
172 | continue; | ||
173 | pcache[idx].CacheId = item["cacheid"].AsUUID(); | ||
174 | pcache[idx].TextureID = item["textureid"].AsUUID(); | ||
175 | /* | ||
176 | if (item.ContainsKey("assetdata")) | ||
177 | { | ||
178 | AssetBase asset = new AssetBase(item["textureid"].AsUUID(), "BakedTexture", (sbyte)AssetType.Texture, UUID.Zero.ToString()); | ||
179 | asset.Temporary = true; | ||
180 | asset.Local = true; | ||
181 | asset.Data = item["assetdata"].AsBinary(); | ||
182 | pcache[idx].TextureAsset = asset; | ||
183 | } | ||
184 | else | ||
185 | */ | ||
186 | pcache[idx].TextureAsset = null; | ||
187 | } | ||
188 | } | ||
189 | return pcache; | ||
190 | } | ||
191 | |||
127 | public static WearableCacheItem SearchTextureIndex(uint pTextureIndex,WearableCacheItem[] pcacheItems) | 192 | public static WearableCacheItem SearchTextureIndex(uint pTextureIndex,WearableCacheItem[] pcacheItems) |
128 | { | 193 | { |
129 | for (int i = 0; i < pcacheItems.Length; i++) | 194 | for (int i = 0; i < pcacheItems.Length; i++) |
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index b180c8a..20d30b5 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs | |||
@@ -72,11 +72,6 @@ namespace OpenSim.Framework | |||
72 | public static int RequestNumber { get; set; } | 72 | public static int RequestNumber { get; set; } |
73 | 73 | ||
74 | /// <summary> | 74 | /// <summary> |
75 | /// Control where OSD requests should be serialized per endpoint. | ||
76 | /// </summary> | ||
77 | public static bool SerializeOSDRequestsPerEndpoint { get; set; } | ||
78 | |||
79 | /// <summary> | ||
80 | /// this is the header field used to communicate the local request id | 75 | /// this is the header field used to communicate the local request id |
81 | /// used for performance and debugging | 76 | /// used for performance and debugging |
82 | /// </summary> | 77 | /// </summary> |
@@ -98,31 +93,6 @@ namespace OpenSim.Framework | |||
98 | /// </remarks> | 93 | /// </remarks> |
99 | public const int MaxRequestDiagLength = 200; | 94 | public const int MaxRequestDiagLength = 200; |
100 | 95 | ||
101 | /// <summary> | ||
102 | /// Dictionary of end points | ||
103 | /// </summary> | ||
104 | private static Dictionary<string,object> m_endpointSerializer = new Dictionary<string,object>(); | ||
105 | |||
106 | private static object EndPointLock(string url) | ||
107 | { | ||
108 | System.Uri uri = new System.Uri(url); | ||
109 | string endpoint = string.Format("{0}:{1}",uri.Host,uri.Port); | ||
110 | |||
111 | lock (m_endpointSerializer) | ||
112 | { | ||
113 | object eplock = null; | ||
114 | |||
115 | if (! m_endpointSerializer.TryGetValue(endpoint,out eplock)) | ||
116 | { | ||
117 | eplock = new object(); | ||
118 | m_endpointSerializer.Add(endpoint,eplock); | ||
119 | // m_log.WarnFormat("[WEB UTIL] add a new host to end point serializer {0}",endpoint); | ||
120 | } | ||
121 | |||
122 | return eplock; | ||
123 | } | ||
124 | } | ||
125 | |||
126 | #region JSONRequest | 96 | #region JSONRequest |
127 | 97 | ||
128 | /// <summary> | 98 | /// <summary> |
@@ -154,21 +124,6 @@ namespace OpenSim.Framework | |||
154 | return ServiceOSDRequest(url, null, "GET", timeout, false, false); | 124 | return ServiceOSDRequest(url, null, "GET", timeout, false, false); |
155 | } | 125 | } |
156 | 126 | ||
157 | public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed, bool rpc) | ||
158 | { | ||
159 | if (SerializeOSDRequestsPerEndpoint) | ||
160 | { | ||
161 | lock (EndPointLock(url)) | ||
162 | { | ||
163 | return ServiceOSDRequestWorker(url, data, method, timeout, compressed, rpc); | ||
164 | } | ||
165 | } | ||
166 | else | ||
167 | { | ||
168 | return ServiceOSDRequestWorker(url, data, method, timeout, compressed, rpc); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | public static void LogOutgoingDetail(Stream outputStream) | 127 | public static void LogOutgoingDetail(Stream outputStream) |
173 | { | 128 | { |
174 | LogOutgoingDetail("", outputStream); | 129 | LogOutgoingDetail("", outputStream); |
@@ -222,7 +177,7 @@ namespace OpenSim.Framework | |||
222 | LogOutgoingDetail(string.Format("RESPONSE {0}: ", reqnum), input); | 177 | LogOutgoingDetail(string.Format("RESPONSE {0}: ", reqnum), input); |
223 | } | 178 | } |
224 | 179 | ||
225 | private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed, bool rpc) | 180 | public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed, bool rpc) |
226 | { | 181 | { |
227 | int reqnum = RequestNumber++; | 182 | int reqnum = RequestNumber++; |
228 | 183 | ||
@@ -233,6 +188,9 @@ namespace OpenSim.Framework | |||
233 | string errorMessage = "unknown error"; | 188 | string errorMessage = "unknown error"; |
234 | int tickstart = Util.EnvironmentTickCount(); | 189 | int tickstart = Util.EnvironmentTickCount(); |
235 | int tickdata = 0; | 190 | int tickdata = 0; |
191 | int tickcompressdata = 0; | ||
192 | int tickJsondata = 0; | ||
193 | int compsize = 0; | ||
236 | string strBuffer = null; | 194 | string strBuffer = null; |
237 | 195 | ||
238 | try | 196 | try |
@@ -242,21 +200,23 @@ namespace OpenSim.Framework | |||
242 | request.Timeout = timeout; | 200 | request.Timeout = timeout; |
243 | request.KeepAlive = false; | 201 | request.KeepAlive = false; |
244 | request.MaximumAutomaticRedirections = 10; | 202 | request.MaximumAutomaticRedirections = 10; |
245 | request.ReadWriteTimeout = timeout / 4; | 203 | request.ReadWriteTimeout = timeout / 2; |
246 | request.Headers[OSHeaderRequestID] = reqnum.ToString(); | 204 | request.Headers[OSHeaderRequestID] = reqnum.ToString(); |
247 | 205 | ||
248 | // If there is some input, write it into the request | 206 | // If there is some input, write it into the request |
249 | if (data != null) | 207 | if (data != null) |
250 | { | 208 | { |
251 | strBuffer = OSDParser.SerializeJsonString(data); | 209 | strBuffer = OSDParser.SerializeJsonString(data); |
252 | 210 | ||
211 | tickJsondata = Util.EnvironmentTickCountSubtract(tickstart); | ||
212 | |||
253 | if (DebugLevel >= 5) | 213 | if (DebugLevel >= 5) |
254 | LogOutgoingDetail("SEND", reqnum, strBuffer); | 214 | LogOutgoingDetail("SEND", reqnum, strBuffer); |
255 | 215 | ||
256 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); | 216 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); |
257 | 217 | ||
258 | request.ContentType = rpc ? "application/json-rpc" : "application/json"; | 218 | request.ContentType = rpc ? "application/json-rpc" : "application/json"; |
259 | 219 | ||
260 | if (compressed) | 220 | if (compressed) |
261 | { | 221 | { |
262 | request.Headers["X-Content-Encoding"] = "gzip"; // can't set "Content-Encoding" because old OpenSims fail if they get an unrecognized Content-Encoding | 222 | request.Headers["X-Content-Encoding"] = "gzip"; // can't set "Content-Encoding" because old OpenSims fail if they get an unrecognized Content-Encoding |
@@ -271,19 +231,25 @@ namespace OpenSim.Framework | |||
271 | // gets written on the stream upon Dispose() | 231 | // gets written on the stream upon Dispose() |
272 | } | 232 | } |
273 | byte[] buf = ms.ToArray(); | 233 | byte[] buf = ms.ToArray(); |
234 | |||
235 | tickcompressdata = Util.EnvironmentTickCountSubtract(tickstart); | ||
236 | |||
274 | request.ContentLength = buf.Length; //Count bytes to send | 237 | request.ContentLength = buf.Length; //Count bytes to send |
238 | compsize = buf.Length; | ||
275 | using (Stream requestStream = request.GetRequestStream()) | 239 | using (Stream requestStream = request.GetRequestStream()) |
276 | requestStream.Write(buf, 0, (int)buf.Length); | 240 | requestStream.Write(buf, 0, (int)buf.Length); |
277 | } | 241 | } |
278 | } | 242 | } |
279 | else | 243 | else |
280 | { | 244 | { |
245 | compsize = buffer.Length; | ||
246 | |||
281 | request.ContentLength = buffer.Length; //Count bytes to send | 247 | request.ContentLength = buffer.Length; //Count bytes to send |
282 | using (Stream requestStream = request.GetRequestStream()) | 248 | using (Stream requestStream = request.GetRequestStream()) |
283 | requestStream.Write(buffer, 0, buffer.Length); //Send it | 249 | requestStream.Write(buffer, 0, buffer.Length); //Send it |
284 | } | 250 | } |
285 | } | 251 | } |
286 | 252 | ||
287 | // capture how much time was spent writing, this may seem silly | 253 | // capture how much time was spent writing, this may seem silly |
288 | // but with the number concurrent requests, this often blocks | 254 | // but with the number concurrent requests, this often blocks |
289 | tickdata = Util.EnvironmentTickCountSubtract(tickstart); | 255 | tickdata = Util.EnvironmentTickCountSubtract(tickstart); |
@@ -314,6 +280,7 @@ namespace OpenSim.Framework | |||
314 | catch (Exception ex) | 280 | catch (Exception ex) |
315 | { | 281 | { |
316 | errorMessage = ex.Message; | 282 | errorMessage = ex.Message; |
283 | m_log.Debug("[WEB UTIL]: Exception making request: " + ex.ToString()); | ||
317 | } | 284 | } |
318 | finally | 285 | finally |
319 | { | 286 | { |
@@ -321,8 +288,17 @@ namespace OpenSim.Framework | |||
321 | if (tickdiff > LongCallTime) | 288 | if (tickdiff > LongCallTime) |
322 | { | 289 | { |
323 | m_log.InfoFormat( | 290 | m_log.InfoFormat( |
324 | "[LOGHTTP]: Slow JSON-RPC request {0} {1} to {2} took {3}ms, {4}ms writing, {5}", | 291 | "[WEB UTIL]: Slow ServiceOSD request {0} {1} {2} took {3}ms, {4}ms writing({5} at Json; {6} at comp), {7} bytes ({8} uncomp): {9}", |
325 | reqnum, method, url, tickdiff, tickdata, | 292 | reqnum, |
293 | method, | ||
294 | url, | ||
295 | tickdiff, | ||
296 | tickdata, | ||
297 | tickJsondata, | ||
298 | tickcompressdata, | ||
299 | compsize, | ||
300 | strBuffer != null ? strBuffer.Length : 0, | ||
301 | |||
326 | strBuffer != null | 302 | strBuffer != null |
327 | ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) | 303 | ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) |
328 | : ""); | 304 | : ""); |
@@ -333,7 +309,7 @@ namespace OpenSim.Framework | |||
333 | reqnum, tickdiff, tickdata); | 309 | reqnum, tickdiff, tickdata); |
334 | } | 310 | } |
335 | } | 311 | } |
336 | 312 | ||
337 | m_log.DebugFormat( | 313 | m_log.DebugFormat( |
338 | "[LOGHTTP]: JSON-RPC request {0} {1} to {2} FAILED: {3}", reqnum, method, url, errorMessage); | 314 | "[LOGHTTP]: JSON-RPC request {0} {1} to {2} FAILED: {3}", reqnum, method, url, errorMessage); |
339 | 315 | ||
@@ -357,7 +333,7 @@ namespace OpenSim.Framework | |||
357 | result["success"] = OSD.FromBoolean(true); | 333 | result["success"] = OSD.FromBoolean(true); |
358 | result["_RawResult"] = OSD.FromString(response); | 334 | result["_RawResult"] = OSD.FromString(response); |
359 | result["_Result"] = new OSDMap(); | 335 | result["_Result"] = new OSDMap(); |
360 | 336 | ||
361 | if (response.Equals("true",System.StringComparison.OrdinalIgnoreCase)) | 337 | if (response.Equals("true",System.StringComparison.OrdinalIgnoreCase)) |
362 | return result; | 338 | return result; |
363 | 339 | ||
@@ -368,7 +344,7 @@ namespace OpenSim.Framework | |||
368 | return result; | 344 | return result; |
369 | } | 345 | } |
370 | 346 | ||
371 | try | 347 | try |
372 | { | 348 | { |
373 | OSD responseOSD = OSDParser.Deserialize(response); | 349 | OSD responseOSD = OSDParser.Deserialize(response); |
374 | if (responseOSD.Type == OSDType.Map) | 350 | if (responseOSD.Type == OSDType.Map) |
@@ -382,10 +358,10 @@ namespace OpenSim.Framework | |||
382 | // don't need to treat this as an error... we're just guessing anyway | 358 | // don't need to treat this as an error... we're just guessing anyway |
383 | // m_log.DebugFormat("[WEB UTIL] couldn't decode <{0}>: {1}",response,e.Message); | 359 | // m_log.DebugFormat("[WEB UTIL] couldn't decode <{0}>: {1}",response,e.Message); |
384 | } | 360 | } |
385 | 361 | ||
386 | return result; | 362 | return result; |
387 | } | 363 | } |
388 | 364 | ||
389 | #endregion JSONRequest | 365 | #endregion JSONRequest |
390 | 366 | ||
391 | #region FormRequest | 367 | #region FormRequest |
@@ -396,18 +372,10 @@ namespace OpenSim.Framework | |||
396 | /// </summary> | 372 | /// </summary> |
397 | public static OSDMap PostToService(string url, NameValueCollection data) | 373 | public static OSDMap PostToService(string url, NameValueCollection data) |
398 | { | 374 | { |
399 | return ServiceFormRequest(url,data,10000); | 375 | return ServiceFormRequest(url,data, 30000); |
400 | } | ||
401 | |||
402 | public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout) | ||
403 | { | ||
404 | lock (EndPointLock(url)) | ||
405 | { | ||
406 | return ServiceFormRequestWorker(url,data,timeout); | ||
407 | } | ||
408 | } | 376 | } |
409 | 377 | ||
410 | private static OSDMap ServiceFormRequestWorker(string url, NameValueCollection data, int timeout) | 378 | public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout) |
411 | { | 379 | { |
412 | int reqnum = RequestNumber++; | 380 | int reqnum = RequestNumber++; |
413 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; | 381 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; |
@@ -415,7 +383,7 @@ namespace OpenSim.Framework | |||
415 | if (DebugLevel >= 3) | 383 | if (DebugLevel >= 3) |
416 | m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} ServiceForm '{1}' to {2}", | 384 | m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} ServiceForm '{1}' to {2}", |
417 | reqnum, method, url); | 385 | reqnum, method, url); |
418 | 386 | ||
419 | string errorMessage = "unknown error"; | 387 | string errorMessage = "unknown error"; |
420 | int tickstart = Util.EnvironmentTickCount(); | 388 | int tickstart = Util.EnvironmentTickCount(); |
421 | int tickdata = 0; | 389 | int tickdata = 0; |
@@ -428,9 +396,9 @@ namespace OpenSim.Framework | |||
428 | request.Timeout = timeout; | 396 | request.Timeout = timeout; |
429 | request.KeepAlive = false; | 397 | request.KeepAlive = false; |
430 | request.MaximumAutomaticRedirections = 10; | 398 | request.MaximumAutomaticRedirections = 10; |
431 | request.ReadWriteTimeout = timeout / 4; | 399 | request.ReadWriteTimeout = timeout / 2; |
432 | request.Headers[OSHeaderRequestID] = reqnum.ToString(); | 400 | request.Headers[OSHeaderRequestID] = reqnum.ToString(); |
433 | 401 | ||
434 | if (data != null) | 402 | if (data != null) |
435 | { | 403 | { |
436 | queryString = BuildQueryString(data); | 404 | queryString = BuildQueryString(data); |
@@ -439,7 +407,7 @@ namespace OpenSim.Framework | |||
439 | LogOutgoingDetail("SEND", reqnum, queryString); | 407 | LogOutgoingDetail("SEND", reqnum, queryString); |
440 | 408 | ||
441 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); | 409 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); |
442 | 410 | ||
443 | request.ContentLength = buffer.Length; | 411 | request.ContentLength = buffer.Length; |
444 | request.ContentType = "application/x-www-form-urlencoded"; | 412 | request.ContentType = "application/x-www-form-urlencoded"; |
445 | using (Stream requestStream = request.GetRequestStream()) | 413 | using (Stream requestStream = request.GetRequestStream()) |
@@ -517,7 +485,7 @@ namespace OpenSim.Framework | |||
517 | } | 485 | } |
518 | 486 | ||
519 | #endregion FormRequest | 487 | #endregion FormRequest |
520 | 488 | ||
521 | #region Uri | 489 | #region Uri |
522 | 490 | ||
523 | /// <summary> | 491 | /// <summary> |
@@ -570,7 +538,7 @@ namespace OpenSim.Framework | |||
570 | } | 538 | } |
571 | 539 | ||
572 | /// <summary> | 540 | /// <summary> |
573 | /// Appends a query string to a Uri that may or may not have existing | 541 | /// Appends a query string to a Uri that may or may not have existing |
574 | /// query parameters | 542 | /// query parameters |
575 | /// </summary> | 543 | /// </summary> |
576 | /// <param name="uri">Uri to append the query to</param> | 544 | /// <param name="uri">Uri to append the query to</param> |
@@ -622,7 +590,7 @@ namespace OpenSim.Framework | |||
622 | } | 590 | } |
623 | 591 | ||
624 | /// <summary> | 592 | /// <summary> |
625 | /// | 593 | /// |
626 | /// </summary> | 594 | /// </summary> |
627 | /// <param name="collection"></param> | 595 | /// <param name="collection"></param> |
628 | /// <param name="key"></param> | 596 | /// <param name="key"></param> |
@@ -641,12 +609,12 @@ namespace OpenSim.Framework | |||
641 | #region Stream | 609 | #region Stream |
642 | 610 | ||
643 | /// <summary> | 611 | /// <summary> |
644 | /// Copies the contents of one stream to another, starting at the | 612 | /// Copies the contents of one stream to another, starting at the |
645 | /// current position of each stream | 613 | /// current position of each stream |
646 | /// </summary> | 614 | /// </summary> |
647 | /// <param name="copyFrom">The stream to copy from, at the position | 615 | /// <param name="copyFrom">The stream to copy from, at the position |
648 | /// where copying should begin</param> | 616 | /// where copying should begin</param> |
649 | /// <param name="copyTo">The stream to copy to, at the position where | 617 | /// <param name="copyTo">The stream to copy to, at the position where |
650 | /// bytes should be written</param> | 618 | /// bytes should be written</param> |
651 | /// <param name="maximumBytesToCopy">The maximum bytes to copy</param> | 619 | /// <param name="maximumBytesToCopy">The maximum bytes to copy</param> |
652 | /// <returns>The total number of bytes copied</returns> | 620 | /// <returns>The total number of bytes copied</returns> |
@@ -779,6 +747,20 @@ namespace OpenSim.Framework | |||
779 | MakeRequest<TRequest, TResponse>(verb, requestUrl, obj, action, maxConnections, null); | 747 | MakeRequest<TRequest, TResponse>(verb, requestUrl, obj, action, maxConnections, null); |
780 | } | 748 | } |
781 | 749 | ||
750 | /// <summary> | ||
751 | /// Perform a synchronous REST request. | ||
752 | /// </summary> | ||
753 | /// <param name="verb"></param> | ||
754 | /// <param name="requestUrl"></param> | ||
755 | /// <param name="obj"></param> | ||
756 | /// <param name="pTimeout"> | ||
757 | /// Request timeout in seconds. Timeout.Infinite indicates no timeout. If 0 is passed then the default HttpWebRequest timeout is used (100 seconds) | ||
758 | /// </param> | ||
759 | /// <param name="maxConnections"></param> | ||
760 | /// <returns> | ||
761 | /// The response. If there was an internal exception or the request timed out, | ||
762 | /// then the default(TResponse) is returned. | ||
763 | /// </returns> | ||
782 | public static void MakeRequest<TRequest, TResponse>(string verb, | 764 | public static void MakeRequest<TRequest, TResponse>(string verb, |
783 | string requestUrl, TRequest obj, Action<TResponse> action, | 765 | string requestUrl, TRequest obj, Action<TResponse> action, |
784 | int maxConnections, IServiceAuth auth) | 766 | int maxConnections, IServiceAuth auth) |
@@ -791,6 +773,7 @@ namespace OpenSim.Framework | |||
791 | 773 | ||
792 | int tickstart = Util.EnvironmentTickCount(); | 774 | int tickstart = Util.EnvironmentTickCount(); |
793 | int tickdata = 0; | 775 | int tickdata = 0; |
776 | int tickdiff = 0; | ||
794 | 777 | ||
795 | Type type = typeof(TRequest); | 778 | Type type = typeof(TRequest); |
796 | 779 | ||
@@ -873,7 +856,7 @@ namespace OpenSim.Framework | |||
873 | // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't | 856 | // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't |
874 | // documented in MSDN | 857 | // documented in MSDN |
875 | using (WebResponse response = request.EndGetResponse(res2)) | 858 | using (WebResponse response = request.EndGetResponse(res2)) |
876 | { | 859 | { |
877 | try | 860 | try |
878 | { | 861 | { |
879 | using (Stream respStream = response.GetResponseStream()) | 862 | using (Stream respStream = response.GetResponseStream()) |
@@ -894,7 +877,7 @@ namespace OpenSim.Framework | |||
894 | if (e.Response is HttpWebResponse) | 877 | if (e.Response is HttpWebResponse) |
895 | { | 878 | { |
896 | using (HttpWebResponse httpResponse = (HttpWebResponse)e.Response) | 879 | using (HttpWebResponse httpResponse = (HttpWebResponse)e.Response) |
897 | { | 880 | { |
898 | if (httpResponse.StatusCode != HttpStatusCode.NotFound) | 881 | if (httpResponse.StatusCode != HttpStatusCode.NotFound) |
899 | { | 882 | { |
900 | // We don't appear to be handling any other status codes, so log these feailures to that | 883 | // We don't appear to be handling any other status codes, so log these feailures to that |
@@ -919,7 +902,7 @@ namespace OpenSim.Framework | |||
919 | "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}", | 902 | "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}", |
920 | verb, requestUrl, e.Message, e.StackTrace); | 903 | verb, requestUrl, e.Message, e.StackTrace); |
921 | } | 904 | } |
922 | 905 | ||
923 | // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); | 906 | // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); |
924 | 907 | ||
925 | try | 908 | try |
@@ -932,11 +915,11 @@ namespace OpenSim.Framework | |||
932 | "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}", | 915 | "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}", |
933 | verb, requestUrl, e.Message, e.StackTrace); | 916 | verb, requestUrl, e.Message, e.StackTrace); |
934 | } | 917 | } |
935 | 918 | ||
936 | }, null); | 919 | }, null); |
937 | } | 920 | } |
938 | 921 | ||
939 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | 922 | tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
940 | if (tickdiff > WebUtil.LongCallTime) | 923 | if (tickdiff > WebUtil.LongCallTime) |
941 | { | 924 | { |
942 | string originalRequest = null; | 925 | string originalRequest = null; |
@@ -948,8 +931,7 @@ namespace OpenSim.Framework | |||
948 | if (originalRequest.Length > WebUtil.MaxRequestDiagLength) | 931 | if (originalRequest.Length > WebUtil.MaxRequestDiagLength) |
949 | originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength); | 932 | originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength); |
950 | } | 933 | } |
951 | 934 | m_log.InfoFormat( | |
952 | m_log.InfoFormat( | ||
953 | "[LOGHTTP]: Slow AsynchronousRequestObject request {0} {1} to {2} took {3}ms, {4}ms writing, {5}", | 935 | "[LOGHTTP]: Slow AsynchronousRequestObject request {0} {1} to {2} took {3}ms, {4}ms writing, {5}", |
954 | reqnum, verb, requestUrl, tickdiff, tickdata, | 936 | reqnum, verb, requestUrl, tickdiff, tickdata, |
955 | originalRequest); | 937 | originalRequest); |
@@ -957,11 +939,12 @@ namespace OpenSim.Framework | |||
957 | else if (WebUtil.DebugLevel >= 4) | 939 | else if (WebUtil.DebugLevel >= 4) |
958 | { | 940 | { |
959 | m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing", | 941 | m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing", |
942 | |||
960 | reqnum, tickdiff, tickdata); | 943 | reqnum, tickdiff, tickdata); |
961 | } | 944 | } |
962 | } | 945 | } |
963 | finally | 946 | finally |
964 | { | 947 | { |
965 | if (buffer != null) | 948 | if (buffer != null) |
966 | buffer.Dispose(); | 949 | buffer.Dispose(); |
967 | } | 950 | } |
@@ -983,7 +966,8 @@ namespace OpenSim.Framework | |||
983 | /// | 966 | /// |
984 | /// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting | 967 | /// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting |
985 | /// the request. You'll want to make sure you deal with this as they're not uncommon</exception> | 968 | /// the request. You'll want to make sure you deal with this as they're not uncommon</exception> |
986 | public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs, IServiceAuth auth) | 969 | public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs = -1, |
970 | IServiceAuth auth = null, bool keepalive = true) | ||
987 | { | 971 | { |
988 | int reqnum = WebUtil.RequestNumber++; | 972 | int reqnum = WebUtil.RequestNumber++; |
989 | 973 | ||
@@ -998,12 +982,16 @@ namespace OpenSim.Framework | |||
998 | request.Method = verb; | 982 | request.Method = verb; |
999 | if (timeoutsecs > 0) | 983 | if (timeoutsecs > 0) |
1000 | request.Timeout = timeoutsecs * 1000; | 984 | request.Timeout = timeoutsecs * 1000; |
985 | if(!keepalive && request is HttpWebRequest) | ||
986 | ((HttpWebRequest)request).KeepAlive = false; | ||
1001 | 987 | ||
1002 | if (auth != null) | 988 | if (auth != null) |
1003 | auth.AddAuthorization(request.Headers); | 989 | auth.AddAuthorization(request.Headers); |
1004 | 990 | ||
1005 | string respstring = String.Empty; | 991 | string respstring = String.Empty; |
1006 | 992 | ||
993 | int tickset = Util.EnvironmentTickCountSubtract(tickstart); | ||
994 | |||
1007 | using (MemoryStream buffer = new MemoryStream()) | 995 | using (MemoryStream buffer = new MemoryStream()) |
1008 | { | 996 | { |
1009 | if ((verb == "POST") || (verb == "PUT")) | 997 | if ((verb == "POST") || (verb == "PUT")) |
@@ -1024,11 +1012,10 @@ namespace OpenSim.Framework | |||
1024 | if (WebUtil.DebugLevel >= 5) | 1012 | if (WebUtil.DebugLevel >= 5) |
1025 | WebUtil.LogOutgoingDetail("SEND", reqnum, System.Text.Encoding.UTF8.GetString(data)); | 1013 | WebUtil.LogOutgoingDetail("SEND", reqnum, System.Text.Encoding.UTF8.GetString(data)); |
1026 | 1014 | ||
1027 | Stream requestStream = null; | ||
1028 | try | 1015 | try |
1029 | { | 1016 | { |
1030 | requestStream = request.GetRequestStream(); | 1017 | using(Stream requestStream = request.GetRequestStream()) |
1031 | requestStream.Write(data, 0, length); | 1018 | requestStream.Write(data,0,length); |
1032 | } | 1019 | } |
1033 | catch (Exception e) | 1020 | catch (Exception e) |
1034 | { | 1021 | { |
@@ -1038,9 +1025,6 @@ namespace OpenSim.Framework | |||
1038 | } | 1025 | } |
1039 | finally | 1026 | finally |
1040 | { | 1027 | { |
1041 | if (requestStream != null) | ||
1042 | requestStream.Dispose(); | ||
1043 | |||
1044 | // capture how much time was spent writing | 1028 | // capture how much time was spent writing |
1045 | tickdata = Util.EnvironmentTickCountSubtract(tickstart); | 1029 | tickdata = Util.EnvironmentTickCountSubtract(tickstart); |
1046 | } | 1030 | } |
@@ -1070,8 +1054,13 @@ namespace OpenSim.Framework | |||
1070 | if (tickdiff > WebUtil.LongCallTime) | 1054 | if (tickdiff > WebUtil.LongCallTime) |
1071 | { | 1055 | { |
1072 | m_log.InfoFormat( | 1056 | m_log.InfoFormat( |
1073 | "[LOGHTTP]: Slow SynchronousRestForms request {0} {1} to {2} took {3}ms, {4}ms writing, {5}", | 1057 | "[FORMS]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", |
1074 | reqnum, verb, requestUrl, tickdiff, tickdata, | 1058 | reqnum, |
1059 | verb, | ||
1060 | requestUrl, | ||
1061 | tickdiff, | ||
1062 | tickset, | ||
1063 | tickdata, | ||
1075 | obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); | 1064 | obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); |
1076 | } | 1065 | } |
1077 | else if (WebUtil.DebugLevel >= 4) | 1066 | else if (WebUtil.DebugLevel >= 4) |
@@ -1086,16 +1075,6 @@ namespace OpenSim.Framework | |||
1086 | return respstring; | 1075 | return respstring; |
1087 | } | 1076 | } |
1088 | 1077 | ||
1089 | public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs) | ||
1090 | { | ||
1091 | return MakeRequest(verb, requestUrl, obj, timeoutsecs, null); | ||
1092 | } | ||
1093 | |||
1094 | public static string MakeRequest(string verb, string requestUrl, string obj) | ||
1095 | { | ||
1096 | return MakeRequest(verb, requestUrl, obj, -1); | ||
1097 | } | ||
1098 | |||
1099 | public static string MakeRequest(string verb, string requestUrl, string obj, IServiceAuth auth) | 1078 | public static string MakeRequest(string verb, string requestUrl, string obj, IServiceAuth auth) |
1100 | { | 1079 | { |
1101 | return MakeRequest(verb, requestUrl, obj, -1, auth); | 1080 | return MakeRequest(verb, requestUrl, obj, -1, auth); |
@@ -1136,7 +1115,7 @@ namespace OpenSim.Framework | |||
1136 | /// Request timeout in milliseconds. Timeout.Infinite indicates no timeout. If 0 is passed then the default HttpWebRequest timeout is used (100 seconds) | 1115 | /// Request timeout in milliseconds. Timeout.Infinite indicates no timeout. If 0 is passed then the default HttpWebRequest timeout is used (100 seconds) |
1137 | /// </param> | 1116 | /// </param> |
1138 | /// <returns> | 1117 | /// <returns> |
1139 | /// The response. If there was an internal exception or the request timed out, | 1118 | /// The response. If there was an internal exception or the request timed out, |
1140 | /// then the default(TResponse) is returned. | 1119 | /// then the default(TResponse) is returned. |
1141 | /// </returns> | 1120 | /// </returns> |
1142 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout) | 1121 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout) |
@@ -1159,7 +1138,7 @@ namespace OpenSim.Framework | |||
1159 | /// </param> | 1138 | /// </param> |
1160 | /// <param name="maxConnections"></param> | 1139 | /// <param name="maxConnections"></param> |
1161 | /// <returns> | 1140 | /// <returns> |
1162 | /// The response. If there was an internal exception or the request timed out, | 1141 | /// The response. If there was an internal exception or the request timed out, |
1163 | /// then the default(TResponse) is returned. | 1142 | /// then the default(TResponse) is returned. |
1164 | /// </returns> | 1143 | /// </returns> |
1165 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout, int maxConnections) | 1144 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout, int maxConnections) |
@@ -1178,7 +1157,7 @@ namespace OpenSim.Framework | |||
1178 | /// </param> | 1157 | /// </param> |
1179 | /// <param name="maxConnections"></param> | 1158 | /// <param name="maxConnections"></param> |
1180 | /// <returns> | 1159 | /// <returns> |
1181 | /// The response. If there was an internal exception or the request timed out, | 1160 | /// The response. If there was an internal exception or the request timed out, |
1182 | /// then the default(TResponse) is returned. | 1161 | /// then the default(TResponse) is returned. |
1183 | /// </returns> | 1162 | /// </returns> |
1184 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout, int maxConnections, IServiceAuth auth) | 1163 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout, int maxConnections, IServiceAuth auth) |
@@ -1202,7 +1181,7 @@ namespace OpenSim.Framework | |||
1202 | auth.AddAuthorization(ht.Headers); | 1181 | auth.AddAuthorization(ht.Headers); |
1203 | 1182 | ||
1204 | if (pTimeout != 0) | 1183 | if (pTimeout != 0) |
1205 | ht.Timeout = pTimeout; | 1184 | request.Timeout = pTimeout; |
1206 | 1185 | ||
1207 | if (maxConnections > 0 && ht.ServicePoint.ConnectionLimit < maxConnections) | 1186 | if (maxConnections > 0 && ht.ServicePoint.ConnectionLimit < maxConnections) |
1208 | ht.ServicePoint.ConnectionLimit = maxConnections; | 1187 | ht.ServicePoint.ConnectionLimit = maxConnections; |
@@ -1283,18 +1262,24 @@ namespace OpenSim.Framework | |||
1283 | { | 1262 | { |
1284 | if (hwr.StatusCode == HttpStatusCode.NotFound) | 1263 | if (hwr.StatusCode == HttpStatusCode.NotFound) |
1285 | return deserial; | 1264 | return deserial; |
1265 | |||
1286 | if (hwr.StatusCode == HttpStatusCode.Unauthorized) | 1266 | if (hwr.StatusCode == HttpStatusCode.Unauthorized) |
1287 | { | 1267 | { |
1288 | m_log.Error(string.Format( | 1268 | m_log.ErrorFormat("[SynchronousRestObjectRequester]: Web request {0} requires authentication", |
1289 | "[SynchronousRestObjectRequester]: Web request {0} requires authentication ", | 1269 | requestUrl); |
1290 | requestUrl)); | 1270 | } |
1291 | return deserial; | 1271 | else |
1272 | { | ||
1273 | m_log.WarnFormat("[SynchronousRestObjectRequester]: Web request {0} returned error: {1}", | ||
1274 | requestUrl, hwr.StatusCode); | ||
1292 | } | 1275 | } |
1293 | } | 1276 | } |
1294 | else | 1277 | else |
1295 | m_log.Error(string.Format( | 1278 | m_log.ErrorFormat( |
1296 | "[SynchronousRestObjectRequester]: WebException for {0} {1} {2} ", | 1279 | "[SynchronousRestObjectRequester]: WebException for {0} {1} {2} {3}", |
1297 | verb, requestUrl, typeof(TResponse).ToString()), e); | 1280 | verb, requestUrl, typeof(TResponse).ToString(), e.Message); |
1281 | |||
1282 | return deserial; | ||
1298 | } | 1283 | } |
1299 | } | 1284 | } |
1300 | catch (System.InvalidOperationException) | 1285 | catch (System.InvalidOperationException) |
@@ -1344,7 +1329,6 @@ namespace OpenSim.Framework | |||
1344 | return deserial; | 1329 | return deserial; |
1345 | } | 1330 | } |
1346 | 1331 | ||
1347 | |||
1348 | public static class XMLResponseHelper | 1332 | public static class XMLResponseHelper |
1349 | { | 1333 | { |
1350 | public static TResponse LogAndDeserialize<TRequest, TResponse>(int reqnum, Stream respStream, long contentLength) | 1334 | public static TResponse LogAndDeserialize<TRequest, TResponse>(int reqnum, Stream respStream, long contentLength) |
@@ -1369,7 +1353,7 @@ namespace OpenSim.Framework | |||
1369 | } | 1353 | } |
1370 | } | 1354 | } |
1371 | 1355 | ||
1372 | 1356 | ||
1373 | public static class XMLRPCRequester | 1357 | public static class XMLRPCRequester |
1374 | { | 1358 | { |
1375 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 1359 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
@@ -1413,7 +1397,7 @@ namespace OpenSim.Framework | |||
1413 | { | 1397 | { |
1414 | m_log.Error("Error parsing XML-RPC response", e); | 1398 | m_log.Error("Error parsing XML-RPC response", e); |
1415 | } | 1399 | } |
1416 | 1400 | ||
1417 | if (Resp.IsFault) | 1401 | if (Resp.IsFault) |
1418 | { | 1402 | { |
1419 | m_log.DebugFormat( | 1403 | m_log.DebugFormat( |