Пример #1
0
 /// <summary>
 /// 清空
 /// </summary>
 public void Clear()
 {
     KeyValuePairs.Clear();
     ValueKeyPairs.Clear();
 }
Пример #2
0
        /// <summary>
        /// Parses connection string
        /// </summary>
        /// <param name="connString">Semicolon delimented KeyValue pair(e.g. KeyName1=value1;KeyName2=value2;KeyName3=value3)</param>
        public void Parse(string connString)
        {
            string parseRegEx = @"(?<KeyName>[^=]+)=(?<KeyValue>.+)";

            if (_parseErrorSb != null)
            {
                _parseErrorSb.Clear();
            }

            if (string.IsNullOrEmpty(connString))
            {
                ParseErrors = "Empty connection string";
            }
            else
            {
                string[] pairs = connString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (pairs == null)
                {
                    ParseErrors = string.Format("'{0}' unable to parse string", connString);
                }

                //TODO: Shall we clear keyValue dictionary?
                //What if parsed gets called on the same instance multiple times
                //the connectionString is either malformed/invalid
                //For now clearing keyValue dictionary, we assume the caller wants to parse new connection string
                //and wants to discard old values (even if they are valid)

                KeyValuePairs.Clear(clearValuesOnly: true);
                foreach (string pair in pairs)
                {
                    Match m = Regex.Match(pair, parseRegEx);

                    if (m.Groups.Count > 2)
                    {
                        string keyName  = m.Groups["KeyName"].Value;
                        string newValue = m.Groups["KeyValue"].Value;

                        if (KeyValuePairs.ContainsKey(keyName))
                        {
                            string existingValue = KeyValuePairs[keyName];
                            // Replace if the existing value do not match.
                            // We allow existing key values to be overwritten (this is especially true for endpoints)
                            if (!existingValue.Equals(newValue, StringComparison.OrdinalIgnoreCase))
                            {
                                KeyValuePairs[keyName] = newValue;
                            }
                        }
                        else
                        {
                            KeyValuePairs[keyName] = newValue;
                        }
                    }
                    else
                    {
                        ParseErrors = string.Format("Incorrect '{0}' keyValue pair format", pair);
                    }
                }

                //Adjust key-value pairs and normalize values across multiple keys
                //We need to do this here because Connection string can be parsed multiple time within same instance
                NormalizeKeyValuePairs();
            }
        }
Пример #3
0
 public void Reload(IFileStore store)
 {
     m_kvp.Clear();
     Load(store);
 }
Пример #4
0
        private void Load(IFileStore store)
        {
            using (var stream = store.OpenFile(m_path))
            {
                var    reader = new StreamReader(stream, Encoding.UTF8);
                string line;
                string type    = null;
                var    options = new KeyValuePairs();
                while ((line = reader.ReadLine()) != null)
                {
                    // Parse each line
                    string[] parts = line.Split(' ');
                    if (parts.Length < 1)
                    {
                        continue;
                    }

                    // Extract type and options
                    type = parts[0];
                    options.Clear();
                    for (int i = 1; i < parts.Length; ++i)
                    {
                        string part        = parts[i];
                        int    equalsIndex = part.IndexOf('=');
                        if (equalsIndex >= 0)
                        {
                            string key   = part.Substring(0, equalsIndex);
                            string value = part.Substring(equalsIndex + 1);
                            int    intValue;
                            if (value.StartsWith("\""))
                            {
                                if (value.EndsWith("\"") && value.Length >= 2)
                                {
                                    value = value.Substring(1, value.Length - 2);
                                }
                                else
                                {
                                    value = value.Substring(1) + " ";
                                    i++;
                                    while (!parts[i].EndsWith("\""))
                                    {
                                        value += parts[i] + " ";
                                        i++;
                                    }
                                    value += parts[i].Substring(0, parts[i].Length - 1);
                                }
                                options.Set(key, value);
                            }
                            else if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out intValue))
                            {
                                options.Set(key, intValue);
                            }
                        }
                    }

                    // Interpret
                    switch (type)
                    {
                    case "common":
                    {
                        m_lineHeight = options.GetInteger("lineHeight");
                        m_base       = options.GetInteger("base");
                        m_scaleW     = options.GetInteger("scaleW");
                        m_scaleH     = options.GetInteger("scaleH");
                        m_pages      = new Page[options.GetInteger("pages")];
                        break;
                    }

                    case "page":
                    {
                        int id = options.GetInteger("id");
                        if (id >= PageCount)
                        {
                            Array.Resize(ref m_pages, id + 1);
                        }
                        m_pages[id]      = new Page();
                        m_pages[id].Path = AssetPath.Combine(AssetPath.GetDirectoryName(m_path), options.GetString("file"));
                        break;
                    }

                    case "chars":
                    {
                        m_chars = new Dictionary <int, Char>(options.GetInteger("count"));
                        break;
                    }

                    case "char":
                    {
                        var id = options.GetInteger("id");
                        m_chars[id]          = new Char();
                        m_chars[id].X        = options.GetInteger("x");
                        m_chars[id].Y        = options.GetInteger("y");
                        m_chars[id].Width    = options.GetInteger("width");
                        m_chars[id].Height   = options.GetInteger("height");
                        m_chars[id].XOffset  = options.GetInteger("xoffset");
                        m_chars[id].YOffset  = options.GetInteger("yoffset");
                        m_chars[id].XAdvance = options.GetInteger("xadvance");
                        m_chars[id].Page     = options.GetInteger("page");
                        if (m_chars[id].Page < 0 || m_chars[id].Page >= PageCount)
                        {
                            m_chars[id].Page = 0;
                            //throw new IOException( "Page count out of range" );
                        }
                        break;
                    }

                    case "kernings":
                    {
                        m_kernings = new Dictionary <KerningPair, Kerning>(options.GetInteger("count"));
                        break;
                    }

                    case "kerning":
                    {
                        var first  = options.GetInteger("first");
                        var second = options.GetInteger("second");
                        var pair   = new KerningPair(first, second);
                        m_kernings[pair]        = new Kerning();
                        m_kernings[pair].Amount = options.GetInteger("amount");
                        break;
                    }
                    }
                }
            }
        }