//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
#[cfg(feature = "objc2-core-foundation")]
use objc2_core_foundation::*;

use crate::*;

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nssocketnativehandle?language=objc)
pub type NSSocketNativeHandle = c_int;

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsportdidbecomeinvalidnotification?language=objc)
    #[cfg(all(feature = "NSNotification", feature = "NSString"))]
    pub static NSPortDidBecomeInvalidNotification: &'static NSNotificationName;
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsport?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSPort;
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCoding for NSPort {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCopying for NSPort {}
);

#[cfg(feature = "NSObject")]
unsafe impl CopyingHelper for NSPort {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for NSPort {}
);

impl NSPort {
    extern_methods!(
        #[unsafe(method(port))]
        #[unsafe(method_family = none)]
        pub fn port() -> Retained<NSPort>;

        #[unsafe(method(invalidate))]
        #[unsafe(method_family = none)]
        pub fn invalidate(&self);

        #[unsafe(method(isValid))]
        #[unsafe(method_family = none)]
        pub fn isValid(&self) -> bool;

        #[unsafe(method(setDelegate:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setDelegate(&self, an_object: Option<&ProtocolObject<dyn NSPortDelegate>>);

        #[unsafe(method(delegate))]
        #[unsafe(method_family = none)]
        pub fn delegate(&self) -> Option<Retained<ProtocolObject<dyn NSPortDelegate>>>;

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        /// # Safety
        ///
        /// `run_loop` possibly has additional threading requirements.
        #[unsafe(method(scheduleInRunLoop:forMode:))]
        #[unsafe(method_family = none)]
        pub unsafe fn scheduleInRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        /// # Safety
        ///
        /// `run_loop` possibly has additional threading requirements.
        #[unsafe(method(removeFromRunLoop:forMode:))]
        #[unsafe(method_family = none)]
        pub unsafe fn removeFromRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);

        #[unsafe(method(reservedSpaceLength))]
        #[unsafe(method_family = none)]
        pub fn reservedSpaceLength(&self) -> NSUInteger;

        #[cfg(all(feature = "NSArray", feature = "NSDate"))]
        /// # Safety
        ///
        /// `components` generic should be of the correct type.
        #[unsafe(method(sendBeforeDate:components:from:reserved:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sendBeforeDate_components_from_reserved(
            &self,
            limit_date: &NSDate,
            components: Option<&NSMutableArray>,
            receive_port: Option<&NSPort>,
            header_space_reserved: NSUInteger,
        ) -> bool;

        #[cfg(all(feature = "NSArray", feature = "NSDate"))]
        /// # Safety
        ///
        /// `components` generic should be of the correct type.
        #[unsafe(method(sendBeforeDate:msgid:components:from:reserved:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sendBeforeDate_msgid_components_from_reserved(
            &self,
            limit_date: &NSDate,
            msg_id: NSUInteger,
            components: Option<&NSMutableArray>,
            receive_port: Option<&NSPort>,
            header_space_reserved: NSUInteger,
        ) -> bool;

        #[cfg(all(
            feature = "NSConnection",
            feature = "NSObjCRuntime",
            feature = "NSRunLoop",
            feature = "NSString"
        ))]
        /// # Safety
        ///
        /// `run_loop` possibly has additional threading requirements.
        #[deprecated = "Use NSXPCConnection instead"]
        #[unsafe(method(addConnection:toRunLoop:forMode:))]
        #[unsafe(method_family = none)]
        pub unsafe fn addConnection_toRunLoop_forMode(
            &self,
            conn: &NSConnection,
            run_loop: &NSRunLoop,
            mode: &NSRunLoopMode,
        );

        #[cfg(all(
            feature = "NSConnection",
            feature = "NSObjCRuntime",
            feature = "NSRunLoop",
            feature = "NSString"
        ))]
        /// # Safety
        ///
        /// `run_loop` possibly has additional threading requirements.
        #[deprecated = "Use NSXPCConnection instead"]
        #[unsafe(method(removeConnection:fromRunLoop:forMode:))]
        #[unsafe(method_family = none)]
        pub unsafe fn removeConnection_fromRunLoop_forMode(
            &self,
            conn: &NSConnection,
            run_loop: &NSRunLoop,
            mode: &NSRunLoopMode,
        );
    );
}

/// Methods declared on superclass `NSObject`.
impl NSPort {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl DefaultRetained for NSPort {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}

extern_protocol!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsportdelegate?language=objc)
    pub unsafe trait NSPortDelegate: NSObjectProtocol {
        #[cfg(feature = "NSPortMessage")]
        #[optional]
        #[unsafe(method(handlePortMessage:))]
        #[unsafe(method_family = none)]
        fn handlePortMessage(&self, message: &NSPortMessage);
    }
);

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsmachportoptions?language=objc)
// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSMachPortOptions(pub NSUInteger);
bitflags::bitflags! {
    impl NSMachPortOptions: NSUInteger {
        #[doc(alias = "NSMachPortDeallocateNone")]
        const DeallocateNone = 0;
        #[doc(alias = "NSMachPortDeallocateSendRight")]
        const DeallocateSendRight = 1<<0;
        #[doc(alias = "NSMachPortDeallocateReceiveRight")]
        const DeallocateReceiveRight = 1<<1;
    }
}

unsafe impl Encode for NSMachPortOptions {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

unsafe impl RefEncode for NSMachPortOptions {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsmachport?language=objc)
    #[unsafe(super(NSPort, NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSMachPort;
);

#[cfg(feature = "objc2-core-foundation")]
impl AsRef<NSMachPort> for CFMachPort {
    #[inline]
    fn as_ref(&self) -> &NSMachPort {
        unsafe { &*((self as *const Self).cast()) }
    }
}

#[cfg(feature = "objc2-core-foundation")]
impl AsRef<CFMachPort> for NSMachPort {
    #[inline]
    fn as_ref(&self) -> &CFMachPort {
        unsafe { &*((self as *const Self).cast()) }
    }
}

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCoding for NSMachPort {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCopying for NSMachPort {}
);

#[cfg(feature = "NSObject")]
unsafe impl CopyingHelper for NSMachPort {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for NSMachPort {}
);

impl NSMachPort {
    extern_methods!(
        #[unsafe(method(portWithMachPort:))]
        #[unsafe(method_family = none)]
        pub fn portWithMachPort(mach_port: u32) -> Retained<NSPort>;

        #[unsafe(method(initWithMachPort:))]
        #[unsafe(method_family = init)]
        pub fn initWithMachPort(this: Allocated<Self>, mach_port: u32) -> Retained<Self>;

        #[unsafe(method(setDelegate:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setDelegate(
            &self,
            an_object: Option<&ProtocolObject<dyn NSMachPortDelegate>>,
        );

        #[unsafe(method(delegate))]
        #[unsafe(method_family = none)]
        pub fn delegate(&self) -> Option<Retained<ProtocolObject<dyn NSMachPortDelegate>>>;

        #[unsafe(method(portWithMachPort:options:))]
        #[unsafe(method_family = none)]
        pub fn portWithMachPort_options(mach_port: u32, f: NSMachPortOptions) -> Retained<NSPort>;

        #[unsafe(method(initWithMachPort:options:))]
        #[unsafe(method_family = init)]
        pub fn initWithMachPort_options(
            this: Allocated<Self>,
            mach_port: u32,
            f: NSMachPortOptions,
        ) -> Retained<Self>;

        #[unsafe(method(machPort))]
        #[unsafe(method_family = none)]
        pub fn machPort(&self) -> u32;

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        /// # Safety
        ///
        /// `run_loop` possibly has additional threading requirements.
        #[unsafe(method(scheduleInRunLoop:forMode:))]
        #[unsafe(method_family = none)]
        pub unsafe fn scheduleInRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        /// # Safety
        ///
        /// `run_loop` possibly has additional threading requirements.
        #[unsafe(method(removeFromRunLoop:forMode:))]
        #[unsafe(method_family = none)]
        pub unsafe fn removeFromRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);
    );
}

/// Methods declared on superclass `NSObject`.
impl NSMachPort {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl DefaultRetained for NSMachPort {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}

extern_protocol!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsmachportdelegate?language=objc)
    pub unsafe trait NSMachPortDelegate: NSPortDelegate {
        /// # Safety
        ///
        /// `msg` must be a valid pointer.
        #[optional]
        #[unsafe(method(handleMachMessage:))]
        #[unsafe(method_family = none)]
        unsafe fn handleMachMessage(&self, msg: NonNull<c_void>);
    }
);

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsmessageport?language=objc)
    #[unsafe(super(NSPort, NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSMessagePort;
);

#[cfg(feature = "objc2-core-foundation")]
impl AsRef<NSMessagePort> for CFMessagePort {
    #[inline]
    fn as_ref(&self) -> &NSMessagePort {
        unsafe { &*((self as *const Self).cast()) }
    }
}

#[cfg(feature = "objc2-core-foundation")]
impl AsRef<CFMessagePort> for NSMessagePort {
    #[inline]
    fn as_ref(&self) -> &CFMessagePort {
        unsafe { &*((self as *const Self).cast()) }
    }
}

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCoding for NSMessagePort {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCopying for NSMessagePort {}
);

#[cfg(feature = "NSObject")]
unsafe impl CopyingHelper for NSMessagePort {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for NSMessagePort {}
);

impl NSMessagePort {
    extern_methods!();
}

/// Methods declared on superclass `NSObject`.
impl NSMessagePort {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl DefaultRetained for NSMessagePort {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nssocketport?language=objc)
    #[unsafe(super(NSPort, NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSSocketPort;
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCoding for NSSocketPort {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCopying for NSSocketPort {}
);

#[cfg(feature = "NSObject")]
unsafe impl CopyingHelper for NSSocketPort {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for NSSocketPort {}
);

impl NSSocketPort {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(initWithTCPPort:))]
        #[unsafe(method_family = init)]
        pub fn initWithTCPPort(this: Allocated<Self>, port: c_ushort) -> Option<Retained<Self>>;

        #[cfg(feature = "NSData")]
        #[unsafe(method(initWithProtocolFamily:socketType:protocol:address:))]
        #[unsafe(method_family = init)]
        pub fn initWithProtocolFamily_socketType_protocol_address(
            this: Allocated<Self>,
            family: c_int,
            r#type: c_int,
            protocol: c_int,
            address: &NSData,
        ) -> Option<Retained<Self>>;

        #[unsafe(method(initWithProtocolFamily:socketType:protocol:socket:))]
        #[unsafe(method_family = init)]
        pub fn initWithProtocolFamily_socketType_protocol_socket(
            this: Allocated<Self>,
            family: c_int,
            r#type: c_int,
            protocol: c_int,
            sock: NSSocketNativeHandle,
        ) -> Option<Retained<Self>>;

        #[cfg(feature = "NSString")]
        #[unsafe(method(initRemoteWithTCPPort:host:))]
        #[unsafe(method_family = init)]
        pub fn initRemoteWithTCPPort_host(
            this: Allocated<Self>,
            port: c_ushort,
            host_name: Option<&NSString>,
        ) -> Option<Retained<Self>>;

        #[cfg(feature = "NSData")]
        #[unsafe(method(initRemoteWithProtocolFamily:socketType:protocol:address:))]
        #[unsafe(method_family = init)]
        pub fn initRemoteWithProtocolFamily_socketType_protocol_address(
            this: Allocated<Self>,
            family: c_int,
            r#type: c_int,
            protocol: c_int,
            address: &NSData,
        ) -> Retained<Self>;

        #[unsafe(method(protocolFamily))]
        #[unsafe(method_family = none)]
        pub fn protocolFamily(&self) -> c_int;

        #[unsafe(method(socketType))]
        #[unsafe(method_family = none)]
        pub fn socketType(&self) -> c_int;

        #[unsafe(method(protocol))]
        #[unsafe(method_family = none)]
        pub fn protocol(&self) -> c_int;

        #[cfg(feature = "NSData")]
        #[unsafe(method(address))]
        #[unsafe(method_family = none)]
        pub fn address(&self) -> Retained<NSData>;

        #[unsafe(method(socket))]
        #[unsafe(method_family = none)]
        pub fn socket(&self) -> NSSocketNativeHandle;
    );
}

/// Methods declared on superclass `NSObject`.
impl NSSocketPort {
    extern_methods!(
        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl DefaultRetained for NSSocketPort {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}
