aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--.nant/local.include1
-rw-r--r--OpenSim/Data/Null/NullRegionData.cs64
-rw-r--r--OpenSim/Framework/Console/ConsoleDisplayTable.cs15
-rw-r--r--OpenSim/Framework/Util.cs11
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs15
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs10
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs42
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs28
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/AssetsArchiver.cs7
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs18
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs3
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs96
-rw-r--r--OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs11
-rw-r--r--OpenSim/Region/CoreModules/World/Sun/SunModule.cs44
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs13
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs28
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs35
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs79
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Animations/AnimationsCommandModule.cs215
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs1
-rw-r--r--OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs14
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs122
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs29
-rw-r--r--OpenSim/Services/GridService/GridService.cs14
-rw-r--r--OpenSim/Services/GridService/HypergridLinker.cs2
-rw-r--r--doc/doxygen.conf1276
29 files changed, 741 insertions, 1466 deletions
diff --git a/.gitignore b/.gitignore
index fae7509..91e9be5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -98,3 +98,5 @@ OpenSim/Region/ScriptEngine/test-results/
98OpenSim/Tests/Common/test-results/ 98OpenSim/Tests/Common/test-results/
99OpenSim/Tests/test-results/ 99OpenSim/Tests/test-results/
100test-results/ 100test-results/
101doc/html
102doc/doxygen.error.log
diff --git a/.nant/local.include b/.nant/local.include
index 5185717..2339ce8 100644
--- a/.nant/local.include
+++ b/.nant/local.include
@@ -43,6 +43,7 @@
43 <delete dir="${distbindir}/Prebuild"/> 43 <delete dir="${distbindir}/Prebuild"/>
44 <delete dir="${distbindir}/%temp%"/> 44 <delete dir="${distbindir}/%temp%"/>
45 <delete dir="${distbindir}/.nant"/> 45 <delete dir="${distbindir}/.nant"/>
46 <delete dir="${distbindir}/ThirdParty"/>
46 <delete> 47 <delete>
47 <fileset basedir="${distbindir}"> 48 <fileset basedir="${distbindir}">
48 <include name="compile.bat"/> 49 <include name="compile.bat"/>
diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs
index b4d701a..f707d98 100644
--- a/OpenSim/Data/Null/NullRegionData.cs
+++ b/OpenSim/Data/Null/NullRegionData.cs
@@ -113,11 +113,14 @@ namespace OpenSim.Data.Null
113 // Find region data 113 // Find region data
114 List<RegionData> ret = new List<RegionData>(); 114 List<RegionData> ret = new List<RegionData>();
115 115
116 foreach (RegionData r in m_regionData.Values) 116 lock (m_regionData)
117 { 117 {
118// m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower()); 118 foreach (RegionData r in m_regionData.Values)
119 {
120 // m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower());
119 if (queryMatch(r.RegionName.ToLower())) 121 if (queryMatch(r.RegionName.ToLower()))
120 ret.Add(r); 122 ret.Add(r);
123 }
121 } 124 }
122 125
123 if (ret.Count > 0) 126 if (ret.Count > 0)
@@ -133,10 +136,13 @@ namespace OpenSim.Data.Null
133 136
134 List<RegionData> ret = new List<RegionData>(); 137 List<RegionData> ret = new List<RegionData>();
135 138
136 foreach (RegionData r in m_regionData.Values) 139 lock (m_regionData)
137 { 140 {
138 if (r.posX == posX && r.posY == posY) 141 foreach (RegionData r in m_regionData.Values)
139 ret.Add(r); 142 {
143 if (r.posX == posX && r.posY == posY)
144 ret.Add(r);
145 }
140 } 146 }
141 147
142 if (ret.Count > 0) 148 if (ret.Count > 0)
@@ -150,8 +156,11 @@ namespace OpenSim.Data.Null
150 if (m_useStaticInstance && Instance != this) 156 if (m_useStaticInstance && Instance != this)
151 return Instance.Get(regionID, scopeID); 157 return Instance.Get(regionID, scopeID);
152 158
153 if (m_regionData.ContainsKey(regionID)) 159 lock (m_regionData)
154 return m_regionData[regionID]; 160 {
161 if (m_regionData.ContainsKey(regionID))
162 return m_regionData[regionID];
163 }
155 164
156 return null; 165 return null;
157 } 166 }
@@ -163,10 +172,13 @@ namespace OpenSim.Data.Null
163 172
164 List<RegionData> ret = new List<RegionData>(); 173 List<RegionData> ret = new List<RegionData>();
165 174
166 foreach (RegionData r in m_regionData.Values) 175 lock (m_regionData)
167 { 176 {
168 if (r.posX >= startX && r.posX <= endX && r.posY >= startY && r.posY <= endY) 177 foreach (RegionData r in m_regionData.Values)
169 ret.Add(r); 178 {
179 if (r.posX >= startX && r.posX <= endX && r.posY >= startY && r.posY <= endY)
180 ret.Add(r);
181 }
170 } 182 }
171 183
172 return ret; 184 return ret;
@@ -180,7 +192,10 @@ namespace OpenSim.Data.Null
180// m_log.DebugFormat( 192// m_log.DebugFormat(
181// "[NULL REGION DATA]: Storing region {0} {1}, scope {2}", data.RegionName, data.RegionID, data.ScopeID); 193// "[NULL REGION DATA]: Storing region {0} {1}, scope {2}", data.RegionName, data.RegionID, data.ScopeID);
182 194
183 m_regionData[data.RegionID] = data; 195 lock (m_regionData)
196 {
197 m_regionData[data.RegionID] = data;
198 }
184 199
185 return true; 200 return true;
186 } 201 }
@@ -190,10 +205,13 @@ namespace OpenSim.Data.Null
190 if (m_useStaticInstance && Instance != this) 205 if (m_useStaticInstance && Instance != this)
191 return Instance.SetDataItem(regionID, item, value); 206 return Instance.SetDataItem(regionID, item, value);
192 207
193 if (!m_regionData.ContainsKey(regionID)) 208 lock (m_regionData)
194 return false; 209 {
210 if (!m_regionData.ContainsKey(regionID))
211 return false;
195 212
196 m_regionData[regionID].Data[item] = value; 213 m_regionData[regionID].Data[item] = value;
214 }
197 215
198 return true; 216 return true;
199 } 217 }
@@ -205,10 +223,13 @@ namespace OpenSim.Data.Null
205 223
206// m_log.DebugFormat("[NULL REGION DATA]: Deleting region {0}", regionID); 224// m_log.DebugFormat("[NULL REGION DATA]: Deleting region {0}", regionID);
207 225
208 if (!m_regionData.ContainsKey(regionID)) 226 lock (m_regionData)
209 return false; 227 {
228 if (!m_regionData.ContainsKey(regionID))
229 return false;
210 230
211 m_regionData.Remove(regionID); 231 m_regionData.Remove(regionID);
232 }
212 233
213 return true; 234 return true;
214 } 235 }
@@ -238,10 +259,13 @@ namespace OpenSim.Data.Null
238 259
239 List<RegionData> ret = new List<RegionData>(); 260 List<RegionData> ret = new List<RegionData>();
240 261
241 foreach (RegionData r in m_regionData.Values) 262 lock (m_regionData)
242 { 263 {
243 if ((Convert.ToInt32(r.Data["flags"]) & regionFlags) != 0) 264 foreach (RegionData r in m_regionData.Values)
244 ret.Add(r); 265 {
266 if ((Convert.ToInt32(r.Data["flags"]) & regionFlags) != 0)
267 ret.Add(r);
268 }
245 } 269 }
246 270
247 return ret; 271 return ret;
diff --git a/OpenSim/Framework/Console/ConsoleDisplayTable.cs b/OpenSim/Framework/Console/ConsoleDisplayTable.cs
index c620dfe..711a337 100644
--- a/OpenSim/Framework/Console/ConsoleDisplayTable.cs
+++ b/OpenSim/Framework/Console/ConsoleDisplayTable.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Framework.Console
56 public List<ConsoleDisplayTableRow> Rows { get; private set; } 56 public List<ConsoleDisplayTableRow> Rows { get; private set; }
57 57
58 /// <summary> 58 /// <summary>
59 /// Number of spaces to indent the table. 59 /// Number of spaces to indent the whole table.
60 /// </summary> 60 /// </summary>
61 public int Indent { get; set; } 61 public int Indent { get; set; }
62 62
@@ -84,7 +84,7 @@ namespace OpenSim.Framework.Console
84 Columns.Add(new ConsoleDisplayTableColumn(name, width)); 84 Columns.Add(new ConsoleDisplayTableColumn(name, width));
85 } 85 }
86 86
87 public void AddRow(params string[] cells) 87 public void AddRow(params object[] cells)
88 { 88 {
89 Rows.Add(new ConsoleDisplayTableRow(cells)); 89 Rows.Add(new ConsoleDisplayTableRow(cells));
90 } 90 }
@@ -113,7 +113,8 @@ namespace OpenSim.Framework.Console
113 113
114 for (int i = 0; i < Columns.Count; i++) 114 for (int i = 0; i < Columns.Count; i++)
115 { 115 {
116 formatSb.Append(' ', TableSpacing); 116 if (i != 0)
117 formatSb.Append(' ', TableSpacing);
117 118
118 // Can only do left formatting for now 119 // Can only do left formatting for now
119 formatSb.AppendFormat("{{{0},-{1}}}", i, Columns[i].Width); 120 formatSb.AppendFormat("{{{0},-{1}}}", i, Columns[i].Width);
@@ -139,16 +140,16 @@ namespace OpenSim.Framework.Console
139 140
140 public struct ConsoleDisplayTableRow 141 public struct ConsoleDisplayTableRow
141 { 142 {
142 public List<string> Cells { get; private set; } 143 public List<object> Cells { get; private set; }
143 144
144 public ConsoleDisplayTableRow(List<string> cells) : this() 145 public ConsoleDisplayTableRow(List<object> cells) : this()
145 { 146 {
146 Cells = cells; 147 Cells = cells;
147 } 148 }
148 149
149 public ConsoleDisplayTableRow(params string[] cells) : this() 150 public ConsoleDisplayTableRow(params object[] cells) : this()
150 { 151 {
151 Cells = new List<string>(cells); 152 Cells = new List<object>(cells);
152 } 153 }
153 } 154 }
154} \ No newline at end of file 155} \ No newline at end of file
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index e76ac24..c049247 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -2114,5 +2114,16 @@ namespace OpenSim.Framework
2114 return firstName + "." + lastName + " " + "@" + uri.Authority; 2114 return firstName + "." + lastName + " " + "@" + uri.Authority;
2115 } 2115 }
2116 #endregion 2116 #endregion
2117
2118 /// <summary>
2119 /// Escapes the special characters used in "LIKE".
2120 /// </summary>
2121 /// <remarks>
2122 /// For example: EscapeForLike("foo_bar%baz") = "foo\_bar\%baz"
2123 /// </remarks>
2124 public static string EscapeForLike(string str)
2125 {
2126 return str.Replace("_", "\\_").Replace("%", "\\%");
2127 }
2117 } 2128 }
2118} 2129}
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index acd156e..6323160 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -722,15 +722,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
722 722
723 if (!silent) 723 if (!silent)
724 { 724 {
725 // Killing it here will cause the client to deselect it 725 if (so.HasPrivateAttachmentPoint)
726 // It then reappears on the avatar, deselected
727 // through the full update below
728 //
729 if (so.IsSelected)
730 {
731 m_scene.SendKillObject(new List<uint> { so.RootPart.LocalId });
732 }
733 else if (so.HasPrivateAttachmentPoint)
734 { 726 {
735// m_log.DebugFormat( 727// m_log.DebugFormat(
736// "[ATTACHMENTS MODULE]: Killing private HUD {0} for avatars other than {1} at attachment point {2}", 728// "[ATTACHMENTS MODULE]: Killing private HUD {0} for avatars other than {1} at attachment point {2}",
@@ -745,7 +737,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
745 }); 737 });
746 } 738 }
747 739
748 so.IsSelected = false; // fudge.... 740 // Fudge below is an extremely unhelpful comment. It's probably here so that the scheduled full update
741 // will succeed, as that will not update if an attachment is selected.
742 so.IsSelected = false; // fudge....
743
749 so.ScheduleGroupForFullUpdate(); 744 so.ScheduleGroupForFullUpdate();
750 } 745 }
751 746
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
index d0e88f6..4c85637 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
@@ -124,7 +124,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
124 SaveAssets = true; 124 SaveAssets = true;
125 } 125 }
126 126
127 protected void ReceivedAllAssets(ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids) 127 protected void ReceivedAllAssets(ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids, bool timedOut)
128 { 128 {
129 Exception reportedException = null; 129 Exception reportedException = null;
130 bool succeeded = true; 130 bool succeeded = true;
@@ -143,6 +143,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
143 m_saveStream.Close(); 143 m_saveStream.Close();
144 } 144 }
145 145
146 if (timedOut)
147 {
148 succeeded = false;
149 reportedException = new Exception("Loading assets timed out");
150 }
151
146 m_module.TriggerInventoryArchiveSaved( 152 m_module.TriggerInventoryArchiveSaved(
147 m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException); 153 m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException);
148 } 154 }
@@ -350,7 +356,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
350 { 356 {
351 m_log.DebugFormat("[INVENTORY ARCHIVER]: Not saving assets since --noassets was specified"); 357 m_log.DebugFormat("[INVENTORY ARCHIVER]: Not saving assets since --noassets was specified");
352 358
353 ReceivedAllAssets(new List<UUID>(), new List<UUID>()); 359 ReceivedAllAssets(new List<UUID>(), new List<UUID>(), false);
354 } 360 }
355 } 361 }
356 catch (Exception) 362 catch (Exception)
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index 01f1c63..fcfdf7c 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -622,13 +622,18 @@ namespace OpenSim.Region.CoreModules.World.Archiver
622 /// <returns></returns> 622 /// <returns></returns>
623 private bool ResolveUserUuid(Scene scene, UUID uuid) 623 private bool ResolveUserUuid(Scene scene, UUID uuid)
624 { 624 {
625 if (!m_validUserUuids.ContainsKey(uuid)) 625 lock (m_validUserUuids)
626 { 626 {
627 UserAccount account = scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, uuid); 627 if (!m_validUserUuids.ContainsKey(uuid))
628 m_validUserUuids.Add(uuid, account != null); 628 {
629 } 629 // Note: we call GetUserAccount() inside the lock because this UserID is likely
630 // to occur many times, and we only want to query the users service once.
631 UserAccount account = scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, uuid);
632 m_validUserUuids.Add(uuid, account != null);
633 }
630 634
631 return m_validUserUuids[uuid]; 635 return m_validUserUuids[uuid];
636 }
632 } 637 }
633 638
634 /// <summary> 639 /// <summary>
@@ -641,19 +646,26 @@ namespace OpenSim.Region.CoreModules.World.Archiver
641 if (uuid == UUID.Zero) 646 if (uuid == UUID.Zero)
642 return true; // this means the object has no group 647 return true; // this means the object has no group
643 648
644 if (!m_validGroupUuids.ContainsKey(uuid)) 649 lock (m_validGroupUuids)
645 { 650 {
646 bool exists; 651 if (!m_validGroupUuids.ContainsKey(uuid))
647 652 {
648 if (m_groupsModule == null) 653 bool exists;
649 exists = false; 654 if (m_groupsModule == null)
650 else 655 {
651 exists = (m_groupsModule.GetGroupRecord(uuid) != null); 656 exists = false;
657 }
658 else
659 {
660 // Note: we call GetGroupRecord() inside the lock because this GroupID is likely
661 // to occur many times, and we only want to query the groups service once.
662 exists = (m_groupsModule.GetGroupRecord(uuid) != null);
663 }
664 m_validGroupUuids.Add(uuid, exists);
665 }
652 666
653 m_validGroupUuids.Add(uuid, exists); 667 return m_validGroupUuids[uuid];
654 } 668 }
655
656 return m_validGroupUuids[uuid];
657 } 669 }
658 670
659 /// Load an asset 671 /// Load an asset
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs
index 7bdd65c..367693d 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs
@@ -587,19 +587,29 @@ namespace OpenSim.Region.CoreModules.World.Archiver
587 } 587 }
588 } 588 }
589 589
590 protected void ReceivedAllAssets( 590 protected void ReceivedAllAssets(ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids, bool timedOut)
591 ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids)
592 { 591 {
593 foreach (UUID uuid in assetsNotFoundUuids) 592 string errorMessage;
593
594 if (timedOut)
594 { 595 {
595 m_log.DebugFormat("[ARCHIVER]: Could not find asset {0}", uuid); 596 errorMessage = "Loading assets timed out";
596 } 597 }
598 else
599 {
600 foreach (UUID uuid in assetsNotFoundUuids)
601 {
602 m_log.DebugFormat("[ARCHIVER]: Could not find asset {0}", uuid);
603 }
597 604
598 // m_log.InfoFormat( 605 // m_log.InfoFormat(
599 // "[ARCHIVER]: Received {0} of {1} assets requested", 606 // "[ARCHIVER]: Received {0} of {1} assets requested",
600 // assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count); 607 // assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count);
601 608
602 CloseArchive(String.Empty); 609 errorMessage = String.Empty;
610 }
611
612 CloseArchive(errorMessage);
603 } 613 }
604 614
605 /// <summary> 615 /// <summary>
@@ -626,4 +636,4 @@ namespace OpenSim.Region.CoreModules.World.Archiver
626 m_rootScene.EventManager.TriggerOarFileSaved(m_requestId, errorMessage); 636 m_rootScene.EventManager.TriggerOarFileSaved(m_requestId, errorMessage);
627 } 637 }
628 } 638 }
629} \ No newline at end of file 639}
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsArchiver.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsArchiver.cs
index 95d109c..c1ff94d 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/AssetsArchiver.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsArchiver.cs
@@ -150,12 +150,5 @@ namespace OpenSim.Region.CoreModules.World.Archiver
150 m_log.InfoFormat("[ARCHIVER]: Added {0} assets to archive", m_assetsWritten); 150 m_log.InfoFormat("[ARCHIVER]: Added {0} assets to archive", m_assetsWritten);
151 } 151 }
152 152
153 /// <summary>
154 /// Only call this if you need to force a close on the underlying writer.
155 /// </summary>
156 public void ForceClose()
157 {
158 m_archiveWriter.Close();
159 }
160 } 153 }
161} 154}
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
index e2f8833..715bf51 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
@@ -50,7 +50,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
50 /// Method called when all the necessary assets for an archive request have been received. 50 /// Method called when all the necessary assets for an archive request have been received.
51 /// </summary> 51 /// </summary>
52 public delegate void AssetsRequestCallback( 52 public delegate void AssetsRequestCallback(
53 ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids); 53 ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids, bool timedOut);
54 54
55 enum RequestState 55 enum RequestState
56 { 56 {
@@ -148,7 +148,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
148 if (m_repliesRequired == 0) 148 if (m_repliesRequired == 0)
149 { 149 {
150 m_requestState = RequestState.Completed; 150 m_requestState = RequestState.Completed;
151 PerformAssetsRequestCallback(null); 151 PerformAssetsRequestCallback(false);
152 return; 152 return;
153 } 153 }
154 154
@@ -164,7 +164,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
164 164
165 protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args) 165 protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args)
166 { 166 {
167 bool close = true; 167 bool timedOut = true;
168 168
169 try 169 try
170 { 170 {
@@ -174,7 +174,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
174 // the final request came in (assuming that such a thing is possible) 174 // the final request came in (assuming that such a thing is possible)
175 if (m_requestState == RequestState.Completed) 175 if (m_requestState == RequestState.Completed)
176 { 176 {
177 close = false; 177 timedOut = false;
178 return; 178 return;
179 } 179 }
180 180
@@ -223,8 +223,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
223 } 223 }
224 finally 224 finally
225 { 225 {
226 if (close) 226 if (timedOut)
227 m_assetsArchiver.ForceClose(); 227 Util.FireAndForget(PerformAssetsRequestCallback, true);
228 } 228 }
229 } 229 }
230 230
@@ -290,7 +290,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
290 290
291 // We want to stop using the asset cache thread asap 291 // We want to stop using the asset cache thread asap
292 // as we now need to do the work of producing the rest of the archive 292 // as we now need to do the work of producing the rest of the archive
293 Util.FireAndForget(PerformAssetsRequestCallback); 293 Util.FireAndForget(PerformAssetsRequestCallback, false);
294 } 294 }
295 else 295 else
296 { 296 {
@@ -311,9 +311,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
311 { 311 {
312 Culture.SetCurrentCulture(); 312 Culture.SetCurrentCulture();
313 313
314 Boolean timedOut = (Boolean)o;
315
314 try 316 try
315 { 317 {
316 m_assetsRequestCallback(m_foundAssetUuids, m_notFoundAssetUuids); 318 m_assetsRequestCallback(m_foundAssetUuids, m_notFoundAssetUuids, timedOut);
317 } 319 }
318 catch (Exception e) 320 catch (Exception e)
319 { 321 {
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index 267332d..9aee491 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -128,7 +128,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
128 { 128 {
129 uint sun = 0; 129 uint sun = 0;
130 130
131 if (!Scene.RegionInfo.EstateSettings.UseGlobalTime) 131 if (Scene.RegionInfo.EstateSettings.FixedSun)
132 sun = (uint)(Scene.RegionInfo.EstateSettings.SunPosition * 1024.0) + 0x1800; 132 sun = (uint)(Scene.RegionInfo.EstateSettings.SunPosition * 1024.0) + 0x1800;
133 UUID estateOwner; 133 UUID estateOwner;
134 estateOwner = Scene.RegionInfo.EstateSettings.EstateOwner; 134 estateOwner = Scene.RegionInfo.EstateSettings.EstateOwner;
@@ -1128,6 +1128,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
1128 { 1128 {
1129 Scene.RegionInfo.EstateSettings.UseGlobalTime = false; 1129 Scene.RegionInfo.EstateSettings.UseGlobalTime = false;
1130 Scene.RegionInfo.EstateSettings.SunPosition = (parms2 - 0x1800)/1024.0; 1130 Scene.RegionInfo.EstateSettings.SunPosition = (parms2 - 0x1800)/1024.0;
1131 // Warning: FixedSun should be set to True, otherwise this sun position won't be used.
1131 } 1132 }
1132 1133
1133 if ((parms1 & 0x00000010) != 0) 1134 if ((parms1 & 0x00000010) != 0)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 281c143..b4f7d51 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -141,6 +141,7 @@ namespace OpenSim.Region.CoreModules.World.Land
141 m_scene.EventManager.OnValidateLandBuy += EventManagerOnValidateLandBuy; 141 m_scene.EventManager.OnValidateLandBuy += EventManagerOnValidateLandBuy;
142 m_scene.EventManager.OnLandBuy += EventManagerOnLandBuy; 142 m_scene.EventManager.OnLandBuy += EventManagerOnLandBuy;
143 m_scene.EventManager.OnNewClient += EventManagerOnNewClient; 143 m_scene.EventManager.OnNewClient += EventManagerOnNewClient;
144 m_scene.EventManager.OnMakeChildAgent += EventMakeChildAgent;
144 m_scene.EventManager.OnSignificantClientMovement += EventManagerOnSignificantClientMovement; 145 m_scene.EventManager.OnSignificantClientMovement += EventManagerOnSignificantClientMovement;
145 m_scene.EventManager.OnNoticeNoLandDataFromStorage += EventManagerOnNoLandDataFromStorage; 146 m_scene.EventManager.OnNoticeNoLandDataFromStorage += EventManagerOnNoLandDataFromStorage;
146 m_scene.EventManager.OnIncomingLandDataFromStorage += EventManagerOnIncomingLandDataFromStorage; 147 m_scene.EventManager.OnIncomingLandDataFromStorage += EventManagerOnIncomingLandDataFromStorage;
@@ -221,6 +222,11 @@ namespace OpenSim.Region.CoreModules.World.Land
221 } 222 }
222 } 223 }
223 224
225 public void EventMakeChildAgent(ScenePresence avatar)
226 {
227 avatar.currentParcelUUID = UUID.Zero;
228 }
229
224 void ClientOnPreAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 230 void ClientOnPreAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
225 { 231 {
226 } 232 }
@@ -249,17 +255,15 @@ namespace OpenSim.Region.CoreModules.World.Land
249 newData.LocalID = local_id; 255 newData.LocalID = local_id;
250 ILandObject landobj = null; 256 ILandObject landobj = null;
251 257
258 ILandObject land;
252 lock (m_landList) 259 lock (m_landList)
253 { 260 {
254 if (m_landList.ContainsKey(local_id)) 261 if (m_landList.TryGetValue(local_id, out land))
255 { 262 land.LandData = newData;
256 m_landList[local_id].LandData = newData;
257 landobj = m_landList[local_id];
258// m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
259 }
260 } 263 }
261 if(landobj != null) 264
262 m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, landobj); 265 if (land != null)
266 m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, land);
263 } 267 }
264 268
265 public bool AllowedForcefulBans 269 public bool AllowedForcefulBans
@@ -584,7 +588,7 @@ namespace OpenSim.Region.CoreModules.World.Land
584 // Only now can we add the prim counts to the land object - we rely on the global ID which is generated 588 // Only now can we add the prim counts to the land object - we rely on the global ID which is generated
585 // as a random UUID inside LandData initialization 589 // as a random UUID inside LandData initialization
586 if (m_primCountModule != null) 590 if (m_primCountModule != null)
587 new_land.PrimCounts = m_primCountModule.GetPrimCounts(new_land.LandData.GlobalID); 591 new_land.PrimCounts = m_primCountModule.GetPrimCounts(new_land.LandData.GlobalID);
588 592
589 lock (m_landList) 593 lock (m_landList)
590 { 594 {
@@ -621,6 +625,7 @@ namespace OpenSim.Region.CoreModules.World.Land
621 /// <param name="local_id">Land.localID of the peice of land to remove.</param> 625 /// <param name="local_id">Land.localID of the peice of land to remove.</param>
622 public void removeLandObject(int local_id) 626 public void removeLandObject(int local_id)
623 { 627 {
628 ILandObject land;
624 lock (m_landList) 629 lock (m_landList)
625 { 630 {
626 for (int x = 0; x < 64; x++) 631 for (int x = 0; x < 64; x++)
@@ -637,9 +642,11 @@ namespace OpenSim.Region.CoreModules.World.Land
637 } 642 }
638 } 643 }
639 644
640 m_scene.EventManager.TriggerLandObjectRemoved(m_landList[local_id].LandData.GlobalID); 645 land = m_landList[local_id];
641 m_landList.Remove(local_id); 646 m_landList.Remove(local_id);
642 } 647 }
648
649 m_scene.EventManager.TriggerLandObjectRemoved(land.LandData.GlobalID);
643 } 650 }
644 651
645 /// <summary> 652 /// <summary>
@@ -1399,25 +1406,72 @@ namespace OpenSim.Region.CoreModules.World.Land
1399 1406
1400 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) 1407 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient)
1401 { 1408 {
1402 ILandObject selectedParcel = null; 1409 if (localID != -1)
1403 lock (m_landList)
1404 { 1410 {
1405 m_landList.TryGetValue(localID, out selectedParcel); 1411 ILandObject selectedParcel = null;
1412 lock (m_landList)
1413 {
1414 m_landList.TryGetValue(localID, out selectedParcel);
1415 }
1416
1417 if (selectedParcel == null)
1418 return;
1419
1420 selectedParcel.ReturnLandObjects(returnType, agentIDs, taskIDs, remoteClient);
1406 } 1421 }
1422 else
1423 {
1424 if (returnType != 1)
1425 {
1426 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: ReturnObjectsInParcel: unknown return type {0}", returnType);
1427 return;
1428 }
1407 1429
1408 if (selectedParcel == null) return; 1430 // We get here when the user returns objects from the list of Top Colliders or Top Scripts.
1431 // In that case we receive specific object UUID's, but no parcel ID.
1409 1432
1410 selectedParcel.ReturnLandObjects(returnType, agentIDs, taskIDs, remoteClient); 1433 Dictionary<UUID, HashSet<SceneObjectGroup>> returns = new Dictionary<UUID, HashSet<SceneObjectGroup>>();
1434
1435 foreach (UUID groupID in taskIDs)
1436 {
1437 SceneObjectGroup obj = m_scene.GetSceneObjectGroup(groupID);
1438 if (obj != null)
1439 {
1440 if (!returns.ContainsKey(obj.OwnerID))
1441 returns[obj.OwnerID] = new HashSet<SceneObjectGroup>();
1442 returns[obj.OwnerID].Add(obj);
1443 }
1444 else
1445 {
1446 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: ReturnObjectsInParcel: unknown object {0}", groupID);
1447 }
1448 }
1449
1450 int num = 0;
1451 foreach (HashSet<SceneObjectGroup> objs in returns.Values)
1452 num += objs.Count;
1453 m_log.DebugFormat("[LAND MANAGEMENT MODULE]: Returning {0} specific object(s)", num);
1454
1455 foreach (HashSet<SceneObjectGroup> objs in returns.Values)
1456 {
1457 List<SceneObjectGroup> objs2 = new List<SceneObjectGroup>(objs);
1458 if (m_scene.Permissions.CanReturnObjects(null, remoteClient.AgentId, objs2))
1459 {
1460 m_scene.returnObjects(objs2.ToArray(), remoteClient.AgentId);
1461 }
1462 else
1463 {
1464 m_log.WarnFormat("[LAND MANAGEMENT MODULE]: ReturnObjectsInParcel: not permitted to return {0} object(s) belonging to user {1}",
1465 objs2.Count, objs2[0].OwnerID);
1466 }
1467 }
1468 }
1411 } 1469 }
1412 1470
1413 public void EventManagerOnNoLandDataFromStorage() 1471 public void EventManagerOnNoLandDataFromStorage()
1414 { 1472 {
1415 // called methods already have locks 1473 ResetSimLandObjects();
1416// lock (m_landList) 1474 CreateDefaultParcel();
1417 {
1418 ResetSimLandObjects();
1419 CreateDefaultParcel();
1420 }
1421 } 1475 }
1422 1476
1423 #endregion 1477 #endregion
diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
index 55b8227..771fdd2 100644
--- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
@@ -490,11 +490,14 @@ namespace OpenSim.Region.CoreModules.World.Land
490 490
491 m_Scene.ForEachSOG(AddObject); 491 m_Scene.ForEachSOG(AddObject);
492 492
493 List<UUID> primcountKeys = new List<UUID>(m_PrimCounts.Keys); 493 lock (m_PrimCounts)
494 foreach (UUID k in primcountKeys)
495 { 494 {
496 if (!m_OwnerMap.ContainsKey(k)) 495 List<UUID> primcountKeys = new List<UUID>(m_PrimCounts.Keys);
497 m_PrimCounts.Remove(k); 496 foreach (UUID k in primcountKeys)
497 {
498 if (!m_OwnerMap.ContainsKey(k))
499 m_PrimCounts.Remove(k);
500 }
498 } 501 }
499 502
500 m_Tainted = false; 503 m_Tainted = false;
diff --git a/OpenSim/Region/CoreModules/World/Sun/SunModule.cs b/OpenSim/Region/CoreModules/World/Sun/SunModule.cs
index a321c09..6f344c8 100644
--- a/OpenSim/Region/CoreModules/World/Sun/SunModule.cs
+++ b/OpenSim/Region/CoreModules/World/Sun/SunModule.cs
@@ -252,12 +252,11 @@ namespace OpenSim.Region.CoreModules
252 } 252 }
253 253
254 // TODO: Decouple this, so we can get rid of Linden Hour info 254 // TODO: Decouple this, so we can get rid of Linden Hour info
255 // Update Region infor with new Sun Position and Hour 255 // Update Region with new Sun Vector
256 // set estate settings for region access to sun position 256 // set estate settings for region access to sun position
257 if (receivedEstateToolsSunUpdate) 257 if (receivedEstateToolsSunUpdate)
258 { 258 {
259 m_scene.RegionInfo.RegionSettings.SunVector = Position; 259 m_scene.RegionInfo.RegionSettings.SunVector = Position;
260 m_scene.RegionInfo.RegionSettings.SunPosition = GetCurrentTimeAsLindenSunHour();
261 } 260 }
262 } 261 }
263 262
@@ -395,7 +394,7 @@ namespace OpenSim.Region.CoreModules
395 ready = false; 394 ready = false;
396 395
397 // Remove our hooks 396 // Remove our hooks
398 m_scene.EventManager.OnFrame -= SunUpdate; 397 m_scene.EventManager.OnFrame -= SunUpdate;
399 m_scene.EventManager.OnAvatarEnteringNewParcel -= AvatarEnteringParcel; 398 m_scene.EventManager.OnAvatarEnteringNewParcel -= AvatarEnteringParcel;
400 m_scene.EventManager.OnEstateToolsSunUpdate -= EstateToolsSunUpdate; 399 m_scene.EventManager.OnEstateToolsSunUpdate -= EstateToolsSunUpdate;
401 m_scene.EventManager.OnGetCurrentTimeAsLindenSunHour -= GetCurrentTimeAsLindenSunHour; 400 m_scene.EventManager.OnGetCurrentTimeAsLindenSunHour -= GetCurrentTimeAsLindenSunHour;
@@ -459,26 +458,33 @@ namespace OpenSim.Region.CoreModules
459 SunToClient(avatar.ControllingClient); 458 SunToClient(avatar.ControllingClient);
460 } 459 }
461 460
462 /// <summary> 461 public void EstateToolsSunUpdate(ulong regionHandle)
463 ///
464 /// </summary>
465 /// <param name="regionHandle"></param>
466 /// <param name="FixedTime">Is the sun's position fixed?</param>
467 /// <param name="useEstateTime">Use the Region or Estate Sun hour?</param>
468 /// <param name="FixedSunHour">What hour of the day is the Sun Fixed at?</param>
469 public void EstateToolsSunUpdate(ulong regionHandle, bool FixedSun, bool useEstateTime, float FixedSunHour)
470 { 462 {
471 if (m_scene.RegionInfo.RegionHandle == regionHandle) 463 if (m_scene.RegionInfo.RegionHandle == regionHandle)
472 { 464 {
473 // Must limit the Sun Hour to 0 ... 24 465 float sunFixedHour;
474 while (FixedSunHour > 24.0f) 466 bool fixedSun;
475 FixedSunHour -= 24;
476 467
477 while (FixedSunHour < 0) 468 if (m_scene.RegionInfo.RegionSettings.UseEstateSun)
478 FixedSunHour += 24; 469 {
470 sunFixedHour = (float)m_scene.RegionInfo.EstateSettings.SunPosition;
471 fixedSun = m_scene.RegionInfo.EstateSettings.FixedSun;
472 }
473 else
474 {
475 sunFixedHour = (float)m_scene.RegionInfo.RegionSettings.SunPosition - 6.0f;
476 fixedSun = m_scene.RegionInfo.RegionSettings.FixedSun;
477 }
478
479 // Must limit the Sun Hour to 0 ... 24
480 while (sunFixedHour > 24.0f)
481 sunFixedHour -= 24;
479 482
480 m_SunFixedHour = FixedSunHour; 483 while (sunFixedHour < 0)
481 m_SunFixed = FixedSun; 484 sunFixedHour += 24;
485
486 m_SunFixedHour = sunFixedHour;
487 m_SunFixed = fixedSun;
482 488
483 // m_log.DebugFormat("[SUN]: Sun Settings Update: Fixed Sun? : {0}", m_SunFixed.ToString()); 489 // m_log.DebugFormat("[SUN]: Sun Settings Update: Fixed Sun? : {0}", m_SunFixed.ToString());
484 // m_log.DebugFormat("[SUN]: Sun Settings Update: Sun Hour : {0}", m_SunFixedHour.ToString()); 490 // m_log.DebugFormat("[SUN]: Sun Settings Update: Sun Hour : {0}", m_SunFixedHour.ToString());
@@ -501,7 +507,7 @@ namespace OpenSim.Region.CoreModules
501 { 507 {
502 m_scene.ForEachRootClient(delegate(IClientAPI client) 508 m_scene.ForEachRootClient(delegate(IClientAPI client)
503 { 509 {
504 SunToClient(client); 510 SunToClient(client);
505 }); 511 });
506 } 512 }
507 513
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index 33aabe4..4d738a5 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -480,7 +480,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
480 else 480 else
481 { 481 {
482 m_plugineffects[pluginName] = effect; 482 m_plugineffects[pluginName] = effect;
483 m_log.Warn("E ... " + pluginName + " (Replaced)"); 483 m_log.Info("E ... " + pluginName + " (Replaced)");
484 } 484 }
485 } 485 }
486 } 486 }
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 5b1c9f4..ac5f433 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -755,7 +755,7 @@ namespace OpenSim.Region.Framework.Scenes
755 public event ScriptTimerEvent OnScriptTimerEvent; 755 public event ScriptTimerEvent OnScriptTimerEvent;
756 */ 756 */
757 757
758 public delegate void EstateToolsSunUpdate(ulong regionHandle, bool FixedTime, bool EstateSun, float LindenHour); 758 public delegate void EstateToolsSunUpdate(ulong regionHandle);
759 public delegate void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID); 759 public delegate void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID);
760 760
761 public event EstateToolsSunUpdate OnEstateToolsSunUpdate; 761 public event EstateToolsSunUpdate OnEstateToolsSunUpdate;
@@ -2536,13 +2536,10 @@ namespace OpenSim.Region.Framework.Scenes
2536 } 2536 }
2537 2537
2538 /// <summary> 2538 /// <summary>
2539 /// Updates the system as to how the position of the sun should be handled. 2539 /// Called when the sun's position parameters have changed in the Region and/or Estate
2540 /// </summary> 2540 /// </summary>
2541 /// <param name="regionHandle"></param> 2541 /// <param name="regionHandle">The region that changed</param>
2542 /// <param name="FixedTime">True if the Sun Position is fixed</param> 2542 public void TriggerEstateToolsSunUpdate(ulong regionHandle)
2543 /// <param name="useEstateTime">True if the Estate Settings should be used instead of region</param>
2544 /// <param name="FixedSunHour">The hour 0.0 <= FixedSunHour <= 24.0 at which the sun is fixed at. Sun Hour 0 is sun-rise, when Day/Night ratio is 1:1</param>
2545 public void TriggerEstateToolsSunUpdate(ulong regionHandle, bool FixedTime, bool useEstateTime, float FixedSunHour)
2546 { 2543 {
2547 EstateToolsSunUpdate handlerEstateToolsSunUpdate = OnEstateToolsSunUpdate; 2544 EstateToolsSunUpdate handlerEstateToolsSunUpdate = OnEstateToolsSunUpdate;
2548 if (handlerEstateToolsSunUpdate != null) 2545 if (handlerEstateToolsSunUpdate != null)
@@ -2551,7 +2548,7 @@ namespace OpenSim.Region.Framework.Scenes
2551 { 2548 {
2552 try 2549 try
2553 { 2550 {
2554 d(regionHandle, FixedTime, useEstateTime, FixedSunHour); 2551 d(regionHandle);
2555 } 2552 }
2556 catch (Exception e) 2553 catch (Exception e)
2557 { 2554 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2a1949d..54e3b2d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -5619,33 +5619,7 @@ Environment.Exit(1);
5619 5619
5620 public void TriggerEstateSunUpdate() 5620 public void TriggerEstateSunUpdate()
5621 { 5621 {
5622 float sun; 5622 EventManager.TriggerEstateToolsSunUpdate(RegionInfo.RegionHandle);
5623 if (RegionInfo.RegionSettings.UseEstateSun)
5624 {
5625 sun = (float)RegionInfo.EstateSettings.SunPosition;
5626 if (RegionInfo.EstateSettings.UseGlobalTime)
5627 {
5628 sun = EventManager.GetCurrentTimeAsSunLindenHour() - 6.0f;
5629 }
5630
5631 //
5632 EventManager.TriggerEstateToolsSunUpdate(
5633 RegionInfo.RegionHandle,
5634 RegionInfo.EstateSettings.FixedSun,
5635 RegionInfo.RegionSettings.UseEstateSun,
5636 sun);
5637 }
5638 else
5639 {
5640 // Use the Sun Position from the Region Settings
5641 sun = (float)RegionInfo.RegionSettings.SunPosition - 6.0f;
5642
5643 EventManager.TriggerEstateToolsSunUpdate(
5644 RegionInfo.RegionHandle,
5645 RegionInfo.RegionSettings.FixedSun,
5646 RegionInfo.RegionSettings.UseEstateSun,
5647 sun);
5648 }
5649 } 5623 }
5650 5624
5651 private void HandleReloadEstate(string module, string[] cmd) 5625 private void HandleReloadEstate(string module, string[] cmd)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 1fc8d3d..7490ac8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -945,6 +945,18 @@ namespace OpenSim.Region.Framework.Scenes
945 /// </remarks> 945 /// </remarks>
946 public UUID FromFolderID { get; set; } 946 public UUID FromFolderID { get; set; }
947 947
948 /// <summary>
949 /// IDs of all avatars sat on this scene object.
950 /// </summary>
951 /// <remarks>
952 /// We need this so that we can maintain a linkset wide ordering of avatars sat on different parts.
953 /// This must be locked before it is read or written.
954 /// SceneObjectPart sitting avatar add/remove code also locks on this object to avoid race conditions.
955 /// No avatar should appear more than once in this list.
956 /// Do not manipulate this list directly - use the Add/Remove sitting avatar methods on SceneObjectPart.
957 /// </remarks>
958 protected internal List<UUID> m_sittingAvatars = new List<UUID>();
959
948 #endregion 960 #endregion
949 961
950// ~SceneObjectGroup() 962// ~SceneObjectGroup()
@@ -4523,17 +4535,28 @@ namespace OpenSim.Region.Framework.Scenes
4523 } 4535 }
4524 4536
4525 /// <summary> 4537 /// <summary>
4538 /// Get a copy of the list of sitting avatars on all prims of this object.
4539 /// </summary>
4540 /// <remarks>
4541 /// This is sorted by the order in which avatars sat down. If an avatar stands up then all avatars that sat
4542 /// down after it move one place down the list.
4543 /// </remarks>
4544 /// <returns>A list of the sitting avatars. Returns an empty list if there are no sitting avatars.</returns>
4545 public List<UUID> GetSittingAvatars()
4546 {
4547 lock (m_sittingAvatars)
4548 return new List<UUID>(m_sittingAvatars);
4549 }
4550
4551 /// <summary>
4526 /// Gets the number of sitting avatars. 4552 /// Gets the number of sitting avatars.
4527 /// </summary> 4553 /// </summary>
4528 /// <remarks>This applies to all sitting avatars whether there is a sit target set or not.</remarks> 4554 /// <remarks>This applies to all sitting avatars whether there is a sit target set or not.</remarks>
4529 /// <returns></returns> 4555 /// <returns></returns>
4530 public int GetSittingAvatarsCount() 4556 public int GetSittingAvatarsCount()
4531 { 4557 {
4532 int count = 0; 4558 lock (m_sittingAvatars)
4533 4559 return m_sittingAvatars.Count;
4534 Array.ForEach<SceneObjectPart>(m_parts.GetArray(), p => count += p.GetSittingAvatarsCount());
4535
4536 return count;
4537 } 4560 }
4538 4561
4539 public override string ToString() 4562 public override string ToString()
@@ -4542,7 +4565,7 @@ namespace OpenSim.Region.Framework.Scenes
4542 } 4565 }
4543 4566
4544 #region ISceneObject 4567 #region ISceneObject
4545 4568
4546 public virtual ISceneObject CloneForNewScene() 4569 public virtual ISceneObject CloneForNewScene()
4547 { 4570 {
4548 SceneObjectGroup sog = Copy(false); 4571 SceneObjectGroup sog = Copy(false);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 143a339..e68793a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1342,7 +1342,7 @@ namespace OpenSim.Region.Framework.Scenes
1342 public UUID SitTargetAvatar { get; set; } 1342 public UUID SitTargetAvatar { get; set; }
1343 1343
1344 /// <summary> 1344 /// <summary>
1345 /// IDs of all avatars start on this object part. 1345 /// IDs of all avatars sat on this part.
1346 /// </summary> 1346 /// </summary>
1347 /// <remarks> 1347 /// <remarks>
1348 /// We need to track this so that we can stop sat upon prims from being attached. 1348 /// We need to track this so that we can stop sat upon prims from being attached.
@@ -5196,18 +5196,22 @@ namespace OpenSim.Region.Framework.Scenes
5196 /// <param name='avatarId'></param> 5196 /// <param name='avatarId'></param>
5197 protected internal bool AddSittingAvatar(UUID avatarId) 5197 protected internal bool AddSittingAvatar(UUID avatarId)
5198 { 5198 {
5199 if (IsSitTargetSet && SitTargetAvatar == UUID.Zero) 5199 lock (ParentGroup.m_sittingAvatars)
5200 SitTargetAvatar = avatarId; 5200 {
5201 if (IsSitTargetSet && SitTargetAvatar == UUID.Zero)
5202 SitTargetAvatar = avatarId;
5201 5203
5202 HashSet<UUID> sittingAvatars = m_sittingAvatars; 5204 if (m_sittingAvatars == null)
5205 m_sittingAvatars = new HashSet<UUID>();
5203 5206
5204 if (sittingAvatars == null) 5207 if (m_sittingAvatars.Add(avatarId))
5205 sittingAvatars = new HashSet<UUID>(); 5208 {
5209 ParentGroup.m_sittingAvatars.Add(avatarId);
5206 5210
5207 lock (sittingAvatars) 5211 return true;
5208 { 5212 }
5209 m_sittingAvatars = sittingAvatars; 5213
5210 return m_sittingAvatars.Add(avatarId); 5214 return false;
5211 } 5215 }
5212 } 5216 }
5213 5217
@@ -5221,27 +5225,26 @@ namespace OpenSim.Region.Framework.Scenes
5221 /// <param name='avatarId'></param> 5225 /// <param name='avatarId'></param>
5222 protected internal bool RemoveSittingAvatar(UUID avatarId) 5226 protected internal bool RemoveSittingAvatar(UUID avatarId)
5223 { 5227 {
5224 if (SitTargetAvatar == avatarId) 5228 lock (ParentGroup.m_sittingAvatars)
5225 SitTargetAvatar = UUID.Zero; 5229 {
5226 5230 if (SitTargetAvatar == avatarId)
5227 HashSet<UUID> sittingAvatars = m_sittingAvatars; 5231 SitTargetAvatar = UUID.Zero;
5228 5232
5229 // This can occur under a race condition where another thread 5233 if (m_sittingAvatars == null)
5230 if (sittingAvatars == null) 5234 return false;
5231 return false;
5232 5235
5233 lock (sittingAvatars) 5236 if (m_sittingAvatars.Remove(avatarId))
5234 {
5235 if (sittingAvatars.Remove(avatarId))
5236 { 5237 {
5237 if (sittingAvatars.Count == 0) 5238 if (m_sittingAvatars.Count == 0)
5238 m_sittingAvatars = null; 5239 m_sittingAvatars = null;
5239 5240
5241 ParentGroup.m_sittingAvatars.Remove(avatarId);
5242
5240 return true; 5243 return true;
5241 } 5244 }
5242 }
5243 5245
5244 return false; 5246 return false;
5247 }
5245 } 5248 }
5246 5249
5247 /// <summary> 5250 /// <summary>
@@ -5251,16 +5254,12 @@ namespace OpenSim.Region.Framework.Scenes
5251 /// <returns>A hashset of the sitting avatars. Returns null if there are no sitting avatars.</returns> 5254 /// <returns>A hashset of the sitting avatars. Returns null if there are no sitting avatars.</returns>
5252 public HashSet<UUID> GetSittingAvatars() 5255 public HashSet<UUID> GetSittingAvatars()
5253 { 5256 {
5254 HashSet<UUID> sittingAvatars = m_sittingAvatars; 5257 lock (ParentGroup.m_sittingAvatars)
5255
5256 if (sittingAvatars == null)
5257 { 5258 {
5258 return null; 5259 if (m_sittingAvatars == null)
5259 } 5260 return null;
5260 else 5261 else
5261 { 5262 return new HashSet<UUID>(m_sittingAvatars);
5262 lock (sittingAvatars)
5263 return new HashSet<UUID>(sittingAvatars);
5264 } 5263 }
5265 } 5264 }
5266 5265
@@ -5271,13 +5270,13 @@ namespace OpenSim.Region.Framework.Scenes
5271 /// <returns></returns> 5270 /// <returns></returns>
5272 public int GetSittingAvatarsCount() 5271 public int GetSittingAvatarsCount()
5273 { 5272 {
5274 HashSet<UUID> sittingAvatars = m_sittingAvatars; 5273 lock (ParentGroup.m_sittingAvatars)
5275 5274 {
5276 if (sittingAvatars == null) 5275 if (m_sittingAvatars == null)
5277 return 0; 5276 return 0;
5278 5277 else
5279 lock (sittingAvatars) 5278 return m_sittingAvatars.Count;
5280 return sittingAvatars.Count; 5279 }
5281 } 5280 }
5282 } 5281 }
5283} 5282} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Avatar/Animations/AnimationsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Animations/AnimationsCommandModule.cs
new file mode 100644
index 0000000..e951d9e
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Avatar/Animations/AnimationsCommandModule.cs
@@ -0,0 +1,215 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Reflection;
32using System.Text;
33using log4net;
34using Mono.Addins;
35using Nini.Config;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Framework.Console;
39using OpenSim.Framework.Monitoring;
40using OpenSim.Region.ClientStack.LindenUDP;
41using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Region.Framework.Scenes.Animation;
44using OpenSim.Services.Interfaces;
45
46namespace OpenSim.Region.OptionalModules.Avatar.Animations
47{
48 /// <summary>
49 /// A module that just holds commands for inspecting avatar animations.
50 /// </summary>
51 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AnimationsCommandModule")]
52 public class AnimationsCommandModule : ISharedRegionModule
53 {
54// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55
56 private List<Scene> m_scenes = new List<Scene>();
57
58 public string Name { get { return "Animations Command Module"; } }
59
60 public Type ReplaceableInterface { get { return null; } }
61
62 public void Initialise(IConfigSource source)
63 {
64// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: INITIALIZED MODULE");
65 }
66
67 public void PostInitialise()
68 {
69// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: POST INITIALIZED MODULE");
70 }
71
72 public void Close()
73 {
74// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: CLOSED MODULE");
75 }
76
77 public void AddRegion(Scene scene)
78 {
79// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
80 }
81
82 public void RemoveRegion(Scene scene)
83 {
84// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
85
86 lock (m_scenes)
87 m_scenes.Remove(scene);
88 }
89
90 public void RegionLoaded(Scene scene)
91 {
92// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
93
94 lock (m_scenes)
95 m_scenes.Add(scene);
96
97 scene.AddCommand(
98 "Users", this, "show animations",
99 "show animations [<first-name> <last-name>]",
100 "Show animation information for avatars in this simulator.",
101 "If no name is supplied then information for all avatars is shown.\n"
102 + "Please note that for inventory animations, the animation name is the name under which the animation was originally uploaded\n"
103 + ", which is not necessarily the current inventory name.",
104 HandleShowAnimationsCommand);
105 }
106
107 protected void HandleShowAnimationsCommand(string module, string[] cmd)
108 {
109 if (cmd.Length != 2 && cmd.Length < 4)
110 {
111 MainConsole.Instance.OutputFormat("Usage: show animations [<first-name> <last-name>]");
112 return;
113 }
114
115 bool targetNameSupplied = false;
116 string optionalTargetFirstName = null;
117 string optionalTargetLastName = null;
118
119 if (cmd.Length >= 4)
120 {
121 targetNameSupplied = true;
122 optionalTargetFirstName = cmd[2];
123 optionalTargetLastName = cmd[3];
124 }
125
126 StringBuilder sb = new StringBuilder();
127
128 lock (m_scenes)
129 {
130 foreach (Scene scene in m_scenes)
131 {
132 if (targetNameSupplied)
133 {
134 ScenePresence sp = scene.GetScenePresence(optionalTargetFirstName, optionalTargetLastName);
135 if (sp != null && !sp.IsChildAgent)
136 GetAttachmentsReport(sp, sb);
137 }
138 else
139 {
140 scene.ForEachRootScenePresence(sp => GetAttachmentsReport(sp, sb));
141 }
142 }
143 }
144
145 MainConsole.Instance.Output(sb.ToString());
146 }
147
148 private void GetAttachmentsReport(ScenePresence sp, StringBuilder sb)
149 {
150 sb.AppendFormat("Animations for {0}\n", sp.Name);
151
152 ConsoleDisplayList cdl = new ConsoleDisplayList() { Indent = 2 };
153 ScenePresenceAnimator spa = sp.Animator;
154 AnimationSet anims = sp.Animator.Animations;
155
156 string cma = spa.CurrentMovementAnimation;
157 cdl.AddRow(
158 "Current movement anim",
159 string.Format("{0}, {1}", DefaultAvatarAnimations.GetDefaultAnimation(cma), cma));
160
161 UUID defaultAnimId = anims.DefaultAnimation.AnimID;
162 cdl.AddRow(
163 "Default anim",
164 string.Format("{0}, {1}", defaultAnimId, GetAnimName(sp.Scene.AssetService, defaultAnimId)));
165
166 UUID implicitDefaultAnimId = anims.ImplicitDefaultAnimation.AnimID;
167 cdl.AddRow(
168 "Implicit default anim",
169 string.Format("{0}, {1}", implicitDefaultAnimId, GetAnimName(sp.Scene.AssetService, implicitDefaultAnimId)));
170
171 cdl.AddToStringBuilder(sb);
172
173 ConsoleDisplayTable cdt = new ConsoleDisplayTable() { Indent = 2 };
174 cdt.AddColumn("Animation ID", 36);
175 cdt.AddColumn("Name", 20);
176 cdt.AddColumn("Seq", 3);
177 cdt.AddColumn("Object ID", 36);
178
179 UUID[] animIds;
180 int[] sequenceNumbers;
181 UUID[] objectIds;
182
183 sp.Animator.Animations.GetArrays(out animIds, out sequenceNumbers, out objectIds);
184
185 for (int i = 0; i < animIds.Length; i++)
186 {
187 UUID animId = animIds[i];
188 string animName = GetAnimName(sp.Scene.AssetService, animId);
189 int seq = sequenceNumbers[i];
190 UUID objectId = objectIds[i];
191
192 cdt.AddRow(animId, animName, seq, objectId);
193 }
194
195 cdt.AddToStringBuilder(sb);
196 sb.Append("\n");
197 }
198
199 private string GetAnimName(IAssetService assetService, UUID animId)
200 {
201 string animName;
202
203 if (!DefaultAvatarAnimations.AnimsNames.TryGetValue(animId, out animName))
204 {
205 AssetMetadata amd = assetService.GetMetadata(animId.ToString());
206 if (amd != null)
207 animName = amd.Name;
208 else
209 animName = "Unknown";
210 }
211
212 return animName;
213 }
214 }
215} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs
index 68bcb4a..d97e3b3 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs
@@ -97,6 +97,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
97 "Users", this, "attachments show", 97 "Users", this, "attachments show",
98 "attachments show [<first-name> <last-name>]", 98 "attachments show [<first-name> <last-name>]",
99 "Show attachment information for avatars in this simulator.", 99 "Show attachment information for avatars in this simulator.",
100 "If no name is supplied then information for all avatars is shown.",
100 HandleShowAttachmentsCommand); 101 HandleShowAttachmentsCommand);
101 } 102 }
102 103
diff --git a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
index c7e3a7a..57d9217 100644
--- a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
+++ b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
@@ -49,7 +49,7 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
49 /// (such as land transfers). There is no money code here! Use FORGE as an example for money code. 49 /// (such as land transfers). There is no money code here! Use FORGE as an example for money code.
50 /// Demo Economy/Money Module. This is a purposely crippled module! 50 /// Demo Economy/Money Module. This is a purposely crippled module!
51 /// // To land transfer you need to add: 51 /// // To land transfer you need to add:
52 /// -helperuri <ADDRESS TO THIS SERVER> 52 /// -helperuri http://serveraddress:port/
53 /// to the command line parameters you use to start up your client 53 /// to the command line parameters you use to start up your client
54 /// This commonly looks like -helperuri http://127.0.0.1:9000/ 54 /// This commonly looks like -helperuri http://127.0.0.1:9000/
55 /// 55 ///
@@ -116,10 +116,9 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
116 } 116 }
117 117
118 /// <summary> 118 /// <summary>
119 /// Startup 119 /// Called on startup so the module can be configured.
120 /// </summary> 120 /// </summary>
121 /// <param name="scene"></param> 121 /// <param name="config">Configuration source.</param>
122 /// <param name="config"></param>
123 public void Initialise(IConfigSource config) 122 public void Initialise(IConfigSource config)
124 { 123 {
125 m_gConfig = config; 124 m_gConfig = config;
@@ -674,9 +673,12 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
674 } 673 }
675 674
676 /// <summary> 675 /// <summary>
677 /// When the client closes the connection we remove their accounting info from memory to free up resources. 676 /// When the client closes the connection we remove their accounting
677 /// info from memory to free up resources.
678 /// </summary> 678 /// </summary>
679 /// <param name="AgentID"></param> 679 /// <param name="AgentID">UUID of agent</param>
680 /// <param name="scene">Scene the agent was connected to.</param>
681 /// <see cref="OpenSim.Region.Framework.Scenes.EventManager.ClientClosed"/>
680 public void ClientClosed(UUID AgentID, Scene scene) 682 public void ClientClosed(UUID AgentID, Scene scene)
681 { 683 {
682 684
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 253d193..aa389ba 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -3298,7 +3298,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3298 /// <summary> 3298 /// <summary>
3299 /// Attach the object containing this script to the avatar that owns it. 3299 /// Attach the object containing this script to the avatar that owns it.
3300 /// </summary> 3300 /// </summary>
3301 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param> 3301 /// <param name='attachmentPoint'>
3302 /// The attachment point (e.g. <see cref="OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass.ATTACH_CHEST">ATTACH_CHEST</see>)
3303 /// </param>
3302 /// <returns>true if the attach suceeded, false if it did not</returns> 3304 /// <returns>true if the attach suceeded, false if it did not</returns>
3303 public bool AttachToAvatar(int attachmentPoint) 3305 public bool AttachToAvatar(int attachmentPoint)
3304 { 3306 {
@@ -3729,21 +3731,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3729 } 3731 }
3730 else 3732 else
3731 { 3733 {
3732 bool sitting = false; 3734 if (m_host.ParentGroup.GetSittingAvatars().Contains(agentID))
3733 if (m_host.SitTargetAvatar == agentID)
3734 {
3735 sitting = true;
3736 }
3737 else
3738 {
3739 foreach (SceneObjectPart p in m_host.ParentGroup.Parts)
3740 {
3741 if (p.SitTargetAvatar == agentID)
3742 sitting = true;
3743 }
3744 }
3745
3746 if (sitting)
3747 { 3735 {
3748 // When agent is sitting, certain permissions are implicit if requested from sitting agent 3736 // When agent is sitting, certain permissions are implicit if requested from sitting agent
3749 implicitPerms = ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION | 3737 implicitPerms = ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION |
@@ -3785,7 +3773,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3785 INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); 3773 INPCModule npcModule = World.RequestModuleInterface<INPCModule>();
3786 if (npcModule != null && npcModule.IsNPC(agentID, World)) 3774 if (npcModule != null && npcModule.IsNPC(agentID, World))
3787 { 3775 {
3788 if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID) 3776 if (npcModule.CheckPermissions(agentID, m_host.OwnerID))
3789 { 3777 {
3790 lock (m_host.TaskInventory) 3778 lock (m_host.TaskInventory)
3791 { 3779 {
@@ -4160,62 +4148,56 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4160 public LSL_String llGetLinkName(int linknum) 4148 public LSL_String llGetLinkName(int linknum)
4161 { 4149 {
4162 m_host.AddScriptLPS(1); 4150 m_host.AddScriptLPS(1);
4163 // simplest case, this prims link number
4164 if (linknum == m_host.LinkNum || linknum == ScriptBaseClass.LINK_THIS)
4165 return m_host.Name;
4166 4151
4167 // parse for sitting avatare-names 4152 if (linknum < 0)
4168 List<String> nametable = new List<String>();
4169 World.ForEachRootScenePresence(delegate(ScenePresence presence)
4170 { 4153 {
4171 SceneObjectPart sitPart = presence.ParentPart; 4154 if (linknum == ScriptBaseClass.LINK_THIS)
4172 if (sitPart != null && m_host.ParentGroup.ContainsPart(sitPart.LocalId))
4173 nametable.Add(presence.ControllingClient.Name);
4174 });
4175
4176 int totalprims = m_host.ParentGroup.PrimCount + nametable.Count;
4177 if (totalprims > m_host.ParentGroup.PrimCount)
4178 {
4179 // sitting Avatar-Name with negativ linknum / SinglePrim
4180 if (linknum < 0 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1)
4181 return nametable[0];
4182 // Prim-Name / SinglePrim Sitting Avatar
4183 if (linknum == 1 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1)
4184 return m_host.Name; 4155 return m_host.Name;
4185 // LinkNumber > of Real PrimSet = AvatarName 4156 else
4186 if (linknum > m_host.ParentGroup.PrimCount && linknum <= totalprims) 4157 return ScriptBaseClass.NULL_KEY;
4187 return nametable[totalprims - linknum];
4188 } 4158 }
4189 4159
4190 // Single prim 4160 int actualPrimCount = m_host.ParentGroup.PrimCount;
4191 if (m_host.LinkNum == 0) 4161 List<UUID> sittingAvatarIds = m_host.ParentGroup.GetSittingAvatars();
4162 int adjustedPrimCount = actualPrimCount + sittingAvatarIds.Count;
4163
4164 // Special case for a single prim. In this case the linknum is zero. However, this will not match a single
4165 // prim that has any avatars sat upon it (in which case the root prim is link 1).
4166 if (linknum == 0)
4192 { 4167 {
4193 if (linknum == 0 || linknum == ScriptBaseClass.LINK_ROOT) 4168 if (actualPrimCount == 1 && sittingAvatarIds.Count == 0)
4194 return m_host.Name; 4169 return m_host.Name;
4195 else
4196 return UUID.Zero.ToString();
4197 }
4198 4170
4199 // Link set 4171 return ScriptBaseClass.NULL_KEY;
4200 SceneObjectPart part = null; 4172 }
4201 if (m_host.LinkNum == 1) // this is the Root prim 4173 // Special case to handle a single prim with sitting avatars. GetLinkPart() would only match zero but
4174 // here we must match 1 (ScriptBaseClass.LINK_ROOT).
4175 else if (linknum == 1 && actualPrimCount == 1)
4202 { 4176 {
4203 if (linknum < 0) 4177 if (sittingAvatarIds.Count > 0)
4204 part = m_host.ParentGroup.GetLinkNumPart(2); 4178 return m_host.ParentGroup.RootPart.Name;
4205 else 4179 else
4206 part = m_host.ParentGroup.GetLinkNumPart(linknum); 4180 return ScriptBaseClass.NULL_KEY;
4207 } 4181 }
4208 else // this is a child prim 4182 else if (linknum <= adjustedPrimCount)
4209 { 4183 {
4210 if (linknum < 2) 4184 if (linknum <= actualPrimCount)
4211 part = m_host.ParentGroup.GetLinkNumPart(1); 4185 {
4186 return m_host.ParentGroup.GetLinkNumPart(linknum).Name;
4187 }
4212 else 4188 else
4213 part = m_host.ParentGroup.GetLinkNumPart(linknum); 4189 {
4190 ScenePresence sp = World.GetScenePresence(sittingAvatarIds[linknum - actualPrimCount - 1]);
4191 if (sp != null)
4192 return sp.Name;
4193 else
4194 return ScriptBaseClass.NULL_KEY;
4195 }
4214 } 4196 }
4215 if (part != null)
4216 return part.Name;
4217 else 4197 else
4218 return UUID.Zero.ToString(); 4198 {
4199 return ScriptBaseClass.NULL_KEY;
4200 }
4219 } 4201 }
4220 4202
4221 public LSL_Integer llGetInventoryNumber(int type) 4203 public LSL_Integer llGetInventoryNumber(int type)
@@ -5828,9 +5810,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5828 } 5810 }
5829 5811
5830 /// <summary> 5812 /// <summary>
5831 /// Insert the list identified by <src> into the 5813 /// Insert the list identified by <paramref name="src"/> into the
5832 /// list designated by <dest> such that the first 5814 /// list designated by <paramref name="dest"/> such that the first
5833 /// new element has the index specified by <index> 5815 /// new element has the index specified by <paramref name="index"/>
5834 /// </summary> 5816 /// </summary>
5835 5817
5836 public LSL_List llListInsertList(LSL_List dest, LSL_List src, int index) 5818 public LSL_List llListInsertList(LSL_List dest, LSL_List src, int index)
@@ -6663,6 +6645,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6663 ps.BurstSpeedMax = 1.0f; 6645 ps.BurstSpeedMax = 1.0f;
6664 ps.BurstRate = 0.1f; 6646 ps.BurstRate = 0.1f;
6665 ps.PartMaxAge = 10.0f; 6647 ps.PartMaxAge = 10.0f;
6648 ps.BurstPartCount = 1;
6666 return ps; 6649 return ps;
6667 } 6650 }
6668 6651
@@ -6684,10 +6667,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6684 SetParticleSystem(m_host, rules); 6667 SetParticleSystem(m_host, rules);
6685 } 6668 }
6686 6669
6687 private void SetParticleSystem(SceneObjectPart part, LSL_List rules) 6670 private void SetParticleSystem(SceneObjectPart part, LSL_List rules)
6688 { 6671 {
6689
6690
6691 if (rules.Length == 0) 6672 if (rules.Length == 0)
6692 { 6673 {
6693 part.RemoveParticleSystem(); 6674 part.RemoveParticleSystem();
@@ -13232,7 +13213,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13232 /// Get a notecard line. 13213 /// Get a notecard line.
13233 /// </summary> 13214 /// </summary>
13234 /// <param name="assetID"></param> 13215 /// <param name="assetID"></param>
13235 /// <param name="line">Lines start at index 0</param> 13216 /// <param name="lineNumber">Lines start at index 0</param>
13236 /// <returns></returns> 13217 /// <returns></returns>
13237 public static string GetLine(UUID assetID, int lineNumber) 13218 public static string GetLine(UUID assetID, int lineNumber)
13238 { 13219 {
@@ -13261,9 +13242,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13261 /// Get a notecard line. 13242 /// Get a notecard line.
13262 /// </summary> 13243 /// </summary>
13263 /// <param name="assetID"></param> 13244 /// <param name="assetID"></param>
13264 /// <param name="line">Lines start at index 0</param> 13245 /// <param name="lineNumber">Lines start at index 0</param>
13265 /// <param name="maxLength">Maximum length of the returned line. Longer lines will be truncated</para> 13246 /// <param name="maxLength">
13266 /// <returns></returns> 13247 /// Maximum length of the returned line.
13248 /// </param>
13249 /// <returns>
13250 /// If the line length is longer than <paramref name="maxLength"/>,
13251 /// the return string will be truncated.
13252 /// </returns>
13267 public static string GetLine(UUID assetID, int lineNumber, int maxLength) 13253 public static string GetLine(UUID assetID, int lineNumber, int maxLength)
13268 { 13254 {
13269 string line = GetLine(assetID, lineNumber); 13255 string line = GetLine(assetID, lineNumber);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 51c8c7e..637d83a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -1214,12 +1214,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1214 sunHour += 24.0; 1214 sunHour += 24.0;
1215 1215
1216 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; 1216 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun;
1217 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 1217 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30
1218 World.RegionInfo.RegionSettings.FixedSun = sunFixed; 1218 World.RegionInfo.RegionSettings.FixedSun = sunFixed;
1219 World.RegionInfo.RegionSettings.Save(); 1219 World.RegionInfo.RegionSettings.Save();
1220 1220
1221 World.EventManager.TriggerEstateToolsSunUpdate( 1221 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle);
1222 World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour);
1223 } 1222 }
1224 1223
1225 /// <summary> 1224 /// <summary>
@@ -1244,8 +1243,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1244 World.RegionInfo.EstateSettings.FixedSun = sunFixed; 1243 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1245 World.RegionInfo.EstateSettings.Save(); 1244 World.RegionInfo.EstateSettings.Save();
1246 1245
1247 World.EventManager.TriggerEstateToolsSunUpdate( 1246 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle);
1248 World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour);
1249 } 1247 }
1250 1248
1251 /// <summary> 1249 /// <summary>
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
index c9c4753..2e61fb8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
@@ -633,19 +633,44 @@ namespace OpenSim.Region.ScriptEngine.Shared
633 633
634 public LSL_Types.Vector3 GetVector3Item(int itemIndex) 634 public LSL_Types.Vector3 GetVector3Item(int itemIndex)
635 { 635 {
636 if(m_data[itemIndex] is LSL_Types.Vector3) 636 if (m_data[itemIndex] is LSL_Types.Vector3)
637 {
637 return (LSL_Types.Vector3)m_data[itemIndex]; 638 return (LSL_Types.Vector3)m_data[itemIndex];
639 }
640 else if(m_data[itemIndex] is OpenMetaverse.Vector3)
641 {
642 return new LSL_Types.Vector3(
643 (OpenMetaverse.Vector3)m_data[itemIndex]);
644 }
638 else 645 else
646 {
639 throw new InvalidCastException(string.Format( 647 throw new InvalidCastException(string.Format(
640 "{0} expected but {1} given", 648 "{0} expected but {1} given",
641 typeof(LSL_Types.Vector3).Name, 649 typeof(LSL_Types.Vector3).Name,
642 m_data[itemIndex] != null ? 650 m_data[itemIndex] != null ?
643 m_data[itemIndex].GetType().Name : "null")); 651 m_data[itemIndex].GetType().Name : "null"));
652 }
644 } 653 }
645 654
646 public LSL_Types.Quaternion GetQuaternionItem(int itemIndex) 655 public LSL_Types.Quaternion GetQuaternionItem(int itemIndex)
647 { 656 {
648 return (LSL_Types.Quaternion)m_data[itemIndex]; 657 if (m_data[itemIndex] is LSL_Types.Quaternion)
658 {
659 return (LSL_Types.Quaternion)m_data[itemIndex];
660 }
661 else if(m_data[itemIndex] is OpenMetaverse.Quaternion)
662 {
663 return new LSL_Types.Quaternion(
664 (OpenMetaverse.Quaternion)m_data[itemIndex]);
665 }
666 else
667 {
668 throw new InvalidCastException(string.Format(
669 "{0} expected but {1} given",
670 typeof(LSL_Types.Quaternion).Name,
671 m_data[itemIndex] != null ?
672 m_data[itemIndex].GetType().Name : "null"));
673 }
649 } 674 }
650 675
651 public LSL_Types.key GetKeyItem(int itemIndex) 676 public LSL_Types.key GetKeyItem(int itemIndex)
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index ee3b858..daebf8b 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -185,15 +185,15 @@ namespace OpenSim.Services.GridService
185 185
186 if (!m_AllowDuplicateNames) 186 if (!m_AllowDuplicateNames)
187 { 187 {
188 List<RegionData> dupe = m_Database.Get(regionInfos.RegionName, scopeID); 188 List<RegionData> dupe = m_Database.Get(Util.EscapeForLike(regionInfos.RegionName), scopeID);
189 if (dupe != null && dupe.Count > 0) 189 if (dupe != null && dupe.Count > 0)
190 { 190 {
191 foreach (RegionData d in dupe) 191 foreach (RegionData d in dupe)
192 { 192 {
193 if (d.RegionID != regionInfos.RegionID) 193 if (d.RegionID != regionInfos.RegionID)
194 { 194 {
195 m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register duplicate name with ID {1}.", 195 m_log.WarnFormat("[GRID SERVICE]: Region tried to register using a duplicate name. New region: {0} ({1}), existing region: {2} ({3}).",
196 regionInfos.RegionName, regionInfos.RegionID); 196 regionInfos.RegionName, regionInfos.RegionID, d.RegionName, d.RegionID);
197 return "Duplicate region name"; 197 return "Duplicate region name";
198 } 198 }
199 } 199 }
@@ -359,7 +359,7 @@ namespace OpenSim.Services.GridService
359 359
360 public GridRegion GetRegionByName(UUID scopeID, string name) 360 public GridRegion GetRegionByName(UUID scopeID, string name)
361 { 361 {
362 List<RegionData> rdatas = m_Database.Get(name, scopeID); 362 List<RegionData> rdatas = m_Database.Get(Util.EscapeForLike(name), scopeID);
363 if ((rdatas != null) && (rdatas.Count > 0)) 363 if ((rdatas != null) && (rdatas.Count > 0))
364 return RegionData2RegionInfo(rdatas[0]); // get the first 364 return RegionData2RegionInfo(rdatas[0]); // get the first
365 365
@@ -377,7 +377,7 @@ namespace OpenSim.Services.GridService
377 { 377 {
378// m_log.DebugFormat("[GRID SERVICE]: GetRegionsByName {0}", name); 378// m_log.DebugFormat("[GRID SERVICE]: GetRegionsByName {0}", name);
379 379
380 List<RegionData> rdatas = m_Database.Get(name + "%", scopeID); 380 List<RegionData> rdatas = m_Database.Get(Util.EscapeForLike(name) + "%", scopeID);
381 381
382 int count = 0; 382 int count = 0;
383 List<GridRegion> rinfos = new List<GridRegion>(); 383 List<GridRegion> rinfos = new List<GridRegion>();
@@ -586,7 +586,7 @@ namespace OpenSim.Services.GridService
586 586
587 string regionName = cmd[3]; 587 string regionName = cmd[3];
588 588
589 List<RegionData> regions = m_Database.Get(regionName, UUID.Zero); 589 List<RegionData> regions = m_Database.Get(Util.EscapeForLike(regionName), UUID.Zero);
590 if (regions == null || regions.Count < 1) 590 if (regions == null || regions.Count < 1)
591 { 591 {
592 MainConsole.Instance.Output("No region with name {0} found", regionName); 592 MainConsole.Instance.Output("No region with name {0} found", regionName);
@@ -716,7 +716,7 @@ namespace OpenSim.Services.GridService
716 return; 716 return;
717 } 717 }
718 718
719 List<RegionData> regions = m_Database.Get(cmd[3], UUID.Zero); 719 List<RegionData> regions = m_Database.Get(Util.EscapeForLike(cmd[3]), UUID.Zero);
720 if (regions == null || regions.Count < 1) 720 if (regions == null || regions.Count < 1)
721 { 721 {
722 MainConsole.Instance.Output("Region not found"); 722 MainConsole.Instance.Output("Region not found");
diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs
index 743d089..073197f 100644
--- a/OpenSim/Services/GridService/HypergridLinker.cs
+++ b/OpenSim/Services/GridService/HypergridLinker.cs
@@ -387,7 +387,7 @@ namespace OpenSim.Services.GridService
387 m_log.DebugFormat("[HYPERGRID LINKER]: Request to unlink {0}", mapName); 387 m_log.DebugFormat("[HYPERGRID LINKER]: Request to unlink {0}", mapName);
388 GridRegion regInfo = null; 388 GridRegion regInfo = null;
389 389
390 List<RegionData> regions = m_Database.Get(mapName, m_ScopeID); 390 List<RegionData> regions = m_Database.Get(Util.EscapeForLike(mapName), m_ScopeID);
391 if (regions != null && regions.Count > 0) 391 if (regions != null && regions.Count > 0)
392 { 392 {
393 OpenSim.Framework.RegionFlags rflags = (OpenSim.Framework.RegionFlags)Convert.ToInt32(regions[0].Data["flags"]); 393 OpenSim.Framework.RegionFlags rflags = (OpenSim.Framework.RegionFlags)Convert.ToInt32(regions[0].Data["flags"]);
diff --git a/doc/doxygen.conf b/doc/doxygen.conf
index 3712dfa..148de9c 100644
--- a/doc/doxygen.conf
+++ b/doc/doxygen.conf
@@ -1,1356 +1,290 @@
1# Doxyfile 1.5.5 1# Doxyfile 1.8.2
2
3# This file describes the settings to be used by the documentation system
4# doxygen (www.doxygen.org) for a project
5#
6# All text after a hash (#) is considered a comment and will be ignored
7# The format is:
8# TAG = value [value, ...]
9# For lists items can also be appended using:
10# TAG += value [value, ...]
11# Values that contain spaces should be placed between quotes (" ")
12 2
13#--------------------------------------------------------------------------- 3#---------------------------------------------------------------------------
14# Project related configuration options 4# Project related configuration options
15#--------------------------------------------------------------------------- 5#---------------------------------------------------------------------------
16
17# This tag specifies the encoding used for all characters in the config file
18# that follow. The default is UTF-8 which is also the encoding used for all
19# text before the first occurrence of this tag. Doxygen uses libiconv (or the
20# iconv built into libc) for the transcoding. See
21# http://www.gnu.org/software/libiconv for the list of possible encodings.
22
23DOXYFILE_ENCODING = UTF-8 6DOXYFILE_ENCODING = UTF-8
24
25# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
26# by quotes) that should identify the project.
27
28PROJECT_NAME = OpenSim 7PROJECT_NAME = OpenSim
29 8PROJECT_NUMBER = GIT
30# The PROJECT_NUMBER tag can be used to enter a project or revision number. 9PROJECT_BRIEF =
31# This could be handy for archiving the generated documentation or 10PROJECT_LOGO =
32# if some version control system is used.
33
34PROJECT_NUMBER = SVN
35
36# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
37# base path where the generated documentation will be put.
38# If a relative path is entered, it will be relative to the location
39# where doxygen was started. If left blank the current directory will be used.
40
41OUTPUT_DIRECTORY = 11OUTPUT_DIRECTORY =
42
43# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
44# 4096 sub-directories (in 2 levels) under the output directory of each output
45# format and will distribute the generated files over these directories.
46# Enabling this option can be useful when feeding doxygen a huge amount of
47# source files, where putting all generated files in the same directory would
48# otherwise cause performance problems for the file system.
49
50CREATE_SUBDIRS = NO 12CREATE_SUBDIRS = NO
51
52# The OUTPUT_LANGUAGE tag is used to specify the language in which all
53# documentation generated by doxygen is written. Doxygen will use this
54# information to generate all constant output in the proper language.
55# The default language is English, other supported languages are:
56# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
57# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek,
58# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages),
59# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish,
60# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
61# and Ukrainian.
62
63OUTPUT_LANGUAGE = English 13OUTPUT_LANGUAGE = English
64
65# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
66# include brief member descriptions after the members that are listed in
67# the file and class documentation (similar to JavaDoc).
68# Set to NO to disable this.
69
70BRIEF_MEMBER_DESC = YES 14BRIEF_MEMBER_DESC = YES
71
72# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
73# the brief description of a member or function before the detailed description.
74# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
75# brief descriptions will be completely suppressed.
76
77REPEAT_BRIEF = YES 15REPEAT_BRIEF = YES
78 16ABBREVIATE_BRIEF =
79# This tag implements a quasi-intelligent brief description abbreviator
80# that is used to form the text in various listings. Each string
81# in this list, if found as the leading text of the brief description, will be
82# stripped from the text and the result after processing the whole list, is
83# used as the annotated text. Otherwise, the brief description is used as-is.
84# If left blank, the following values are used ("$name" is automatically
85# replaced with the name of the entity): "The $name class" "The $name widget"
86# "The $name file" "is" "provides" "specifies" "contains"
87# "represents" "a" "an" "the"
88
89ABBREVIATE_BRIEF =
90
91# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
92# Doxygen will generate a detailed section even if there is only a brief
93# description.
94
95ALWAYS_DETAILED_SEC = NO 17ALWAYS_DETAILED_SEC = NO
96
97# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
98# inherited members of a class in the documentation of that class as if those
99# members were ordinary class members. Constructors, destructors and assignment
100# operators of the base classes will not be shown.
101
102INLINE_INHERITED_MEMB = NO 18INLINE_INHERITED_MEMB = NO
103
104# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
105# path before files name in the file list and in the header files. If set
106# to NO the shortest path that makes the file name unique will be used.
107
108FULL_PATH_NAMES = YES 19FULL_PATH_NAMES = YES
109 20STRIP_FROM_PATH =
110# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 21STRIP_FROM_INC_PATH =
111# can be used to strip a user-defined part of the path. Stripping is
112# only done if one of the specified strings matches the left-hand part of
113# the path. The tag can be used to show relative paths in the file list.
114# If left blank the directory from which doxygen is run is used as the
115# path to strip.
116
117STRIP_FROM_PATH =
118
119# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
120# the path mentioned in the documentation of a class, which tells
121# the reader which header file to include in order to use a class.
122# If left blank only the name of the header file containing the class
123# definition is used. Otherwise one should specify the include paths that
124# are normally passed to the compiler using the -I flag.
125
126STRIP_FROM_INC_PATH =
127
128# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
129# (but less readable) file names. This can be useful is your file systems
130# doesn't support long names like on DOS, Mac, or CD-ROM.
131
132SHORT_NAMES = NO 22SHORT_NAMES = NO
133
134# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
135# will interpret the first line (until the first dot) of a JavaDoc-style
136# comment as the brief description. If set to NO, the JavaDoc
137# comments will behave just like regular Qt-style comments
138# (thus requiring an explicit @brief command for a brief description.)
139
140JAVADOC_AUTOBRIEF = NO 23JAVADOC_AUTOBRIEF = NO
141
142# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
143# interpret the first line (until the first dot) of a Qt-style
144# comment as the brief description. If set to NO, the comments
145# will behave just like regular Qt-style comments (thus requiring
146# an explicit \brief command for a brief description.)
147
148QT_AUTOBRIEF = NO 24QT_AUTOBRIEF = NO
149
150# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
151# treat a multi-line C++ special comment block (i.e. a block of //! or ///
152# comments) as a brief description. This used to be the default behaviour.
153# The new default is to treat a multi-line C++ comment block as a detailed
154# description. Set this tag to YES if you prefer the old behaviour instead.
155
156MULTILINE_CPP_IS_BRIEF = NO 25MULTILINE_CPP_IS_BRIEF = NO
157
158# If the DETAILS_AT_TOP tag is set to YES then Doxygen
159# will output the detailed description near the top, like JavaDoc.
160# If set to NO, the detailed description appears after the member
161# documentation.
162
163DETAILS_AT_TOP = NO
164
165# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
166# member inherits the documentation from any documented member that it
167# re-implements.
168
169INHERIT_DOCS = YES 26INHERIT_DOCS = YES
170
171# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
172# a new page for each member. If set to NO, the documentation of a member will
173# be part of the file/class/namespace that contains it.
174
175SEPARATE_MEMBER_PAGES = NO 27SEPARATE_MEMBER_PAGES = NO
176
177# The TAB_SIZE tag can be used to set the number of spaces in a tab.
178# Doxygen uses this value to replace tabs by spaces in code fragments.
179
180TAB_SIZE = 8 28TAB_SIZE = 8
181 29ALIASES =
182# This tag can be used to specify a number of aliases that acts 30TCL_SUBST =
183# as commands in the documentation. An alias has the form "name=value".
184# For example adding "sideeffect=\par Side Effects:\n" will allow you to
185# put the command \sideeffect (or @sideeffect) in the documentation, which
186# will result in a user-defined paragraph with heading "Side Effects:".
187# You can put \n's in the value part of an alias to insert newlines.
188
189ALIASES =
190
191# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
192# sources only. Doxygen will then generate output that is more tailored for C.
193# For instance, some of the names that are used will be different. The list
194# of all members will be omitted, etc.
195
196OPTIMIZE_OUTPUT_FOR_C = NO 31OPTIMIZE_OUTPUT_FOR_C = NO
197
198# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
199# sources only. Doxygen will then generate output that is more tailored for
200# Java. For instance, namespaces will be presented as packages, qualified
201# scopes will look different, etc.
202
203OPTIMIZE_OUTPUT_JAVA = NO 32OPTIMIZE_OUTPUT_JAVA = NO
204
205# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
206# sources only. Doxygen will then generate output that is more tailored for
207# Fortran.
208
209OPTIMIZE_FOR_FORTRAN = NO 33OPTIMIZE_FOR_FORTRAN = NO
210
211# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
212# sources. Doxygen will then generate output that is tailored for
213# VHDL.
214
215OPTIMIZE_OUTPUT_VHDL = NO 34OPTIMIZE_OUTPUT_VHDL = NO
216 35EXTENSION_MAPPING =
217# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 36MARKDOWN_SUPPORT = YES
218# to include (a tag file for) the STL sources as input, then you should 37AUTOLINK_SUPPORT = YES
219# set this tag to YES in order to let doxygen match functions declarations and
220# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
221# func(std::string) {}). This also make the inheritance and collaboration
222# diagrams that involve STL classes more complete and accurate.
223
224BUILTIN_STL_SUPPORT = NO 38BUILTIN_STL_SUPPORT = NO
225
226# If you use Microsoft's C++/CLI language, you should set this option to YES to
227# enable parsing support.
228
229CPP_CLI_SUPPORT = NO 39CPP_CLI_SUPPORT = NO
230
231# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
232# Doxygen will parse them like normal C++ but will assume all classes use public
233# instead of private inheritance when no explicit protection keyword is present.
234
235SIP_SUPPORT = NO 40SIP_SUPPORT = NO
236 41IDL_PROPERTY_SUPPORT = YES
237# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
238# tag is set to YES, then doxygen will reuse the documentation of the first
239# member in the group (if any) for the other members of the group. By default
240# all members of a group must be documented explicitly.
241
242DISTRIBUTE_GROUP_DOC = NO 42DISTRIBUTE_GROUP_DOC = NO
243
244# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
245# the same type (for instance a group of public functions) to be put as a
246# subgroup of that type (e.g. under the Public Functions section). Set it to
247# NO to prevent subgrouping. Alternatively, this can be done per class using
248# the \nosubgrouping command.
249
250SUBGROUPING = YES 43SUBGROUPING = YES
251 44INLINE_GROUPED_CLASSES = NO
252# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 45INLINE_SIMPLE_STRUCTS = NO
253# is documented as struct, union, or enum with the name of the typedef. So
254# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
255# with name TypeT. When disabled the typedef will appear as a member of a file,
256# namespace, or class. And the struct will be named TypeS. This can typically
257# be useful for C code in case the coding convention dictates that all compound
258# types are typedef'ed and only the typedef is referenced, never the tag name.
259
260TYPEDEF_HIDES_STRUCT = NO 46TYPEDEF_HIDES_STRUCT = NO
261 47SYMBOL_CACHE_SIZE = 0
48LOOKUP_CACHE_SIZE = 0
262#--------------------------------------------------------------------------- 49#---------------------------------------------------------------------------
263# Build related configuration options 50# Build related configuration options
264#--------------------------------------------------------------------------- 51#---------------------------------------------------------------------------
265
266# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
267# documentation are documented, even if no documentation was available.
268# Private class members and static file members will be hidden unless
269# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
270
271EXTRACT_ALL = YES 52EXTRACT_ALL = YES
272
273# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
274# will be included in the documentation.
275
276EXTRACT_PRIVATE = NO 53EXTRACT_PRIVATE = NO
277 54EXTRACT_PACKAGE = NO
278# If the EXTRACT_STATIC tag is set to YES all static members of a file
279# will be included in the documentation.
280
281EXTRACT_STATIC = NO 55EXTRACT_STATIC = NO
282
283# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
284# defined locally in source files will be included in the documentation.
285# If set to NO only classes defined in header files are included.
286
287EXTRACT_LOCAL_CLASSES = YES 56EXTRACT_LOCAL_CLASSES = YES
288
289# This flag is only useful for Objective-C code. When set to YES local
290# methods, which are defined in the implementation section but not in
291# the interface are included in the documentation.
292# If set to NO (the default) only methods in the interface are included.
293
294EXTRACT_LOCAL_METHODS = NO 57EXTRACT_LOCAL_METHODS = NO
295
296# If this flag is set to YES, the members of anonymous namespaces will be
297# extracted and appear in the documentation as a namespace called
298# 'anonymous_namespace{file}', where file will be replaced with the base
299# name of the file that contains the anonymous namespace. By default
300# anonymous namespace are hidden.
301
302EXTRACT_ANON_NSPACES = NO 58EXTRACT_ANON_NSPACES = NO
303
304# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
305# undocumented members of documented classes, files or namespaces.
306# If set to NO (the default) these members will be included in the
307# various overviews, but no documentation section is generated.
308# This option has no effect if EXTRACT_ALL is enabled.
309
310HIDE_UNDOC_MEMBERS = NO 59HIDE_UNDOC_MEMBERS = NO
311
312# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
313# undocumented classes that are normally visible in the class hierarchy.
314# If set to NO (the default) these classes will be included in the various
315# overviews. This option has no effect if EXTRACT_ALL is enabled.
316
317HIDE_UNDOC_CLASSES = NO 60HIDE_UNDOC_CLASSES = NO
318
319# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
320# friend (class|struct|union) declarations.
321# If set to NO (the default) these declarations will be included in the
322# documentation.
323
324HIDE_FRIEND_COMPOUNDS = NO 61HIDE_FRIEND_COMPOUNDS = NO
325
326# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
327# documentation blocks found inside the body of a function.
328# If set to NO (the default) these blocks will be appended to the
329# function's detailed documentation block.
330
331HIDE_IN_BODY_DOCS = NO 62HIDE_IN_BODY_DOCS = NO
332
333# The INTERNAL_DOCS tag determines if documentation
334# that is typed after a \internal command is included. If the tag is set
335# to NO (the default) then the documentation will be excluded.
336# Set it to YES to include the internal documentation.
337
338INTERNAL_DOCS = NO 63INTERNAL_DOCS = NO
339
340# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
341# file names in lower-case letters. If set to YES upper-case letters are also
342# allowed. This is useful if you have classes or files whose names only differ
343# in case and if your file system supports case sensitive file names. Windows
344# and Mac users are advised to set this option to NO.
345
346CASE_SENSE_NAMES = YES 64CASE_SENSE_NAMES = YES
347
348# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
349# will show members with their full class and namespace scopes in the
350# documentation. If set to YES the scope will be hidden.
351
352HIDE_SCOPE_NAMES = NO 65HIDE_SCOPE_NAMES = NO
353
354# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
355# will put a list of the files that are included by a file in the documentation
356# of that file.
357
358SHOW_INCLUDE_FILES = YES 66SHOW_INCLUDE_FILES = YES
359 67FORCE_LOCAL_INCLUDES = NO
360# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
361# is inserted in the documentation for inline members.
362
363INLINE_INFO = YES 68INLINE_INFO = YES
364
365# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
366# will sort the (detailed) documentation of file and class members
367# alphabetically by member name. If set to NO the members will appear in
368# declaration order.
369
370SORT_MEMBER_DOCS = YES 69SORT_MEMBER_DOCS = YES
371
372# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
373# brief documentation of file, namespace and class members alphabetically
374# by member name. If set to NO (the default) the members will appear in
375# declaration order.
376
377SORT_BRIEF_DOCS = NO 70SORT_BRIEF_DOCS = NO
378 71SORT_MEMBERS_CTORS_1ST = NO
379# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
380# hierarchy of group names into alphabetical order. If set to NO (the default)
381# the group names will appear in their defined order.
382
383SORT_GROUP_NAMES = NO 72SORT_GROUP_NAMES = NO
384
385# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
386# sorted by fully-qualified names, including namespaces. If set to
387# NO (the default), the class list will be sorted only by class name,
388# not including the namespace part.
389# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
390# Note: This option applies only to the class list, not to the
391# alphabetical list.
392
393SORT_BY_SCOPE_NAME = NO 73SORT_BY_SCOPE_NAME = NO
394 74STRICT_PROTO_MATCHING = NO
395# The GENERATE_TODOLIST tag can be used to enable (YES) or
396# disable (NO) the todo list. This list is created by putting \todo
397# commands in the documentation.
398
399GENERATE_TODOLIST = YES 75GENERATE_TODOLIST = YES
400
401# The GENERATE_TESTLIST tag can be used to enable (YES) or
402# disable (NO) the test list. This list is created by putting \test
403# commands in the documentation.
404
405GENERATE_TESTLIST = YES 76GENERATE_TESTLIST = YES
406
407# The GENERATE_BUGLIST tag can be used to enable (YES) or
408# disable (NO) the bug list. This list is created by putting \bug
409# commands in the documentation.
410
411GENERATE_BUGLIST = YES 77GENERATE_BUGLIST = YES
412
413# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
414# disable (NO) the deprecated list. This list is created by putting
415# \deprecated commands in the documentation.
416
417GENERATE_DEPRECATEDLIST= YES 78GENERATE_DEPRECATEDLIST= YES
418 79ENABLED_SECTIONS =
419# The ENABLED_SECTIONS tag can be used to enable conditional
420# documentation sections, marked by \if sectionname ... \endif.
421
422ENABLED_SECTIONS =
423
424# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
425# the initial value of a variable or define consists of for it to appear in
426# the documentation. If the initializer consists of more lines than specified
427# here it will be hidden. Use a value of 0 to hide initializers completely.
428# The appearance of the initializer of individual variables and defines in the
429# documentation can be controlled using \showinitializer or \hideinitializer
430# command in the documentation regardless of this setting.
431
432MAX_INITIALIZER_LINES = 30 80MAX_INITIALIZER_LINES = 30
433
434# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
435# at the bottom of the documentation of classes and structs. If set to YES the
436# list will mention the files that were used to generate the documentation.
437
438SHOW_USED_FILES = YES 81SHOW_USED_FILES = YES
439 82SHOW_FILES = YES
440# If the sources in your project are distributed over multiple directories 83SHOW_NAMESPACES = YES
441# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 84FILE_VERSION_FILTER =
442# in the documentation. The default is NO. 85LAYOUT_FILE =
443 86CITE_BIB_FILES =
444SHOW_DIRECTORIES = NO
445
446# The FILE_VERSION_FILTER tag can be used to specify a program or script that
447# doxygen should invoke to get the current version for each file (typically from
448# the version control system). Doxygen will invoke the program by executing (via
449# popen()) the command <command> <input-file>, where <command> is the value of
450# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
451# provided by doxygen. Whatever the program writes to standard output
452# is used as the file version. See the manual for examples.
453
454FILE_VERSION_FILTER =
455
456#--------------------------------------------------------------------------- 87#---------------------------------------------------------------------------
457# configuration options related to warning and progress messages 88# configuration options related to warning and progress messages
458#--------------------------------------------------------------------------- 89#---------------------------------------------------------------------------
459
460# The QUIET tag can be used to turn on/off the messages that are generated
461# by doxygen. Possible values are YES and NO. If left blank NO is used.
462
463QUIET = NO 90QUIET = NO
464
465# The WARNINGS tag can be used to turn on/off the warning messages that are
466# generated by doxygen. Possible values are YES and NO. If left blank
467# NO is used.
468
469WARNINGS = YES 91WARNINGS = YES
470
471# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
472# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
473# automatically be disabled.
474
475WARN_IF_UNDOCUMENTED = YES 92WARN_IF_UNDOCUMENTED = YES
476
477# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
478# potential errors in the documentation, such as not documenting some
479# parameters in a documented function, or documenting parameters that
480# don't exist or using markup commands wrongly.
481
482WARN_IF_DOC_ERROR = YES 93WARN_IF_DOC_ERROR = YES
483
484# This WARN_NO_PARAMDOC option can be abled to get warnings for
485# functions that are documented, but have no documentation for their parameters
486# or return value. If set to NO (the default) doxygen will only warn about
487# wrong or incomplete parameter documentation, but not about the absence of
488# documentation.
489
490WARN_NO_PARAMDOC = NO 94WARN_NO_PARAMDOC = NO
491
492# The WARN_FORMAT tag determines the format of the warning messages that
493# doxygen can produce. The string should contain the $file, $line, and $text
494# tags, which will be replaced by the file and line number from which the
495# warning originated and the warning text. Optionally the format may contain
496# $version, which will be replaced by the version of the file (if it could
497# be obtained via FILE_VERSION_FILTER)
498
499WARN_FORMAT = "$file:$line: $text" 95WARN_FORMAT = "$file:$line: $text"
500 96WARN_LOGFILE = doxygen.error.log
501# The WARN_LOGFILE tag can be used to specify a file to which warning
502# and error messages should be written. If left blank the output is written
503# to stderr.
504
505WARN_LOGFILE =
506
507#--------------------------------------------------------------------------- 97#---------------------------------------------------------------------------
508# configuration options related to the input files 98# configuration options related to the input files
509#--------------------------------------------------------------------------- 99#---------------------------------------------------------------------------
510
511# The INPUT tag can be used to specify the files and/or directories that contain
512# documented source files. You may enter file names like "myfile.cpp" or
513# directories like "/usr/src/myproject". Separate the files or directories
514# with spaces.
515
516INPUT = ../OpenSim 100INPUT = ../OpenSim
517
518# This tag can be used to specify the character encoding of the source files
519# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
520# also the default input encoding. Doxygen uses libiconv (or the iconv built
521# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
522# the list of possible encodings.
523
524INPUT_ENCODING = UTF-8 101INPUT_ENCODING = UTF-8
525 102FILE_PATTERNS =
526# If the value of the INPUT tag contains directories, you can use the
527# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
528# and *.h) to filter out the source-files in the directories. If left
529# blank the following patterns are tested:
530# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
531# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
532
533FILE_PATTERNS =
534
535# The RECURSIVE tag can be used to turn specify whether or not subdirectories
536# should be searched for input files as well. Possible values are YES and NO.
537# If left blank NO is used.
538
539RECURSIVE = YES 103RECURSIVE = YES
540
541# The EXCLUDE tag can be used to specify files and/or directories that should
542# excluded from the INPUT source files. This way you can easily exclude a
543# subdirectory from a directory tree whose root is specified with the INPUT tag.
544
545EXCLUDE = 104EXCLUDE =
546
547# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
548# directories that are symbolic links (a Unix filesystem feature) are excluded
549# from the input.
550
551EXCLUDE_SYMLINKS = NO 105EXCLUDE_SYMLINKS = NO
552 106EXCLUDE_PATTERNS =
553# If the value of the INPUT tag contains directories, you can use the 107EXCLUDE_SYMBOLS =
554# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 108EXAMPLE_PATH =
555# certain files from those directories. Note that the wildcards are matched 109EXAMPLE_PATTERNS =
556# against the file with absolute path, so to exclude all test directories
557# for example use the pattern */test/*
558
559EXCLUDE_PATTERNS =
560
561# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
562# (namespaces, classes, functions, etc.) that should be excluded from the
563# output. The symbol name can be a fully qualified name, a word, or if the
564# wildcard * is used, a substring. Examples: ANamespace, AClass,
565# AClass::ANamespace, ANamespace::*Test
566
567EXCLUDE_SYMBOLS =
568
569# The EXAMPLE_PATH tag can be used to specify one or more files or
570# directories that contain example code fragments that are included (see
571# the \include command).
572
573EXAMPLE_PATH =
574
575# If the value of the EXAMPLE_PATH tag contains directories, you can use the
576# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
577# and *.h) to filter out the source-files in the directories. If left
578# blank all files are included.
579
580EXAMPLE_PATTERNS =
581
582# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
583# searched for input files to be used with the \include or \dontinclude
584# commands irrespective of the value of the RECURSIVE tag.
585# Possible values are YES and NO. If left blank NO is used.
586
587EXAMPLE_RECURSIVE = NO 110EXAMPLE_RECURSIVE = NO
588 111IMAGE_PATH =
589# The IMAGE_PATH tag can be used to specify one or more files or 112INPUT_FILTER =
590# directories that contain image that are included in the documentation (see 113FILTER_PATTERNS =
591# the \image command).
592
593IMAGE_PATH =
594
595# The INPUT_FILTER tag can be used to specify a program that doxygen should
596# invoke to filter for each input file. Doxygen will invoke the filter program
597# by executing (via popen()) the command <filter> <input-file>, where <filter>
598# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
599# input file. Doxygen will then use the output that the filter program writes
600# to standard output. If FILTER_PATTERNS is specified, this tag will be
601# ignored.
602
603INPUT_FILTER =
604
605# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
606# basis. Doxygen will compare the file name with each pattern and apply the
607# filter if there is a match. The filters are a list of the form:
608# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
609# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
610# is applied to all files.
611
612FILTER_PATTERNS =
613
614# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
615# INPUT_FILTER) will be used to filter the input files when producing source
616# files to browse (i.e. when SOURCE_BROWSER is set to YES).
617
618FILTER_SOURCE_FILES = NO 114FILTER_SOURCE_FILES = NO
619 115FILTER_SOURCE_PATTERNS =
620#--------------------------------------------------------------------------- 116#---------------------------------------------------------------------------
621# configuration options related to source browsing 117# configuration options related to source browsing
622#--------------------------------------------------------------------------- 118#---------------------------------------------------------------------------
623
624# If the SOURCE_BROWSER tag is set to YES then a list of source files will
625# be generated. Documented entities will be cross-referenced with these sources.
626# Note: To get rid of all source code in the generated output, make sure also
627# VERBATIM_HEADERS is set to NO.
628
629SOURCE_BROWSER = NO 119SOURCE_BROWSER = NO
630
631# Setting the INLINE_SOURCES tag to YES will include the body
632# of functions and classes directly in the documentation.
633
634INLINE_SOURCES = NO 120INLINE_SOURCES = NO
635
636# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
637# doxygen to hide any special comment blocks from generated source code
638# fragments. Normal C and C++ comments will always remain visible.
639
640STRIP_CODE_COMMENTS = YES 121STRIP_CODE_COMMENTS = YES
641
642# If the REFERENCED_BY_RELATION tag is set to YES (the default)
643# then for each documented function all documented
644# functions referencing it will be listed.
645
646REFERENCED_BY_RELATION = NO 122REFERENCED_BY_RELATION = NO
647
648# If the REFERENCES_RELATION tag is set to YES (the default)
649# then for each documented function all documented entities
650# called/used by that function will be listed.
651
652REFERENCES_RELATION = NO 123REFERENCES_RELATION = NO
653
654# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
655# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
656# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
657# link to the source code. Otherwise they will link to the documentstion.
658
659REFERENCES_LINK_SOURCE = YES 124REFERENCES_LINK_SOURCE = YES
660
661# If the USE_HTAGS tag is set to YES then the references to source code
662# will point to the HTML generated by the htags(1) tool instead of doxygen
663# built-in source browser. The htags tool is part of GNU's global source
664# tagging system (see http://www.gnu.org/software/global/global.html). You
665# will need version 4.8.6 or higher.
666
667USE_HTAGS = NO 125USE_HTAGS = NO
668
669# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
670# will generate a verbatim copy of the header file for each class for
671# which an include is specified. Set to NO to disable this.
672
673VERBATIM_HEADERS = YES 126VERBATIM_HEADERS = YES
674
675#--------------------------------------------------------------------------- 127#---------------------------------------------------------------------------
676# configuration options related to the alphabetical class index 128# configuration options related to the alphabetical class index
677#--------------------------------------------------------------------------- 129#---------------------------------------------------------------------------
678
679# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
680# of all compounds will be generated. Enable this if the project
681# contains a lot of classes, structs, unions or interfaces.
682
683ALPHABETICAL_INDEX = NO 130ALPHABETICAL_INDEX = NO
684
685# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
686# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
687# in which this list will be split (can be a number in the range [1..20])
688
689COLS_IN_ALPHA_INDEX = 5 131COLS_IN_ALPHA_INDEX = 5
690 132IGNORE_PREFIX =
691# In case all classes in a project start with a common prefix, all
692# classes will be put under the same header in the alphabetical index.
693# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
694# should be ignored while generating the index headers.
695
696IGNORE_PREFIX =
697
698#--------------------------------------------------------------------------- 133#---------------------------------------------------------------------------
699# configuration options related to the HTML output 134# configuration options related to the HTML output
700#--------------------------------------------------------------------------- 135#---------------------------------------------------------------------------
701
702# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
703# generate HTML output.
704
705GENERATE_HTML = YES 136GENERATE_HTML = YES
706
707# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
708# If a relative path is entered the value of OUTPUT_DIRECTORY will be
709# put in front of it. If left blank `html' will be used as the default path.
710
711HTML_OUTPUT = html 137HTML_OUTPUT = html
712
713# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
714# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
715# doxygen will generate files with .html extension.
716
717HTML_FILE_EXTENSION = .html 138HTML_FILE_EXTENSION = .html
718 139HTML_HEADER =
719# The HTML_HEADER tag can be used to specify a personal HTML header for 140HTML_FOOTER =
720# each generated HTML page. If it is left blank doxygen will generate a 141HTML_STYLESHEET =
721# standard header. 142HTML_EXTRA_STYLESHEET =
722 143HTML_EXTRA_FILES =
723HTML_HEADER = 144HTML_COLORSTYLE_HUE = 220
724 145HTML_COLORSTYLE_SAT = 100
725# The HTML_FOOTER tag can be used to specify a personal HTML footer for 146HTML_COLORSTYLE_GAMMA = 80
726# each generated HTML page. If it is left blank doxygen will generate a 147HTML_TIMESTAMP = YES
727# standard footer.
728
729HTML_FOOTER =
730
731# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
732# style sheet that is used by each HTML page. It can be used to
733# fine-tune the look of the HTML output. If the tag is left blank doxygen
734# will generate a default style sheet. Note that doxygen will try to copy
735# the style sheet file to the HTML output directory, so don't put your own
736# stylesheet in the HTML output directory as well, or it will be erased!
737
738HTML_STYLESHEET =
739
740# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
741# files or namespaces will be aligned in HTML using tables. If set to
742# NO a bullet list will be used.
743
744HTML_ALIGN_MEMBERS = YES
745
746# If the GENERATE_HTMLHELP tag is set to YES, additional index files
747# will be generated that can be used as input for tools like the
748# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
749# of the generated HTML documentation.
750
751GENERATE_HTMLHELP = NO
752
753# If the GENERATE_DOCSET tag is set to YES, additional index files
754# will be generated that can be used as input for Apple's Xcode 3
755# integrated development environment, introduced with OSX 10.5 (Leopard).
756# To create a documentation set, doxygen will generate a Makefile in the
757# HTML output directory. Running make will produce the docset in that
758# directory and running "make install" will install the docset in
759# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
760# it at startup.
761
762GENERATE_DOCSET = NO
763
764# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
765# feed. A documentation feed provides an umbrella under which multiple
766# documentation sets from a single provider (such as a company or product suite)
767# can be grouped.
768
769DOCSET_FEEDNAME = "Doxygen generated docs"
770
771# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
772# should uniquely identify the documentation set bundle. This should be a
773# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
774# will append .docset to the name.
775
776DOCSET_BUNDLE_ID = org.doxygen.Project
777
778# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
779# documentation will contain sections that can be hidden and shown after the
780# page has loaded. For this to work a browser that supports
781# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
782# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
783
784HTML_DYNAMIC_SECTIONS = NO 148HTML_DYNAMIC_SECTIONS = NO
785 149HTML_INDEX_NUM_ENTRIES = 100
786# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 150GENERATE_DOCSET = NO
787# be used to specify the file name of the resulting .chm file. You 151DOCSET_FEEDNAME = "OpenSimulator docs"
788# can add a path in front of the file if the result should not be 152DOCSET_BUNDLE_ID = org.opensimulator.OpenSim
789# written to the html output directory. 153DOCSET_PUBLISHER_ID = org.opensimulator.OpenSim
790 154DOCSET_PUBLISHER_NAME = OpenSim
791CHM_FILE = 155GENERATE_HTMLHELP = NO
792 156CHM_FILE =
793# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 157HHC_LOCATION =
794# be used to specify the location (absolute path including file name) of
795# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
796# the HTML help compiler on the generated index.hhp.
797
798HHC_LOCATION =
799
800# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
801# controls if a separate .chi index file is generated (YES) or that
802# it should be included in the master .chm file (NO).
803
804GENERATE_CHI = NO 158GENERATE_CHI = NO
805 159CHM_INDEX_ENCODING =
806# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
807# controls whether a binary table of contents is generated (YES) or a
808# normal table of contents (NO) in the .chm file.
809
810BINARY_TOC = NO 160BINARY_TOC = NO
811
812# The TOC_EXPAND flag can be set to YES to add extra items for group members
813# to the contents of the HTML help documentation and to the tree view.
814
815TOC_EXPAND = NO 161TOC_EXPAND = NO
816 162GENERATE_QHP = NO
817# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 163QCH_FILE =
818# top of each HTML page. The value NO (the default) enables the index and 164QHP_NAMESPACE = org.opensimulator.OpenSim
819# the value YES disables it. 165QHP_VIRTUAL_FOLDER = doc
820 166QHP_CUST_FILTER_NAME =
167QHP_CUST_FILTER_ATTRS =
168QHP_SECT_FILTER_ATTRS =
169QHG_LOCATION =
170GENERATE_ECLIPSEHELP = NO
171ECLIPSE_DOC_ID = org.opensimulator.OpenSim
821DISABLE_INDEX = NO 172DISABLE_INDEX = NO
822
823# This tag can be used to set the number of enum values (range [1..20])
824# that doxygen will group on one line in the generated HTML documentation.
825
826ENUM_VALUES_PER_LINE = 4
827
828# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
829# generated containing a tree-like index structure (just like the one that
830# is generated for HTML Help). For this to work a browser that supports
831# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
832# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
833# probably better off using the HTML help feature.
834
835GENERATE_TREEVIEW = NO 173GENERATE_TREEVIEW = NO
836 174ENUM_VALUES_PER_LINE = 4
837# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
838# used to set the initial width (in pixels) of the frame in which the tree
839# is shown.
840
841TREEVIEW_WIDTH = 250 175TREEVIEW_WIDTH = 250
842 176EXT_LINKS_IN_WINDOW = NO
177FORMULA_FONTSIZE = 10
178FORMULA_TRANSPARENT = YES
179USE_MATHJAX = NO
180MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
181MATHJAX_EXTENSIONS =
182SEARCHENGINE = YES
183SERVER_BASED_SEARCH = NO
843#--------------------------------------------------------------------------- 184#---------------------------------------------------------------------------
844# configuration options related to the LaTeX output 185# configuration options related to the LaTeX output
845#--------------------------------------------------------------------------- 186#---------------------------------------------------------------------------
846
847# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
848# generate Latex output.
849
850GENERATE_LATEX = NO 187GENERATE_LATEX = NO
851
852# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
853# If a relative path is entered the value of OUTPUT_DIRECTORY will be
854# put in front of it. If left blank `latex' will be used as the default path.
855
856LATEX_OUTPUT = latex 188LATEX_OUTPUT = latex
857
858# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
859# invoked. If left blank `latex' will be used as the default command name.
860
861LATEX_CMD_NAME = latex 189LATEX_CMD_NAME = latex
862
863# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
864# generate index for LaTeX. If left blank `makeindex' will be used as the
865# default command name.
866
867MAKEINDEX_CMD_NAME = makeindex 190MAKEINDEX_CMD_NAME = makeindex
868
869# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
870# LaTeX documents. This may be useful for small projects and may help to
871# save some trees in general.
872
873COMPACT_LATEX = NO 191COMPACT_LATEX = NO
874
875# The PAPER_TYPE tag can be used to set the paper type that is used
876# by the printer. Possible values are: a4, a4wide, letter, legal and
877# executive. If left blank a4wide will be used.
878
879PAPER_TYPE = a4wide 192PAPER_TYPE = a4wide
880 193EXTRA_PACKAGES =
881# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 194LATEX_HEADER =
882# packages that should be included in the LaTeX output. 195LATEX_FOOTER =
883
884EXTRA_PACKAGES =
885
886# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
887# the generated latex document. The header should contain everything until
888# the first chapter. If it is left blank doxygen will generate a
889# standard header. Notice: only use this tag if you know what you are doing!
890
891LATEX_HEADER =
892
893# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
894# is prepared for conversion to pdf (using ps2pdf). The pdf file will
895# contain links (just like the HTML output) instead of page references
896# This makes the output suitable for online browsing using a pdf viewer.
897
898PDF_HYPERLINKS = YES 196PDF_HYPERLINKS = YES
899
900# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
901# plain latex in the generated Makefile. Set this option to YES to get a
902# higher quality PDF documentation.
903
904USE_PDFLATEX = YES 197USE_PDFLATEX = YES
905
906# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
907# command to the generated LaTeX files. This will instruct LaTeX to keep
908# running if errors occur, instead of asking the user for help.
909# This option is also used when generating formulas in HTML.
910
911LATEX_BATCHMODE = NO 198LATEX_BATCHMODE = NO
912
913# If LATEX_HIDE_INDICES is set to YES then doxygen will not
914# include the index chapters (such as File Index, Compound Index, etc.)
915# in the output.
916
917LATEX_HIDE_INDICES = NO 199LATEX_HIDE_INDICES = NO
918 200LATEX_SOURCE_CODE = NO
201LATEX_BIB_STYLE = plain
919#--------------------------------------------------------------------------- 202#---------------------------------------------------------------------------
920# configuration options related to the RTF output 203# configuration options related to the RTF output
921#--------------------------------------------------------------------------- 204#---------------------------------------------------------------------------
922
923# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
924# The RTF output is optimized for Word 97 and may not look very pretty with
925# other RTF readers or editors.
926
927GENERATE_RTF = NO 205GENERATE_RTF = NO
928
929# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
930# If a relative path is entered the value of OUTPUT_DIRECTORY will be
931# put in front of it. If left blank `rtf' will be used as the default path.
932
933RTF_OUTPUT = rtf 206RTF_OUTPUT = rtf
934
935# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
936# RTF documents. This may be useful for small projects and may help to
937# save some trees in general.
938
939COMPACT_RTF = NO 207COMPACT_RTF = NO
940
941# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
942# will contain hyperlink fields. The RTF file will
943# contain links (just like the HTML output) instead of page references.
944# This makes the output suitable for online browsing using WORD or other
945# programs which support those fields.
946# Note: wordpad (write) and others do not support links.
947
948RTF_HYPERLINKS = NO 208RTF_HYPERLINKS = NO
949 209RTF_STYLESHEET_FILE =
950# Load stylesheet definitions from file. Syntax is similar to doxygen's 210RTF_EXTENSIONS_FILE =
951# config file, i.e. a series of assignments. You only have to provide
952# replacements, missing definitions are set to their default value.
953
954RTF_STYLESHEET_FILE =
955
956# Set optional variables used in the generation of an rtf document.
957# Syntax is similar to doxygen's config file.
958
959RTF_EXTENSIONS_FILE =
960
961#--------------------------------------------------------------------------- 211#---------------------------------------------------------------------------
962# configuration options related to the man page output 212# configuration options related to the man page output
963#--------------------------------------------------------------------------- 213#---------------------------------------------------------------------------
964
965# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
966# generate man pages
967
968GENERATE_MAN = NO 214GENERATE_MAN = NO
969
970# The MAN_OUTPUT tag is used to specify where the man pages will be put.
971# If a relative path is entered the value of OUTPUT_DIRECTORY will be
972# put in front of it. If left blank `man' will be used as the default path.
973
974MAN_OUTPUT = man 215MAN_OUTPUT = man
975
976# The MAN_EXTENSION tag determines the extension that is added to
977# the generated man pages (default is the subroutine's section .3)
978
979MAN_EXTENSION = .3 216MAN_EXTENSION = .3
980
981# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
982# then it will generate one additional man file for each entity
983# documented in the real man page(s). These additional files
984# only source the real man page, but without them the man command
985# would be unable to find the correct page. The default is NO.
986
987MAN_LINKS = NO 217MAN_LINKS = NO
988
989#--------------------------------------------------------------------------- 218#---------------------------------------------------------------------------
990# configuration options related to the XML output 219# configuration options related to the XML output
991#--------------------------------------------------------------------------- 220#---------------------------------------------------------------------------
992
993# If the GENERATE_XML tag is set to YES Doxygen will
994# generate an XML file that captures the structure of
995# the code including all documentation.
996
997GENERATE_XML = NO 221GENERATE_XML = NO
998
999# The XML_OUTPUT tag is used to specify where the XML pages will be put.
1000# If a relative path is entered the value of OUTPUT_DIRECTORY will be
1001# put in front of it. If left blank `xml' will be used as the default path.
1002
1003XML_OUTPUT = xml 222XML_OUTPUT = xml
1004 223XML_SCHEMA =
1005# The XML_SCHEMA tag can be used to specify an XML schema, 224XML_DTD =
1006# which can be used by a validating XML parser to check the
1007# syntax of the XML files.
1008
1009XML_SCHEMA =
1010
1011# The XML_DTD tag can be used to specify an XML DTD,
1012# which can be used by a validating XML parser to check the
1013# syntax of the XML files.
1014
1015XML_DTD =
1016
1017# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
1018# dump the program listings (including syntax highlighting
1019# and cross-referencing information) to the XML output. Note that
1020# enabling this will significantly increase the size of the XML output.
1021
1022XML_PROGRAMLISTING = YES 225XML_PROGRAMLISTING = YES
1023
1024#--------------------------------------------------------------------------- 226#---------------------------------------------------------------------------
1025# configuration options for the AutoGen Definitions output 227# configuration options for the AutoGen Definitions output
1026#--------------------------------------------------------------------------- 228#---------------------------------------------------------------------------
1027
1028# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
1029# generate an AutoGen Definitions (see autogen.sf.net) file
1030# that captures the structure of the code including all
1031# documentation. Note that this feature is still experimental
1032# and incomplete at the moment.
1033
1034GENERATE_AUTOGEN_DEF = NO 229GENERATE_AUTOGEN_DEF = NO
1035
1036#--------------------------------------------------------------------------- 230#---------------------------------------------------------------------------
1037# configuration options related to the Perl module output 231# configuration options related to the Perl module output
1038#--------------------------------------------------------------------------- 232#---------------------------------------------------------------------------
1039
1040# If the GENERATE_PERLMOD tag is set to YES Doxygen will
1041# generate a Perl module file that captures the structure of
1042# the code including all documentation. Note that this
1043# feature is still experimental and incomplete at the
1044# moment.
1045
1046GENERATE_PERLMOD = NO 233GENERATE_PERLMOD = NO
1047
1048# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
1049# the necessary Makefile rules, Perl scripts and LaTeX code to be able
1050# to generate PDF and DVI output from the Perl module output.
1051
1052PERLMOD_LATEX = NO 234PERLMOD_LATEX = NO
1053
1054# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
1055# nicely formatted so it can be parsed by a human reader. This is useful
1056# if you want to understand what is going on. On the other hand, if this
1057# tag is set to NO the size of the Perl module output will be much smaller
1058# and Perl will parse it just the same.
1059
1060PERLMOD_PRETTY = YES 235PERLMOD_PRETTY = YES
1061 236PERLMOD_MAKEVAR_PREFIX =
1062# The names of the make variables in the generated doxyrules.make file
1063# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
1064# This is useful so different doxyrules.make files included by the same
1065# Makefile don't overwrite each other's variables.
1066
1067PERLMOD_MAKEVAR_PREFIX =
1068
1069#--------------------------------------------------------------------------- 237#---------------------------------------------------------------------------
1070# Configuration options related to the preprocessor 238# Configuration options related to the preprocessor
1071#--------------------------------------------------------------------------- 239#---------------------------------------------------------------------------
1072
1073# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
1074# evaluate all C-preprocessor directives found in the sources and include
1075# files.
1076
1077ENABLE_PREPROCESSING = YES 240ENABLE_PREPROCESSING = YES
1078
1079# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
1080# names in the source code. If set to NO (the default) only conditional
1081# compilation will be performed. Macro expansion can be done in a controlled
1082# way by setting EXPAND_ONLY_PREDEF to YES.
1083
1084MACRO_EXPANSION = NO 241MACRO_EXPANSION = NO
1085
1086# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
1087# then the macro expansion is limited to the macros specified with the
1088# PREDEFINED and EXPAND_AS_DEFINED tags.
1089
1090EXPAND_ONLY_PREDEF = NO 242EXPAND_ONLY_PREDEF = NO
1091
1092# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
1093# in the INCLUDE_PATH (see below) will be search if a #include is found.
1094
1095SEARCH_INCLUDES = YES 243SEARCH_INCLUDES = YES
1096 244INCLUDE_PATH =
1097# The INCLUDE_PATH tag can be used to specify one or more directories that 245INCLUDE_FILE_PATTERNS =
1098# contain include files that are not input files but should be processed by 246PREDEFINED =
1099# the preprocessor. 247EXPAND_AS_DEFINED =
1100
1101INCLUDE_PATH =
1102
1103# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
1104# patterns (like *.h and *.hpp) to filter out the header-files in the
1105# directories. If left blank, the patterns specified with FILE_PATTERNS will
1106# be used.
1107
1108INCLUDE_FILE_PATTERNS =
1109
1110# The PREDEFINED tag can be used to specify one or more macro names that
1111# are defined before the preprocessor is started (similar to the -D option of
1112# gcc). The argument of the tag is a list of macros of the form: name
1113# or name=definition (no spaces). If the definition and the = are
1114# omitted =1 is assumed. To prevent a macro definition from being
1115# undefined via #undef or recursively expanded use the := operator
1116# instead of the = operator.
1117
1118PREDEFINED =
1119
1120# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
1121# this tag can be used to specify a list of macro names that should be expanded.
1122# The macro definition that is found in the sources will be used.
1123# Use the PREDEFINED tag if you want to use a different macro definition.
1124
1125EXPAND_AS_DEFINED =
1126
1127# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
1128# doxygen's preprocessor will remove all function-like macros that are alone
1129# on a line, have an all uppercase name, and do not end with a semicolon. Such
1130# function macros are typically used for boiler-plate code, and will confuse
1131# the parser if not removed.
1132
1133SKIP_FUNCTION_MACROS = YES 248SKIP_FUNCTION_MACROS = YES
1134
1135#--------------------------------------------------------------------------- 249#---------------------------------------------------------------------------
1136# Configuration::additions related to external references 250# Configuration::additions related to external references
1137#--------------------------------------------------------------------------- 251#---------------------------------------------------------------------------
1138 252TAGFILES =
1139# The TAGFILES option can be used to specify one or more tagfiles. 253GENERATE_TAGFILE =
1140# Optionally an initial location of the external documentation
1141# can be added for each tagfile. The format of a tag file without
1142# this location is as follows:
1143# TAGFILES = file1 file2 ...
1144# Adding location for the tag files is done as follows:
1145# TAGFILES = file1=loc1 "file2 = loc2" ...
1146# where "loc1" and "loc2" can be relative or absolute paths or
1147# URLs. If a location is present for each tag, the installdox tool
1148# does not have to be run to correct the links.
1149# Note that each tag file must have a unique name
1150# (where the name does NOT include the path)
1151# If a tag file is not located in the directory in which doxygen
1152# is run, you must also specify the path to the tagfile here.
1153
1154TAGFILES =
1155
1156# When a file name is specified after GENERATE_TAGFILE, doxygen will create
1157# a tag file that is based on the input files it reads.
1158
1159GENERATE_TAGFILE =
1160
1161# If the ALLEXTERNALS tag is set to YES all external classes will be listed
1162# in the class index. If set to NO only the inherited external classes
1163# will be listed.
1164
1165ALLEXTERNALS = NO 254ALLEXTERNALS = NO
1166
1167# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
1168# in the modules index. If set to NO, only the current project's groups will
1169# be listed.
1170
1171EXTERNAL_GROUPS = YES 255EXTERNAL_GROUPS = YES
1172
1173# The PERL_PATH should be the absolute path and name of the perl script
1174# interpreter (i.e. the result of `which perl').
1175
1176PERL_PATH = /usr/bin/perl 256PERL_PATH = /usr/bin/perl
1177
1178#--------------------------------------------------------------------------- 257#---------------------------------------------------------------------------
1179# Configuration options related to the dot tool 258# Configuration options related to the dot tool
1180#--------------------------------------------------------------------------- 259#---------------------------------------------------------------------------
1181
1182# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
1183# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
1184# or super classes. Setting the tag to NO turns the diagrams off. Note that
1185# this option is superseded by the HAVE_DOT option below. This is only a
1186# fallback. It is recommended to install and use dot, since it yields more
1187# powerful graphs.
1188
1189CLASS_DIAGRAMS = YES 260CLASS_DIAGRAMS = YES
1190 261MSCGEN_PATH =
1191# You can define message sequence charts within doxygen comments using the \msc
1192# command. Doxygen will then run the mscgen tool (see
1193# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
1194# documentation. The MSCGEN_PATH tag allows you to specify the directory where
1195# the mscgen tool resides. If left empty the tool is assumed to be found in the
1196# default search path.
1197
1198MSCGEN_PATH =
1199
1200# If set to YES, the inheritance and collaboration graphs will hide
1201# inheritance and usage relations if the target is undocumented
1202# or is not a class.
1203
1204HIDE_UNDOC_RELATIONS = YES 262HIDE_UNDOC_RELATIONS = YES
1205
1206# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
1207# available from the path. This tool is part of Graphviz, a graph visualization
1208# toolkit from AT&T and Lucent Bell Labs. The other options in this section
1209# have no effect if this option is set to NO (the default)
1210
1211HAVE_DOT = NO 263HAVE_DOT = NO
1212 264DOT_NUM_THREADS = 0
1213# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 265DOT_FONTNAME = Helvetica
1214# will generate a graph for each documented class showing the direct and 266DOT_FONTSIZE = 10
1215# indirect inheritance relations. Setting this tag to YES will force the 267DOT_FONTPATH =
1216# the CLASS_DIAGRAMS tag to NO.
1217
1218CLASS_GRAPH = YES 268CLASS_GRAPH = YES
1219
1220# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
1221# will generate a graph for each documented class showing the direct and
1222# indirect implementation dependencies (inheritance, containment, and
1223# class references variables) of the class with other documented classes.
1224
1225COLLABORATION_GRAPH = YES 269COLLABORATION_GRAPH = YES
1226
1227# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
1228# will generate a graph for groups, showing the direct groups dependencies
1229
1230GROUP_GRAPHS = YES 270GROUP_GRAPHS = YES
1231
1232# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
1233# collaboration diagrams in a style similar to the OMG's Unified Modeling
1234# Language.
1235
1236UML_LOOK = NO 271UML_LOOK = NO
1237 272UML_LIMIT_NUM_FIELDS = 10
1238# If set to YES, the inheritance and collaboration graphs will show the
1239# relations between templates and their instances.
1240
1241TEMPLATE_RELATIONS = NO 273TEMPLATE_RELATIONS = NO
1242
1243# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
1244# tags are set to YES then doxygen will generate a graph for each documented
1245# file showing the direct and indirect include dependencies of the file with
1246# other documented files.
1247
1248INCLUDE_GRAPH = YES 274INCLUDE_GRAPH = YES
1249
1250# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
1251# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
1252# documented header file showing the documented files that directly or
1253# indirectly include this file.
1254
1255INCLUDED_BY_GRAPH = YES 275INCLUDED_BY_GRAPH = YES
1256
1257# If the CALL_GRAPH and HAVE_DOT options are set to YES then
1258# doxygen will generate a call dependency graph for every global function
1259# or class method. Note that enabling this option will significantly increase
1260# the time of a run. So in most cases it will be better to enable call graphs
1261# for selected functions only using the \callgraph command.
1262
1263CALL_GRAPH = NO 276CALL_GRAPH = NO
1264
1265# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
1266# doxygen will generate a caller dependency graph for every global function
1267# or class method. Note that enabling this option will significantly increase
1268# the time of a run. So in most cases it will be better to enable caller
1269# graphs for selected functions only using the \callergraph command.
1270
1271CALLER_GRAPH = NO 277CALLER_GRAPH = NO
1272
1273# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
1274# will graphical hierarchy of all classes instead of a textual one.
1275
1276GRAPHICAL_HIERARCHY = YES 278GRAPHICAL_HIERARCHY = YES
1277
1278# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
1279# then doxygen will show the dependencies a directory has on other directories
1280# in a graphical way. The dependency relations are determined by the #include
1281# relations between the files in the directories.
1282
1283DIRECTORY_GRAPH = YES 279DIRECTORY_GRAPH = YES
1284
1285# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
1286# generated by dot. Possible values are png, jpg, or gif
1287# If left blank png will be used.
1288
1289DOT_IMAGE_FORMAT = png 280DOT_IMAGE_FORMAT = png
1290 281INTERACTIVE_SVG = NO
1291# The tag DOT_PATH can be used to specify the path where the dot tool can be 282DOT_PATH =
1292# found. If left blank, it is assumed the dot tool can be found in the path. 283DOTFILE_DIRS =
1293 284MSCFILE_DIRS =
1294DOT_PATH =
1295
1296# The DOTFILE_DIRS tag can be used to specify one or more directories that
1297# contain dot files that are included in the documentation (see the
1298# \dotfile command).
1299
1300DOTFILE_DIRS =
1301
1302# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
1303# nodes that will be shown in the graph. If the number of nodes in a graph
1304# becomes larger than this value, doxygen will truncate the graph, which is
1305# visualized by representing a node as a red box. Note that doxygen if the
1306# number of direct children of the root node in a graph is already larger than
1307# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
1308# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
1309
1310DOT_GRAPH_MAX_NODES = 50 285DOT_GRAPH_MAX_NODES = 50
1311
1312# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
1313# graphs generated by dot. A depth value of 3 means that only nodes reachable
1314# from the root by following a path via at most 3 edges will be shown. Nodes
1315# that lay further from the root node will be omitted. Note that setting this
1316# option to 1 or 2 may greatly reduce the computation time needed for large
1317# code bases. Also note that the size of a graph can be further restricted by
1318# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
1319
1320MAX_DOT_GRAPH_DEPTH = 0 286MAX_DOT_GRAPH_DEPTH = 0
1321
1322# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
1323# background. This is enabled by default, which results in a transparent
1324# background. Warning: Depending on the platform used, enabling this option
1325# may lead to badly anti-aliased labels on the edges of a graph (i.e. they
1326# become hard to read).
1327
1328DOT_TRANSPARENT = YES 287DOT_TRANSPARENT = YES
1329
1330# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
1331# files in one run (i.e. multiple -o and -T options on the command line). This
1332# makes dot run faster, but since only newer versions of dot (>1.8.10)
1333# support this, this feature is disabled by default.
1334
1335DOT_MULTI_TARGETS = NO 288DOT_MULTI_TARGETS = NO
1336
1337# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
1338# generate a legend page explaining the meaning of the various boxes and
1339# arrows in the dot generated graphs.
1340
1341GENERATE_LEGEND = YES 289GENERATE_LEGEND = YES
1342
1343# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
1344# remove the intermediate dot files that are used to generate
1345# the various graphs.
1346
1347DOT_CLEANUP = YES 290DOT_CLEANUP = YES
1348
1349#---------------------------------------------------------------------------
1350# Configuration::additions related to the search engine
1351#---------------------------------------------------------------------------
1352
1353# The SEARCHENGINE tag specifies whether or not a search engine should be
1354# used. If set to NO the values of all tags below this one will be ignored.
1355
1356SEARCHENGINE = YES