Package org.freedesktop.dbus.messages
Class Message
- java.lang.Object
-
- org.freedesktop.dbus.messages.Message
-
- Direct Known Subclasses:
DBusSignal,Error,MethodBase
public class Message extends java.lang.ObjectSuperclass of all messages which are sent over the Bus. This class deals with all the marshalling to/from the wire format.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceMessage.ArgumentTypeDefines constants for each argument type.static interfaceMessage.EndianDefines constants representing the endianness of the message.(package private) static interfaceMessage.ExtractMethodInterface defining a method to extract a specific data type.static interfaceMessage.FlagsDefines constants representing the flags which can be set on a message.static interfaceMessage.HeaderFieldDefines constants for each valid header field type.static interfaceMessage.MessageTypeDefines constants for each message type.
-
Field Summary
Fields Modifier and Type Field Description private java.lang.Object[]argsprivate booleanbigprivate byte[]bodyprivate longbodylenprivate static intBUFFERINCREMENTSteps to increment the buffer array.private intbufferuseprivate longbytecounterprivate java.util.List<FileDescriptor>filedescriptorsprivate byteflagsprivate static java.util.concurrent.atomic.AtomicLongGLOBAL_SERIALprivate java.lang.Object[]headersprotected org.slf4j.Loggerloggerstatic intMAXIMUM_ARRAY_LENGTHstatic intMAXIMUM_MESSAGE_LENGTHstatic intMAXIMUM_NUM_UNIX_FDSprivate static intOFFSET_DATAPosition of data offset in int array.private static intOFFSET_SIGPosition of signature offset in int array.private byte[]pabufprivate static byte[][]paddingKeep a static reference to each size of padding array to prevent allocation.private intpaofsprivate intpreallocatedstatic bytePROTOCOLThe current protocol major version.private byteprotoverprivate longserialprivate bytetypeprivate byte[][]wiredata
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description intalign(int _current, byte _type)Align a counter to the given type.voidappend(java.lang.String _sig, java.lang.Object... _data)Append a series of values to the message.protected voidappendByte(byte _b)Appends a byte to the buffer list.protected voidappendBytes(byte[] _buf)Appends a buffer to the buffer list.voidappendint(long _l, int _width)Marshalls an integer of a given width and appends it to the message.private intappendOne(byte[] _sigb, int _sigofs, java.lang.Object _data)Appends a value to the message.protected java.lang.Object[]createHeaderArgs(byte _header, java.lang.String _argType, java.lang.Object _value)Creates a message header.static longdemarshallint(byte[] _buf, int _ofs, byte _endian, int _width)Demarshalls an integer of a given width from a buffer.longdemarshallint(byte[] _buf, int _ofs, int _width)Demarshalls an integer of a given width from a buffer.static longdemarshallintBig(byte[] _buf, int _ofs, int _width)Demarshalls an integer of a given width from a buffer using big-endian format.static longdemarshallintLittle(byte[] _buf, int _ofs, int _width)Demarshalls an integer of a given width from a buffer using little-endian format.(package private) java.lang.StringdumpWireData()Dumps the current content ofwiredatato String.private voidensureBuffers(int _num)Ensures there are enough free buffers.java.lang.Object[]extract(java.lang.String _signature, byte[] _dataBuf, int _offsets)Demarshall values from a buffer.java.lang.Object[]extract(java.lang.String _signature, byte[] _dataBuf, int[] _offsets)Demarshall values from a buffer.(package private) java.lang.Object[]extract(java.lang.String _signature, byte[] _dataBuf, int[] _offsets, Message.ExtractMethod _method)private java.lang.ObjectextractArray(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, boolean _contained, Message.ExtractMethod _extractMethod)Extracts an array from the data received on bus.private java.lang.ObjectextractByte(byte[] _dataBuf, int[] _offsets)Extracts a byte from the data received on bus.(package private) java.lang.Object[]extractHeader(byte[] _headers)Extracts the header information from the given byte array.private java.lang.ObjectextractOne(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, boolean _contained)Demarshall one value from a buffer.private java.lang.ObjectextractStruct(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, Message.ExtractMethod _extractMethod)Extracts a struct from the data received on bus.private java.lang.ObjectextractVariant(byte[] _dataBuf, int[] _offsets, java.util.function.BiFunction<java.lang.String,java.lang.Object,java.lang.Object> _variantFactory)Extracts aVariantfrom the data received on bus.static intgetAlignment(byte _type)Return the alignment for a given type.(package private) longgetBodylen()protected longgetByteCounter()java.lang.StringgetDestination()Returns the destination of the message.bytegetEndianess()java.util.List<FileDescriptor>getFiledescriptors()intgetFlags()Returns the message flags.protected java.lang.Object[]getHeader()java.lang.ObjectgetHeader(byte _type)Returns the value of the header field of a given field.static java.lang.StringgetHeaderFieldName(byte _field)Returns the name of the given header field.protected java.util.Map<java.lang.Byte,java.lang.Object>getHeaders()Deprecated, for removal: This API element is subject to removal in a future version.use getHeader().java.lang.StringgetInterface()Returns the interface of the message.java.lang.StringgetName()Returns the member name or error name this message represents.java.lang.Object[]getParameters()Parses and returns the parameters to this message as an Object array.java.lang.StringgetPath()Returns the object path of the message.(package private) bytegetProtover()longgetReplySerial()If this is a reply to a message, this returns its serial.longgetSerial()Returns the message serial ID (unique for this connection)java.lang.StringgetSig()Returns the dbus signature of the parameters.java.lang.StringgetSource()Returns the Bus ID that sent the message.bytegetType()Type of this message.protected byte[][]getWiredata()byte[][]getWireData()voidmarshallint(long _l, byte[] _buf, int _ofs, int _width)Marshalls an integer of a given width into a buffer.static voidmarshallintBig(long _l, byte[] _buf, int _ofs, int _width)Marshalls an integer of a given width into a buffer using big-endian format.static voidmarshallintLittle(long _l, byte[] _buf, int _ofs, int _width)Marshalls an integer of a given width into a buffer using little-endian format.private java.lang.ObjectoptimizePrimitives(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, long _size, byte _algn, int _length, Message.ExtractMethod _extractMethod)Will create primitive arrays when an array is read.voidpad(byte _type)Pad the message to the proper alignment for the given type.protected voidpadAndMarshall(java.util.List<java.lang.Object> _hargs, long _serial, java.lang.String _sig, java.lang.Object... _args)Adds message padding and marshalling.(package private) voidpopulate(byte[] _msg, byte[] _headers, byte[] _body, java.util.List<FileDescriptor> _descriptors)Create a message from wire-format data.private voidpreallocate(int _num)Create a buffer of num bytes.private intprepareCollection(byte[] _signatureBuf, int[] _offsets, long _size)private java.lang.ObjectreadHeaderVariants(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, boolean _contained)Special lightweight version to read the variant objects in DBus message header.voidsetArgs(java.lang.Object[] _args)protected voidsetByteCounter(long _bytecounter)protected voidsetHeader(java.lang.Object[] _header)Set header content.protected voidsetSerial(long _serial)voidsetSource(java.lang.String _source)Warning, do not use this method unless you really know what you are doing.protected voidsetWiredata(byte[][] _wiredata)java.lang.StringtoString()Formats the message in a human-readable format.
-
-
-
Field Detail
-
MAXIMUM_ARRAY_LENGTH
public static final int MAXIMUM_ARRAY_LENGTH
- See Also:
- Constant Field Values
-
MAXIMUM_MESSAGE_LENGTH
public static final int MAXIMUM_MESSAGE_LENGTH
- See Also:
- Constant Field Values
-
MAXIMUM_NUM_UNIX_FDS
public static final int MAXIMUM_NUM_UNIX_FDS
- See Also:
- Constant Field Values
-
PROTOCOL
public static final byte PROTOCOL
The current protocol major version.- See Also:
- Constant Field Values
-
OFFSET_DATA
private static final int OFFSET_DATA
Position of data offset in int array.- See Also:
- Constant Field Values
-
OFFSET_SIG
private static final int OFFSET_SIG
Position of signature offset in int array.- See Also:
- Constant Field Values
-
padding
private static byte[][] padding
Keep a static reference to each size of padding array to prevent allocation.
-
BUFFERINCREMENT
private static final int BUFFERINCREMENT
Steps to increment the buffer array.- See Also:
- Constant Field Values
-
GLOBAL_SERIAL
private static final java.util.concurrent.atomic.AtomicLong GLOBAL_SERIAL
-
logger
protected final org.slf4j.Logger logger
-
filedescriptors
private final java.util.List<FileDescriptor> filedescriptors
-
headers
private final java.lang.Object[] headers
-
wiredata
private byte[][] wiredata
-
bytecounter
private long bytecounter
-
serial
private long serial
-
type
private byte type
-
flags
private byte flags
-
protover
private byte protover
-
big
private boolean big
-
args
private java.lang.Object[] args
-
body
private byte[] body
-
bodylen
private long bodylen
-
preallocated
private int preallocated
-
paofs
private int paofs
-
pabuf
private byte[] pabuf
-
bufferuse
private int bufferuse
-
-
Constructor Detail
-
Message
protected Message(byte _endian, byte _type, byte _flags) throws DBusExceptionCreate a message; only to be called by sub-classes.- Parameters:
_endian- The endianness to create the message._type- The message type._flags- Any message flags.- Throws:
DBusException- on error
-
Message
protected Message()
Create a blank message. Only to be used when calling populate.
-
-
Method Detail
-
populate
void populate(byte[] _msg, byte[] _headers, byte[] _body, java.util.List<FileDescriptor> _descriptors) throws DBusExceptionCreate a message from wire-format data.- Parameters:
_msg- D-Bus serialized data of type yyyuu_headers- D-Bus serialized data of type a(yv)_body- D-Bus serialized data of the signature defined in headers.- Throws:
DBusException
-
getHeaders
@Deprecated(forRemoval=true, since="4.2.2 - 2023-01-19") protected java.util.Map<java.lang.Byte,java.lang.Object> getHeaders()Deprecated, for removal: This API element is subject to removal in a future version.use getHeader(). This method did return a map containing message header. It allows changing the map, but changes did not result in changing the actual message header. Therefore using a map was removed and an object array is used instead. Changes to that array (content) will be result in a changed header in the message.- Returns:
- map of header
-
getHeader
protected java.lang.Object[] getHeader()
-
setHeader
protected void setHeader(java.lang.Object[] _header)
Set header content.nullvalue is ignored.- Parameters:
_header- header to set
-
getByteCounter
protected long getByteCounter()
-
setByteCounter
protected void setByteCounter(long _bytecounter)
-
setSerial
protected void setSerial(long _serial)
-
getWiredata
protected byte[][] getWiredata()
-
setWiredata
protected void setWiredata(byte[][] _wiredata)
-
getProtover
byte getProtover()
-
getBodylen
long getBodylen()
-
preallocate
private void preallocate(int _num)
Create a buffer of num bytes. Data is copied to this rather than added to the buffer list.
-
ensureBuffers
private void ensureBuffers(int _num)
Ensures there are enough free buffers.- Parameters:
_num- number of free buffers to create.
-
appendBytes
protected void appendBytes(byte[] _buf)
Appends a buffer to the buffer list.- Parameters:
_buf- buffer byte array
-
appendByte
protected void appendByte(byte _b)
Appends a byte to the buffer list.- Parameters:
_b- byte
-
demarshallint
public long demarshallint(byte[] _buf, int _ofs, int _width)Demarshalls an integer of a given width from a buffer. Endianness is determined from the format of the message.- Parameters:
_buf- The buffer to demarshall from._ofs- The offset to demarshall from._width- The byte-width of the int.- Returns:
- long
-
demarshallint
public static long demarshallint(byte[] _buf, int _ofs, byte _endian, int _width)Demarshalls an integer of a given width from a buffer.- Parameters:
_buf- The buffer to demarshall from._ofs- The offset to demarshall from._endian- The endianness to use in demarshalling._width- The byte-width of the int.- Returns:
- long
-
demarshallintBig
public static long demarshallintBig(byte[] _buf, int _ofs, int _width)Demarshalls an integer of a given width from a buffer using big-endian format.- Parameters:
_buf- The buffer to demarshall from._ofs- The offset to demarshall from._width- The byte-width of the int.- Returns:
- long
-
demarshallintLittle
public static long demarshallintLittle(byte[] _buf, int _ofs, int _width)Demarshalls an integer of a given width from a buffer using little-endian format.- Parameters:
_buf- The buffer to demarshall from._ofs- The offset to demarshall from._width- The byte-width of the int.- Returns:
- long
-
appendint
public void appendint(long _l, int _width)Marshalls an integer of a given width and appends it to the message. Endianness is determined from the message.- Parameters:
_l- The integer to marshall._width- The byte-width of the int.
-
marshallint
public void marshallint(long _l, byte[] _buf, int _ofs, int _width)Marshalls an integer of a given width into a buffer. Endianness is determined from the message.- Parameters:
_l- The integer to marshall._buf- The buffer to marshall to._ofs- The offset to marshall to._width- The byte-width of the int.
-
marshallintBig
public static void marshallintBig(long _l, byte[] _buf, int _ofs, int _width)Marshalls an integer of a given width into a buffer using big-endian format.- Parameters:
_l- The integer to marshall._buf- The buffer to marshall to._ofs- The offset to marshall to._width- The byte-width of the int.
-
marshallintLittle
public static void marshallintLittle(long _l, byte[] _buf, int _ofs, int _width)Marshalls an integer of a given width into a buffer using little-endian format.- Parameters:
_l- The integer to marshall._buf- The buffer to demarshall to._ofs- The offset to demarshall to._width- The byte-width of the int.
-
getWireData
public byte[][] getWireData()
-
getFiledescriptors
public java.util.List<FileDescriptor> getFiledescriptors()
-
toString
public java.lang.String toString()
Formats the message in a human-readable format.- Overrides:
toStringin classjava.lang.Object
-
getHeader
public java.lang.Object getHeader(byte _type)
Returns the value of the header field of a given field.- Parameters:
_type- The field to return.- Returns:
- The value of the field or null if unset.
-
appendOne
private int appendOne(byte[] _sigb, int _sigofs, java.lang.Object _data) throws DBusExceptionAppends a value to the message. The type of the value is read from a D-Bus signature and used to marshall the value.- Parameters:
_sigb- A buffer of the D-Bus signature._sigofs- The offset into the signature corresponding to this value._data- The value to marshall.- Returns:
- The offset into the signature of the end of this value's type.
- Throws:
DBusException
-
pad
public void pad(byte _type)
Pad the message to the proper alignment for the given type.- Parameters:
_type- type
-
getAlignment
public static int getAlignment(byte _type)
Return the alignment for a given type.- Parameters:
_type- type- Returns:
- int
-
append
public void append(java.lang.String _sig, java.lang.Object... _data) throws DBusExceptionAppend a series of values to the message.- Parameters:
_sig- The signature(s) of the value(s)._data- The value(s).- Throws:
DBusException- on error
-
align
public int align(int _current, byte _type)Align a counter to the given type.- Parameters:
_current- The current counter._type- The type to align to.- Returns:
- The new, aligned, counter.
-
extractHeader
java.lang.Object[] extractHeader(byte[] _headers) throws DBusExceptionExtracts the header information from the given byte array.- Parameters:
_headers- D-Bus serialized data of type a(yv)- Returns:
- Object array containing header data
- Throws:
DBusException- when parsing fails
-
readHeaderVariants
private java.lang.Object readHeaderVariants(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, boolean _contained) throws DBusExceptionSpecial lightweight version to read the variant objects in DBus message header. This method will not createVariantobjects it directly extracts the Variant data content.- Parameters:
_signatureBuf- DBus signature string as byte array_dataBuf- buffer with header data_offsets- current offsets_contained- boolean to indicate if nested lists should be resolved (false usually)- Returns:
- Object
- Throws:
DBusException- when parsing fails
-
extractOne
private java.lang.Object extractOne(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, boolean _contained) throws DBusExceptionDemarshall one value from a buffer.- Parameters:
_signatureBuf- A buffer of the D-Bus signature._dataBuf- The buffer to demarshall from._offsets- An array of two ints, which holds the position of the current signature offset and the current offset of the data buffer._contained- converts nested arrays to Lists- Returns:
- The demarshalled value.
- Throws:
DBusException
-
extractByte
private java.lang.Object extractByte(byte[] _dataBuf, int[] _offsets)Extracts a byte from the data received on bus.- Parameters:
_dataBuf- buffer holding the byte_offsets- offset position in buffer (will be updated)- Returns:
- Object
-
extractStruct
private java.lang.Object extractStruct(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, Message.ExtractMethod _extractMethod) throws DBusExceptionExtracts a struct from the data received on bus.- Parameters:
_signatureBuf- signature (as byte array) defining the struct content_dataBuf- buffer containing the struct_offsets- offset position in buffer (will be updated)_extractMethod- method to be called for every entry contained of the struct- Returns:
- Object
- Throws:
DBusException- when parsing fails
-
extractArray
private java.lang.Object extractArray(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, boolean _contained, Message.ExtractMethod _extractMethod) throws MarshallingException, DBusExceptionExtracts an array from the data received on bus.- Parameters:
_signatureBuf- signature string (as byte array) of the content of the array_dataBuf- buffer containing the array to read_offsets- current offsets in the buffer (will be updated)_contained- resolve nested lists_extractMethod- method to be called for every entry contained in the array- Returns:
- Object
- Throws:
MarshallingException- when Array is too largeDBusException- when parsing fails
-
extractVariant
private java.lang.Object extractVariant(byte[] _dataBuf, int[] _offsets, java.util.function.BiFunction<java.lang.String,java.lang.Object,java.lang.Object> _variantFactory) throws DBusExceptionExtracts aVariantfrom the data received on bus.- Parameters:
_dataBuf- buffer containing the variant_offsets- current offsets in the buffer (will be updated)_variantFactory- method to create newVariantobjects (or other object types)- Returns:
- Object / Variant
- Throws:
DBusException- when parsing fails
-
optimizePrimitives
private java.lang.Object optimizePrimitives(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, long _size, byte _algn, int _length, Message.ExtractMethod _extractMethod) throws DBusExceptionWill create primitive arrays when an array is read.
In case the array is not compatible with primitives (e.g. object types are used or array contains Struct/Maps etc) an array of the appropriate type will be created.- Parameters:
_signatureBuf- signature string (as byte array) containing the type of array_dataBuf- buffer containing the array_offsets- current offset in buffer (will be updated)_size- size of a byte_algn- data offset padding width when reading primitives (except byte)_length- length of the array_extractMethod- method to be called for every entry contained in the array if not primitive array- Returns:
- Object array
- Throws:
DBusException- when parsing fails
-
prepareCollection
private int prepareCollection(byte[] _signatureBuf, int[] _offsets, long _size) throws DBusException- Throws:
DBusException
-
extract
public java.lang.Object[] extract(java.lang.String _signature, byte[] _dataBuf, int _offsets) throws DBusExceptionDemarshall values from a buffer.- Parameters:
_signature- The D-Bus signature(s) of the value(s)._dataBuf- The buffer to demarshall from._offsets- The offset into the data buffer to start.- Returns:
- The demarshalled value(s).
- Throws:
DBusException- on error
-
extract
public java.lang.Object[] extract(java.lang.String _signature, byte[] _dataBuf, int[] _offsets) throws DBusExceptionDemarshall values from a buffer.- Parameters:
_signature- The D-Bus signature(s) of the value(s)._dataBuf- The buffer to demarshall from._offsets- An array of two ints, which holds the position of the current signature offset and the current offset of the data buffer. These values will be updated to the start of the next value after demarshalling.- Returns:
- The demarshalled value(s).
- Throws:
DBusException- on error
-
extract
java.lang.Object[] extract(java.lang.String _signature, byte[] _dataBuf, int[] _offsets, Message.ExtractMethod _method) throws DBusException- Throws:
DBusException
-
getSource
public java.lang.String getSource()
Returns the Bus ID that sent the message.- Returns:
- string
-
getDestination
public java.lang.String getDestination()
Returns the destination of the message.- Returns:
- string
-
getInterface
public java.lang.String getInterface()
Returns the interface of the message.- Returns:
- string
-
getPath
public java.lang.String getPath()
Returns the object path of the message.- Returns:
- string
-
getName
public java.lang.String getName()
Returns the member name or error name this message represents.- Returns:
- string
-
getSig
public java.lang.String getSig()
Returns the dbus signature of the parameters.- Returns:
- string
-
getFlags
public int getFlags()
Returns the message flags.- Returns:
- int
-
getSerial
public long getSerial()
Returns the message serial ID (unique for this connection)- Returns:
- the message serial.
-
getReplySerial
public long getReplySerial()
If this is a reply to a message, this returns its serial.- Returns:
- The reply serial, or 0 if it is not a reply.
-
getParameters
public java.lang.Object[] getParameters() throws DBusExceptionParses and returns the parameters to this message as an Object array.- Returns:
- object array
- Throws:
DBusException- on failure
-
setArgs
public void setArgs(java.lang.Object[] _args)
-
setSource
public void setSource(java.lang.String _source) throws DBusExceptionWarning, do not use this method unless you really know what you are doing.- Parameters:
_source- string- Throws:
DBusException- on error
-
dumpWireData
java.lang.String dumpWireData()
Dumps the current content ofwiredatato String.- Returns:
- String, maybe empty
- Since:
- v4.2.2 - 2023-01-20
-
getType
public byte getType()
Type of this message.- Returns:
- byte
-
getEndianess
public byte getEndianess()
-
createHeaderArgs
protected java.lang.Object[] createHeaderArgs(byte _header, java.lang.String _argType, java.lang.Object _value)Creates a message header. Will automatically add the values to the current instances header map.- Parameters:
_header- header type (one ofMessage.HeaderField)_argType- argument type (one ofMessage.ArgumentType)_value- value- Returns:
- Object array
-
padAndMarshall
protected void padAndMarshall(java.util.List<java.lang.Object> _hargs, long _serial, java.lang.String _sig, java.lang.Object... _args) throws DBusExceptionAdds message padding and marshalling.- Parameters:
_hargs-_serial-_sig-_args-- Throws:
DBusException
-
getHeaderFieldName
public static java.lang.String getHeaderFieldName(byte _field)
Returns the name of the given header field.- Parameters:
_field- field- Returns:
- string
-
-