public void LoadForeignNoteXml (string foreignNoteXml, ChangeType changeType)
{
if (foreignNoteXml == null)
throw new ArgumentNullException ("foreignNoteXml");
// Arguments to this method cannot be trusted. If this method
// were to throw an XmlException in the middle of processing,
// a note could be damaged. Therefore, we check for parseability
// ahead of time, and throw early.
XmlDocument xmlDoc = new XmlDocument ();
// This will throw an XmlException if foreignNoteXml is not parseable
xmlDoc.LoadXml (foreignNoteXml);
xmlDoc = null;
// Remove tags now, since a note with no tags has
// no "tags" element in the XML
List<Tag> newTags = new List<Tag> ();
using (var xml = new XmlTextReader (new StringReader (foreignNoteXml)) {Namespaces = false}) {
DateTime date;
while (xml.Read ()) {
switch (xml.NodeType) {
case XmlNodeType.Element:
switch (xml.Name) {
case "title":
Title = xml.ReadString ();
break;
case "text":
XmlContent = xml.ReadInnerXml ();
break;
case "last-change-date":
if (DateTime.TryParse (xml.ReadString (), out date))
data.Data.ChangeDate = date;
else
data.Data.ChangeDate = DateTime.Now;
break;
case "last-metadata-change-date":
if (DateTime.TryParse (xml.ReadString (), out date))
data.Data.MetadataChangeDate = date;
else
data.Data.MetadataChangeDate = DateTime.Now;
break;
case "create-date":
if (DateTime.TryParse (xml.ReadString (), out date))
data.Data.CreateDate = date;
else
data.Data.CreateDate = DateTime.Now;
break;
case "tags":
XmlDocument doc = new XmlDocument ();
List<string> tag_strings = ParseTags (doc.ReadNode (xml.ReadSubtree ()));
foreach (string tag_str in tag_strings) {
Tag tag = TagManager.GetOrCreateTag (tag_str);
newTags.Add (tag);
}
break;
case "open-on-startup":
bool isStartup;
if (bool.TryParse (xml.ReadString (), out isStartup))
IsOpenOnStartup = isStartup;
break;
}
break;
}
}
}
foreach (Tag oldTag in Tags)
if (!newTags.Contains (oldTag))
RemoveTag (oldTag);
foreach (Tag newTag in newTags)
AddTag (newTag);
// Allow method caller to specify ChangeType (mostly needed by sync)
QueueSave (changeType);
}