//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;

use crate::*;

pub type NSSocketNativeHandle = c_int;

extern "C" {
    #[cfg(all(feature = "NSNotification", feature = "NSString"))]
    pub static NSPortDidBecomeInvalidNotification: &'static NSNotificationName;
}

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSPort;

    unsafe impl ClassType for NSPort {
        type Super = NSObject;
        type Mutability = InteriorMutable;
    }
);

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

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

unsafe impl NSObjectProtocol for NSPort {}

extern_methods!(
    unsafe impl NSPort {
        #[method_id(@__retain_semantics Other port)]
        pub unsafe fn port() -> Retained<NSPort>;

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

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

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

        #[method_id(@__retain_semantics Other delegate)]
        pub unsafe fn delegate(&self) -> Option<Retained<ProtocolObject<dyn NSPortDelegate>>>;

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        #[method(scheduleInRunLoop:forMode:)]
        pub unsafe fn scheduleInRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        #[method(removeFromRunLoop:forMode:)]
        pub unsafe fn removeFromRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);

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

        #[cfg(all(feature = "NSArray", feature = "NSDate"))]
        #[method(sendBeforeDate:components:from:reserved:)]
        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"))]
        #[method(sendBeforeDate:msgid:components:from:reserved:)]
        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"
        ))]
        #[deprecated = "Use NSXPCConnection instead"]
        #[method(addConnection:toRunLoop:forMode:)]
        pub unsafe fn addConnection_toRunLoop_forMode(
            &self,
            conn: &NSConnection,
            run_loop: &NSRunLoop,
            mode: &NSRunLoopMode,
        );

        #[cfg(all(
            feature = "NSConnection",
            feature = "NSObjCRuntime",
            feature = "NSRunLoop",
            feature = "NSString"
        ))]
        #[deprecated = "Use NSXPCConnection instead"]
        #[method(removeConnection:fromRunLoop:forMode:)]
        pub unsafe fn removeConnection_fromRunLoop_forMode(
            &self,
            conn: &NSConnection,
            run_loop: &NSRunLoop,
            mode: &NSRunLoopMode,
        );
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSPort {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Retained<Self>;
    }
);

extern_protocol!(
    pub unsafe trait NSPortDelegate: NSObjectProtocol {
        #[cfg(feature = "NSPortMessage")]
        #[optional]
        #[method(handlePortMessage:)]
        unsafe fn handlePortMessage(&self, message: &NSPortMessage);
    }

    unsafe impl ProtocolType for dyn NSPortDelegate {}
);

// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSMachPortOptions(pub NSUInteger);
bitflags::bitflags! {
    impl NSMachPortOptions: NSUInteger {
        const NSMachPortDeallocateNone = 0;
        const NSMachPortDeallocateSendRight = 1<<0;
        const NSMachPortDeallocateReceiveRight = 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!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSMachPort;

    unsafe impl ClassType for NSMachPort {
        #[inherits(NSObject)]
        type Super = NSPort;
        type Mutability = InteriorMutable;
    }
);

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

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

unsafe impl NSObjectProtocol for NSMachPort {}

extern_methods!(
    unsafe impl NSMachPort {
        #[method_id(@__retain_semantics Other portWithMachPort:)]
        pub unsafe fn portWithMachPort(mach_port: u32) -> Retained<NSPort>;

        #[method_id(@__retain_semantics Init initWithMachPort:)]
        pub unsafe fn initWithMachPort(this: Allocated<Self>, mach_port: u32) -> Retained<Self>;

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

        #[method_id(@__retain_semantics Other delegate)]
        pub unsafe fn delegate(&self) -> Option<Retained<ProtocolObject<dyn NSMachPortDelegate>>>;

        #[method_id(@__retain_semantics Other portWithMachPort:options:)]
        pub unsafe fn portWithMachPort_options(
            mach_port: u32,
            f: NSMachPortOptions,
        ) -> Retained<NSPort>;

        #[method_id(@__retain_semantics Init initWithMachPort:options:)]
        pub unsafe fn initWithMachPort_options(
            this: Allocated<Self>,
            mach_port: u32,
            f: NSMachPortOptions,
        ) -> Retained<Self>;

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

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        #[method(scheduleInRunLoop:forMode:)]
        pub unsafe fn scheduleInRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRunLoop", feature = "NSString"))]
        #[method(removeFromRunLoop:forMode:)]
        pub unsafe fn removeFromRunLoop_forMode(&self, run_loop: &NSRunLoop, mode: &NSRunLoopMode);
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSMachPort {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Retained<Self>;
    }
);

extern_protocol!(
    pub unsafe trait NSMachPortDelegate: NSPortDelegate {
        #[optional]
        #[method(handleMachMessage:)]
        unsafe fn handleMachMessage(&self, msg: NonNull<c_void>);
    }

    unsafe impl ProtocolType for dyn NSMachPortDelegate {}
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSMessagePort;

    unsafe impl ClassType for NSMessagePort {
        #[inherits(NSObject)]
        type Super = NSPort;
        type Mutability = InteriorMutable;
    }
);

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

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

unsafe impl NSObjectProtocol for NSMessagePort {}

extern_methods!(
    unsafe impl NSMessagePort {}
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSMessagePort {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Retained<Self>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSSocketPort;

    unsafe impl ClassType for NSSocketPort {
        #[inherits(NSObject)]
        type Super = NSPort;
        type Mutability = InteriorMutable;
    }
);

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

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

unsafe impl NSObjectProtocol for NSSocketPort {}

extern_methods!(
    unsafe impl NSSocketPort {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics Init initWithTCPPort:)]
        pub unsafe fn initWithTCPPort(
            this: Allocated<Self>,
            port: c_ushort,
        ) -> Option<Retained<Self>>;

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

        #[method_id(@__retain_semantics Init initWithProtocolFamily:socketType:protocol:socket:)]
        pub unsafe 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")]
        #[method_id(@__retain_semantics Init initRemoteWithTCPPort:host:)]
        pub unsafe fn initRemoteWithTCPPort_host(
            this: Allocated<Self>,
            port: c_ushort,
            host_name: Option<&NSString>,
        ) -> Option<Retained<Self>>;

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

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

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

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

        #[cfg(feature = "NSData")]
        #[method_id(@__retain_semantics Other address)]
        pub unsafe fn address(&self) -> Retained<NSData>;

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

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSSocketPort {
        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Retained<Self>;
    }
);
