/// <summary>
 /// Returns the value of an argument, used to call a command
 /// </summary>
 /// <param name="context">The <see cref="HttpContext"/> of the HTTP-request</param>
 /// <param name="parMeta">The metadata of the parameter</param>
 /// <param name="queryDict">A dictionary of query values</param>
 /// <returns></returns>
 private object GetArgumentValue(HttpContext context, Metadata.Parameter parMeta, IDictionary <string, string> queryDict)
 {
     if (parMeta.IsPlatformSpecific)
     {
         if (parMeta.ParameterType.Type == typeof(HttpContext))
         {
             return(context);
         }
         else
         {
             throw new ServiceException(HttpStatusCode.InternalServerError, $"Unsupported platform specific parameter: {parMeta.Name}");
         }
     }
     else
     {
         bool found = queryDict.TryGetValue(parMeta.Name, out string value);
         if (!found && !parMeta.IsOptional)
         {
             throw new ServiceException(HttpStatusCode.BadRequest, $"Parameter missing: {parMeta.Name}");
         }
         if (found)
         {
             return(String.IsNullOrEmpty(value) ? null : ParseQueryValue(parMeta, value));
         }
     }
     return(null);
 }
Esempio n. 2
0
        MethodImpl CreateMethod()
        {
            var parameters = new List <Component_MemberParameter>();

            foreach (var p in GetComponents <Component_MemberParameter>(false, false))
            {
                if (p.Enabled)
                {
                    parameters.Add(p);
                }
            }

            var parameters2 = new List <Metadata.Parameter>();

            foreach (var p in parameters)
            {
                Metadata.Parameter p2 = p.CreateMetadataParameter();
                if (p2 == null)
                {
                    //!!!!
                    return(null);
                }

                parameters2.Add(p2);
            }

            //!!!!isConstructor
            //!!!!isOperator
            var method = new MethodImpl(Parent, Name, Static, parameters2.ToArray(), false, false, this);

            method.Description = Description;

            return(method);
        }
Esempio n. 3
0
            //

            public PropertyImpl(object owner, string name, bool isStatic, Metadata.TypeInfo type, Metadata.TypeInfo typeUnreferenced, Metadata.Parameter[] indexers, bool readOnly, string category, string displayName, bool referenceSupport, Metadata.Parameter parameter, bool invoke)
                : base(owner, name, isStatic, type, typeUnreferenced, indexers, readOnly)
            {
                this.category         = category;
                this.displayName      = displayName;
                this.referenceSupport = referenceSupport;
                this.parameter        = parameter;
                this.invoke           = invoke;
            }
Esempio n. 4
0
        MethodParameterPropertyImpl OneMethod_AddPropertyOfParameter(Metadata.Parameter parameter)
        {
            ////!!!!имя еще как-то фиксить?
            string name = null;

            if (parameter.ReturnValue)
            {
                name = "ReturnValue";
            }
            else
            {
                name = parameter.Name.Substring(0, 1).ToUpper() + parameter.Name.Substring(1);
            }

            //!!!!поддержать ByReference. еще какие?
            bool readOnly = parameter.Output || parameter.ReturnValue || parameter.ByReference;

            //bool readOnly = parameter.Output || parameter.ReturnValue;

            //!!!!
            //var parameterType = GetOverrideParameterType( parameter, out bool error );
            //if( error )
            //{
            //	unableToInit = true;
            //	goto unableToInitLabel;
            //}
            //var parameterType = parameter.Type;

            Metadata.TypeInfo type;
            bool referenceSupport = !readOnly;

            if (referenceSupport)
            {
                Type unrefNetType = parameter.Type.GetNetType();
                var  refNetType   = typeof(Reference <>).MakeGenericType(unrefNetType);
                type = MetadataManager.GetTypeOfNetType(refNetType);
            }
            else
            {
                type = parameter.Type;
            }

            bool invoke = parameter.ReturnValue || parameter.ByReference || parameter.Output;

            string namePrefix  = "__parameter_";
            string displayName = TypeUtility.DisplayNameAddSpaces(name);

            var prop = new MethodParameterPropertyImpl(this, namePrefix + name, false, type, parameter.Type, new Metadata.Parameter[0], readOnly, "Method's Parameters", displayName, referenceSupport, parameter, invoke);

            prop.Description = "";
            if (!readOnly)
            {
                prop.Serializable = SerializeType.Enable;
            }

            return(prop);
        }
Esempio n. 5
0
        public virtual Metadata.Parameter CreateMetadataParameter()
        {
            var type = Type.Value;

            if (type == null)
            {
                //!!!!
                //Log.Warning( "The type with name \"{0}\" is not exists.", type );
                return(null);
            }

            //!!!!
            bool   defaultValueSpecified2 = false;
            object defaultValue2          = null;

            //!!!!!inIn

            var p = new Metadata.Parameter(Name, type, ByReference, false, Output, ReturnValue, Optional, defaultValueSpecified2, defaultValue2);

            return(p);
        }
 private object ParseQueryValue(Metadata.Parameter parMeta, string value)
 {
     // Is it an enum value?
     if (parMeta.ParameterType.Type.IsEnum)
     {
         if (!Int32.TryParse(value, out int intValue))
         {
             throw new ServiceException(HttpStatusCode.BadRequest, $"Enum-arguments should be represented by their numeric value: {parMeta.Name}");
         }
         return(Enum.ToObject(parMeta.ParameterType.Type, intValue));
     }
     // Is it a primitive value?
     if (!Enum.TryParse(parMeta.ParameterType.Name, out Metadata.PrimitiveType primitiveType))
     {
         throw new ServiceException(HttpStatusCode.BadRequest, $"Argument is not a primitive type: {parMeta.Name}");
     }
     // Do we have a binder for it?
     if (!primitiveBinders.TryGetValue(primitiveType, out Func <string, object> conv))
     {
         throw new ServiceException(HttpStatusCode.InternalServerError, $"Primitive type {primitiveType} not supported: {parMeta.Name}");
     }
     return(conv(value));
 }
Esempio n. 7
0
        public void Update()
        {
            if (DisableUpdate)
            {
                return;
            }

            //check disabled
            if (!Enabled)
            {
                Clear();
                return;
            }

            var newCode = Code.Value;

            needUpdate = false;
            if (newCode == compiledCode)
            {
                return;
            }
            ////check for updates
            //if( !needUpdate && newCode != compiledCode )
            //	needUpdate = true;
            ////nothing to update
            //if( !needUpdate )
            //	return;

            //do update

            Clear();
            compiledCode = newCode;
            needUpdate   = false;

            if (!string.IsNullOrEmpty(newCode))
            {
                compiledScript = ScriptingCSharpEngine.GetOrCompileScript(compiledCode, out var error);
                if (!string.IsNullOrEmpty(error))
                {
                    Log.Warning($"Unable to compile script.\r\n\r\nComponent \"{GetPathFromRoot( true )}\".\r\n\r\n" + error);
                    return;
                }

                CreateScriptInstance();

                //fields
                foreach (var netField in compiledScript.Fields)
                {
                    if (netField.IsPublic && netField.Name != "Owner")
                    {
                        var type   = MetadataManager.GetTypeOfNetType(netField.FieldType);
                        var member = new PropertyImpl(this, netField.Name, netField.IsStatic, type, type, Array.Empty <Metadata.Parameter>(), false, compiledScript, netField);

                        compiledMembers.Add(member);
                        compiledMemberBySignature[member.Signature] = member;
                    }
                }

                //properties
                foreach (var netProperty in compiledScript.Properties)
                {
                    if (netProperty.GetMethod != null && netProperty.GetMethod.IsPublic)
                    {
                        var type      = MetadataManager.GetTypeOfNetType(netProperty.PropertyType);
                        var unrefType = ReferenceUtility.GetUnreferencedType(type);

                        var netParameters = netProperty.GetIndexParameters();

                        var indexers = new List <Metadata.Parameter>();
                        for (int n = 0; n < netParameters.Length; n++)
                        {
                            var netParam = netParameters[n];

                            var  netType       = netParam.ParameterType;
                            bool isByReference = netType.IsByRef;
                            if (isByReference)
                            {
                                netType = netType.GetElementType();
                            }

                            var type2 = MetadataManager.GetTypeOfNetType(netType);

                            var p = new Metadata.Parameter(netParam.Name, type2, isByReference, netParam.IsIn, netParam.IsOut, netParam.IsRetval,
                                                           netParam.IsOptional, netParam.HasDefaultValue, netParam.DefaultValue);
                            indexers.Add(p);
                        }

                        var member = new PropertyImpl(this, netProperty.Name, ReflectionUtility.PropertyIsStatic(netProperty), type, unrefType, indexers.Count != 0 ? indexers.ToArray() : Array.Empty <Metadata.Parameter>(), !netProperty.CanWrite, compiledScript, netProperty);

                        compiledMembers.Add(member);
                        compiledMemberBySignature[member.Signature] = member;
                    }
                }

                //methods
                foreach (var netMethod in compiledScript.Methods)
                {
                    if (netMethod.IsSpecialName)
                    {
                        if (netMethod.Name.Length > 4 && (netMethod.Name.Substring(0, 4) == "get_" || netMethod.Name.Substring(0, 4) == "set_"))
                        {
                            continue;
                        }
                        if (netMethod.Name.Length > 4 && netMethod.Name.Substring(0, 4) == "add_")
                        {
                            continue;
                        }
                        if (netMethod.Name.Length > 7 && netMethod.Name.Substring(0, 7) == "remove_")
                        {
                            continue;
                        }
                    }

                    if (netMethod.GetBaseDefinition() != netMethod)
                    {
                        continue;
                    }

                    var netParams = netMethod.GetParameters();

                    var parameters = new List <Metadata.Parameter>();
                    for (int n = 0; n < netParams.Length; n++)
                    {
                        var netParam = netParams[n];

                        var  netType       = netParam.ParameterType;
                        bool isByReference = netType.IsByRef;
                        if (isByReference)
                        {
                            netType = netType.GetElementType();
                        }

                        var type = MetadataManager.GetTypeOfNetType(netType);

                        var p = new Metadata.Parameter(netParam.Name, type, isByReference, netParam.IsIn, netParam.IsOut, netParam.IsRetval,
                                                       netParam.IsOptional, netParam.HasDefaultValue, netParam.DefaultValue);
                        parameters.Add(p);
                    }

                    if (netMethod.ReturnType != null && netMethod.ReturnType != typeof(void))
                    {
                        var  netType = netMethod.ReturnType;
                        bool isRef   = netType.IsByRef;
                        if (isRef)
                        {
                            netType = netType.GetElementType();
                        }

                        var paramType = MetadataManager.GetTypeOfNetType(netType);
                        //"_return"
                        var p = new Metadata.Parameter("ReturnValue", paramType, isRef, false, true, true, false, false, null);
                        parameters.Add(p);
                    }

                    bool isOperator = netMethod.IsSpecialName && netMethod.Name.Length > 3 && netMethod.Name.Substring(0, 3) == "op_";

                    var member = new MethodImpl(this, netMethod.Name, netMethod.IsStatic, parameters.ToArray(), false, isOperator, compiledScript, netMethod);

                    compiledMembers.Add(member);
                    compiledMemberBySignature[member.Signature] = member;
                }

                //One method mode
                if (compiledScript != null && compiledMembers.Count == 1)
                {
                    compiledOneMethod = (MethodImpl)compiledMembers[0];
                    OneMethod_AddProperties(compiledOneMethod);

                    //var parameters = new List<Metadata.Parameter>();
                    //parameters.Add( new Metadata.Parameter( "a", MetadataManager.GetTypeOfNetType( typeof( int ) ), false, true, false, false, false, false, null ) );
                    //parameters.Add( new Metadata.Parameter( "ReturnValue", MetadataManager.GetTypeOfNetType( typeof( int ) ), false, true, false, true, false, false, null ) );
                    //xx xx;
                    //var method = new MethodImpl( this, "Method", true, parameters.ToArray(), false, false, compiledScript, compiledScript.PublicMethods[ 0 ] );

                    //compiledMembers.Add( method );
                    //compiledMemberBySignature[ method.Signature ] = method;
                    //compiledOneMethod = method;

                    ////create properties
                    //if( method != null )
                    //{
                    //	//parameters
                    //	propertyMethodParameters = new List<PropertyImpl>();
                    //	for( int nParameter = 0; nParameter < method.Parameters.Length; nParameter++ )
                    //	{
                    //		var parameter = method.Parameters[ nParameter ];

                    //		////!!!!имя еще как-то фиксить?
                    //		//string name = null;
                    //		//!!!!
                    //		//if( parameter.ReturnValue )
                    //		//	name = "ReturnValue";
                    //		//if( name == null )
                    //		var name = parameter.Name.Substring( 0, 1 ).ToUpper() + parameter.Name.Substring( 1 );

                    //		//!!!!поддержать ByReference. еще какие?
                    //		bool readOnly = parameter.Output || parameter.ReturnValue;

                    //		//!!!!
                    //		//var parameterType = GetOverrideParameterType( parameter, out bool error );
                    //		//if( error )
                    //		//{
                    //		//	unableToInit = true;
                    //		//	goto unableToInitLabel;
                    //		//}
                    //		//var parameterType = parameter.Type;

                    //		Metadata.TypeInfo type;
                    //		bool referenceSupport = !readOnly;
                    //		if( referenceSupport )
                    //		{
                    //			Type unrefNetType = parameter.Type.GetNetType();
                    //			var refNetType = typeof( Reference<> ).MakeGenericType( unrefNetType );
                    //			type = MetadataManager.GetTypeOfNetType( refNetType );
                    //		}
                    //		else
                    //			type = parameter.Type;

                    //		bool invoke = parameter.ReturnValue || parameter.ByReference || parameter.Output;

                    //		string namePrefix = "__parameter_";
                    //		string displayName = TypeUtils.DisplayNameAddSpaces( name );

                    //		var p = new PropertyImpl( this, namePrefix + name, false, type, parameter.Type, new Metadata.Parameter[ 0 ], readOnly, "Method's Parameters", displayName, referenceSupport, parameter, invoke );
                    //		p.Description = "";
                    //		if( !readOnly )
                    //			p.Serializable = true;

                    //		properties.Add( p );
                    //		propertyBySignature[ p.Signature ] = p;

                    //		//!!!!так? если несколько?
                    //		if( parameter.ReturnValue )
                    //			propertyMethodReturnParameter = p;
                    //		else
                    //			propertyMethodParameters.Add( p );
                    //	}
                    //}
                }

                //update child handlers
                try
                {
                    foreach (var handler in GetComponents <Component_EventHandler>())
                    {
                        handler.UpdateSubscription();
                    }
                }
                catch { }
            }
        }