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); }
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); }
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; } } }
public override bool Validate(LogWriter log) { if (!is_valid) { log.Warn("Can't generate ABI compatible union"); } return(is_valid); }
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; }
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; }
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); }
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); }
public override bool Validate (LogWriter log) { if (!base.Validate (log)) return false; if (IsBitfield) { log.Warn ("bitfields are not supported"); return false; } return true; }
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); }
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; }
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); }
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; }
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); }
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); }
public override bool Validate(LogWriter log) { if (!base.Validate(log)) { return(false); } if (IsBitfield) { log.Warn("bitfields are not supported"); return(false); } return(true); }
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); }
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; }
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); }
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); }
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;"); } }
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; }
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); }
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; }
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); }
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); } }
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); }
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); }
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; }
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; }
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; }
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; }
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); } }