2005-05-02 18:40:30 +00:00
// GtkSharp.Generation.StructField.cs - The Structure Field generation
// Class.
2004-01-19 05:30:05 +00:00
//
// Author: Mike Kestner <mkestner@ximian.com>
//
2005-07-02 15:23:27 +00:00
// Copyright (c) 2004-2005 Novell, Inc.
2004-06-25 16:35:15 +00:00
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
2004-01-19 05:30:05 +00:00
namespace GtkSharp.Generation {
using System ;
using System.IO ;
using System.Xml ;
2005-05-02 18:40:30 +00:00
public class StructField : FieldBase {
2004-01-19 05:30:05 +00:00
public static int bitfields ;
2005-05-02 18:40:30 +00:00
public StructField ( XmlElement elem , ClassBase container_type ) : base ( elem , container_type ) { }
2004-01-19 05:30:05 +00:00
2005-05-02 18:40:30 +00:00
protected override string DefaultAccess {
2004-02-10 16:04:50 +00:00
get {
2005-07-02 15:23:27 +00:00
if ( IsPadding )
return "private" ;
2005-05-02 18:40:30 +00:00
return "public" ;
2004-02-10 16:04:50 +00:00
}
}
2017-10-03 13:18:08 +00:00
public int ArrayLength {
2004-01-19 17:05:53 +00:00
get {
if ( ! IsArray )
return 0 ;
int result ;
try {
result = Int32 . Parse ( elem . GetAttribute ( "array_len" ) ) ;
2005-07-02 15:23:27 +00:00
} catch ( Exception ) {
2017-10-03 13:18:08 +00:00
LogWriter log = new LogWriter ( container_type . Name + "." + Name ) ;
2017-10-03 13:07:17 +00:00
log . Warn ( "Non-numeric array_len: \"" + elem . GetAttribute ( "array_len" ) +
2017-10-03 13:18:08 +00:00
"\" incorrectly generated" ) ;
2004-01-19 17:05:53 +00:00
result = 0 ;
}
return result ;
}
}
2017-10-03 13:18:08 +00:00
public bool IsNullTermArray {
2013-08-14 11:16:40 +00:00
get { return elem . GetAttributeAsBoolean ( "null_term_array" ) ; }
}
2005-05-02 18:40:30 +00:00
public new string CSType {
2004-01-19 05:30:05 +00:00
get {
2005-05-02 18:40:30 +00:00
string type = base . CSType ;
2004-01-19 05:30:05 +00:00
if ( IsArray )
2004-01-19 17:05:53 +00:00
type + = "[]" ;
2004-01-19 05:30:05 +00:00
else if ( ( IsPointer | | SymbolTable . Table . IsOpaque ( CType ) ) & & type ! = "string" )
type = "IntPtr" ;
return type ;
}
}
2013-10-09 11:40:56 +00:00
bool visible = false ;
internal bool Visible {
get {
return visible ;
}
}
2011-10-08 02:55:26 +00:00
public string EqualityName {
get {
SymbolTable table = SymbolTable . Table ;
string wrapped_name = SymbolTable . Table . MangleName ( CName ) ;
IGeneratable gen = table [ CType ] ;
2018-01-29 17:07:35 +00:00
if ( IsArray & & IsNullTermArray )
return StudlyName + "Ptr" ;
else if ( IsArray | | gen is IAccessor )
2015-11-10 10:37:34 +00:00
return Access = = "public" ? StudlyName : Name ;
2011-10-08 02:55:26 +00:00
else if ( IsBitfield )
return Name ;
2013-10-08 18:22:16 +00:00
else if ( IsPointer & & ( gen is StructGen | | gen is BoxedGen | | gen is UnionGen ) )
2011-10-08 02:55:26 +00:00
return Access ! = "private" ? wrapped_name : Name ;
else if ( IsPointer & & CSType ! = "string" )
return Name ;
else
return Access = = "public" ? StudlyName : Name ;
}
}
2017-10-03 13:18:08 +00:00
bool IsFixedSizeArray ( ) {
return IsArray & & ! IsNullTermArray & & ArrayLength ! = 0 ;
}
2017-10-04 00:13:35 +00:00
public virtual bool IsCPointer ( ) {
2017-10-03 13:18:08 +00:00
IGeneratable gen = SymbolTable . Table [ CType ] ;
return ( CType . EndsWith ( "*" ) | |
CType . EndsWith ( "pointer" ) | |
gen is CallbackGen | |
cstype = = "string" | |
( CType = = "guint8" & & ( IsArray & & IsNullTermArray ) ) | |
elem . GetAttributeAsBoolean ( "is_callback" ) ) ;
}
public virtual string GenerateGetSizeOf ( string indent ) {
string cstype = SymbolTable . Table . GetCSType ( CType , true ) ;
string res = "" ;
IGeneratable gen = SymbolTable . Table [ CType ] ;
var is_pointer = false ;
if ( IsCPointer ( ) ) {
is_pointer = true ;
cstype = "IntPtr" ;
} else if ( gen ! = null ) {
res = gen . GenerateGetSizeOf ( ) ;
}
if ( res ! = null & & res ! = "" ) {
if ( IsFixedSizeArray ( ) )
res + = " * " + ArrayLength ;
return indent + res ;
}
var _enum = gen as EnumGen ;
if ( _enum ! = null & & ! is_pointer )
2021-07-20 18:24:49 +00:00
res = "(uint) sizeof(" + cstype + ")" ;
2017-10-03 13:18:08 +00:00
else
2021-07-20 18:24:49 +00:00
res = "(uint) " + GenerationInfo . GetSizeOfExpression ( cstype ) ;
2017-10-03 13:18:08 +00:00
if ( IsFixedSizeArray ( ) )
res + = " * " + ArrayLength ;
return res ;
}
2013-05-31 17:38:35 +00:00
public bool IsPadding {
2004-01-19 05:30:05 +00:00
get {
2017-12-01 00:59:07 +00:00
if ( elem . GetAttributeAsBoolean ( "padding" ) )
return elem . GetAttributeAsBoolean ( "padding" ) ;
2017-08-24 13:20:05 +00:00
return ( elem . GetAttribute ( "access" ) = = "private" & & (
CName . StartsWith ( "dummy" ) | | CName . StartsWith ( "padding" ) ) ) ;
2004-01-19 05:30:05 +00:00
}
}
public bool IsPointer {
get {
2017-10-03 13:18:08 +00:00
return IsCPointer ( ) ;
2004-01-19 05:30:05 +00:00
}
}
2005-05-02 18:40:30 +00:00
public new string Name {
2004-01-19 05:30:05 +00:00
get {
string result = "" ;
if ( ( IsPointer | | SymbolTable . Table . IsOpaque ( CType ) ) & & CSType ! = "string" )
result = "_" ;
* generator/StructBase.cs: update field-generation logic a bit
* generator/CodeGenerator.cs: add a --glue-includes flag
* generator/GenerationInfo.cs: Accept glue_includes value from
Main and output it to the glue_filename.
* generator/FieldBase.cs (Ignored): handle more ignorable cases.
(CheckGlue): New method to figure out what kind of glue we'll need
for a field.
(GenerateImports): generate appropriate imports per CheckGlue.
(GenerateGlue): Generate C glue for accessing a struct field;
either a fully-C-based accessor, or a method to just return the
field's offset in the struct.
(Generate): Use the generated glue to read the field.
* generator/PropertyBase.cs (CType): if the field is a single bit,
set its type to gboolean.
* generator/ObjectGen.cs (Generate):
* generator/OpaqueGen.cs (Generate): Call GenFields.
* generator/StructField.cs: Use FieldBase's glue-generation code
to handle bitfields. [#54489]
* generator/ObjectField.cs: Generates accessors for public fields
of objects and opaque structs. [#69514]
* generator/ClassBase.cs (ClassBase): Parse <fields> nodes and
create ObjectField objects.
(GenFields): Output field properties
(IgnoreMethod): Ignore Get/Set methods that duplicate fields
* generator/Makefile.am (sources): update
* {gdk,gnome,gtk,pango}/*.metadata: Mark some additional fields as
public. Rename/retype some fields for consistency with earlier
hand-coded bindings.
* {gdk,gnome,gtk,pango}/*.custom: Remove custom methods that can
now be autogenerated.
* {gdk,gnome,gtk,pango}/glue/*.c: Remove glue methods that can now
be autogenerated
* {gdk,glade,gnome,gtk,pango,vte}/Makefile.am
* {gdk,glade,gnome,gtk,pango,vte}/glue/Makefile.am
* {gdk,gnome,gtk,pango}/glue/makefile.win32: Update
svn path=/trunk/gtk-sharp/; revision=44563
2005-05-16 14:28:55 +00:00
result + = SymbolTable . Table . MangleName ( CName ) ;
2004-01-19 05:30:05 +00:00
return result ;
}
}
2017-10-04 00:13:35 +00:00
public virtual string StudlyName {
2004-01-19 05:30:05 +00:00
get {
2005-05-02 18:40:30 +00:00
string studly = base . Name ;
2005-07-03 15:14:09 +00:00
if ( studly = = "" )
2017-10-04 00:13:35 +00:00
throw new Exception ( CName + "API file must be regenerated with a current version of the GAPI parser. It is incompatible with this version of the GAPI code generator." ) ;
2005-07-03 15:14:09 +00:00
2004-12-17 20:29:54 +00:00
return studly ;
2004-01-19 05:30:05 +00:00
}
}
2005-05-02 18:40:30 +00:00
public override void Generate ( GenerationInfo gen_info , string indent )
2005-02-23 17:37:33 +00:00
{
2017-10-03 13:18:08 +00:00
Generate ( gen_info , indent , false , gen_info . Writer ) ;
}
public void Generate ( GenerationInfo gen_info , string indent , bool use_cnames ,
TextWriter sw )
{
if ( Hidden & & ! use_cnames )
2005-02-23 17:37:33 +00:00
return ;
2004-01-19 05:30:05 +00:00
2013-10-09 11:40:56 +00:00
visible = Access ! = "private" ;
2004-01-19 05:30:05 +00:00
SymbolTable table = SymbolTable . Table ;
string wrapped = table . GetCSType ( CType ) ;
2017-10-03 13:18:08 +00:00
2005-05-02 18:40:30 +00:00
string wrapped_name = SymbolTable . Table . MangleName ( CName ) ;
2017-10-03 13:18:08 +00:00
string name = Name ;
string studly_name = StudlyName ;
string cstype = CSType ;
2005-01-05 20:54:39 +00:00
IGeneratable gen = table [ CType ] ;
2017-10-03 13:18:08 +00:00
if ( use_cnames ) {
name = studly_name = wrapped_name = SymbolTable . Table . MangleName ( CName ) . Replace ( "." , "_" ) ;
var mangen = gen as ManualGen ;
if ( mangen ! = null ) {
if ( mangen . AbiType ! = null )
cstype = mangen . AbiType ;
}
if ( IsCPointer ( ) )
cstype = "IntPtr" ;
}
2013-08-14 11:16:40 +00:00
if ( IsArray & & ! IsNullTermArray ) {
2005-07-02 15:23:27 +00:00
sw . WriteLine ( indent + "[MarshalAs (UnmanagedType.ByValArray, SizeConst=" + ArrayLength + ")]" ) ;
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "{0} {1} {2};" , Access , cstype , studly_name ) ;
2013-08-14 11:16:40 +00:00
} else if ( IsArray & & IsNullTermArray ) {
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "private {0} {1};" , "IntPtr" , studly_name + "Ptr" ) ;
2013-08-14 11:16:40 +00:00
if ( ( Readable | | Writable ) & & Access = = "public" ) {
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "public {0} {1} {{" , cstype , studly_name ) ;
2013-08-14 11:16:40 +00:00
if ( Readable )
sw . WriteLine ( indent + "\tget {{ return GLib.Marshaller.StructArrayFromNullTerminatedIntPtr<{0}> ({1}); }}" ,
2017-10-03 13:18:08 +00:00
base . CSType , studly_name + "Ptr" ) ;
2013-08-14 11:16:40 +00:00
if ( Writable )
sw . WriteLine ( indent + "\tset {{ {0} = GLib.Marshaller.StructArrayToNullTerminatedStructArrayIntPtr<{1}> (value); }}" ,
2017-10-03 13:18:08 +00:00
studly_name + "Ptr" , base . CSType ) ;
2013-08-14 11:16:40 +00:00
sw . WriteLine ( indent + "}" ) ;
}
* generator/StructBase.cs: update field-generation logic a bit
* generator/CodeGenerator.cs: add a --glue-includes flag
* generator/GenerationInfo.cs: Accept glue_includes value from
Main and output it to the glue_filename.
* generator/FieldBase.cs (Ignored): handle more ignorable cases.
(CheckGlue): New method to figure out what kind of glue we'll need
for a field.
(GenerateImports): generate appropriate imports per CheckGlue.
(GenerateGlue): Generate C glue for accessing a struct field;
either a fully-C-based accessor, or a method to just return the
field's offset in the struct.
(Generate): Use the generated glue to read the field.
* generator/PropertyBase.cs (CType): if the field is a single bit,
set its type to gboolean.
* generator/ObjectGen.cs (Generate):
* generator/OpaqueGen.cs (Generate): Call GenFields.
* generator/StructField.cs: Use FieldBase's glue-generation code
to handle bitfields. [#54489]
* generator/ObjectField.cs: Generates accessors for public fields
of objects and opaque structs. [#69514]
* generator/ClassBase.cs (ClassBase): Parse <fields> nodes and
create ObjectField objects.
(GenFields): Output field properties
(IgnoreMethod): Ignore Get/Set methods that duplicate fields
* generator/Makefile.am (sources): update
* {gdk,gnome,gtk,pango}/*.metadata: Mark some additional fields as
public. Rename/retype some fields for consistency with earlier
hand-coded bindings.
* {gdk,gnome,gtk,pango}/*.custom: Remove custom methods that can
now be autogenerated.
* {gdk,gnome,gtk,pango}/glue/*.c: Remove glue methods that can now
be autogenerated
* {gdk,glade,gnome,gtk,pango,vte}/Makefile.am
* {gdk,glade,gnome,gtk,pango,vte}/glue/Makefile.am
* {gdk,gnome,gtk,pango}/glue/makefile.win32: Update
svn path=/trunk/gtk-sharp/; revision=44563
2005-05-16 14:28:55 +00:00
} else if ( IsBitfield ) {
base . Generate ( gen_info , indent ) ;
2005-07-03 15:14:09 +00:00
} else if ( gen is IAccessor ) {
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "private {0} {1};" , gen . MarshalType , name ) ;
2004-12-16 23:22:07 +00:00
if ( Access ! = "private" ) {
2005-07-02 15:23:27 +00:00
IAccessor acc = table [ CType ] as IAccessor ;
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + Access + " " + wrapped + " " + studly_name + " {" ) ;
acc . WriteAccessors ( sw , indent + "\t" , name ) ;
2005-05-02 18:40:30 +00:00
sw . WriteLine ( indent + "}" ) ;
2004-12-16 23:22:07 +00:00
}
2013-10-08 18:22:16 +00:00
} else if ( IsPointer & & ( gen is StructGen | | gen is BoxedGen | | gen is UnionGen ) ) {
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "private {0} {1};" , cstype , name ) ;
2004-01-19 05:30:05 +00:00
sw . WriteLine ( ) ;
2004-12-16 23:22:07 +00:00
if ( Access ! = "private" ) {
* generator/StructBase.cs: update field-generation logic a bit
* generator/CodeGenerator.cs: add a --glue-includes flag
* generator/GenerationInfo.cs: Accept glue_includes value from
Main and output it to the glue_filename.
* generator/FieldBase.cs (Ignored): handle more ignorable cases.
(CheckGlue): New method to figure out what kind of glue we'll need
for a field.
(GenerateImports): generate appropriate imports per CheckGlue.
(GenerateGlue): Generate C glue for accessing a struct field;
either a fully-C-based accessor, or a method to just return the
field's offset in the struct.
(Generate): Use the generated glue to read the field.
* generator/PropertyBase.cs (CType): if the field is a single bit,
set its type to gboolean.
* generator/ObjectGen.cs (Generate):
* generator/OpaqueGen.cs (Generate): Call GenFields.
* generator/StructField.cs: Use FieldBase's glue-generation code
to handle bitfields. [#54489]
* generator/ObjectField.cs: Generates accessors for public fields
of objects and opaque structs. [#69514]
* generator/ClassBase.cs (ClassBase): Parse <fields> nodes and
create ObjectField objects.
(GenFields): Output field properties
(IgnoreMethod): Ignore Get/Set methods that duplicate fields
* generator/Makefile.am (sources): update
* {gdk,gnome,gtk,pango}/*.metadata: Mark some additional fields as
public. Rename/retype some fields for consistency with earlier
hand-coded bindings.
* {gdk,gnome,gtk,pango}/*.custom: Remove custom methods that can
now be autogenerated.
* {gdk,gnome,gtk,pango}/glue/*.c: Remove glue methods that can now
be autogenerated
* {gdk,glade,gnome,gtk,pango,vte}/Makefile.am
* {gdk,glade,gnome,gtk,pango,vte}/glue/Makefile.am
* {gdk,gnome,gtk,pango}/glue/makefile.win32: Update
svn path=/trunk/gtk-sharp/; revision=44563
2005-05-16 14:28:55 +00:00
sw . WriteLine ( indent + Access + " " + wrapped + " " + wrapped_name + " {" ) ;
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "\tget { return " + table . FromNative ( CType , name ) + "; }" ) ;
2005-05-02 18:40:30 +00:00
sw . WriteLine ( indent + "}" ) ;
2004-12-16 23:22:07 +00:00
}
2017-10-03 13:18:08 +00:00
} else if ( IsPointer & & cstype ! = "string" ) {
2004-01-21 20:47:41 +00:00
// FIXME: probably some fields here which should be visible.
2013-10-09 11:40:56 +00:00
visible = false ;
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "private {0} {1};" , cstype , name ) ;
2004-01-21 20:47:41 +00:00
} else {
2017-10-03 13:18:08 +00:00
sw . WriteLine ( indent + "{0} {1} {2};" , Access , cstype , Access = = "public" ? studly_name : name ) ;
2004-01-19 05:30:05 +00:00
}
}
}
}
2017-10-03 13:18:08 +00:00