aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Framework/Interfaces/IScriptModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs55
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs47
4 files changed, 79 insertions, 27 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index f11e571..98efcbe 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -35,7 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces
35 string ScriptEngineName { get; } 35 string ScriptEngineName { get; }
36 36
37 string GetXMLState(UUID itemID); 37 string GetXMLState(UUID itemID);
38 void SetXMLState(UUID itemID, string xml); 38 bool SetXMLState(UUID itemID, string xml);
39 39
40 bool PostScriptEvent(UUID itemID, string name, Object[] args); 40 bool PostScriptEvent(UUID itemID, string name, Object[] args);
41 bool PostObjectEvent(UUID itemID, string name, Object[] args); 41 bool PostObjectEvent(UUID itemID, string name, Object[] args);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index eb284c1..f79eb5d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1314,7 +1314,7 @@ namespace OpenSim.Region.Framework.Scenes
1314 maintc = Util.EnvironmentTickCountSubtract(maintc); 1314 maintc = Util.EnvironmentTickCountSubtract(maintc);
1315 maintc = (int)(m_timespan * 1000) - maintc; 1315 maintc = (int)(m_timespan * 1000) - maintc;
1316 1316
1317 if ((maintc < (m_timespan * 1000)) && maintc > 0) 1317 if (maintc > 0)
1318 Thread.Sleep(maintc); 1318 Thread.Sleep(maintc);
1319 1319
1320 // Tell the watchdog that this thread is still alive 1320 // Tell the watchdog that this thread is still alive
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 22eedba..47e4ad0 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Xml;
29using System.IO; 30using System.IO;
30using System.Collections.Generic; 31using System.Collections.Generic;
31using System.Reflection; 32using System.Reflection;
@@ -283,15 +284,55 @@ namespace OpenSim.Region.Framework.Scenes
283 284
284 private void RestoreSavedScriptState(UUID oldID, UUID newID) 285 private void RestoreSavedScriptState(UUID oldID, UUID newID)
285 { 286 {
287 IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
288 if (engines == null) // No engine at all
289 return;
290
286 if (m_part.ParentGroup.m_savedScriptState.ContainsKey(oldID)) 291 if (m_part.ParentGroup.m_savedScriptState.ContainsKey(oldID))
287 { 292 {
288 string fpath = Path.Combine("ScriptEngines/"+m_part.ParentGroup.Scene.RegionInfo.RegionID.ToString(), 293 XmlDocument doc = new XmlDocument();
289 newID.ToString()+".state"); 294
290 FileStream fs = File.Create(fpath); 295 doc.LoadXml(m_part.ParentGroup.m_savedScriptState[oldID]);
291 Byte[] buffer = enc.GetBytes(m_part.ParentGroup.m_savedScriptState[oldID]); 296
292 fs.Write(buffer,0,buffer.Length); 297 ////////// CRUFT WARNING ///////////////////////////////////
293 fs.Close(); 298 //
294 m_part.ParentGroup.m_savedScriptState.Remove(oldID); 299 // Old objects will have <ScriptState><State> ...
300 // This format is XEngine ONLY
301 //
302 // New objects have <State Engine="...." ...><ScriptState>...
303 // This can be passed to any engine
304 //
305 XmlNode n = doc.SelectSingleNode("ScriptState");
306 if (n != null) // Old format data
307 {
308 XmlDocument newDoc = new XmlDocument();
309
310 XmlElement rootN = newDoc.CreateElement("", "State", "");
311 XmlAttribute uuidA = newDoc.CreateAttribute("", "UUID", "");
312 uuidA.Value = oldID.ToString();
313 rootN.Attributes.Append(uuidA);
314 XmlAttribute engineA = newDoc.CreateAttribute("", "Engine", "");
315 engineA.Value = "XEngine";
316 rootN.Attributes.Append(engineA);
317
318 newDoc.AppendChild(rootN);
319
320 XmlNode stateN = newDoc.ImportNode(n, true);
321 rootN.AppendChild(stateN);
322
323 // This created document has only the minimun data
324 // necessary for XEngine to parse it successfully
325
326 m_part.ParentGroup.m_savedScriptState[oldID] = newDoc.OuterXml;
327 }
328 foreach (IScriptModule e in engines)
329 {
330 if (e != null)
331 {
332 if (e.SetXMLState(newID, m_part.ParentGroup.m_savedScriptState[oldID]))
333 break;
334 }
335 }
295 } 336 }
296 } 337 }
297 338
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 9030a5c..25a4cd6 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1266,6 +1266,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1266 XmlAttribute assetID = doc.CreateAttribute("", "Asset", ""); 1266 XmlAttribute assetID = doc.CreateAttribute("", "Asset", "");
1267 assetID.Value = instance.AssetID.ToString(); 1267 assetID.Value = instance.AssetID.ToString();
1268 stateData.Attributes.Append(assetID); 1268 stateData.Attributes.Append(assetID);
1269 XmlAttribute engineName = doc.CreateAttribute("", "Engine", "");
1270 engineName.Value = ScriptEngineName;
1271 stateData.Attributes.Append(engineName);
1269 doc.AppendChild(stateData); 1272 doc.AppendChild(stateData);
1270 1273
1271 // Add <ScriptState>...</ScriptState> 1274 // Add <ScriptState>...</ScriptState>
@@ -1365,10 +1368,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1365 return false; 1368 return false;
1366 } 1369 }
1367 1370
1368 public void SetXMLState(UUID itemID, string xml) 1371 public bool SetXMLState(UUID itemID, string xml)
1369 { 1372 {
1370 if (xml == String.Empty) 1373 if (xml == String.Empty)
1371 return; 1374 return false;
1372 1375
1373 XmlDocument doc = new XmlDocument(); 1376 XmlDocument doc = new XmlDocument();
1374 1377
@@ -1379,24 +1382,28 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1379 catch (Exception) 1382 catch (Exception)
1380 { 1383 {
1381 m_log.Error("[XEngine]: Exception decoding XML data from region transfer"); 1384 m_log.Error("[XEngine]: Exception decoding XML data from region transfer");
1382 return; 1385 return false;
1383 } 1386 }
1384 1387
1385 XmlNodeList rootL = doc.GetElementsByTagName("State"); 1388 XmlNodeList rootL = doc.GetElementsByTagName("State");
1386 if (rootL.Count < 1) 1389 if (rootL.Count < 1)
1387 return; 1390 return false;
1388 1391
1389 XmlElement rootE = (XmlElement)rootL[0]; 1392 XmlElement rootE = (XmlElement)rootL[0];
1390 1393
1391 if (rootE.GetAttribute("UUID") != itemID.ToString()) 1394 if (rootE.GetAttribute("Engine") != ScriptEngineName)
1392 return; 1395 return false;
1393 1396
1394// string assetID = rootE.GetAttribute("Asset"); 1397// On rez from inventory, that ID will have changed. It was only
1398// advisory anyway. So we don't check it anymore.
1399//
1400// if (rootE.GetAttribute("UUID") != itemID.ToString())
1401// return;
1395 1402
1396 XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState"); 1403 XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState");
1397 1404
1398 if (stateL.Count != 1) 1405 if (stateL.Count != 1)
1399 return; 1406 return false;
1400 1407
1401 XmlElement stateE = (XmlElement)stateL[0]; 1408 XmlElement stateE = (XmlElement)stateL[0];
1402 1409
@@ -1405,7 +1412,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1405 XmlNodeList assemL = rootE.GetElementsByTagName("Assembly"); 1412 XmlNodeList assemL = rootE.GetElementsByTagName("Assembly");
1406 1413
1407 if (assemL.Count != 1) 1414 if (assemL.Count != 1)
1408 return; 1415 return false;
1409 1416
1410 XmlElement assemE = (XmlElement)assemL[0]; 1417 XmlElement assemE = (XmlElement)assemL[0];
1411 1418
@@ -1445,19 +1452,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1445 sfs.Close(); 1452 sfs.Close();
1446 1453
1447 XmlNodeList mapL = rootE.GetElementsByTagName("LineMap"); 1454 XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
1448 1455 if (mapL.Count > 0)
1449 XmlElement mapE = (XmlElement)mapL[0]; 1456 {
1457 XmlElement mapE = (XmlElement)mapL[0];
1450 1458
1451 string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); 1459 string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString());
1452 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); 1460 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
1453 1461
1454 FileStream mfs = File.Create(mappath); 1462 FileStream mfs = File.Create(mappath);
1455 StreamWriter msw = new StreamWriter(mfs); 1463 StreamWriter msw = new StreamWriter(mfs);
1456 1464
1457 msw.Write(mapE.InnerText); 1465 msw.Write(mapE.InnerText);
1458 1466
1459 msw.Close(); 1467 msw.Close();
1460 mfs.Close(); 1468 mfs.Close();
1469 }
1470
1471 return true;
1461 } 1472 }
1462 } 1473 }
1463} 1474}