1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT
use glib::{prelude::*, translate::*};
use std::fmt;
glib::wrapper! {
/// A [`SocketControlMessage`][crate::SocketControlMessage] is a special-purpose utility message that
/// can be sent to or received from a [`Socket`][crate::Socket]. These types of
/// messages are often called "ancillary data".
///
/// The message can represent some sort of special instruction to or
/// information from the socket or can represent a special kind of
/// transfer to the peer (for example, sending a file descriptor over
/// a UNIX socket).
///
/// These messages are sent with [`SocketExtManual::send_message()`][crate::prelude::SocketExtManual::send_message()] and received
/// with [`SocketExtManual::receive_message()`][crate::prelude::SocketExtManual::receive_message()].
///
/// To extend the set of control message that can be sent, subclass this
/// class and override the get_size, get_level, get_type and serialize
/// methods.
///
/// To extend the set of control messages that can be received, subclass
/// this class and implement the deserialize method. Also, make sure your
/// class is registered with the GType typesystem before calling
/// [`SocketExtManual::receive_message()`][crate::prelude::SocketExtManual::receive_message()] to read such a message.
///
/// This is an Abstract Base Class, you cannot instantiate it.
///
/// # Implements
///
/// [`SocketControlMessageExt`][trait@crate::prelude::SocketControlMessageExt], [`trait@glib::ObjectExt`], [`SocketControlMessageExtManual`][trait@crate::prelude::SocketControlMessageExtManual]
#[doc(alias = "GSocketControlMessage")]
pub struct SocketControlMessage(Object<ffi::GSocketControlMessage, ffi::GSocketControlMessageClass>);
match fn {
type_ => || ffi::g_socket_control_message_get_type(),
}
}
impl SocketControlMessage {
pub const NONE: Option<&'static SocketControlMessage> = None;
/// Tries to deserialize a socket control message of a given
/// `level` and `type_`. This will ask all known (to GType) subclasses
/// of [`SocketControlMessage`][crate::SocketControlMessage] if they can understand this kind
/// of message and if so deserialize it into a [`SocketControlMessage`][crate::SocketControlMessage].
///
/// If there is no implementation for this kind of control message, [`None`]
/// will be returned.
/// ## `level`
/// a socket level
/// ## `type_`
/// a socket control message type for the given `level`
///
/// # Returns
///
/// the deserialized message or [`None`]
#[doc(alias = "g_socket_control_message_deserialize")]
pub fn deserialize(level: i32, type_: i32, data: &[u8]) -> Option<SocketControlMessage> {
let size = data.len() as _;
unsafe {
from_glib_full(ffi::g_socket_control_message_deserialize(
level,
type_,
size,
data.to_glib_none().0 as glib::ffi::gpointer,
))
}
}
}
/// Trait containing all [`struct@SocketControlMessage`] methods.
///
/// # Implementors
///
/// [`SocketControlMessage`][struct@crate::SocketControlMessage], [`UnixCredentialsMessage`][struct@crate::UnixCredentialsMessage], [`UnixFDMessage`][struct@crate::UnixFDMessage]
pub trait SocketControlMessageExt: 'static {
/// Returns the "level" (i.e. the originating protocol) of the control message.
/// This is often SOL_SOCKET.
///
/// # Returns
///
/// an integer describing the level
#[doc(alias = "g_socket_control_message_get_level")]
#[doc(alias = "get_level")]
fn level(&self) -> i32;
/// Returns the protocol specific type of the control message.
/// For instance, for UNIX fd passing this would be SCM_RIGHTS.
///
/// # Returns
///
/// an integer describing the type of control message
#[doc(alias = "g_socket_control_message_get_msg_type")]
#[doc(alias = "get_msg_type")]
fn msg_type(&self) -> i32;
/// Returns the space required for the control message, not including
/// headers or alignment.
///
/// # Returns
///
/// The number of bytes required.
#[doc(alias = "g_socket_control_message_get_size")]
#[doc(alias = "get_size")]
fn size(&self) -> usize;
}
impl<O: IsA<SocketControlMessage>> SocketControlMessageExt for O {
fn level(&self) -> i32 {
unsafe { ffi::g_socket_control_message_get_level(self.as_ref().to_glib_none().0) }
}
fn msg_type(&self) -> i32 {
unsafe { ffi::g_socket_control_message_get_msg_type(self.as_ref().to_glib_none().0) }
}
fn size(&self) -> usize {
unsafe { ffi::g_socket_control_message_get_size(self.as_ref().to_glib_none().0) }
}
}
impl fmt::Display for SocketControlMessage {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("SocketControlMessage")
}
}