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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;

use crate::*;

#[deprecated = "Not supported"]
pub const NSWindowsNTOperatingSystem: c_uint = 1;
#[deprecated = "Not supported"]
pub const NSWindows95OperatingSystem: c_uint = 2;
#[deprecated = "Not supported"]
pub const NSSolarisOperatingSystem: c_uint = 3;
#[deprecated = "Not supported"]
pub const NSHPUXOperatingSystem: c_uint = 4;
#[deprecated = "Not supported"]
pub const NSMACHOperatingSystem: c_uint = 5;
#[deprecated = "Not supported"]
pub const NSSunOSOperatingSystem: c_uint = 6;
#[deprecated = "Not supported"]
pub const NSOSF1OperatingSystem: c_uint = 7;

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct NSOperatingSystemVersion {
    pub majorVersion: NSInteger,
    pub minorVersion: NSInteger,
    pub patchVersion: NSInteger,
}

unsafe impl Encode for NSOperatingSystemVersion {
    const ENCODING: Encoding = Encoding::Struct(
        "?",
        &[
            <NSInteger>::ENCODING,
            <NSInteger>::ENCODING,
            <NSInteger>::ENCODING,
        ],
    );
}

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

unsafe impl Send for NSOperatingSystemVersion {}

unsafe impl Sync for NSOperatingSystemVersion {}

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

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

unsafe impl NSObjectProtocol for NSProcessInfo {}

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

        #[cfg(all(feature = "NSDictionary", feature = "NSString"))]
        #[method_id(@__retain_semantics Other environment)]
        pub unsafe fn environment(&self) -> Retained<NSDictionary<NSString, NSString>>;

        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[method_id(@__retain_semantics Other arguments)]
        pub unsafe fn arguments(&self) -> Retained<NSArray<NSString>>;

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

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

        #[cfg(feature = "NSString")]
        #[method(setProcessName:)]
        pub unsafe fn setProcessName(&self, process_name: &NSString);

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

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

        #[deprecated = "-operatingSystem always returns NSMACHOperatingSystem, use -operatingSystemVersion or -isOperatingSystemAtLeastVersion: instead"]
        #[method(operatingSystem)]
        pub unsafe fn operatingSystem(&self) -> NSUInteger;

        #[cfg(feature = "NSString")]
        #[deprecated = "-operatingSystemName always returns NSMACHOperatingSystem, use -operatingSystemVersionString instead"]
        #[method_id(@__retain_semantics Other operatingSystemName)]
        pub unsafe fn operatingSystemName(&self) -> Retained<NSString>;

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

        #[method(operatingSystemVersion)]
        pub fn operatingSystemVersion(&self) -> NSOperatingSystemVersion;

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

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

        #[method(physicalMemory)]
        pub unsafe fn physicalMemory(&self) -> c_ulonglong;

        #[method(isOperatingSystemAtLeastVersion:)]
        pub unsafe fn isOperatingSystemAtLeastVersion(
            &self,
            version: NSOperatingSystemVersion,
        ) -> bool;

        #[cfg(feature = "NSDate")]
        #[method(systemUptime)]
        pub unsafe fn systemUptime(&self) -> NSTimeInterval;

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

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

        #[cfg(feature = "NSString")]
        #[method(disableAutomaticTermination:)]
        pub unsafe fn disableAutomaticTermination(&self, reason: &NSString);

        #[cfg(feature = "NSString")]
        #[method(enableAutomaticTermination:)]
        pub unsafe fn enableAutomaticTermination(&self, reason: &NSString);

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

        #[method(setAutomaticTerminationSupportEnabled:)]
        pub unsafe fn setAutomaticTerminationSupportEnabled(
            &self,
            automatic_termination_support_enabled: bool,
        );
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSProcessInfo {
        #[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>;
    }
);

// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSActivityOptions(pub u64);
bitflags::bitflags! {
    impl NSActivityOptions: u64 {
        const NSActivityIdleDisplaySleepDisabled = 1<<40;
        const NSActivityIdleSystemSleepDisabled = 1<<20;
        const NSActivitySuddenTerminationDisabled = 1<<14;
        const NSActivityAutomaticTerminationDisabled = 1<<15;
        const NSActivityAnimationTrackingEnabled = 1<<45;
        const NSActivityTrackingEnabled = 1<<46;
        const NSActivityUserInitiated = 0x00FFFFFF|NSActivityOptions::NSActivityIdleSystemSleepDisabled.0;
        const NSActivityUserInitiatedAllowingIdleSystemSleep = NSActivityOptions::NSActivityUserInitiated.0&!NSActivityOptions::NSActivityIdleSystemSleepDisabled.0;
        const NSActivityBackground = 0x000000FF;
        const NSActivityLatencyCritical = 0xFF00000000;
        const NSActivityUserInteractive = NSActivityOptions::NSActivityUserInitiated.0|NSActivityOptions::NSActivityLatencyCritical.0;
    }
}

unsafe impl Encode for NSActivityOptions {
    const ENCODING: Encoding = u64::ENCODING;
}

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

extern_methods!(
    /// NSProcessInfoActivity
    unsafe impl NSProcessInfo {
        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other beginActivityWithOptions:reason:)]
        pub unsafe fn beginActivityWithOptions_reason(
            &self,
            options: NSActivityOptions,
            reason: &NSString,
        ) -> Retained<NSObject>;

        #[method(endActivity:)]
        pub unsafe fn endActivity(&self, activity: &NSObject);

        #[cfg(all(feature = "NSString", feature = "block2"))]
        #[method(performActivityWithOptions:reason:usingBlock:)]
        pub unsafe fn performActivityWithOptions_reason_usingBlock(
            &self,
            options: NSActivityOptions,
            reason: &NSString,
            block: &block2::Block<dyn Fn()>,
        );

        #[cfg(all(feature = "NSString", feature = "block2"))]
        #[method(performExpiringActivityWithReason:usingBlock:)]
        pub unsafe fn performExpiringActivityWithReason_usingBlock(
            &self,
            reason: &NSString,
            block: &block2::Block<dyn Fn(Bool)>,
        );
    }
);

extern_methods!(
    /// NSUserInformation
    unsafe impl NSProcessInfo {
        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other userName)]
        pub unsafe fn userName(&self) -> Retained<NSString>;

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

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSProcessInfoThermalState(pub NSInteger);
impl NSProcessInfoThermalState {
    #[doc(alias = "NSProcessInfoThermalStateNominal")]
    pub const Nominal: Self = Self(0);
    #[doc(alias = "NSProcessInfoThermalStateFair")]
    pub const Fair: Self = Self(1);
    #[doc(alias = "NSProcessInfoThermalStateSerious")]
    pub const Serious: Self = Self(2);
    #[doc(alias = "NSProcessInfoThermalStateCritical")]
    pub const Critical: Self = Self(3);
}

unsafe impl Encode for NSProcessInfoThermalState {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

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

extern_methods!(
    /// NSProcessInfoThermalState
    unsafe impl NSProcessInfo {
        #[method(thermalState)]
        pub unsafe fn thermalState(&self) -> NSProcessInfoThermalState;
    }
);

extern_methods!(
    /// NSProcessInfoPowerState
    unsafe impl NSProcessInfo {
        #[method(isLowPowerModeEnabled)]
        pub unsafe fn isLowPowerModeEnabled(&self) -> bool;
    }
);

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

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

extern_methods!(
    /// NSProcessInfoPlatform
    unsafe impl NSProcessInfo {
        #[method(isMacCatalystApp)]
        pub unsafe fn isMacCatalystApp(&self) -> bool;

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