示例#1
0
        protected override bool OnKeyPressEvent(Gdk.EventKey evnt)
        {
            switch (evnt.Key)
            {
            case Gdk.Key.Left:
                SelectPrev();
                return(true);

            case Gdk.Key.Right:
                SelectNext();
                return(true);

            case Gdk.Key.BackSpace:
                if (CurrentPart != "")
                {
                    CurrentPart = CurrentPart.Remove(CurrentPart.Length - 1, 1);
                }
                else
                {
                    CurrentPart = atStart.ToString().Remove(atStart.ToString().Length - 1, 1);
                }
                break;
            }
            return(base.OnKeyPressEvent(evnt));
        }
示例#2
0
 public KeyValuePair <string, PathType>?CompileCurrent(TokenzierContext context, int index, out Func <IMorestachioError> errProducer)
 {
     if (CurrentPart == ".")
     {
         PathParts.Add(null, PathType.SelfAssignment);
     }
     else if (CurrentPart == "../")
     {
         PathParts.Add(null, PathType.ParentSelector);
     }
     else if (CurrentPart == "~")
     {
         PathParts.Add(null, PathType.RootSelector);
     }
     else if (CurrentPart == "?")
     {
         PathParts.Add(null, PathType.ObjectSelector);
     }
     else if (CurrentPart.Trim() != string.Empty)
     {
         if (!ComputeCurrentPart(context, index, out errProducer))
         {
             errProducer = () => (
                 new InvalidPathSyntaxError(context.CurrentLocation.Offset(index)
                                            .AddWindow(new CharacterSnippedLocation(1, index, CurrentPart)),
                                            CurrentPart,
                                            "Invalid character"));
             return(default);
示例#3
0
        public void OnStreamPartChange(PackageDataStreamPart oldPart, PackageDataStreamPart newPart)
        {
            EnsureNotDisposed();

            bool keepSameStream = oldPart != null && newPart != null && oldPart.Path == newPart.Path;

            if (keepSameStream)
            {
                // move stream to new part
                newPart.Stream = oldPart.Stream;
                currentPart.FileStream.Seek(newPart.SegmentOffsetInDataFile, SeekOrigin.Begin);
            }
            else
            {
                // close old one
                if (oldPart != null)
                {
                    DisposeCurrentPart();
                }

                // open new part
                if (newPart != null)
                {
                    currentPart            = new CurrentPart();
                    currentPart.Part       = newPart;
                    currentPart.FileStream = new FileStream(newPart.Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                    currentPart.FileStream.Seek(newPart.SegmentOffsetInDataFile, SeekOrigin.Begin);
                    currentPart.Part.Stream = currentPart.FileStream;
                }
            }
        }
示例#4
0
 public void Upgrade()
 {
     Level += 1;
     if (CurrentPart != null && Level != 3)
     {
         CurrentPart.Upgrade();
     }
 }
示例#5
0
 private void DisposeCurrentPart()
 {
     if (currentPart == null)
     {
         return;
     }
     currentPart.FileStream.Dispose();
     currentPart = null;
 }
示例#6
0
 public void Upgrade()
 {
     if (Level <= 3)
     {
         Level++;
         baseMaxSpeed = ((0.5F * Level));
         CurrentPart.Upgrade();
     }
 }
示例#7
0
        private void DisposeCurrentPart()
        {
            if (currentPart == null)
            {
                return;
            }

            currentPart.HashStream.Dispose();
            currentPart.HashAlgorithm.Dispose();
            currentPart = null;
        }
示例#8
0
        public void OnStreamPartChange(PackageDataStreamPart oldPart, PackageDataStreamPart newPart)
        {
            EnsureNotDisposed();

            bool keepSameStream = oldPart != null && newPart != null && oldPart.Path == newPart.Path;

            // compute hash
            if (oldPart != null)
            {
                ComputeCurrentPartHash();
            }

            if (!keepSameStream)
            {
                // close old one
                if (oldPart != null)
                {
                    DisposeCurrentPart();
                }

                // open new part
                if (newPart != null)
                {
                    logger.LogTrace($"Opening data file {Path.GetFileName(newPart.Path)} for writing.");

                    currentPart = new CurrentPart
                    {
                        Part = newPart,
                    };
                }
            }

            // update current part
            if (newPart != null)
            {
                currentPart.Part          = newPart;
                currentPart.HashAlgorithm = cryptoProvider.CreateHashAlgorithm();
                if (writeToNestedStream)
                {
                    // allocate and write to memory stream
                    memStream.Position = 0;
                    memStream.SetLength(0);
                    currentPart.HashStream = new CryptoStream(memStream, currentPart.HashAlgorithm, CryptoStreamMode.Write, leaveOpen: true);
                }
                else
                {
                    // write to NULL - just compute hash
                    currentPart.HashStream = new CryptoStream(Stream.Null, currentPart.HashAlgorithm, CryptoStreamMode.Write, leaveOpen: true);
                }
                currentPart.Part.Stream = currentPart.HashStream;
            }
        }
示例#9
0
        private void DisposeCurrentPart()
        {
            if (currentPart == null)
            {
                return;
            }

            currentPart.HashStream.Dispose();
            currentPart.HashAlgorithm.Dispose();
            totalSize += currentPart.FileStream.Length;
            currentPart.FileStream.Dispose();
            currentPart = null;
        }
示例#10
0
        public IList <KeyValuePair <string, PathType> > Compile(TokenzierContext context, int index)
        {
            if (CurrentPart == ".")
            {
                PathParts.Add(new KeyValuePair <string, PathType>(null, PathType.SelfAssignment));
            }
            else if (CurrentPart == "../")
            {
                PathParts.Add(new KeyValuePair <string, PathType>(null, PathType.ParentSelector));
            }
            else if (CurrentPart == "~")
            {
                PathParts.Add(new KeyValuePair <string, PathType>(null, PathType.RootSelector));
            }
            else if (CurrentPart == "?")
            {
                PathParts.Add(new KeyValuePair <string, PathType>(null, PathType.ObjectSelector));
            }
            else if (CurrentPart.Trim() != "")
            {
                if (CurrentPartIsNumber)
                {
                    PathParts.Add(new KeyValuePair <string, PathType>(CurrentPart, PathType.Number));
                }
                else
                {
                    if (!ComputeCurrentPart(context, index))
                    {
                        return(new KeyValuePair <string, PathType> [0]);
                    }
                }
            }

            if (PathParts.Count > 1 && PathParts.Last().Value == PathType.SelfAssignment)
            {
                PathParts.Remove(PathParts.Last());
            }

            //if (!PathParts.Any())
            //{
            //	hasError = 0;
            //	return PathParts;
            //}

            CurrentPart = "";
            return(PathParts);
        }
示例#11
0
        public void OnStreamPartChange(PackageDataStreamPart oldPart, PackageDataStreamPart newPart)
        {
            EnsureNotDisposed();

            bool keepSameStream = oldPart != null && newPart != null && oldPart.Path == newPart.Path;

            // compute hash
            if (oldPart != null)
            {
                ComputeCurrentPartHash();
            }

            if (!keepSameStream)
            {
                // close old one
                if (oldPart != null)
                {
                    DisposeCurrentPart();
                }

                // open new part
                if (newPart != null)
                {
                    logger.LogDebug($"Creating new data file {Path.GetFileName(newPart.Path)}. Already wrote {SizeFormatter.ToString(totalSize)}.");

                    currentPart = new CurrentPart
                    {
                        Part       = newPart,
                        FileStream = new FileStream(newPart.Path, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None)
                    };
                    currentPart.FileStream.SetLength(newPart.DataFileLength);
                }
            }

            // update current part
            if (newPart != null)
            {
                currentPart.Part = newPart;
                currentPart.FileStream.Seek(newPart.SegmentOffsetInDataFile, SeekOrigin.Begin);
                currentPart.HashAlgorithm = cryptoProvider.CreateHashAlgorithm();
                currentPart.HashStream    = new CryptoStream(currentPart.FileStream, currentPart.HashAlgorithm, CryptoStreamMode.Write, leaveOpen: true);
                currentPart.Part.Stream   = currentPart.HashStream;
            }
        }
示例#12
0
        public void OnStreamPartChange(PackageDataStreamPart oldPart, PackageDataStreamPart newPart)
        {
            EnsureNotDisposed();

            bool keepSameStream = oldPart != null && newPart != null && oldPart.Path == newPart.Path;

            // flush
            if (oldPart != null)
            {
                FlushCurrentPart();
            }

            if (!keepSameStream)
            {
                // close old one
                if (oldPart != null)
                {
                    DisposeCurrentPart();
                }

                // open new part
                if (newPart != null)
                {
                    logger.LogTrace($"Opening data file {Path.GetFileName(newPart.Path)} for writing.");

                    currentPart = new CurrentPart
                    {
                        Part       = newPart,
                        FileStream = new FileStream(newPart.Path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
                    };
                }
            }

            // update current part
            if (newPart != null)
            {
                currentPart.Part = newPart;
                currentPart.FileStream.Seek(newPart.SegmentOffsetInDataFile, SeekOrigin.Begin);
                currentPart.Part.Stream = currentPart.FileStream;
            }
        }
示例#13
0
    void Update()
    {
        if (CurrentPart == null)
        {
            return;
        }

        if (PlayStateManager.Instance.CurrentInteractible != null)
        {
            CurrentPart = null;
            return;
        }

        if (CurrentPart.Equals(PART_HANDLE))
        {
            PlayStateManager.Instance.Robot.MoveIKHandle(GetTranslationVector(CurrentDirection, moveSpeed * Time.deltaTime));
        }
        else
        {
            PlayStateManager.Instance.Robot.Rotate(CurrentPart, GetRotationVector(CurrentDirection, rotationSpeed * Time.deltaTime));
        }
    }
示例#14
0
        /// <summary>
        /// Handles KeyPress event
        /// </summary>
        /// <param name="evnt">
        /// Arguments <see cref="Gdk.EventKey"/>
        /// </param>
        /// <returns>
        /// true if handled, false if not <see cref="System.Boolean"/>
        /// </returns>
        protected override bool OnKeyPressEvent(Gdk.EventKey evnt)
        {
            switch (evnt.Key)
            {
            case Gdk.Key.Tab:
                return(base.OnKeyPressEvent(evnt));
            }
            if (Editable == false)
            {
                return(true);
            }
            switch (evnt.Key)
            {
            case Gdk.Key.Left:
                SelectPrev();
                return(true);

            case Gdk.Key.Right:
                SelectNext();
                return(true);

            case Gdk.Key.BackSpace:
                if (CurrentPart != "")
                {
                    CurrentPart = CurrentPart.Remove(CurrentPart.Length - 1, 1);
                }
                else
                {
                    CurrentPart = atStart.ToString().Remove(atStart.ToString().Length - 1, 1);
                }
                break;

            case Gdk.Key.Insert:
                if ((evnt.State & ModifierType.ControlMask) == ModifierType.ControlMask)
                {
                    CopyToClipboard((evnt.State & ModifierType.ShiftMask) == ModifierType.ShiftMask);
                    return(true);
                }
                if ((evnt.State & ModifierType.ShiftMask) == ModifierType.ShiftMask)
                {
                    ResetEditing();
                    PasteFromClipboard();
                    return(true);
                }
                return(false);

            case Gdk.Key.C:
            case Gdk.Key.c:
                if ((evnt.State & ModifierType.ControlMask) != ModifierType.ControlMask)
                {
                    return(false);
                }
                ResetEditing();
                CopyToClipboard(false);
                return(true);

            case Gdk.Key.X:
            case Gdk.Key.x:
                if ((evnt.State & ModifierType.ControlMask) != ModifierType.ControlMask)
                {
                    return(false);
                }
                ResetEditing();
                CopyToClipboard(true);
                return(true);

            case Gdk.Key.V:
            case Gdk.Key.v:
                if ((evnt.State & ModifierType.ControlMask) != ModifierType.ControlMask)
                {
                    return(false);
                }
                ResetEditing();
                PasteFromClipboard();
                return(true);

            case Gdk.Key.Up:
            case Gdk.Key.Down:
                int inc = (evnt.Key == Gdk.Key.Down) ? -1 : 1;
                ResetEditing();
                switch (Selected)
                {
                case DataPart.Hour:
                    if (((Time.Hour + inc) >= 0) && ((Time.Hour + inc) <= MaxNumber))
                    {
                        SetTime(Time.Hour + inc, Time.Minute, Time.Second, Time.Millisecond);
                    }
                    break;

                case DataPart.Minute:
                    if (((Time.Minute + inc) >= 0) && ((Time.Minute + inc) <= MaxNumber))
                    {
                        SetTime(Time.Hour, Time.Minute + inc, Time.Second, Time.Millisecond);
                    }
                    break;

                case DataPart.Second:
                    if (((Time.Second + inc) >= 0) && ((Time.Second + inc) <= MaxNumber))
                    {
                        SetTime(Time.Hour, Time.Minute, Time.Second + inc, Time.Millisecond);
                    }
                    break;

                case DataPart.Millisecond:
                    if (((Time.Millisecond + inc) >= 0) && ((Time.Millisecond + inc) <= MaxNumber))
                    {
                        SetTime(Time.Hour, Time.Minute, Time.Second, Time.Millisecond + inc);
                    }
                    break;
                }
                return(true);
            }
            return(base.OnKeyPressEvent(evnt));
        }
示例#15
0
        public bool Add(char c, TokenzierContext context, int index)
        {
            if (!Tokenizer.IsExpressionChar(c))
            {
                context.Errors.Add(
                    new InvalidPathSyntaxError(context.CurrentLocation.Offset(index)
                                               .AddWindow(new CharacterSnippedLocation(1, index, CurrentPart)),
                                               CurrentPart));
                return(false);
            }

            if (PathParts.Any(f => f.Value == PathType.Null))
            {
                context.Errors.Add(
                    new InvalidPathSyntaxError(context.CurrentLocation.Offset(index)
                                               .AddWindow(new CharacterSnippedLocation(1, index, CurrentPart)),
                                               CurrentPart,
                                               "Nothing can follow on a null"));
            }

            LastCharWasDelimiter = c == '.';

            if (c == '/')
            {
                if (CurrentPart == "..")
                {
                    if (PathParts.Any() && PathParts.Any(e => e.Value != PathType.ParentSelector))
                    {
                        context.Errors.Add(
                            new InvalidPathSyntaxError(context.CurrentLocation.Offset(index)
                                                       .AddWindow(new CharacterSnippedLocation(1, index, CurrentPart)),
                                                       CurrentPart,
                                                       "An Parent selector '..\\' can only follow on another parent selector like and never on an root or an data selector"));

                        return(false);
                    }
                    PathParts.Add(new KeyValuePair <string, PathType>(null, PathType.ParentSelector));
                    CurrentPart = "";
                    return(true);
                }
                context.Errors.Add(
                    new InvalidPathSyntaxError(context.CurrentLocation.Offset(index)
                                               .AddWindow(new CharacterSnippedLocation(1, index, CurrentPart)),
                                               CurrentPart,
                                               "Unexpected '/'. Expected ether the start of an expression or an './'"));
                return(false);
            }

            if (c == '~')
            {
                if (CurrentPart != string.Empty || PathParts.Any())
                {
                    context.Errors.Add(
                        new InvalidPathSyntaxError(context.CurrentLocation.Offset(index)
                                                   .AddWindow(new CharacterSnippedLocation(1, index, CurrentPart)),
                                                   CurrentPart,
                                                   "An root selector '~' must be at the start of an expression"));

                    return(false);
                }

                PathParts.Add(new KeyValuePair <string, PathType>(null, PathType.RootSelector));
                CurrentPart = "";
                return(true);
            }

            if (c == '?')
            {
                PathParts.Add(new KeyValuePair <string, PathType>(null, PathType.ObjectSelector));
                CurrentPart = "";
                return(true);
            }

            if (c != '.' && CurrentPart == "." && PathParts.Count == 0)
            {
                //in this case somebody wrote .data
                //so ignore the dot
                CurrentPart = "";
            }

            if (CurrentPart != "" && CurrentPart != "." && c == '.')
            {
                if (CurrentPartIsNumber)
                {
                    if (CurrentPart.Contains("."))
                    {
                        PathParts.Add(new KeyValuePair <string, PathType>(CurrentPart, PathType.Number));
                        CurrentPart = "";
                    }
                    else
                    {
                        CurrentPart += c;
                    }

                    return(true);
                }

                if (!ComputeCurrentPart(context, index))
                {
                    return(false);
                }

                CurrentPart = "";
            }
            else
            {
                if (CurrentPart == string.Empty && char.IsDigit(c))
                {
                    CurrentPartIsNumber = true;
                    if (PathParts.Any())
                    {
                        context.Errors.Add(
                            new InvalidPathSyntaxError(context.CurrentLocation.Offset(index)
                                                       .AddWindow(new CharacterSnippedLocation(1, index, CurrentPart)),
                                                       CurrentPart,
                                                       "A number expression must be at the start of the expression and cannot follow on anything else"));

                        return(false);
                    }
                }

                CurrentPart += c;
            }

            return(true);
        }
示例#16
0
        /// <summary>
        /// Handles KeyPress event
        /// </summary>
        /// <param name="evnt">
        /// Arguments <see cref="Gdk.EventKey"/>
        /// </param>
        /// <returns>
        /// true if handled, false if not <see cref="System.Boolean"/>
        /// </returns>
        protected override bool OnKeyPressEvent(Gdk.EventKey evnt)
        {
            switch (evnt.Key)
            {
            case Gdk.Key.Tab:
                return(base.OnKeyPressEvent(evnt));

                break;
            }
            if (Editable == false)
            {
                return(true);
            }
            switch (evnt.Key)
            {
            case Gdk.Key.Escape:
                if (IsCellRenderer == true)
                {
                    System.Console.WriteLine("Escape");
                }
                return(false);

                break;

            case Gdk.Key.Left:
                SelectPrev();
                return(true);

            case Gdk.Key.Right:
                SelectNext();
                return(true);

            case Gdk.Key.BackSpace:
                if (CurrentPart != "")
                {
                    CurrentPart = CurrentPart.Remove(CurrentPart.Length - 1, 1);
                }
                else
                {
                    CurrentPart = atStart.ToString().Remove(atStart.ToString().Length - 1, 1);
                }
                break;

            case Gdk.Key.Insert:
                if ((evnt.State & ModifierType.ControlMask) == ModifierType.ControlMask)
                {
                    CopyToClipboard((evnt.State & ModifierType.ShiftMask) == ModifierType.ShiftMask);
                    return(true);
                }
                if ((evnt.State & ModifierType.ShiftMask) == ModifierType.ShiftMask)
                {
                    ResetEditing();
                    PasteFromClipboard();
                    return(true);
                }
                return(false);

            case Gdk.Key.C:
            case Gdk.Key.c:
                if ((evnt.State & ModifierType.ControlMask) != ModifierType.ControlMask)
                {
                    return(false);
                }
                ResetEditing();
                CopyToClipboard(false);
                return(true);

            case Gdk.Key.X:
            case Gdk.Key.x:
                if ((evnt.State & ModifierType.ControlMask) != ModifierType.ControlMask)
                {
                    return(false);
                }
                ResetEditing();
                CopyToClipboard(true);
                return(true);

            case Gdk.Key.V:
            case Gdk.Key.v:
                if ((evnt.State & ModifierType.ControlMask) != ModifierType.ControlMask)
                {
                    return(false);
                }
                ResetEditing();
                PasteFromClipboard();
                return(true);

            case Gdk.Key.Up:
            case Gdk.Key.Down:
                int inc = (evnt.Key == Gdk.Key.Down) ? -1 : 1;
                ResetEditing();
                switch (Selected)
                {
                case DataPart.Day:
                    if (((Date.Day + inc) > 0) && ((Date.Day + inc) <= MaxDaysInCurrentMonth))
                    {
                        SetCorrectDateTime(Date.Year, Date.Month, Date.Day + inc);
                    }
                    break;

                case DataPart.Month:
                    if (((Date.Month + inc) > 0) && ((Date.Month + inc) <= MaxNumber))
                    {
                        SetCorrectDateTime(Date.Year, Date.Month + inc, Date.Day);
                    }
                    break;

                case DataPart.Year:
                    if (((Date.Year + inc) > 0) && ((Date.Year + inc) <= MaxNumber))
                    {
                        SetCorrectDateTime(Date.Year + inc, Date.Month, Date.Day);
                    }
                    break;
                }
                return(true);
            }
            return(base.OnKeyPressEvent(evnt));
        }
示例#17
0
        public void WriteXml(System.Xml.XmlWriter writer)
        {
            var s = new XmlSerializer(typeof(string));
            var b = new XmlSerializer(typeof(bool));
            var l = new XmlSerializer(typeof(List <AutoAnswer>));

            writer.WriteStartElement("TaskInfo");

            //taskid
            writer.WriteStartElement("TaskId");
            s.Serialize(writer, TaskId.ToString());
            writer.WriteEndElement();

            //pluginname
            writer.WriteStartElement("PluginName");
            s.Serialize(writer, PluginName);
            writer.WriteEndElement();

            //url
            writer.WriteStartElement("Url");
            s.Serialize(writer, Url);
            writer.WriteEndElement();

            //title
            writer.WriteStartElement("Title");
            s.Serialize(writer, Title);
            writer.WriteEndElement();

            //status
            writer.WriteStartElement("Status");
            DownloadStatus tmpds = Status;

            if (tmpds == DownloadStatus.正在下载 || tmpds == DownloadStatus.正在停止 || tmpds == DownloadStatus.等待开始)
            {
                tmpds = DownloadStatus.已经停止;
            }
            s.Serialize(writer, tmpds.ToString());
            writer.WriteEndElement();

            //createtime
            writer.WriteStartElement("CreateTime");
            s.Serialize(writer, CreateTime.ToString());
            writer.WriteEndElement();

            //finishtime
            if (FinishTime != null)
            {
                writer.WriteStartElement("FinishTime");
                s.Serialize(writer, FinishTime.ToString());
                writer.WriteEndElement();
            }

            //savedirectory
            writer.WriteStartElement("SaveDirectory");
            s.Serialize(writer, SaveDirectory.ToString());
            writer.WriteEndElement();

            //PartCount
            writer.WriteStartElement("PartCount");
            s.Serialize(writer, PartCount.ToString());
            writer.WriteEndElement();

            //CurrentPart
            writer.WriteStartElement("CurrentPart");
            s.Serialize(writer, CurrentPart.ToString());
            writer.WriteEndElement();

            //is be added
            writer.WriteStartElement("IsBeAdded");
            b.Serialize(writer, IsBeAdded);
            writer.WriteEndElement();

            //partialfinished
            writer.WriteStartElement("PartialFinished");
            b.Serialize(writer, PartialFinished);
            writer.WriteEndElement();

            //partialfinished detail
            writer.WriteStartElement("PartialFinishedDetail");
            s.Serialize(writer, PartialFinishedDetail);
            writer.WriteEndElement();

            //autoanswer
            writer.WriteStartElement("AutoAnswers");
            l.Serialize(writer, AutoAnswer);
            writer.WriteEndElement();

            //extract cache
            writer.WriteStartElement("ExtractCache");
            b.Serialize(writer, ExtractCache);
            writer.WriteEndElement();

            //FilePath
            writer.WriteStartElement("Files");
            foreach (string item in FilePath)
            {
                writer.WriteStartElement("File");
                s.Serialize(writer, item);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            //SubFilePath
            writer.WriteStartElement("SubFiles");
            foreach (string item in SubFilePath)
            {
                writer.WriteStartElement("SubFile");
                s.Serialize(writer, item);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            //DownloadType
            writer.WriteStartElement("DownloadType");
            s.Serialize(writer, DownloadTypes.ToString("D"));
            writer.WriteEndElement();

            //proxy
            XmlSerializer sProxy = new XmlSerializer(typeof(AcDownProxy));

            writer.WriteStartElement("Proxy");
            sProxy.Serialize(writer, new AcDownProxy().FromWebProxy(Proxy));
            writer.WriteEndElement();

            //source url
            writer.WriteStartElement("SourceUrl");
            s.Serialize(writer, SourceUrl);
            writer.WriteEndElement();

            //comment
            writer.WriteStartElement("Comment");
            s.Serialize(writer, Comment);
            writer.WriteEndElement();

            //hash
            writer.WriteStartElement("Hash");
            s.Serialize(writer, Hash);
            writer.WriteEndElement();

            //Progress
            writer.WriteStartElement("Progress");
            s.Serialize(writer, GetProgress().ToString());
            writer.WriteEndElement();

            //settings
            XmlSerializer sSettings = new XmlSerializer(typeof(SerializableDictionary <string, string>));

            writer.WriteStartElement("Settings");
            sSettings.Serialize(writer, Settings);
            writer.WriteEndElement();

            writer.WriteEndElement();
        }