コード例 #1
0
ファイル: DataHelper.cs プロジェクト: InfFelixNaumann/ppsn
        }         // ctor

        /// <summary>Add a meta info value.</summary>
        /// <param name="key">Meta key.</param>
        /// <param name="getDataType">Data type of the value.</param>
        /// <param name="value">Unconverted value of the meta key.</param>
        protected void Add(string key, Func <Type> getDataType, object value)
        {
            if (String.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException("key");
            }

            if (value == null)
            {
                metaInfo.Remove(key);
            }
            else
            {
                // change the type
                if (WellknownMetaTypes.TryGetValue(key, out var dataType))
                {
                    value = Procs.ChangeType(value, dataType);
                }
                else if (getDataType != null)
                {
                    value = Procs.ChangeType(value, getDataType());
                }

                // add the key
                if (value == null)
                {
                    metaInfo.Remove(key);
                }
                else
                {
                    metaInfo[key] = value;
                }
            }
        }         // proc Add
コード例 #2
0
ファイル: DataSet.cs プロジェクト: InfFelixNaumann/ppsn
        /// <summary>Parse tag, return from sqlite db.</summary>
        /// <param name="attributeLine"></param>
        /// <returns></returns>
        public static PpsObjectTag ParseTag(string attributeLine)
        {
            // name:class=value
            // e.g.: key:0=text

            var m = regAttributeLine.Match(attributeLine);

            if (!m.Success)
            {
                throw new FormatException("Attribute line does not match format.");
            }

            var    classHint = (PpsObjectTagClass)(String.IsNullOrEmpty(m.Groups["c"].Value) ? 0 : Int32.Parse(m.Groups["c"].Value));
            object value;

            if (classHint == PpsObjectTagClass.Deleted)
            {
                value = null;
            }
            else
            {
                var dataType = GetTypeFromClass(classHint);
                value = Procs.UnescapeSpecialChars(m.Groups["v"].Value);
                if (value != null)
                {
                    value = Procs.ChangeType(value, dataType);
                }
            }

            return(new PpsObjectTag(m.Groups["n"].Value, classHint, value));
        }         // func ParseTag
コード例 #3
0
ファイル: DataSet.cs プロジェクト: InfFelixNaumann/ppsn
        /// <summary></summary>
        /// <param name="xTag"></param>
        /// <returns></returns>
        public static PpsObjectTag FromXml(XElement xTag)
        {
            var key      = xTag.GetAttribute("key", null);
            var tagClass = xTag.GetAttribute("tagClass", PpsObjectTagClass.Text);
            var value    = Procs.ChangeType(xTag.GetAttribute("value", null), PpsObjectTag.GetTypeFromClass(tagClass));

            return(new PpsObjectTag(key, tagClass, value));
        } // func FromXml
コード例 #4
0
ファイル: PpsWindowPane.cs プロジェクト: InfFelixNaumann/ppsn
        }         // func GetPaneType

        /// <summary>Get default open pane mode</summary>
        /// <param name="paneManager">Pane manager to use.</param>
        /// <param name="arguments"></param>
        /// <returns></returns>
        public static PpsOpenPaneMode GetDefaultPaneMode(this IPpsWindowPaneManager paneManager, dynamic arguments)
        {
            if (arguments != null && arguments.Mode != null)
            {
                return(Procs.ChangeType <PpsOpenPaneMode>(arguments.Mode));
            }

            return(paneManager.Shell.GetOptionalValue("NewPaneMode", true) ? PpsOpenPaneMode.NewPane : PpsOpenPaneMode.ReplacePane);
        }         // func GetDefaultPaneMode
コード例 #5
0
        public static void RunCommand(string cmd, string[] argArray)
        {
            var ti = typeof(Program).GetTypeInfo();

            var mi = (from c in ti.GetRuntimeMethods()
                      let attr = c.GetCustomAttribute <InteractiveCommandAttribute>()
                                 where c.IsStatic && attr != null && (String.Compare(attr.Name, cmd, StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(attr.Short, cmd, StringComparison.OrdinalIgnoreCase) == 0)
                                 select c).FirstOrDefault();

            if (mi == null)
            {
                throw new Exception($"Command '{cmd}' not found.");
            }


            var parameterInfo = mi.GetParameters();
            var parameters    = new object[parameterInfo.Length];

            if (parameterInfo.Length > 0)             // bind arguments
            {
                for (var i = 0; i < parameterInfo.Length; i++)
                {
                    if (i < argArray.Length)                     // convert argument
                    {
                        parameters[i] = Procs.ChangeType(argArray[i], parameterInfo[i].ParameterType);
                    }
                    else
                    {
                        parameters[i] = parameterInfo[i].DefaultValue;
                    }
                }
            }

            // execute command
            object r;

            if (mi.ReturnType == typeof(Task))             // async
            {
                var t = (Task)mi.Invoke(null, parameters);
                t.Wait();
                r = null;
            }
            else
            {
                r = mi.Invoke(null, parameters);
            }

            if (r != null)
            {
                view.WriteObject(r);
            }
        }         // proc RunCommand
コード例 #6
0
            }             // proc CreateException

            private XElement CreateMember(object member, object value, Type type = null)
            {
                var x = new XElement("v",
                                     member is int?new XAttribute("i", member) : new XAttribute("n", member.ToString()),
                                         new XAttribute("t", LuaType.GetType(type ?? (value != null ? value.GetType() : typeof(object))).AliasOrFullName)
                                     );

                if (value != null)
                {
                    x.Add(new XText(Procs.ChangeType <string>(value)));
                }

                return(x);
            }             // func CreateMember
コード例 #7
0
        }         // func GetWebScopeExpression

        private static void CreateArgumentExpressionsByInfo(dynamic alternateParameterInfo, ParameterInfo parameterInfo, out ConstantExpression parameterName, out Expression parameterDefault)
        {
            var parameterNameString   = (string)(alternateParameterInfo?.Name ?? parameterInfo.Name);
            var parameterDefaultValue = (object)(alternateParameterInfo?.Default ?? parameterInfo.DefaultValue);

            if (parameterNameString == null)
            {
                throw new ArgumentNullException(nameof(parameterName));
            }

            parameterName    = Expression.Constant(parameterNameString, typeof(string));
            parameterDefault = parameterDefaultValue == DBNull.Value || parameterDefaultValue == null
                                ? (Expression)Expression.Default(parameterInfo.ParameterType)
                                : Expression.Constant(Procs.ChangeType(parameterDefaultValue, parameterInfo.ParameterType), parameterInfo.ParameterType);
        }         // func CreateArgumentExpressionsByInfo
コード例 #8
0
ファイル: DataHelper.cs プロジェクト: InfFelixNaumann/ppsn
        }         // func GetPublicMemberList

        internal static object GetConvertedValue(PpsDataColumnDefinition columnInfo, object value)
        {
            if (value != null)             // unpack data type
            {
                if (columnInfo.IsRelationColumn && value is PpsDataRow parentRow)
                {
                    if (parentRow.Table.TableDefinition != columnInfo.ParentColumn.Table)
                    {
                        throw new InvalidCastException($"The row (from table '{parentRow.Table.TableName}') is not a member of the parent table ({columnInfo.ParentColumn.Table.Name})");
                    }
                    value = parentRow[columnInfo.ParentColumn.Index];
                }
                else if (!columnInfo.IsExtended)
                {
                    value = Procs.ChangeType(value, columnInfo.DataType);
                }
            }
            return(value);
        }         // func GetConvertedValue
コード例 #9
0
ファイル: DataServer.cs プロジェクト: InfFelixNaumann/ppsn
        }         // proc NextCursorAsync

        private async Task NextCursorCountAsync(LuaTable table)
        {
            // get parameter
            var cursor = GetCursor(table);
            var count  = Procs.ChangeType <int>(table.GetMemberValue("count") ?? -1);

            // collect rows
            var rows = new LuaTable();

            while (count-- > 0 && cursor.MoveNext())
            {
                rows.Add(cursor.GetCurrentRow());
            }

            // send result
            await PushPacketAsync(new LuaTable()
            {
                ["id"]  = cursor.Id,
                ["row"] = rows.Length == 0 ? null : rows
            });
        }         // proc NextCursorCountAsync
コード例 #10
0
        private void LuaPrint(params object[] values)
        {
            string text;

            if (values == null || values.Length == 0)
            {
                return;
            }

            if (values.Length == 1)
            {
                if (values[0] is string)
                {
                    text = (string)values[0];
                }
                else
                {
                    text = Procs.ChangeType <string>(values[0]);
                }
            }
            else
            {
                text = String.Join(" ", values.Select(c => Procs.ChangeType <string>(c)));
            }

            if (textOutput != null)
            {
                textOutput.WriteLine(text);
            }
            else if (streamOutput != null)
            {
                var b = encoding.GetBytes(text);
                streamOutput.Write(b, 0, b.Length);
            }
            else
            {
                throw new ArgumentException("out is not open.");
            }
        }         // proc OnPrint
コード例 #11
0
        }         // ctor

        public string FormatValue(string value)
        {
            try
            {
                var v = Procs.ChangeType(value, DataType);
                if (String.IsNullOrEmpty(format))
                {
                    return(v.ToString());
                }
                else if (format[0] == '{')
                {
                    return(String.Format(format, v));
                }
                else
                {
                    return(v is IFormattable f?f.ToString(format, CultureInfo.CurrentCulture) : v.ToString());
                }
            }
            catch
            {
                return(value);
            }
        }         // func FormatValue
コード例 #12
0
ファイル: ConfigNode.cs プロジェクト: InfFelixNaumann/des
        }         // ctor

        private static object GetConfigurationValueSingle(IDEConfigurationValue attr, string value)
        {
            var type = attr.Type;

            if (type == typeof(LuaType))
            {
                if (value == null)
                {
                    value = attr.DefaultValue ?? "object";
                }
                return(LuaType.GetType(value, false, false).Type);
            }
            else if (type == typeof(Encoding))
            {
                if (String.IsNullOrEmpty(value))
                {
                    value = attr.DefaultValue;
                }

                if (String.IsNullOrEmpty(value))
                {
                    return(Encoding.Default);
                }
                else if (Int32.TryParse(value, out var codePage))
                {
                    return(Encoding.GetEncoding(codePage));
                }
                else
                {
                    return(Encoding.GetEncoding(value));
                }
            }
            else if (type == typeof(CultureInfo))
            {
                return(String.IsNullOrEmpty(value)
                                        ? CultureInfo.GetCultureInfo(attr.DefaultValue)
                                        : CultureInfo.GetCultureInfo(value));
            }
            else if (type == typeof(DirectoryInfo))
            {
                return(String.IsNullOrEmpty(value)
                                        ? null
                                        : new DirectoryInfo(value));
            }
            else if (type == typeof(SecureString))
            {
                try
                {
                    return(Passwords.DecodePassword(value));
                }
                catch
                {
                    return(null);
                }
            }
            else if (type == typeof(FileSize))
            {
                return(FileSize.TryParse(value ?? attr.DefaultValue, out var fileSize)
                                        ? fileSize
                                        : FileSize.Empty);
            }
            else
            {
                try
                {
                    return(Procs.ChangeType(value ?? attr.DefaultValue, type));
                }
                catch
                {
                    return(Procs.ChangeType(attr.DefaultValue, type));
                }
            }
        }         // func GetConfigurationValue
コード例 #13
0
            }             // ctor

            protected override string FormatValueCore(object value)
            => base.FormatValueCore(Procs.ChangeType(value, type));
コード例 #14
0
        /// <summary></summary>
        /// <param name="x"></param>
        protected override void Read(XElement x)
        {
            var t = x?.Element("c")?.Value;

            currentValue = t ?? Procs.ChangeType(t, Column.DataType);
        }         // proc Read
コード例 #15
0
                }                 // proc Dispose

                #endregion

                #region -- IEnumerator ------------------------------------------------------------

                private bool MoveNext(bool headerOnly)
                {
                    switch (state)
                    {
                        #region -- ReadingState.Unread --
                    case ReadingState.Unread:
                        // open the xml stream
                        xml = owner.request.GetXmlStreamAsync(owner.path, owner.acceptedMimeType).Result;

                        xml.Read();
                        if (xml.NodeType == XmlNodeType.XmlDeclaration)
                        {
                            xml.Read();
                        }

                        if (xml.NodeType != XmlNodeType.Element || xml.LocalName != xnView.LocalName)
                        {
                            throw new InvalidDataException($"Expected \"{xnView}\", read \"{xml.LocalName}\".");
                        }

                        xml.Read();
                        if (xml.NodeType != XmlNodeType.Element || xml.LocalName != xnFields.LocalName)
                        {
                            throw new InvalidDataException($"Expected \"{xnFields}\", read \"{xml.LocalName}\".");
                        }

                        var viewColumns = new List <ViewDataColumn>();
                        var fields      = (XElement)XNode.ReadFrom(xml);
                        foreach (var field in fields.Elements())
                        {
                            var columnName     = field.Name.LocalName;
                            var columnDataType = LuaType.GetType(field.GetAttribute("type", "string"), lateAllowed: false).Type;
                            var columnId       = field.GetAttribute("field", String.Empty);

                            var attributes = new PropertyDictionary();

                            // add colum id
                            if (!String.IsNullOrEmpty(columnId))
                            {
                                attributes.SetProperty("field", typeof(string), columnId);
                            }

                            foreach (var c in field.Elements("attribute"))
                            {
                                if (c.IsEmpty)
                                {
                                    continue;
                                }

                                var attributeName = c.GetAttribute("name", String.Empty);
                                if (String.IsNullOrEmpty(attributeName))
                                {
                                    continue;
                                }

                                attributes.SetProperty(attributeName, LuaType.GetType(c.GetAttribute("type", "string"), lateAllowed: false).Type, c.Value);
                            }                                     // foreach c

                            viewColumns.Add(new ViewDataColumn(columnName, columnDataType, attributes));
                        }                                 // foreach field

                        if (viewColumns.Count < 1)
                        {
                            throw new InvalidDataException("No header found.");
                        }
                        columns = viewColumns.ToArray();

                        state = ReadingState.FetchFirstRow;
                        if (headerOnly)
                        {
                            return(true);
                        }
                        else
                        {
                            goto case ReadingState.FetchFirstRow;
                        }

                        #endregion
                        #region -- ReadingState.FetchFirstRow --
                    case ReadingState.FetchFirstRow:
                        if (xml.NodeType != XmlNodeType.Element || xml.LocalName != xnRows.LocalName)
                        {
                            throw new InvalidDataException($"Expected \"{xnRows}\", read \"{xml.LocalName}\".");
                        }

                        if (xml.IsEmptyElement)
                        {
                            xml.Read();
                            if (xml.NodeType != XmlNodeType.EndElement || xml.LocalName != xnView.LocalName)
                            {
                                throw new InvalidDataException($"Expected \"{xnView}\", read \"{xml.LocalName}\".");
                            }

                            xml.Read();
                            if (!xml.EOF)
                            {
                                throw new InvalidDataException("Unexpected eof.");
                            }

                            state = ReadingState.Complete;
                            goto case ReadingState.Complete;
                        }                                 // if xml.IsEmptyElement
                        else
                        {
                            xml.Read();
                            state = ReadingState.FetchRows;
                            goto case ReadingState.FetchRows;
                        }

                        #endregion
                        #region -- ReadingState.FetchRows --
                    case ReadingState.FetchRows:
                        if (xml.NodeType != XmlNodeType.Element || xml.LocalName != xnRow.LocalName)
                        {
                            throw new InvalidDataException($"Expected \"r\", read \"{xml.LocalName}\".");
                        }

                        var values = new object[columns.Length];

                        if (!xml.IsEmptyElement)
                        {
                            var rowData = (XElement)XNode.ReadFrom(xml);
                            foreach (var column in rowData.Elements())
                            {
                                var columnIndex = Array.FindIndex(columns, c => String.Compare(c.Name, column.Name.LocalName, StringComparison.OrdinalIgnoreCase) == 0);
                                if (columnIndex != -1)
                                {
                                    values[columnIndex] = Procs.ChangeType(column.Value, columns[columnIndex].DataType);
                                }
                            }
                        }                                 // if xml.IsEmptyElement
                        else
                        {
                            // Without a call to XNode.ReadFrom() it's necessary to read to the next node.
                            xml.Read();
                        }

                        currentRow = new ViewDataRow(this, values);

                        if (xml.NodeType == XmlNodeType.Element && xml.LocalName == xnRow.LocalName)
                        {
                            return(true);
                        }

                        if (xml.NodeType != XmlNodeType.EndElement || xml.LocalName != xnRows.LocalName)
                        {
                            throw new InvalidDataException($"Expected \"{xnRows}\", read \"{xml.LocalName}\".");
                        }

                        xml.Read();
                        if (xml.NodeType != XmlNodeType.EndElement || xml.LocalName != xnView.LocalName)
                        {
                            throw new InvalidDataException($"Expected \"{xnView}\", read \"{xml.LocalName}\".");
                        }

                        xml.Read();
                        if (!xml.EOF)
                        {
                            throw new InvalidDataException("Unexpected eof.");
                        }

                        state = ReadingState.Complete;
                        return(true);

                        #endregion
                    case ReadingState.Complete:
                        return(false);

                    default:
                        throw new InvalidOperationException("The state of the object is invalid.");
                    }             // switch state
                }                 // func MoveNext
コード例 #16
0
        }         // proc Reset

        private object GetValueIntern(int columnIndex)
        {
            // get value
            var value  = owner.CoreReader[columnIndex];
            var column = owner.Columns?[columnIndex];

            if (column == null)
            {
                return(null);                // no column defined
            }
            // convert
            if (column.Converter != null)
            {
                return(column.Converter(value));
            }
            else if (column.DataType == typeof(decimal))
            {
                return(Decimal.Parse(value, NumberStyles.Currency | NumberStyles.Float, column.FormatProvider));
            }
            else if (column.DataType == typeof(double))
            {
                return(Double.Parse(value, NumberStyles.Currency | NumberStyles.Float, column.FormatProvider));
            }
            else if (column.DataType == typeof(float))
            {
                return(Single.Parse(value, NumberStyles.Currency | NumberStyles.Float, column.FormatProvider));
            }

            else if (column.DataType == typeof(byte))
            {
                return(Byte.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }
            else if (column.DataType == typeof(sbyte))
            {
                return(SByte.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }
            else if (column.DataType == typeof(ushort))
            {
                return(UInt16.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }
            else if (column.DataType == typeof(short))
            {
                return(Int16.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }
            else if (column.DataType == typeof(uint))
            {
                return(UInt32.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }
            else if (column.DataType == typeof(int))
            {
                return(Int32.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }
            else if (column.DataType == typeof(ulong))
            {
                return(UInt64.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }
            else if (column.DataType == typeof(long))
            {
                return(Int64.Parse(value, NumberStyles.Integer, column.FormatProvider));
            }

            else if (column.DataType == typeof(DateTime))
            {
                return(DateTime.Parse(value, column.FormatProvider, DateTimeStyles.AssumeLocal));
            }

            else if (column.DataType == typeof(string))
            {
                return(value);
            }

            else
            {
                return(Procs.ChangeType(value, column.DataType));
            }
        }         // func GetValue
コード例 #17
0
        private CollectionViewSource LuaCreateSource(object collection)
        {
            var collectionArgs = collection as LuaTable;

            if (collectionArgs != null)
            {
                collection = collectionArgs.GetMemberValue("Source");
            }

            if (collection == null)
            {
                throw new ArgumentNullException(nameof(collection));
            }

            // get containted list
            if (collection is IListSource listSource)
            {
                collection = listSource.GetList();
            }

            // function views
            if (!(collection is IEnumerable) && Lua.RtInvokeable(collection))
            {
                collection = new LuaFunctionEnumerator(collection);
            }

            var collectionViewSource = new CollectionViewSource();

            using (collectionViewSource.DeferRefresh())
            {
                collectionViewSource.Source = collection;

                if (collectionArgs != null)
                {
                    if (collectionArgs.GetMemberValue(nameof(CollectionView.SortDescriptions)) is LuaTable t)
                    {
                        foreach (var col in t.ArrayList.OfType <string>())
                        {
                            if (String.IsNullOrEmpty(col))
                            {
                                continue;
                            }

                            string            propertyName;
                            ListSortDirection direction;

                            if (col[0] == '+')
                            {
                                propertyName = col.Substring(1);
                                direction    = ListSortDirection.Ascending;
                            }
                            else if (col[0] == '-')
                            {
                                propertyName = col.Substring(1);
                                direction    = ListSortDirection.Descending;
                            }
                            else
                            {
                                propertyName = col;
                                direction    = ListSortDirection.Ascending;
                            }

                            collectionViewSource.SortDescriptions.Add(new SortDescription(propertyName, direction));
                        }
                    }

                    // todo: beist sich mit CanFilter
                    var viewFilter = collectionArgs.GetMemberValue("ViewFilter");
                    if (Lua.RtInvokeable(viewFilter))
                    {
                        collectionViewSource.Filter += (sender, e) => e.Accepted = Procs.ChangeType <bool>(new LuaResult(Lua.RtInvoke(viewFilter, e.Item)));
                    }
                }
            }


            if (collectionViewSource.View == null)
            {
                throw new ArgumentNullException("Could not create a collection view.");
            }

            return(collectionViewSource);
        }         // func LuaCreateSource
コード例 #18
0
ファイル: DataSet.cs プロジェクト: InfFelixNaumann/ppsn
 /// <summary>Is the tag value equal.</summary>
 /// <param name="otherValue"></param>
 /// <returns></returns>
 public bool IsValueEqual(object otherValue)
 => Equals(value, Procs.ChangeType(otherValue, GetTypeFromClass(cls)));
コード例 #19
0
ファイル: ConfigNode.cs プロジェクト: s72785/des
        public object GetAttribute(string name)
        {
            var attribute = attributes.FirstOrDefault(c => String.Compare(c.Name.LocalName, name, StringComparison.OrdinalIgnoreCase) == 0);

            if (attribute == null)
            {
                throw new ArgumentException(String.Format("@{0} is not defined.", name));
            }

            var attributeValue = element.Attribute(attribute.Name)?.Value ?? attribute.DefaultValue;

            if (attribute.TypeName == "LuaType")
            {
                if (attributeValue == null)
                {
                    attributeValue = "object";
                }
                return(LuaType.GetType(attributeValue, false, false).Type);
            }
            else if (attribute.TypeName == "EncodingType")
            {
                int codePage;

                if (String.IsNullOrEmpty(attributeValue))
                {
                    attributeValue = attribute.DefaultValue;
                }

                if (String.IsNullOrEmpty(attributeValue))
                {
                    return(Encoding.Default);
                }
                else if (int.TryParse(attributeValue, out codePage))
                {
                    return(Encoding.GetEncoding(codePage));
                }
                else
                {
                    return(Encoding.GetEncoding(attributeValue));
                }
            }
            else if (attribute.TypeName == "language")
            {
                return(String.IsNullOrEmpty(attributeValue) ?
                       CultureInfo.GetCultureInfo(attribute.DefaultValue) :
                       CultureInfo.GetCultureInfo(attributeValue));
            }
            else if (attribute.TypeName == "PathType")
            {
                if (String.IsNullOrEmpty(attributeValue))
                {
                    return(null);
                }
                return(new DirectoryInfo(attributeValue));
            }
            else
            {
                var type = attribute.Type;
                try
                {
                    return(Procs.ChangeType(attributeValue, type));
                }
                catch
                {
                    return(Procs.ChangeType(attribute.DefaultValue, type));
                }
            }
        }         // func GetAttribute
コード例 #20
0
ファイル: ConfigNode.cs プロジェクト: s72785/des
        }         // ctor

        public T GetAttribute <T>(string name)
        => Procs.ChangeType <T>(GetAttribute(name));