Class VariantType
- All Implemented Interfaces:
Proxy
GLib.Variant type system.
GLib.Variant types are represented as strings, but have a strict
syntax described below. All GLib.VariantTypes passed to GLib must be
valid, and they are typically expected to be static (i.e. not provided by
user input) as they determine how binary GLib.Variant data is
interpreted.
To convert a static string to a GLib.VariantType in C, use the
GLib#VARIANTTYPE casting macro. When GLib is compiled with checks
enabled, it will validate the type. To check if an arbitrary string is a
valid GLib.VariantType, use stringIsValid(java.lang.String).
GVariant Type System
This section introduces the GLib.Variant type system. It is based, in
large part, on the D-Bus type system, with two major changes and
some minor lifting of restrictions. The
D-Bus specification,
therefore, provides a significant amount of
information that is useful when working with GLib.Variant.
The first major change with respect to the D-Bus type system is the
introduction of maybe (or ‘nullable’) types. Any type in GLib.Variant
can be converted to a maybe type, in which case, nothing (or null)
becomes a valid value. Maybe types have been added by introducing the
character m to type strings.
The second major change is that the GLib.Variant type system supports
the concept of ‘indefinite types’ — types that are less specific than
the normal types found in D-Bus. For example, it is possible to speak
of ‘an array of any type’ in GLib.Variant, where the D-Bus type system
would require you to speak of ‘an array of integers’ or ‘an array of
strings’. Indefinite types have been added by introducing the
characters *, ? and r to type strings.
Finally, all arbitrary restrictions relating to the complexity of types are lifted along with the restriction that dictionary entries may only appear nested inside of arrays.
Just as in D-Bus, GLib.Variant types are described with strings (‘type
strings’). Subject to the differences mentioned above, these strings
are of the same form as those found in D-Bus. Note, however: D-Bus
always works in terms of messages and therefore individual type
strings appear nowhere in its interface. Instead, ‘signatures’
are a concatenation of the strings of the type of each argument in a
message. GLib.Variant deals with single values directly so
GLib.Variant type strings always describe the type of exactly one
value. This means that a D-Bus signature string is generally not a valid
GLib.Variant type string — except in the case that it is the signature
of a message containing exactly one argument.
An indefinite type is similar in spirit to what may be called an
abstract type in other type systems. No value can exist that has an
indefinite type as its type, but values can exist that have types
that are subtypes of indefinite types. That is to say,
Variant#getType will never return an indefinite type, but
calling Variant.isOfType(org.gnome.glib.VariantType) with an indefinite type may return
true. For example, you cannot have a value that represents ‘an
array of no particular type’, but you can have an ‘array of integers’
which certainly matches the type of ‘an array of no particular type’,
since ‘array of integers’ is a subtype of ‘array of no particular
type’.
This is similar to how instances of abstract classes may not
directly exist in other type systems, but instances of their
non-abstract subtypes may. For example, in GTK, no object that has
the type of GtkWidget can
exist (since GtkWidget is an abstract class), but a GtkWindow
can certainly be instantiated, and you would say that a GtkWindow is a
GtkWidget (since GtkWindow is a subclass of GtkWidget).
Two types may not be compared by value; use equal(org.gnome.glib.VariantType)
or isSubtypeOf(org.gnome.glib.VariantType) May be copied using
copy() and freed using free().
GVariant Type Strings
A GLib.Variant type string can be any of the following:
- any basic type string (listed below)
v,ror*- one of the characters
aorm, followed by another type string - the character
(, followed by a concatenation of zero or more other type strings, followed by the character) - the character
{, followed by a basic type string (see below), followed by another type string, followed by the character}
A basic type string describes a basic type (as per
isBasic()) and is always a single character in
length. The valid basic type strings are b, y, n, q, i, u, x,
t, h, d, s, o, g and ?.
The above definition is recursive to arbitrary depth. aaaaai and
(ui(nq((y)))s) are both valid type strings, as is
a(aa(ui)(qna{ya(yd)})). In order to not hit memory limits,
GLib.Variant imposes a limit on recursion depth of 65 nested
containers. This is the limit in the D-Bus specification (64) plus one to
allow a GDBusMessage to be nested in
a top-level tuple.
The meaning of each of the characters is as follows:
b: the type string ofG_VARIANT_TYPE_BOOLEAN; a boolean value.y: the type string ofG_VARIANT_TYPE_BYTE; a byte.n: the type string ofG_VARIANT_TYPE_INT16; a signed 16 bit integer.q: the type string ofG_VARIANT_TYPE_UINT16; an unsigned 16 bit integer.i: the type string ofG_VARIANT_TYPE_INT32; a signed 32 bit integer.u: the type string ofG_VARIANT_TYPE_UINT32; an unsigned 32 bit integer.x: the type string ofG_VARIANT_TYPE_INT64; a signed 64 bit integer.t: the type string ofG_VARIANT_TYPE_UINT64; an unsigned 64 bit integer.h: the type string ofG_VARIANT_TYPE_HANDLE; a signed 32 bit value that, by convention, is used as an index into an array of file descriptors that are sent alongside a D-Bus message.d: the type string ofG_VARIANT_TYPE_DOUBLE; a double precision floating point value.s: the type string ofG_VARIANT_TYPE_STRING; a string.o: the type string ofG_VARIANT_TYPE_OBJECT_PATH; a string in the form of a D-Bus object path.g: the type string ofG_VARIANT_TYPE_SIGNATURE; a string in the form of a D-Bus type signature.?: the type string ofG_VARIANT_TYPE_BASIC; an indefinite type that is a supertype of any of the basic types.v: the type string ofG_VARIANT_TYPE_VARIANT; a container type that contain any other type of value.a: used as a prefix on another type string to mean an array of that type; the type stringai, for example, is the type of an array of signed 32-bit integers.m: used as a prefix on another type string to mean a ‘maybe’, or ‘nullable’, version of that type; the type stringms, for example, is the type of a value that maybe contains a string, or maybe contains nothing.(): used to enclose zero or more other concatenated type strings to create a tuple type; the type string(is), for example, is the type of a pair of an integer and a string.r: the type string ofG_VARIANT_TYPE_TUPLE; an indefinite type that is a supertype of any tuple type, regardless of the number of items.{}: used to enclose a basic type string concatenated with another type string to create a dictionary entry type, which usually appears inside of an array to form a dictionary; the type stringa{sd}, for example, is the type of a dictionary that maps strings to double precision floating point values.
The first type (the basic type) is the key type and the second type is the value type. The reason that the first type is restricted to being a basic type is so that it can easily be hashed.
*: the type string ofG_VARIANT_TYPE_ANY; the indefinite type that is a supertype of all types. Note that, as with all type strings, this character represents exactly one type. It cannot be used inside of tuples to mean ‘any number of items’.
Any type string of a container that contains an indefinite type is,
itself, an indefinite type. For example, the type string a*
(corresponding to G_VARIANT_TYPE_ARRAY) is an indefinite type
that is a supertype of every array type. (*s) is a supertype
of all tuples that contain exactly two items where the second
item is a string.
a{?*} is an indefinite type that is a supertype of all arrays
containing dictionary entries where the key is any basic type and
the value is any type at all. This is, by definition, a dictionary,
so this type string corresponds to G_VARIANT_TYPE_DICTIONARY. Note
that, due to the restriction that the key of a dictionary entry must
be a basic type, {**} is not a valid type string.
- Since:
- 2.24
-
Constructor Summary
ConstructorsConstructorDescriptionVariantType(MemorySegment address) Create a VariantType proxy instance for the provided memory address.VariantType(String typeString) Creates a newGLib.VariantTypecorresponding to the type string given bytypeString. -
Method Summary
Modifier and TypeMethodDescriptionstatic VariantTypearray(VariantType element) Constructs the type corresponding to an array of elements of the typetype.static VariantTypecopy()Makes a copy of aGLib.VariantType.static VariantTypedictEntry(VariantType key, VariantType value) Constructs the type corresponding to a dictionary entry with a key of typekeyand a value of typevalue.Returns a newly-allocated copy of the type string corresponding totype.element()Determines the element type of an array or ‘maybe’ type.booleanequal(VariantType type2) Compares this VariantType andtype2for equality.@Nullable VariantTypefirst()Determines the first item type of a tuple or dictionary entry type.voidfree()Frees aGLib.VariantTypethat was allocated withcopy(),VariantType(java.lang.String)or one of the container type constructor functions.longReturns the length of the type string corresponding to the giventype.static @Nullable TypegetType()Get the GType of the VariantType classinthash()Hashestype.booleanisArray()Determines if the given this VariantType is an array type.booleanisBasic()Determines if the given this VariantType is a basic type.booleanDetermines if the given this VariantType is a container type.booleanDetermines if the given this VariantType is definite (ie: not indefinite).booleanDetermines if the given this VariantType is a dictionary entry type.booleanisMaybe()Determines if the given this VariantType is a ‘maybe’ type.booleanisSubtypeOf(VariantType supertype) Checks if this VariantType is a subtype ofsupertype.booleanisTuple()Determines if the given this VariantType is a tuple type.booleanDetermines if the given this VariantType is the variant type.key()Determines the key type of a dictionary entry type.static VariantTypemaybe(VariantType element) Constructs the type corresponding to a ‘maybe’ instance containing typetypeorNothing.@Nullable VariantTypenext()Determines the next item type of a tuple or dictionary entry type.longnItems()Determines the number of items contained in a tuple or dictionary entry type.Returns the type string corresponding to the giventype.static longstringGetDepth(String typeString) static booleanstringIsValid(String typeString) Checks iftypeStringis a valid GVariant type string.static booleanstringScan(String string, @Nullable String limit, @Nullable Out<String> endptr) Scan for a single complete and valid GVariant type string instring.toString()Returns a string representation of the object.static VariantTypetuple(@Nullable VariantType @Nullable [] items) Constructs a new tuple type, fromitems.value()Determines the value type of a dictionary entry type.Methods inherited from class org.javagi.base.ProxyInstance
equals, handle, hashCode
-
Constructor Details
-
VariantType
Create a VariantType proxy instance for the provided memory address.- Parameters:
address- the memory address of the native object
-
VariantType
Creates a newGLib.VariantTypecorresponding to the type string given bytypeString.It is appropriate to call
free()on the return value.It is a programmer error to call this function with an invalid type string. Use
stringIsValid(java.lang.String)if you are unsure.- Parameters:
typeString- a valid GVariant type string- Since:
- 2.24
-
-
Method Details
-
getType
-
array
Constructs the type corresponding to an array of elements of the typetype.It is appropriate to call
first()on the return value.- Parameters:
element- an element type- Returns:
- a new array type Since 2.24
-
dictEntry
Constructs the type corresponding to a dictionary entry with a key of typekeyand a value of typevalue.It is appropriate to call
free()on the return value.- Parameters:
key- a basic type to use for the keyvalue- a type to use for the value- Returns:
- a new dictionary entry type Since 2.24
-
maybe
Constructs the type corresponding to a ‘maybe’ instance containing typetypeorNothing.It is appropriate to call
free()on the return value.- Parameters:
element- an element type- Returns:
- a new ‘maybe’ type Since 2.24
-
tuple
Constructs a new tuple type, fromitems.lengthis the number of items initems,or-1to indicate thatitemsisNULL-terminated.It is appropriate to call
free()on the return value.- Parameters:
items- an array of types, one for each item- Returns:
- a new tuple type Since 2.24
-
checked
-
stringGetDepth
-
stringIsValid
Checks iftypeStringis a valid GVariant type string.This call is equivalent to calling
stringScan(java.lang.String, java.lang.String, org.javagi.base.Out<java.lang.String>)and confirming that the following character is a nul terminator.- Parameters:
typeString- a pointer to any string- Returns:
- true if
typeStringis exactly one valid type string Since 2.24
-
stringScan
public static boolean stringScan(String string, @Nullable String limit, @Nullable Out<String> endptr) Scan for a single complete and valid GVariant type string instring.The memory pointed to by
limit(or bytes beyond it) is never accessed.If a valid type string is found,
endptris updated to point to the first character past the end of the string that was found andtrueis returned.If there is no valid type string starting at
string,or if the type string does not end beforelimitthenfalseis returned.For the simple case of checking if a string is a valid type string, see
stringIsValid(java.lang.String).- Parameters:
string- a pointer to any stringlimit- the end ofstringendptr- location to store the end pointer- Returns:
- true if a valid type string was found
- Since:
- 2.24
-
copy
Makes a copy of aGLib.VariantType.It is appropriate to call
free()on the return value. this VariantType may not beNULL.- Returns:
- a new
GLib.VariantTypeSince 2.24
-
dupString
Returns a newly-allocated copy of the type string corresponding totype.The returned string is nul-terminated. It is appropriate to call
GLib.free(java.lang.foreign.MemorySegment)on the return value.- Returns:
- the corresponding type string Since 2.24
-
element
Determines the element type of an array or ‘maybe’ type.This function may only be used with array or ‘maybe’ types.
- Returns:
- the element type of this VariantType Since 2.24
-
equal
Compares this VariantType andtype2for equality.Only returns true if the types are exactly equal. Even if one type is an indefinite type and the other is a subtype of it, false will be returned if they are not exactly equal. If you want to check for subtypes, use
isSubtypeOf(org.gnome.glib.VariantType).The argument types of this VariantType and
type2are onlygconstpointerto allow use withGLib.HashTablewithout function pointer casting. For both arguments, a validGLib.VariantTypemust be provided.- Parameters:
type2- another type to compare- Returns:
- true if this VariantType and
type2are exactly equal Since 2.24
-
first
Determines the first item type of a tuple or dictionary entry type.This function may only be used with tuple or dictionary entry types, but must not be used with the generic tuple type
G_VARIANT_TYPE_TUPLE.In the case of a dictionary entry type, this returns the type of the key.
NULLis returned in case of this VariantType beingG_VARIANT_TYPE_UNIT.This call, together with
next()provides an iterator interface over tuple and dictionary entry types.- Returns:
- the first item type of
type,orNULLif the type has no item types Since 2.24
-
free
public void free()Frees aGLib.VariantTypethat was allocated withcopy(),VariantType(java.lang.String)or one of the container type constructor functions.In the case that this VariantType is
NULL, this function does nothing.Since 2.24
-
getStringLength
public long getStringLength()Returns the length of the type string corresponding to the giventype.This function must be used to determine the valid extent of the memory region returned by
peekString().- Returns:
- the length of the corresponding type string Since 2.24
-
hash
public int hash()Hashestype.The argument type of this VariantType is only
gconstpointerto allow use withGLib.HashTablewithout function pointer casting. A validGLib.VariantTypemust be provided.- Returns:
- the hash value Since 2.24
-
isArray
public boolean isArray()Determines if the given this VariantType is an array type.This is true if the type string for this VariantType starts with an
a.This function returns true for any indefinite type for which every definite subtype is an array type —
G_VARIANT_TYPE_ARRAY, for example.- Returns:
- true if this VariantType is an array type Since 2.24
-
isBasic
public boolean isBasic()Determines if the given this VariantType is a basic type.Basic types are booleans, bytes, integers, doubles, strings, object paths and signatures.
Only a basic type may be used as the key of a dictionary entry.
This function returns
FALSEfor all indefinite types exceptG_VARIANT_TYPE_BASIC.- Returns:
- true if this VariantType is a basic type Since 2.24
-
isContainer
public boolean isContainer()Determines if the given this VariantType is a container type.Container types are any array, maybe, tuple, or dictionary entry types plus the variant type.
This function returns true for any indefinite type for which every definite subtype is a container —
G_VARIANT_TYPE_ARRAY, for example.- Returns:
- true if this VariantType is a container type Since 2.24
-
isDefinite
public boolean isDefinite()Determines if the given this VariantType is definite (ie: not indefinite).A type is definite if its type string does not contain any indefinite type characters (
*,?, orr).A
GLib.Variantinstance may not have an indefinite type, so calling this function on the result ofVariant#getTypewill always result in true being returned. Calling this function on an indefinite type likeG_VARIANT_TYPE_ARRAY, however, will result inFALSEbeing returned.- Returns:
- true if this VariantType is definite Since 2.24
-
isDictEntry
public boolean isDictEntry()Determines if the given this VariantType is a dictionary entry type.This is true if the type string for this VariantType starts with a
{.This function returns true for any indefinite type for which every definite subtype is a dictionary entry type —
G_VARIANT_TYPE_DICT_ENTRY, for example.- Returns:
- true if this VariantType is a dictionary entry type Since 2.24
-
isMaybe
public boolean isMaybe()Determines if the given this VariantType is a ‘maybe’ type.This is true if the type string for this VariantType starts with an
m.This function returns true for any indefinite type for which every definite subtype is a ‘maybe’ type —
G_VARIANT_TYPE_MAYBE, for example.- Returns:
- true if this VariantType is a ‘maybe’ type Since 2.24
-
isSubtypeOf
Checks if this VariantType is a subtype ofsupertype.This function returns true if this VariantType is a subtype of
supertype.All types are considered to be subtypes of themselves. Aside from that, only indefinite types can have subtypes.- Parameters:
supertype- type of potential supertype- Returns:
- true if this VariantType is a subtype of
supertypeSince 2.24
-
isTuple
public boolean isTuple()Determines if the given this VariantType is a tuple type.This is true if the type string for this VariantType starts with a
(or if this VariantType isG_VARIANT_TYPE_TUPLE.This function returns true for any indefinite type for which every definite subtype is a tuple type —
G_VARIANT_TYPE_TUPLE, for example.- Returns:
- true if this VariantType is a tuple type Since 2.24
-
isVariant
public boolean isVariant()Determines if the given this VariantType is the variant type.- Returns:
- true if this VariantType is the variant type Since 2.24
-
key
Determines the key type of a dictionary entry type.This function may only be used with a dictionary entry type. Other than the additional restriction, this call is equivalent to
first().- Returns:
- the key type of the dictionary entry Since 2.24
-
nItems
public long nItems()Determines the number of items contained in a tuple or dictionary entry type.This function may only be used with tuple or dictionary entry types, but must not be used with the generic tuple type
G_VARIANT_TYPE_TUPLE.In the case of a dictionary entry type, this function will always return
2.- Returns:
- the number of items in this VariantType Since 2.24
-
next
Determines the next item type of a tuple or dictionary entry type.this VariantType must be the result of a previous call to
first()ornext().If called on the key type of a dictionary entry then this call returns the value type. If called on the value type of a dictionary entry then this call returns
NULL.For tuples,
NULLis returned when this VariantType is the last item in the tuple.- Returns:
- the next type after
type,orNULLif there are no further types Since 2.24
-
peekString
Returns the type string corresponding to the giventype.The result is not nul-terminated; in order to determine its length you must call
getStringLength().To get a nul-terminated string, see
dupString().- Returns:
- the corresponding type string (not nul-terminated) Since 2.24
-
value
Determines the value type of a dictionary entry type.This function may only be used with a dictionary entry type.
- Returns:
- the value type of the dictionary entry Since 2.24
-
toString
-