Пример #1
0
        public void Save(IEnumerable <RemoteElement> elements)
        {
            XmlDocument document = new XmlDocument();

            document.Schemas.Add(_Schema);
            RemoteControls persistenceModel = new RemoteControls();

            foreach (var e in elements)
            {
                e.Deflate(document);
            }
            persistenceModel.Items = elements.ToArray();

            using (StringWriter writer = new StringWriter())
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                using (XmlWriter xmlWriter = XmlWriter.Create(writer, settings))
                {
                    XmlSerializer xmlSerializer = new XmlSerializer(typeof(RemoteControls));
                    xmlSerializer.Serialize(xmlWriter, persistenceModel);
                }
                _SaveQueue.Enqueue(writer.ToString());
            }

            Task.Factory.StartNew(() =>
            {
                string toSave;
                while (_SaveQueue.TryDequeue(out toSave))
                {
                    lockObj.EnterWriteLock();
                    try
                    {
                        File.Copy(_XmlFilename, _XmlFilename + ".bak", true);
                        using (var stream = File.Create(_XmlFilename))
                        {
                            using (StreamWriter writer = new StreamWriter(stream))
                            {
                                writer.WriteLine(toSave);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _Log.Error(string.Format("Failed to save \"Controls.xml\": {0}", ex.Message), ex);
                    }
                    finally
                    {
                        lockObj.ExitWriteLock();
                    }
                }
            });
        }
Пример #2
0
 public IEnumerable <RemoteElement> Load()
 {
     lockObj.EnterReadLock();
     try
     {
         using (StreamReader reader = new StreamReader(File.OpenRead(_XmlFilename)))
         {
             XmlReaderSettings settings = new XmlReaderSettings();
             settings.IgnoreComments = true;
             settings.IgnoreProcessingInstructions = true;
             settings.IgnoreWhitespace             = true;
             settings.Schemas.Add(_Schema);
             settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
             settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
             settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
             using (XmlReader xmlReader = XmlReader.Create(reader, settings))
             {
                 XmlSerializer  xmlSerializer = new XmlSerializer(typeof(RemoteControls));
                 RemoteControls deserialized  = (RemoteControls)xmlSerializer.Deserialize(xmlReader);
                 foreach (RemoteElement element in deserialized.Items)
                 {
                     var result = element.Inflate(_PluginManager);
                     if (!result.Success)
                     {
                         foreach (var error in result.Errors)
                         {
                             _Log.WarnFormat("Failed to inflate control \"{0}\": {1}", element, error);
                         }
                     }
                 }
                 return(new List <RemoteElement>(deserialized.Items));
             }
         }
     }
     finally
     {
         lockObj.ExitReadLock();
     }
 }