public void ToXml(XmlWriter w, bool backup) { if (!backup) { ToXml(w); } if (loaded) { int pathEnd = ((IObjectCollectionParent)parent).WorldFilePath.LastIndexOf('\\'); string pathName = ((IObjectCollectionParent)parent).WorldFilePath.Substring(0, pathEnd); w.WriteStartElement("WorldObjectCollection"); w.WriteAttributeString("Version", app.Config.XmlSaveFileVersion.ToString()); foreach (IWorldObject obj in objectList) { if (String.Equals(obj.ObjectType, "Collection")) { WorldObjectCollection worldCollection = (WorldObjectCollection)obj; worldCollection.Path = pathName; // write the XML into the top level world file w.WriteStartElement("WorldCollection"); if (worldCollection.Filename == "") { int startIndex = pathEnd + 1; int subStringLength = WorldFilePath.LastIndexOf(".mwc") - startIndex; worldCollection.Filename = String.Format("{0}-{1}.mwc", WorldFilePath.Substring(startIndex, subStringLength), worldCollection.Name); } w.WriteAttributeString("Name", worldCollection.Name); string filename = worldCollection.Filename.Insert((worldCollection.Filename.LastIndexOf(".")), "~"); w.WriteAttributeString("Filename", filename); w.WriteEndElement(); // create a file for the collection if (worldCollection.Loaded) { try { XmlWriter childWriter = XmlWriter.Create(String.Format("{0}\\{1}", pathName, filename), app.XMLWriterSettings); worldCollection.ToXml(childWriter, backup); childWriter.Close(); } catch (Exception e) { LogManager.Instance.Write(e.ToString()); MessageBox.Show(String.Format("Unable to open the file for writing. Use file menu \"Save As\" to save to another location. Error: {0}", e.Message), "Error Saving File", MessageBoxButtons.OK); } } } else { obj.ToXml(w); } } w.WriteEndElement(); } }
protected void FromXml(XmlReader r, bool loadall) { string colfilename = ""; string baseName = WorldFilePath.Substring(0, WorldFilePath.LastIndexOf('\\')); do { r.Read(); } while ((r.NodeType != XmlNodeType.Element) || !(String.Equals(r.Name, "WorldObjectCollection"))); while (r.Read()) { // look for the start of an element if (r.NodeType == XmlNodeType.Whitespace) { continue; } if (r.NodeType == XmlNodeType.EndElement) { break; } if (r.NodeType == XmlNodeType.Element) { switch (r.Name) { case "Road": RoadObject road = new RoadObject(r, this, app); Add(road); break; case "StaticObject": StaticObject obj = new StaticObject(this, app, r); Add(obj); break; case "Waypoint": Waypoint wp = new Waypoint(r, this, app); Add(wp); break; case "Boundary": Boundary b = new Boundary(r, this, app); Add(b); break; case "PointLight": PointLight pl = new PointLight(app, this, app.Scene, r); Add(pl); break; case "TerrainDecal": TerrainDecal d = new TerrainDecal(app, this, r); Add(d); break; case "WorldCollection": string collectionName = null; colfilename = ""; for (int i = 0; i < r.AttributeCount; i++) { r.MoveToAttribute(i); switch (r.Name) { case "Name": collectionName = r.Value; break; case "Filename": colfilename = r.Value; break; } } baseName = this.Path; if (!loadall) { if (colfilename != "") { if (colfilename.EndsWith("~.mwc")) { string autofilepath = String.Format("{0}\\{1}", baseName, colfilename); string normalfilepath = String.Format("{0}\\{1}", baseName, colfilename.Remove(colfilename.LastIndexOf("~"), 1)); if ((File.Exists(autofilepath) && File.Exists(normalfilepath) && (new FileInfo(autofilepath)).LastWriteTime < (new FileInfo(normalfilepath).LastWriteTime)) || (!File.Exists(autofilepath) && File.Exists(normalfilepath))) { colfilename = colfilename.Remove(filename.LastIndexOf("~"), 1); } } XmlReader childReader = XmlReader.Create(String.Format("{0}\\{1}", baseName, colfilename), app.XMLReaderSettings); WorldObjectCollection coll = new WorldObjectCollection(childReader, collectionName, this, app, baseName, false); while (colfilename.Contains("~")) { colfilename = colfilename.Remove(colfilename.LastIndexOf("~"), 1); } coll.Filename = colfilename; Add(coll); childReader.Close(); } else { XmlReader childReader = XmlReader.Create(String.Format("{0}\\{1}.mwc", baseName, collectionName), app.XMLReaderSettings); WorldObjectCollection coll = new WorldObjectCollection(childReader, collectionName, this, app, baseName, false); coll.Filename = collectionName + ".mwc"; Add(coll); childReader.Close(); } } else { if (colfilename != "") { if (colfilename.EndsWith("~.mwc")) { string autofilepath = String.Format("{0}\\{1}", baseName, colfilename); string normalfilepath = String.Format("{0}\\{1}", baseName, colfilename.Remove(filename.LastIndexOf("~"), 1)); if ((File.Exists(autofilepath) && File.Exists(normalfilepath) && (new FileInfo(autofilepath)).LastWriteTime < (new FileInfo(normalfilepath).LastWriteTime)) || (!File.Exists(autofilepath) && File.Exists(normalfilepath))) { colfilename = colfilename.Remove(colfilename.LastIndexOf("~"), 1); } } XmlReader childReader = XmlReader.Create(String.Format("{0}\\{1}", baseName, colfilename), app.XMLReaderSettings); WorldObjectCollection coll = new WorldObjectCollection(childReader, collectionName, this, app, baseName); while (colfilename.Contains("~")) { colfilename = colfilename.Remove(colfilename.LastIndexOf("~"), 1); } coll.Filename = colfilename; Add(coll); childReader.Close(); } else { XmlReader childReader = XmlReader.Create(String.Format("{0}\\{1}.mwc", baseName, collectionName), app.XMLReaderSettings); WorldObjectCollection coll = new WorldObjectCollection(childReader, collectionName, this, app, baseName); coll.Filename = collectionName + ".mwc"; Add(coll); childReader.Close(); } } r.MoveToElement(); break; } } } while (filename.Contains("~")) { filename = filename.Remove(filename.IndexOf("~"), 1); } }