Ejemplo n.º 1
0
        public override bool Validate(LogWriter log)
        {
            if (!base.Validate(log))
            {
                return(false);
            }

            bool is_valid = true;

            if (this.IsStatic)
            {
                switch (OverrideType)
                {
                case VMOverrideType.Unspecified:
                    log.Warn("Static virtual methods can only be generated if you provide info on how to override this method via the metadata ");
                    is_valid = false;
                    break;

                case VMOverrideType.ImplementingClass:
                    log.Warn("Overriding static virtual methods in the implementing class is not supported yet ");
                    is_valid = false;
                    break;
                }
            }

            return(is_valid);
        }
Ejemplo n.º 2
0
        public bool Validate(LogWriter log)
        {
            if (MarshalType == "" || CSType == "")
            {
                log.Warn("Unknown return type: {0}", CType);
                return(false);
            }
            else if ((CSType == "GLib.List" || CSType == "GLib.SList") && String.IsNullOrEmpty(ElementType))
            {
                log.Warn("Returns {0} with unknown element type.  Add element_type attribute with gapi-fixup.", CType);
            }

            return(true);
        }
Ejemplo n.º 3
0
        public NativeStructGen(XmlElement ns, XmlElement elem) : base(ns, elem)
        {
            LogWriter log = new LogWriter(QualifiedName);

            foreach (XmlNode node in elem.ChildNodes)
            {
                if (!(node is XmlElement))
                {
                    continue;
                }
                XmlElement member = (XmlElement)node;

                switch (node.Name)
                {
                case "field":
                    fields.Add(new StructField(member, this));
                    break;

                default:
                    if (!IsNodeNameHandled(node.Name))
                    {
                        log.Warn("Unexpected node " + node.Name + " in " + CName);
                    }
                    break;
                }
            }
        }
Ejemplo n.º 4
0
 public override bool Validate(LogWriter log)
 {
     if (!is_valid)
     {
         log.Warn("Can't generate ABI compatible union");
     }
     return(is_valid);
 }
Ejemplo n.º 5
0
		public bool Validate (LogWriter log)
		{
			if (CSType == "" && !Hidden) {
				log.Member = Name;
				log.Warn ("property has unknown type '{0}' ", CType);
				Statistics.ThrottledCount++;
				return false;
			}

			return true;
		}
Ejemplo n.º 6
0
		public virtual bool Validate (LogWriter log)
		{
			if (ConstType == String.Empty) {
				log.Warn ("{0} type is missing or wrong", Name);
				return false;
			}
			if (SymbolTable.Table.GetMarshalType (ctype) == "int" && value.Length >= 20) {
				return false;
			}
			return true;
		}
Ejemplo n.º 7
0
        public bool Validate(LogWriter log)
        {
            if (MarshalType == "" || CSType == "")
            {
                log.Warn("Unknown return type: {0}", CType);
                return(false);
            }
            else if ((CSType == "GLib.List" || CSType == "GLib.SList") && String.IsNullOrEmpty(ElementType))
            {
                log.Warn("Returns {0} with unknown element type.  Add element_type attribute with gapi-fixup.", CType);
            }

            if (is_array && !is_null_term && String.IsNullOrEmpty(array_length_param))
            {
                log.Warn("Returns an array with undeterminable length. Add null_term_array or array_length_param attribute with gapi-fixup.");
                return(false);
            }

            return(true);
        }
Ejemplo n.º 8
0
        public virtual bool Validate(LogWriter log)
        {
            log.Member = Name;
            if (!Ignored && !Hidden && CSType == "")
            {
                log.Warn("field has unknown type: " + CType);
                Statistics.ThrottledCount++;
                return(false);
            }

            return(true);
        }
Ejemplo n.º 9
0
		public override bool Validate (LogWriter log)
		{
			if (!base.Validate (log))
				return false;

			if (IsBitfield) {
				log.Warn ("bitfields are not supported");
				return false;
			}

			return true;
		}
Ejemplo n.º 10
0
        public bool Validate(LogWriter log)
        {
            if (CSType == "" && !Hidden)
            {
                log.Member = Name;
                log.Warn("property has unknown type '{0}' ", CType);
                Statistics.ThrottledCount++;
                return(false);
            }

            return(true);
        }
Ejemplo n.º 11
0
		public bool Validate (LogWriter log)
		{
			log.Member = Name;
			if (Name == "") {
				log.Warn ("Nameless signal found. Add name attribute with fixup.");
				Statistics.ThrottledCount++;
				return false;
			} else if (!parms.Validate (log) || !retval.Validate (log)) {
				Statistics.ThrottledCount++;
				return false;
			}
			return true;
		}
Ejemplo n.º 12
0
 public virtual bool Validate(LogWriter log)
 {
     if (ConstType == String.Empty)
     {
         log.Warn("{0} type is missing or wrong", Name);
         return(false);
     }
     if (SymbolTable.Table.GetMarshalType(ctype) == "int" && value.Length >= 20)
     {
         return(false);
     }
     return(true);
 }
Ejemplo n.º 13
0
		public virtual bool Validate (LogWriter log)
		{
			log.Member = Name;
			if (!Ignored && !Hidden && CSType == "") {
				if (Name == "Priv")
					return false;
				log.Warn ("field has unknown type: " + CType);
				Statistics.ThrottledCount++;
				return false;
			}

			return true;
		}
Ejemplo n.º 14
0
        bool CheckABIStructParent(LogWriter log, out string cs_parent_struct)
        {
            cs_parent_struct = null;

            if (!CanGenerateABIStruct(log))
            {
                return(false);
            }

            var    parent              = SymbolTable.Table[Elem.GetAttribute("parent")];
            string cs_parent           = SymbolTable.Table.GetCSType(Elem.GetAttribute("parent"));
            var    parent_can_generate = true;

            cs_parent_struct = null;
            if (parent != null)
            {
                // FIXME Add that information to ManualGen and use it.
                if (parent.CName == "GInitiallyUnowned" || parent.CName == "GObject")
                {
                    cs_parent_struct = "GLib.Object";
                }
                else
                {
                    parent_can_generate = false;
                    var _parent = parent as ClassBase;

                    if (_parent != null)
                    {
                        string tmp;
                        parent_can_generate = _parent.CheckABIStructParent(log, out tmp);
                    }

                    if (parent_can_generate)
                    {
                        cs_parent_struct = cs_parent;
                    }
                }

                if (!parent_can_generate)
                {
                    log.Warn("Can't generate ABI structrure as the parent structure '" +
                             parent.CName + "' can't be generated.");
                    return(false);
                }
            }
            else
            {
                cs_parent_struct = "";
            }
            return(parent_can_generate);
        }
Ejemplo n.º 15
0
        public override bool Validate(LogWriter log)
        {
            if (!base.Validate(log))
            {
                return(false);
            }

            if (target == null && !(container_type as InterfaceGen).IsConsumeOnly)
            {
                log.Warn("No matching target method to invoke. Add target_method attribute with fixup.");
                return(false);
            }

            return(true);
        }
Ejemplo n.º 16
0
        public override bool Validate(LogWriter log)
        {
            if (!base.Validate(log))
            {
                return(false);
            }

            if (IsBitfield)
            {
                log.Warn("bitfields are not supported");
                return(false);
            }

            return(true);
        }
Ejemplo n.º 17
0
 public bool Validate(LogWriter log)
 {
     log.Member = Name;
     if (Name == "")
     {
         log.Warn("Nameless signal found. Add name attribute with fixup.");
         Statistics.ThrottledCount++;
         return(false);
     }
     else if (!parms.Validate(log) || !retval.Validate(log))
     {
         Statistics.ThrottledCount++;
         return(false);
     }
     return(true);
 }
Ejemplo n.º 18
0
		public override bool Validate (LogWriter log)
		{
			log.Member = Name;
			if (!retval.Validate (log) || !base.Validate (log))
				return false;

			if (Name == String.Empty || CName == String.Empty) {
				log.Warn ("Method has no name or cname.");
				return false;
			}

			Parameters parms = Parameters;
			is_get = ((parms.IsAccessor && retval.IsVoid) || (parms.Count == 0 && !retval.IsVoid)) && HasGetterName;
			is_set = ((parms.IsAccessor || (parms.VisibleCount == 1 && retval.IsVoid)) && HasSetterName);

			call = "(" + (IsStatic ? "" : container_type.CallByName () + (parms.Count > 0 ? ", " : "")) + Body.GetCallString (is_set) + ")";

			return true;
		}
Ejemplo n.º 19
0
        public override bool Validate(LogWriter log)
        {
            string cstype = SymbolTable.Table.GetCSType(CType, true);

            if (elem.GetAttributeAsBoolean("is_callback"))
            {
                return(true);
            }

            if (cstype == null || cstype == "")
            {
                log.Warn(" field \"" + CName + "\" has no cstype, can't generate ABI field.");
                return(false);
            }

            if (!base.Validate(log))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 20
0
        public override bool Validate(LogWriter log)
        {
            log.Member = Name;
            if (!retval.Validate(log) || !base.Validate(log))
            {
                return(false);
            }

            if (Name == String.Empty || CName == String.Empty)
            {
                log.Warn("Method has no name or cname.");
                return(false);
            }

            Parameters parms = Parameters;

            is_get = ((parms.IsAccessor && retval.IsVoid) || (parms.Count == 0 && !retval.IsVoid)) && HasGetterName;
            is_set = ((parms.IsAccessor || (parms.VisibleCount == 1 && retval.IsVoid)) && HasSetterName);

            call = "(" + (IsStatic ? "" : container_type.CallByName() + (parms.Count > 0 ? ", " : "")) + Body.GetCallString(is_set) + ")";

            return(true);
        }
Ejemplo n.º 21
0
        public void Initialize(GenerationInfo gen_info, bool is_get, bool is_set, string indent)
        {
            if (parameters.Count == 0)
            {
                return;
            }

            StreamWriter sw = gen_info.Writer;

            for (int i = 0; i < parameters.Count; i++)
            {
                Parameter p = parameters [i];

                IGeneratable gen  = p.Generatable;
                string       name = p.Name;
                if (is_set)
                {
                    name = "value";
                }

                p.CallName = name;
                foreach (string prep in p.Prepare)
                {
                    sw.WriteLine(indent + "\t\t\t" + prep);
                }

                if (gen is CallbackGen)
                {
                    CallbackGen cbgen   = gen as CallbackGen;
                    string      wrapper = cbgen.GenWrapper(gen_info);

                    int closure = i + 1;
                    if (p.Closure >= 0)
                    {
                        closure = p.Closure;
                    }

                    int destroyNotify = i + 2;
                    if (p.DestroyNotify >= 0)
                    {
                        destroyNotify = p.DestroyNotify;
                    }

                    switch (p.Scope)
                    {
                    case "notified":
                        sw.WriteLine(indent + "\t\t\t{0} {1}_wrapper = new {0} ({1});", wrapper, name);
                        sw.WriteLine(indent + "\t\t\tIntPtr {0};", parameters [closure].Name);
                        sw.WriteLine(indent + "\t\t\t{0} {1};", parameters [destroyNotify].CSType, parameters [destroyNotify].Name);
                        sw.WriteLine(indent + "\t\t\tif ({0} == null) {{", name);
                        sw.WriteLine(indent + "\t\t\t\t{0} = IntPtr.Zero;", parameters [closure].Name);
                        sw.WriteLine(indent + "\t\t\t\t{0} = null;", parameters [destroyNotify].Name);
                        sw.WriteLine(indent + "\t\t\t} else {");
                        sw.WriteLine(indent + "\t\t\t\t{0} = (IntPtr) GCHandle.Alloc ({1}_wrapper);", parameters [closure].Name, name);
                        sw.WriteLine(indent + "\t\t\t\t{0} = GLib.DestroyHelper.NotifyHandler;", parameters [destroyNotify].Name, parameters [destroyNotify].CSType);
                        sw.WriteLine(indent + "\t\t\t}");
                        break;

                    case "async":
                        sw.WriteLine(indent + "\t\t\t{0} {1}_wrapper = new {0} ({1});", wrapper, name);
                        sw.WriteLine(indent + "\t\t\t{0}_wrapper.PersistUntilCalled ();", name);
                        break;

                    case "call":
                    default:
                        if (p.Scope == String.Empty)
                        {
                            log.Warn(gen_info.CurrentMember + " - defaulting " + gen.Name + " param to 'call' scope. Specify callback scope (call|async|notified) attribute with fixup.");
                        }
                        sw.WriteLine(indent + "\t\t\t{0} {1}_wrapper = new {0} ({1});", wrapper, name);
                        break;
                    }
                }
            }

            if (ThrowsException)
            {
                sw.WriteLine(indent + "\t\t\tIntPtr error = IntPtr.Zero;");
            }
        }
Ejemplo n.º 22
0
		public override bool Validate (LogWriter log)
		{
			if (!base.Validate (log))
				return false;

			if (target == null && !(container_type as InterfaceGen).IsConsumeOnly) {
				log.Warn ("No matching target method to invoke. Add target_method attribute with fixup.");
				return false;
			}

			return true;
		}
Ejemplo n.º 23
0
        public override bool Validate()
        {
            LogWriter log = new LogWriter(QualifiedName);

            foreach (string iface in interfaces)
            {
                InterfaceGen igen = SymbolTable.Table[iface] as InterfaceGen;
                if (igen == null)
                {
                    log.Warn("implements unknown GInterface " + iface);
                    return(false);
                }
                if (!igen.ValidateForSubclass())
                {
                    log.Warn("implements invalid GInterface " + iface);
                    return(false);
                }
            }

            ArrayList invalids = new ArrayList();

            foreach (Property prop in props.Values)
            {
                if (!prop.Validate(log))
                {
                    invalids.Add(prop);
                }
            }
            foreach (Property prop in invalids)
            {
                props.Remove(prop.Name);
            }
            invalids.Clear();

            foreach (ObjectField field in fields.Values)
            {
                if (!field.Validate(log))
                {
                    invalids.Add(field);
                }
            }
            foreach (ObjectField field in invalids)
            {
                fields.Remove(field.Name);
            }
            invalids.Clear();

            foreach (Method method in methods.Values)
            {
                if (!method.Validate(log))
                {
                    invalids.Add(method);
                }
            }
            foreach (Method method in invalids)
            {
                methods.Remove(method.Name);
            }
            invalids.Clear();

            foreach (Ctor ctor in ctors)
            {
                if (!ctor.Validate(log))
                {
                    invalids.Add(ctor);
                }
            }
            foreach (Ctor ctor in invalids)
            {
                ctors.Remove(ctor);
            }
            invalids.Clear();

            return(true);
        }
Ejemplo n.º 24
0
        public override bool Validate(LogWriter log)
        {
            if (!base.Validate (log))
                return false;

            bool is_valid = true;

            if (this.IsStatic) {
                switch (OverrideType) {
                case VMOverrideType.Unspecified:
                    log.Warn ("Static virtual methods can only be generated if you provide info on how to override this method via the metadata ");
                    is_valid = false;
                    break;
                case VMOverrideType.ImplementingClass:
                    log.Warn ("Overriding static virtual methods in the implementing class is not supported yet ");
                    is_valid = false;
                    break;
                }
            }

            return is_valid;
        }
Ejemplo n.º 25
0
        public virtual void Generate(GenerationInfo gen_info, string indent)
        {
            if (Ignored || Hidden)
                return;

            CheckGlue ();
            if ((getterName != null || setterName != null || getOffsetName != null) && gen_info.GlueWriter == null) {
                LogWriter log = new LogWriter (container_type.QualifiedName);
                log.Member = Name;
                log.Warn ("needs glue for field access.  Specify --glue-filename");
                return;
            }

            GenerateImports (gen_info, indent);

            SymbolTable table = SymbolTable.Table;
            StreamWriter sw = gen_info.Writer;
            string modifiers = elem.HasAttribute ("new_flag") ? "new " : "";
            bool is_struct = table.IsStruct (CType) || table.IsBoxed (CType);
            string access = elem.HasAttribute ("access") ? elem.GetAttribute ("access") : "public";

            sw.WriteLine (indent + access + " " + modifiers + CSType + " " + Name + " {");

            if (Getter != null) {
                sw.Write (indent + "\tget ");
                Getter.GenerateBody (gen_info, container_type, "\t");
                sw.WriteLine ("");
            } else if (getterName != null) {
                sw.WriteLine (indent + "\tget {");
                container_type.Prepare (sw, indent + "\t\t");
                sw.WriteLine (indent + "\t\t" + CSType + " result = " + table.FromNative (ctype, getterName + " (" + container_type.CallByName () + ")") + ";");
                container_type.Finish (sw, indent + "\t\t");
                sw.WriteLine (indent + "\t\treturn result;");
                sw.WriteLine (indent + "\t}");
            } else if (Readable && offsetName != null) {
                sw.WriteLine (indent + "\tget {");
                sw.WriteLine (indent + "\t\tunsafe {");
                if (is_struct) {
                    sw.WriteLine (indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
                    sw.WriteLine (indent + "\t\t\treturn *raw_ptr;");
                } else {
                    sw.WriteLine (indent + "\t\t\t" + table.GetMarshalType (CType) + "* raw_ptr = (" + table.GetMarshalType (CType) + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
                    sw.WriteLine (indent + "\t\t\treturn " + table.FromNative (ctype, "(*raw_ptr)") + ";");
                }
                sw.WriteLine (indent + "\t\t}");
                sw.WriteLine (indent + "\t}");
            }

            IGeneratable gen = table [CType];
            string to_native = (gen is IManualMarshaler) ? (gen as IManualMarshaler).AllocNative ("value") : gen.CallByName ("value");

            if (Setter != null) {
                sw.Write (indent + "\tset ");
                Setter.GenerateBody (gen_info, container_type, "\t");
                sw.WriteLine ("");
            } else if (setterName != null) {
                sw.WriteLine (indent + "\tset {");
                container_type.Prepare (sw, indent + "\t\t");
                sw.WriteLine (indent + "\t\t" + setterName + " (" + container_type.CallByName () + ", " + to_native + ");");
                container_type.Finish (sw, indent + "\t\t");
                sw.WriteLine (indent + "\t}");
            } else if (Writable && offsetName != null) {
                sw.WriteLine (indent + "\tset {");
                sw.WriteLine (indent + "\t\tunsafe {");
                if (is_struct) {
                    sw.WriteLine (indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
                    sw.WriteLine (indent + "\t\t\t*raw_ptr = value;");
                } else {
                    sw.WriteLine (indent + "\t\t\t" + table.GetMarshalType (CType) + "* raw_ptr = (" + table.GetMarshalType (CType) + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
                    sw.WriteLine (indent + "\t\t\t*raw_ptr = " + to_native + ";");
                }
                sw.WriteLine (indent + "\t\t}");
                sw.WriteLine (indent + "\t}");
            }

            sw.WriteLine (indent + "}");
            sw.WriteLine ("");

            if (getterName != null || setterName != null || getOffsetName != null)
                GenerateGlue (gen_info);
        }
Ejemplo n.º 26
0
        public virtual void Generate(GenerationInfo gen_info, string indent)
        {
            if (Ignored || Hidden)
            {
                return;
            }

            CheckGlue();
            if ((getterName != null || setterName != null || getOffsetName != null) && gen_info.GlueWriter == null)
            {
                LogWriter log = new LogWriter(container_type.QualifiedName);
                log.Member = Name;
                log.Warn("needs glue for field access.  Specify --glue-filename");
                return;
            }

            GenerateImports(gen_info, indent);

            SymbolTable  table     = SymbolTable.Table;
            IGeneratable gen       = table [CType];
            StreamWriter sw        = gen_info.Writer;
            string       modifiers = elem.GetAttributeAsBoolean("new_flag") ? "new " : "";

            sw.WriteLine(indent + "public " + modifiers + CSType + " " + Name + " {");

            if (Getter != null)
            {
                sw.Write(indent + "\tget ");
                Getter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (getterName != null)
            {
                sw.WriteLine(indent + "\tget {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + CSType + " result = " + table.FromNative(ctype, getterName + " (" + container_type.CallByName() + ")") + ";");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\treturn result;");
                sw.WriteLine(indent + "\t}");
            }
            else if (Readable && offsetName != null)
            {
                sw.WriteLine(indent + "\tget {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (gen is CallbackGen)
                {
                    sw.WriteLine(indent + "\t\t\tIntPtr* raw_ptr = (IntPtr*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t {0} del = ({0})Marshal.GetDelegateForFunctionPointer(*raw_ptr, typeof({0}));", table.GetMarshalType(CType));
                    sw.WriteLine(indent + "\t\t\treturn " + table.FromNative(ctype, "(del)") + ";");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalType(CType) + "* raw_ptr = (" + table.GetMarshalType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\treturn " + table.FromNative(ctype, "(*raw_ptr)") + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            string to_native = (gen is IManualMarshaler) ? (gen as IManualMarshaler).AllocNative("value") : gen.CallByName("value");

            if (Setter != null)
            {
                sw.Write(indent + "\tset ");
                Setter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (setterName != null)
            {
                sw.WriteLine(indent + "\tset {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + setterName + " (" + container_type.CallByName() + ", " + to_native + ");");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t}");
            }
            else if (Writable && offsetName != null)
            {
                sw.WriteLine(indent + "\tset {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (gen is CallbackGen)
                {
                    sw.WriteLine(indent + "\t\t\t{0} wrapper = new {0} (value);", ((CallbackGen)gen).WrapperName);
                    sw.WriteLine(indent + "\t\t\tIntPtr* raw_ptr = (IntPtr*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = Marshal.GetFunctionPointerForDelegate (wrapper.NativeDelegate);");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalType(CType) + "* raw_ptr = (" + table.GetMarshalType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = " + to_native + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            sw.WriteLine(indent + "}");
            sw.WriteLine("");

            if (getterName != null || setterName != null || getOffsetName != null)
            {
                GenerateGlue(gen_info);
            }
        }
Ejemplo n.º 27
0
        public bool Validate(LogWriter log)
        {
            if (valid)
            {
                return(true);
            }

            if (elem == null)
            {
                return(false);
            }

            for (int i = first_is_instance ? 1 : 0; i < elem.ChildNodes.Count; i++)
            {
                XmlElement parm = elem.ChildNodes [i] as XmlElement;
                if (parm == null || parm.Name != "parameter")
                {
                    continue;
                }
                Parameter p = new Parameter(parm);

                if (p.IsEllipsis)
                {
                    log.Warn("Ellipsis parameter: hide and bind manually if no alternative exists. ");
                    Clear();
                    return(false);
                }

                if ((p.CSType == "") || (p.Name == "") ||
                    (p.MarshalType == "") || (SymbolTable.Table.CallByName(p.CType, p.Name) == ""))
                {
                    log.Warn("Unknown type {1} on parameter {0}", p.Name, p.CType);
                    Clear();
                    return(false);
                }

                if (p.IsOptional && p.PassAs == String.Empty && p.IsUserData == false)
                {
                    has_optional = true;
                }

                IGeneratable gen = p.Generatable;

                if (p.IsArray)
                {
                    p = new ArrayParameter(parm);
                    if (i < elem.ChildNodes.Count - 1)
                    {
                        XmlElement next = elem.ChildNodes [i + 1] as XmlElement;
                        if (next != null || next.Name == "parameter")
                        {
                            Parameter c = new Parameter(next);
                            if (c.IsCount)
                            {
                                p = new ArrayCountPair(parm, next, false);
                                i++;
                            }
                        }
                    }
                }
                else if (p.IsCount)
                {
                    p.IsCount = false;
                    if (i < elem.ChildNodes.Count - 1)
                    {
                        XmlElement next = elem.ChildNodes [i + 1] as XmlElement;
                        if (next != null || next.Name == "parameter")
                        {
                            Parameter a = new Parameter(next);
                            if (a.IsArray)
                            {
                                p = new ArrayCountPair(next, parm, true);
                                i++;
                            }
                        }
                    }
                }
                else if (p.CType == "GError**" && Throws)
                {
                    p = new ErrorParameter(parm);
                }
                else if (gen is StructBase || gen is ByRefGen)
                {
                    p = new StructParameter(parm);
                }
                else if (gen is CallbackGen)
                {
                    has_cb = true;
                }
                param_list.Add(p);
            }

            if (Parser.GetVersion(elem.OwnerDocument.DocumentElement) < 3 &&
                has_cb && Count > 2 && this [Count - 3].Generatable is CallbackGen && this [Count - 2].IsUserData && this [Count - 1].IsDestroyNotify)
            {
                this [Count - 3].Scope = "notified";
            }

            valid = true;
            return(true);
        }
Ejemplo n.º 28
0
		public virtual void Generate (GenerationInfo gen_info, string indent)
		{
			if (Ignored || Hidden)
				return;

			CheckGlue ();
			if ((getterName != null || setterName != null || getOffsetName != null) && gen_info.GlueWriter == null) {
				LogWriter log = new LogWriter (container_type.QualifiedName);
				log.Member = Name;
				log.Warn ("needs glue for field access.  Specify --glue-filename");
				return;
			}

			GenerateImports (gen_info, indent);

			SymbolTable table = SymbolTable.Table;
			IGeneratable gen = table [CType];
			StreamWriter sw = gen_info.Writer;
			string modifiers = elem.GetAttributeAsBoolean ("new_flag") ? "new " : "";

			sw.WriteLine (indent + "public " + modifiers + CSType + " " + Name + " {");

			if (Getter != null) {
				sw.Write (indent + "\tget ");
				Getter.GenerateBody (gen_info, container_type, "\t");
				sw.WriteLine ("");
			} else if (getterName != null) {
				sw.WriteLine (indent + "\tget {");
				container_type.Prepare (sw, indent + "\t\t");
				sw.WriteLine (indent + "\t\t" + CSType + " result = " + table.FromNative (ctype, getterName + " (" + container_type.CallByName () + ")") + ";");
				container_type.Finish (sw, indent + "\t\t");
				sw.WriteLine (indent + "\t\treturn result;");
				sw.WriteLine (indent + "\t}");
			} else if (Readable && offsetName != null) {
				sw.WriteLine (indent + "\tget {");
				sw.WriteLine (indent + "\t\tunsafe {");
				if (gen is CallbackGen) {
					sw.WriteLine (indent + "\t\t\tIntPtr* raw_ptr = (IntPtr*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
					sw.WriteLine (indent + "\t\t\t {0} del = ({0})Marshal.GetDelegateForFunctionPointer(*raw_ptr, typeof({0}));", table.GetMarshalType (CType));
					sw.WriteLine (indent + "\t\t\treturn " + table.FromNative (ctype, "(del)") + ";");
				}
				else {
					sw.WriteLine (indent + "\t\t\t" + table.GetMarshalType (CType) + "* raw_ptr = (" + table.GetMarshalType (CType) + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
					sw.WriteLine (indent + "\t\t\treturn " + table.FromNative (ctype, "(*raw_ptr)") + ";");
				}
				sw.WriteLine (indent + "\t\t}");
				sw.WriteLine (indent + "\t}");
			}

			string to_native = (gen is IManualMarshaler) ? (gen as IManualMarshaler).AllocNative ("value") : gen.CallByName ("value");

			if (Setter != null) {
				sw.Write (indent + "\tset ");
				Setter.GenerateBody (gen_info, container_type, "\t");
				sw.WriteLine ("");
			} else if (setterName != null) {
				sw.WriteLine (indent + "\tset {");
				container_type.Prepare (sw, indent + "\t\t");
				sw.WriteLine (indent + "\t\t" + setterName + " (" + container_type.CallByName () + ", " + to_native + ");");
				container_type.Finish (sw, indent + "\t\t");
				sw.WriteLine (indent + "\t}");
			} else if (Writable && offsetName != null) {
				sw.WriteLine (indent + "\tset {");
				sw.WriteLine (indent + "\t\tunsafe {");
				if (gen is CallbackGen) {
					sw.WriteLine (indent + "\t\t\t{0} wrapper = new {0} (value);", ((CallbackGen)gen).WrapperName);
					sw.WriteLine (indent + "\t\t\tIntPtr* raw_ptr = (IntPtr*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
					sw.WriteLine (indent + "\t\t\t*raw_ptr = Marshal.GetFunctionPointerForDelegate (wrapper.NativeDelegate);");
				}
				else {
					sw.WriteLine (indent + "\t\t\t" + table.GetMarshalType (CType) + "* raw_ptr = (" + table.GetMarshalType (CType) + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");");
					sw.WriteLine (indent + "\t\t\t*raw_ptr = " + to_native + ";");
				}
				sw.WriteLine (indent + "\t\t}");
				sw.WriteLine (indent + "\t}");
			}

			sw.WriteLine (indent + "}");
			sw.WriteLine ("");

			if (getterName != null || setterName != null || getOffsetName != null)
				GenerateGlue (gen_info);
		}
Ejemplo n.º 29
0
        public bool Validate(LogWriter log)
        {
            if (valid)
                return true;

            if (elem == null)
                return false;

            for (int i = first_is_instance ? 1 : 0; i < elem.ChildNodes.Count; i++) {
                XmlElement parm = elem.ChildNodes [i] as XmlElement;
                if (parm == null || parm.Name != "parameter")
                    continue;
                Parameter p = new Parameter (parm);

                if (p.IsEllipsis) {
                    log.Warn ("Ellipsis parameter: hide and bind manually if no alternative exists. ");
                    Clear ();
                    return false;
                }

                if ((p.CSType == "") || (p.Name == "") ||
                    (p.MarshalType == "") || (SymbolTable.Table.CallByName(p.CType, p.Name) == "")) {
                    log.Warn ("Unknown type {1} on parameter {0}", p.Name, p.CType);
                    Clear ();
                    return false;
                }

                IGeneratable gen = p.Generatable;

                if (p.IsArray) {
                    p = new ArrayParameter (parm);
                    if (i < elem.ChildNodes.Count - 1) {
                        XmlElement next = elem.ChildNodes [i + 1] as XmlElement;
                        if (next != null || next.Name == "parameter") {
                            Parameter c = new Parameter (next);
                            if (c.IsCount) {
                                p = new ArrayCountPair (parm, next, false);
                                i++;
                            }
                        }
                    }
                } else if (p.IsCount) {
                    p.IsCount = false;
                    if (i < elem.ChildNodes.Count - 1) {
                        XmlElement next = elem.ChildNodes [i + 1] as XmlElement;
                        if (next != null || next.Name == "parameter") {
                            Parameter a = new Parameter (next);
                            if (a.IsArray) {
                                p = new ArrayCountPair (next, parm, true);
                                i++;
                            }
                        }
                    }
                } else if (p.CType == "GError**")
                    p = new ErrorParameter (parm);
                else if (gen is StructBase || gen is ByRefGen) {
                    p = new StructParameter (parm);
                } else if (gen is CallbackGen) {
                    has_cb = true;
                }
                param_list.Add (p);
            }

            if (has_cb && Count > 2 && this [Count - 3].Generatable is CallbackGen && this [Count - 2].IsUserData && this [Count - 1].IsDestroyNotify)
                this [Count - 3].Scope = "notified";

            valid = true;
            return true;
        }
Ejemplo n.º 30
0
        public bool Validate(LogWriter log)
        {
            if (MarshalType == "" || CSType == "") {
                log.Warn ("Unknown return type: {0}", CType);
                return false;
            } else if ((CSType == "GLib.List" || CSType == "GLib.SList") && String.IsNullOrEmpty (ElementType))
                log.Warn ("Returns {0} with unknown element type.  Add element_type attribute with gapi-fixup.", CType);

            return true;
        }
Ejemplo n.º 31
0
		public bool Validate (LogWriter log)
		{
			if (MarshalType == "" || CSType == "") {
				log.Warn ("Unknown return type: {0}", CType);
				return false;
			} else if ((CSType == "GLib.List" || CSType == "GLib.SList") && String.IsNullOrEmpty (ElementType))
				log.Warn ("Returns {0} with unknown element type.  Add element_type attribute with gapi-fixup.", CType);

			if (is_array && !is_null_term && String.IsNullOrEmpty (array_length_param)) {
				log.Warn ("Returns an array with undeterminable length. Add null_term_array or array_length_param attribute with gapi-fixup.");
				return false;
			}

			return true;
		}
Ejemplo n.º 32
0
		public override bool Validate ()
		{
			LogWriter log = new LogWriter (QualifiedName);

			foreach (string iface in interfaces) {
				InterfaceGen igen = SymbolTable.Table[iface] as InterfaceGen;
				if (igen == null) {
					log.Warn ("implements unknown GInterface " + iface);
					return false;
				}
				if (!igen.ValidateForSubclass ()) {
					log.Warn ("implements invalid GInterface " + iface);
					return false;
				}
			}

			ArrayList invalids = new ArrayList ();

			foreach (Property prop in props.Values) {
				if (!prop.Validate (log))
					invalids.Add (prop);
			}
			foreach (Property prop in invalids)
				props.Remove (prop.Name);
			invalids.Clear ();

			foreach (ObjectField field in fields.Values) {
				if (!field.Validate (log))
					invalids.Add (field);
			}
			foreach (ObjectField field in invalids)
				fields.Remove (field.Name);
			invalids.Clear ();

			foreach (Method method in methods.Values) {
				if (!method.Validate (log))
					invalids.Add (method);
			}
			foreach (Method method in invalids)
				methods.Remove (method.Name);
			invalids.Clear ();

			foreach (Constant con in constants.Values) {
				if (!con.Validate (log))
					invalids.Add (con);
			}
			foreach (Constant con in invalids)
				constants.Remove (con.Name);
			invalids.Clear ();

			foreach (Ctor ctor in ctors) {
				if (!ctor.Validate (log))
					invalids.Add (ctor);
			}
			foreach (Ctor ctor in invalids)
				ctors.Remove (ctor);
			invalids.Clear ();

			return true;
		}
Ejemplo n.º 33
0
        public virtual void Generate(GenerationInfo gen_info, string indent)
        {
            if (Ignored || Hidden)
            {
                return;
            }

            CheckGlue();
            if ((getterName != null || setterName != null || getOffsetName != null) && gen_info.GlueWriter == null)
            {
                LogWriter log = new LogWriter(container_type.QualifiedName);
                log.Member = Name;
                log.Warn("needs glue for field access.  Specify --glue-filename");
                return;
            }

            GenerateImports(gen_info, indent);

            SymbolTable  table     = SymbolTable.Table;
            StreamWriter sw        = gen_info.Writer;
            string       modifiers = elem.HasAttribute("new_flag") ? "new " : "";
            bool         is_struct = table.IsStruct(CType) || table.IsBoxed(CType);

            sw.WriteLine(indent + "public " + modifiers + CSType + " " + Name + " {");

            if (Getter != null)
            {
                sw.Write(indent + "\tget ");
                Getter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (getterName != null)
            {
                sw.WriteLine(indent + "\tget {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + CSType + " result = " + table.FromNative(ctype, getterName + " (" + container_type.CallByName() + ")") + ";");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\treturn result;");
                sw.WriteLine(indent + "\t}");
            }
            else if (Readable && offsetName != null)
            {
                sw.WriteLine(indent + "\tget {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (is_struct)
                {
                    sw.WriteLine(indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\treturn *raw_ptr;");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalType(CType) + "* raw_ptr = (" + table.GetMarshalType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\treturn " + table.FromNative(ctype, "(*raw_ptr)") + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            IGeneratable gen       = table [CType];
            string       to_native = (gen is IManualMarshaler) ? (gen as IManualMarshaler).AllocNative("value") : gen.CallByName("value");

            if (Setter != null)
            {
                sw.Write(indent + "\tset ");
                Setter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (setterName != null)
            {
                sw.WriteLine(indent + "\tset {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + setterName + " (" + container_type.CallByName() + ", " + to_native + ");");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t}");
            }
            else if (Writable && offsetName != null)
            {
                sw.WriteLine(indent + "\tset {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (is_struct)
                {
                    sw.WriteLine(indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = value;");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalType(CType) + "* raw_ptr = (" + table.GetMarshalType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = " + to_native + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            sw.WriteLine(indent + "}");
            sw.WriteLine("");

            if (getterName != null || setterName != null || getOffsetName != null)
            {
                GenerateGlue(gen_info);
            }
        }