1use core::cell::UnsafeCell;
4use core::ffi::*;
5use core::marker::{PhantomData, PhantomPinned};
6use core::ptr::NonNull;
7#[cfg(feature = "dispatch2")]
8use dispatch2::*;
9#[cfg(feature = "objc2")]
10use objc2::__framework_prelude::*;
11use objc2_core_foundation::*;
12
13use crate::*;
14
15#[doc(alias = "SCDynamicStoreRef")]
20#[repr(C)]
21pub struct SCDynamicStore {
22 inner: [u8; 0],
23 _p: UnsafeCell<PhantomData<(*const UnsafeCell<()>, PhantomPinned)>>,
24}
25
26cf_type!(
27 unsafe impl SCDynamicStore {}
28);
29#[cfg(feature = "objc2")]
30cf_objc2_type!(
31 unsafe impl RefEncode<"__SCDynamicStore"> for SCDynamicStore {}
32);
33
34#[repr(C)]
52#[allow(unpredictable_function_pointer_comparisons)]
53#[derive(Clone, Copy, Debug, PartialEq)]
54pub struct SCDynamicStoreContext {
55 pub version: CFIndex,
56 pub info: *mut c_void,
57 pub retain: Option<unsafe extern "C-unwind" fn(NonNull<c_void>) -> NonNull<c_void>>,
58 pub release: Option<unsafe extern "C-unwind" fn(NonNull<c_void>)>,
59 pub copyDescription: Option<unsafe extern "C-unwind" fn(NonNull<c_void>) -> NonNull<CFString>>,
60}
61
62#[cfg(feature = "objc2")]
63unsafe impl Encode for SCDynamicStoreContext {
64 const ENCODING: Encoding = Encoding::Struct(
65 "?",
66 &[
67 <CFIndex>::ENCODING,
68 <*mut c_void>::ENCODING,
69 <Option<unsafe extern "C-unwind" fn(NonNull<c_void>) -> NonNull<c_void>>>::ENCODING,
70 <Option<unsafe extern "C-unwind" fn(NonNull<c_void>)>>::ENCODING,
71 <Option<unsafe extern "C-unwind" fn(NonNull<c_void>) -> NonNull<CFString>>>::ENCODING,
72 ],
73 );
74}
75
76#[cfg(feature = "objc2")]
77unsafe impl RefEncode for SCDynamicStoreContext {
78 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
79}
80
81pub type SCDynamicStoreCallBack =
103 Option<unsafe extern "C-unwind" fn(NonNull<SCDynamicStore>, NonNull<CFArray>, *mut c_void)>;
104
105unsafe impl ConcreteType for SCDynamicStore {
106 #[doc(alias = "SCDynamicStoreGetTypeID")]
108 #[inline]
109 fn type_id() -> CFTypeID {
110 extern "C-unwind" {
111 fn SCDynamicStoreGetTypeID() -> CFTypeID;
112 }
113 unsafe { SCDynamicStoreGetTypeID() }
114 }
115}
116
117impl SCDynamicStore {
118 #[doc(alias = "SCDynamicStoreCreate")]
145 #[inline]
146 pub unsafe fn new(
147 allocator: Option<&CFAllocator>,
148 name: &CFString,
149 callout: SCDynamicStoreCallBack,
150 context: *mut SCDynamicStoreContext,
151 ) -> Option<CFRetained<SCDynamicStore>> {
152 extern "C-unwind" {
153 fn SCDynamicStoreCreate(
154 allocator: Option<&CFAllocator>,
155 name: &CFString,
156 callout: SCDynamicStoreCallBack,
157 context: *mut SCDynamicStoreContext,
158 ) -> Option<NonNull<SCDynamicStore>>;
159 }
160 let ret = unsafe { SCDynamicStoreCreate(allocator, name, callout, context) };
161 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
162 }
163
164 #[doc(alias = "SCDynamicStoreCreateWithOptions")]
229 #[inline]
230 pub unsafe fn with_options(
231 allocator: Option<&CFAllocator>,
232 name: &CFString,
233 store_options: Option<&CFDictionary>,
234 callout: SCDynamicStoreCallBack,
235 context: *mut SCDynamicStoreContext,
236 ) -> Option<CFRetained<SCDynamicStore>> {
237 extern "C-unwind" {
238 fn SCDynamicStoreCreateWithOptions(
239 allocator: Option<&CFAllocator>,
240 name: &CFString,
241 store_options: Option<&CFDictionary>,
242 callout: SCDynamicStoreCallBack,
243 context: *mut SCDynamicStoreContext,
244 ) -> Option<NonNull<SCDynamicStore>>;
245 }
246 let ret = unsafe {
247 SCDynamicStoreCreateWithOptions(allocator, name, store_options, callout, context)
248 };
249 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
250 }
251}
252
253extern "C" {
254 pub static kSCDynamicStoreUseSessionKeys: &'static CFString;
256}
257
258impl SCDynamicStore {
259 #[doc(alias = "SCDynamicStoreCreateRunLoopSource")]
283 #[inline]
284 pub fn new_run_loop_source(
285 allocator: Option<&CFAllocator>,
286 store: &SCDynamicStore,
287 order: CFIndex,
288 ) -> Option<CFRetained<CFRunLoopSource>> {
289 extern "C-unwind" {
290 fn SCDynamicStoreCreateRunLoopSource(
291 allocator: Option<&CFAllocator>,
292 store: &SCDynamicStore,
293 order: CFIndex,
294 ) -> Option<NonNull<CFRunLoopSource>>;
295 }
296 let ret = unsafe { SCDynamicStoreCreateRunLoopSource(allocator, store, order) };
297 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
298 }
299
300 #[doc(alias = "SCDynamicStoreSetDispatchQueue")]
314 #[cfg(feature = "dispatch2")]
315 #[inline]
316 pub unsafe fn set_dispatch_queue(&self, queue: Option<&DispatchQueue>) -> bool {
317 extern "C-unwind" {
318 fn SCDynamicStoreSetDispatchQueue(
319 store: &SCDynamicStore,
320 queue: Option<&DispatchQueue>,
321 ) -> Boolean;
322 }
323 let ret = unsafe { SCDynamicStoreSetDispatchQueue(self, queue) };
324 ret != 0
325 }
326
327 #[doc(alias = "SCDynamicStoreCopyKeyList")]
339 #[inline]
340 pub fn key_list(
341 store: Option<&SCDynamicStore>,
342 pattern: &CFString,
343 ) -> Option<CFRetained<CFArray>> {
344 extern "C-unwind" {
345 fn SCDynamicStoreCopyKeyList(
346 store: Option<&SCDynamicStore>,
347 pattern: &CFString,
348 ) -> Option<NonNull<CFArray>>;
349 }
350 let ret = unsafe { SCDynamicStoreCopyKeyList(store, pattern) };
351 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
352 }
353
354 #[doc(alias = "SCDynamicStoreAddValue")]
370 #[inline]
371 pub unsafe fn add_value(
372 store: Option<&SCDynamicStore>,
373 key: &CFString,
374 value: &CFPropertyList,
375 ) -> bool {
376 extern "C-unwind" {
377 fn SCDynamicStoreAddValue(
378 store: Option<&SCDynamicStore>,
379 key: &CFString,
380 value: &CFPropertyList,
381 ) -> Boolean;
382 }
383 let ret = unsafe { SCDynamicStoreAddValue(store, key, value) };
384 ret != 0
385 }
386
387 #[doc(alias = "SCDynamicStoreAddTemporaryValue")]
405 #[inline]
406 pub unsafe fn add_temporary_value(&self, key: &CFString, value: &CFPropertyList) -> bool {
407 extern "C-unwind" {
408 fn SCDynamicStoreAddTemporaryValue(
409 store: &SCDynamicStore,
410 key: &CFString,
411 value: &CFPropertyList,
412 ) -> Boolean;
413 }
414 let ret = unsafe { SCDynamicStoreAddTemporaryValue(self, key, value) };
415 ret != 0
416 }
417
418 #[doc(alias = "SCDynamicStoreCopyValue")]
428 #[inline]
429 pub fn value(
430 store: Option<&SCDynamicStore>,
431 key: &CFString,
432 ) -> Option<CFRetained<CFPropertyList>> {
433 extern "C-unwind" {
434 fn SCDynamicStoreCopyValue(
435 store: Option<&SCDynamicStore>,
436 key: &CFString,
437 ) -> Option<NonNull<CFPropertyList>>;
438 }
439 let ret = unsafe { SCDynamicStoreCopyValue(store, key) };
440 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
441 }
442
443 #[doc(alias = "SCDynamicStoreCopyMultiple")]
463 #[inline]
464 pub unsafe fn multiple(
465 store: Option<&SCDynamicStore>,
466 keys: Option<&CFArray>,
467 patterns: Option<&CFArray>,
468 ) -> Option<CFRetained<CFDictionary>> {
469 extern "C-unwind" {
470 fn SCDynamicStoreCopyMultiple(
471 store: Option<&SCDynamicStore>,
472 keys: Option<&CFArray>,
473 patterns: Option<&CFArray>,
474 ) -> Option<NonNull<CFDictionary>>;
475 }
476 let ret = unsafe { SCDynamicStoreCopyMultiple(store, keys, patterns) };
477 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
478 }
479
480 #[doc(alias = "SCDynamicStoreSetValue")]
495 #[inline]
496 pub unsafe fn set_value(
497 store: Option<&SCDynamicStore>,
498 key: &CFString,
499 value: &CFPropertyList,
500 ) -> bool {
501 extern "C-unwind" {
502 fn SCDynamicStoreSetValue(
503 store: Option<&SCDynamicStore>,
504 key: &CFString,
505 value: &CFPropertyList,
506 ) -> Boolean;
507 }
508 let ret = unsafe { SCDynamicStoreSetValue(store, key, value) };
509 ret != 0
510 }
511
512 #[doc(alias = "SCDynamicStoreSetMultiple")]
530 #[inline]
531 pub unsafe fn set_multiple(
532 store: Option<&SCDynamicStore>,
533 keys_to_set: Option<&CFDictionary>,
534 keys_to_remove: Option<&CFArray>,
535 keys_to_notify: Option<&CFArray>,
536 ) -> bool {
537 extern "C-unwind" {
538 fn SCDynamicStoreSetMultiple(
539 store: Option<&SCDynamicStore>,
540 keys_to_set: Option<&CFDictionary>,
541 keys_to_remove: Option<&CFArray>,
542 keys_to_notify: Option<&CFArray>,
543 ) -> Boolean;
544 }
545 let ret = unsafe {
546 SCDynamicStoreSetMultiple(store, keys_to_set, keys_to_remove, keys_to_notify)
547 };
548 ret != 0
549 }
550
551 #[doc(alias = "SCDynamicStoreRemoveValue")]
561 #[inline]
562 pub fn remove_value(store: Option<&SCDynamicStore>, key: &CFString) -> bool {
563 extern "C-unwind" {
564 fn SCDynamicStoreRemoveValue(store: Option<&SCDynamicStore>, key: &CFString)
565 -> Boolean;
566 }
567 let ret = unsafe { SCDynamicStoreRemoveValue(store, key) };
568 ret != 0
569 }
570
571 #[doc(alias = "SCDynamicStoreNotifyValue")]
582 #[inline]
583 pub fn notify_value(store: Option<&SCDynamicStore>, key: &CFString) -> bool {
584 extern "C-unwind" {
585 fn SCDynamicStoreNotifyValue(store: Option<&SCDynamicStore>, key: &CFString)
586 -> Boolean;
587 }
588 let ret = unsafe { SCDynamicStoreNotifyValue(store, key) };
589 ret != 0
590 }
591
592 #[doc(alias = "SCDynamicStoreSetNotificationKeys")]
611 #[inline]
612 pub unsafe fn set_notification_keys(
613 &self,
614 keys: Option<&CFArray>,
615 patterns: Option<&CFArray>,
616 ) -> bool {
617 extern "C-unwind" {
618 fn SCDynamicStoreSetNotificationKeys(
619 store: &SCDynamicStore,
620 keys: Option<&CFArray>,
621 patterns: Option<&CFArray>,
622 ) -> Boolean;
623 }
624 let ret = unsafe { SCDynamicStoreSetNotificationKeys(self, keys, patterns) };
625 ret != 0
626 }
627
628 #[doc(alias = "SCDynamicStoreCopyNotifiedKeys")]
640 #[inline]
641 pub fn notified_keys(&self) -> Option<CFRetained<CFArray>> {
642 extern "C-unwind" {
643 fn SCDynamicStoreCopyNotifiedKeys(store: &SCDynamicStore) -> Option<NonNull<CFArray>>;
644 }
645 let ret = unsafe { SCDynamicStoreCopyNotifiedKeys(self) };
646 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
647 }
648}
649
650#[deprecated = "renamed to `SCDynamicStore::new`"]
651#[inline]
652pub unsafe extern "C-unwind" fn SCDynamicStoreCreate(
653 allocator: Option<&CFAllocator>,
654 name: &CFString,
655 callout: SCDynamicStoreCallBack,
656 context: *mut SCDynamicStoreContext,
657) -> Option<CFRetained<SCDynamicStore>> {
658 extern "C-unwind" {
659 fn SCDynamicStoreCreate(
660 allocator: Option<&CFAllocator>,
661 name: &CFString,
662 callout: SCDynamicStoreCallBack,
663 context: *mut SCDynamicStoreContext,
664 ) -> Option<NonNull<SCDynamicStore>>;
665 }
666 let ret = unsafe { SCDynamicStoreCreate(allocator, name, callout, context) };
667 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
668}
669
670#[deprecated = "renamed to `SCDynamicStore::with_options`"]
671#[inline]
672pub unsafe extern "C-unwind" fn SCDynamicStoreCreateWithOptions(
673 allocator: Option<&CFAllocator>,
674 name: &CFString,
675 store_options: Option<&CFDictionary>,
676 callout: SCDynamicStoreCallBack,
677 context: *mut SCDynamicStoreContext,
678) -> Option<CFRetained<SCDynamicStore>> {
679 extern "C-unwind" {
680 fn SCDynamicStoreCreateWithOptions(
681 allocator: Option<&CFAllocator>,
682 name: &CFString,
683 store_options: Option<&CFDictionary>,
684 callout: SCDynamicStoreCallBack,
685 context: *mut SCDynamicStoreContext,
686 ) -> Option<NonNull<SCDynamicStore>>;
687 }
688 let ret = unsafe {
689 SCDynamicStoreCreateWithOptions(allocator, name, store_options, callout, context)
690 };
691 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
692}
693
694#[deprecated = "renamed to `SCDynamicStore::new_run_loop_source`"]
695#[inline]
696pub extern "C-unwind" fn SCDynamicStoreCreateRunLoopSource(
697 allocator: Option<&CFAllocator>,
698 store: &SCDynamicStore,
699 order: CFIndex,
700) -> Option<CFRetained<CFRunLoopSource>> {
701 extern "C-unwind" {
702 fn SCDynamicStoreCreateRunLoopSource(
703 allocator: Option<&CFAllocator>,
704 store: &SCDynamicStore,
705 order: CFIndex,
706 ) -> Option<NonNull<CFRunLoopSource>>;
707 }
708 let ret = unsafe { SCDynamicStoreCreateRunLoopSource(allocator, store, order) };
709 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
710}
711
712#[cfg(feature = "dispatch2")]
713#[deprecated = "renamed to `SCDynamicStore::set_dispatch_queue`"]
714#[inline]
715pub unsafe extern "C-unwind" fn SCDynamicStoreSetDispatchQueue(
716 store: &SCDynamicStore,
717 queue: Option<&DispatchQueue>,
718) -> bool {
719 extern "C-unwind" {
720 fn SCDynamicStoreSetDispatchQueue(
721 store: &SCDynamicStore,
722 queue: Option<&DispatchQueue>,
723 ) -> Boolean;
724 }
725 let ret = unsafe { SCDynamicStoreSetDispatchQueue(store, queue) };
726 ret != 0
727}
728
729#[deprecated = "renamed to `SCDynamicStore::key_list`"]
730#[inline]
731pub extern "C-unwind" fn SCDynamicStoreCopyKeyList(
732 store: Option<&SCDynamicStore>,
733 pattern: &CFString,
734) -> Option<CFRetained<CFArray>> {
735 extern "C-unwind" {
736 fn SCDynamicStoreCopyKeyList(
737 store: Option<&SCDynamicStore>,
738 pattern: &CFString,
739 ) -> Option<NonNull<CFArray>>;
740 }
741 let ret = unsafe { SCDynamicStoreCopyKeyList(store, pattern) };
742 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
743}
744
745#[deprecated = "renamed to `SCDynamicStore::add_value`"]
746#[inline]
747pub unsafe extern "C-unwind" fn SCDynamicStoreAddValue(
748 store: Option<&SCDynamicStore>,
749 key: &CFString,
750 value: &CFPropertyList,
751) -> bool {
752 extern "C-unwind" {
753 fn SCDynamicStoreAddValue(
754 store: Option<&SCDynamicStore>,
755 key: &CFString,
756 value: &CFPropertyList,
757 ) -> Boolean;
758 }
759 let ret = unsafe { SCDynamicStoreAddValue(store, key, value) };
760 ret != 0
761}
762
763#[deprecated = "renamed to `SCDynamicStore::add_temporary_value`"]
764#[inline]
765pub unsafe extern "C-unwind" fn SCDynamicStoreAddTemporaryValue(
766 store: &SCDynamicStore,
767 key: &CFString,
768 value: &CFPropertyList,
769) -> bool {
770 extern "C-unwind" {
771 fn SCDynamicStoreAddTemporaryValue(
772 store: &SCDynamicStore,
773 key: &CFString,
774 value: &CFPropertyList,
775 ) -> Boolean;
776 }
777 let ret = unsafe { SCDynamicStoreAddTemporaryValue(store, key, value) };
778 ret != 0
779}
780
781#[deprecated = "renamed to `SCDynamicStore::value`"]
782#[inline]
783pub extern "C-unwind" fn SCDynamicStoreCopyValue(
784 store: Option<&SCDynamicStore>,
785 key: &CFString,
786) -> Option<CFRetained<CFPropertyList>> {
787 extern "C-unwind" {
788 fn SCDynamicStoreCopyValue(
789 store: Option<&SCDynamicStore>,
790 key: &CFString,
791 ) -> Option<NonNull<CFPropertyList>>;
792 }
793 let ret = unsafe { SCDynamicStoreCopyValue(store, key) };
794 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
795}
796
797#[deprecated = "renamed to `SCDynamicStore::multiple`"]
798#[inline]
799pub unsafe extern "C-unwind" fn SCDynamicStoreCopyMultiple(
800 store: Option<&SCDynamicStore>,
801 keys: Option<&CFArray>,
802 patterns: Option<&CFArray>,
803) -> Option<CFRetained<CFDictionary>> {
804 extern "C-unwind" {
805 fn SCDynamicStoreCopyMultiple(
806 store: Option<&SCDynamicStore>,
807 keys: Option<&CFArray>,
808 patterns: Option<&CFArray>,
809 ) -> Option<NonNull<CFDictionary>>;
810 }
811 let ret = unsafe { SCDynamicStoreCopyMultiple(store, keys, patterns) };
812 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
813}
814
815#[deprecated = "renamed to `SCDynamicStore::set_value`"]
816#[inline]
817pub unsafe extern "C-unwind" fn SCDynamicStoreSetValue(
818 store: Option<&SCDynamicStore>,
819 key: &CFString,
820 value: &CFPropertyList,
821) -> bool {
822 extern "C-unwind" {
823 fn SCDynamicStoreSetValue(
824 store: Option<&SCDynamicStore>,
825 key: &CFString,
826 value: &CFPropertyList,
827 ) -> Boolean;
828 }
829 let ret = unsafe { SCDynamicStoreSetValue(store, key, value) };
830 ret != 0
831}
832
833#[deprecated = "renamed to `SCDynamicStore::set_multiple`"]
834#[inline]
835pub unsafe extern "C-unwind" fn SCDynamicStoreSetMultiple(
836 store: Option<&SCDynamicStore>,
837 keys_to_set: Option<&CFDictionary>,
838 keys_to_remove: Option<&CFArray>,
839 keys_to_notify: Option<&CFArray>,
840) -> bool {
841 extern "C-unwind" {
842 fn SCDynamicStoreSetMultiple(
843 store: Option<&SCDynamicStore>,
844 keys_to_set: Option<&CFDictionary>,
845 keys_to_remove: Option<&CFArray>,
846 keys_to_notify: Option<&CFArray>,
847 ) -> Boolean;
848 }
849 let ret =
850 unsafe { SCDynamicStoreSetMultiple(store, keys_to_set, keys_to_remove, keys_to_notify) };
851 ret != 0
852}
853
854#[deprecated = "renamed to `SCDynamicStore::remove_value`"]
855#[inline]
856pub extern "C-unwind" fn SCDynamicStoreRemoveValue(
857 store: Option<&SCDynamicStore>,
858 key: &CFString,
859) -> bool {
860 extern "C-unwind" {
861 fn SCDynamicStoreRemoveValue(store: Option<&SCDynamicStore>, key: &CFString) -> Boolean;
862 }
863 let ret = unsafe { SCDynamicStoreRemoveValue(store, key) };
864 ret != 0
865}
866
867#[deprecated = "renamed to `SCDynamicStore::notify_value`"]
868#[inline]
869pub extern "C-unwind" fn SCDynamicStoreNotifyValue(
870 store: Option<&SCDynamicStore>,
871 key: &CFString,
872) -> bool {
873 extern "C-unwind" {
874 fn SCDynamicStoreNotifyValue(store: Option<&SCDynamicStore>, key: &CFString) -> Boolean;
875 }
876 let ret = unsafe { SCDynamicStoreNotifyValue(store, key) };
877 ret != 0
878}
879
880#[deprecated = "renamed to `SCDynamicStore::set_notification_keys`"]
881#[inline]
882pub unsafe extern "C-unwind" fn SCDynamicStoreSetNotificationKeys(
883 store: &SCDynamicStore,
884 keys: Option<&CFArray>,
885 patterns: Option<&CFArray>,
886) -> bool {
887 extern "C-unwind" {
888 fn SCDynamicStoreSetNotificationKeys(
889 store: &SCDynamicStore,
890 keys: Option<&CFArray>,
891 patterns: Option<&CFArray>,
892 ) -> Boolean;
893 }
894 let ret = unsafe { SCDynamicStoreSetNotificationKeys(store, keys, patterns) };
895 ret != 0
896}
897
898#[deprecated = "renamed to `SCDynamicStore::notified_keys`"]
899#[inline]
900pub extern "C-unwind" fn SCDynamicStoreCopyNotifiedKeys(
901 store: &SCDynamicStore,
902) -> Option<CFRetained<CFArray>> {
903 extern "C-unwind" {
904 fn SCDynamicStoreCopyNotifiedKeys(store: &SCDynamicStore) -> Option<NonNull<CFArray>>;
905 }
906 let ret = unsafe { SCDynamicStoreCopyNotifiedKeys(store) };
907 ret.map(|ret| unsafe { CFRetained::from_raw(ret) })
908}