From 634631cc6262b892db66fab836674d03c2f16acc Mon Sep 17 00:00:00 2001 From: samuelsleight Date: Sun, 18 Jun 2023 20:55:12 +0100 Subject: [PATCH 1/6] Add `CoreAudioTypes` framework boilerplate --- crates/header-translator/framework-includes.h | 2 ++ crates/header-translator/translation-config.toml | 8 ++++++++ crates/icrate/Cargo.toml | 5 +++++ crates/icrate/src/CoreAudioTypes/mod.rs | 7 +++++++ crates/icrate/src/lib.rs | 2 ++ 5 files changed, 24 insertions(+) create mode 100644 crates/icrate/src/CoreAudioTypes/mod.rs diff --git a/crates/header-translator/framework-includes.h b/crates/header-translator/framework-includes.h index f4bb47113..cd9184088 100644 --- a/crates/header-translator/framework-includes.h +++ b/crates/header-translator/framework-includes.h @@ -37,6 +37,8 @@ #import +#import + #import #import diff --git a/crates/header-translator/translation-config.toml b/crates/header-translator/translation-config.toml index f79202ad0..8f08a9f00 100644 --- a/crates/header-translator/translation-config.toml +++ b/crates/header-translator/translation-config.toml @@ -114,6 +114,14 @@ maccatalyst = "13.0" ios = "9.0" watchos = "2.0" +[library.CoreAudioTypes] +imports = [] +macos = "10.15" +maccatalyst = "13.0" +ios = "13.0" +tvos = "13.0" +watchos = "6.0" + [library.CoreData] imports = ["Foundation"] # Temporary, since some structs and statics use these diff --git a/crates/icrate/Cargo.toml b/crates/icrate/Cargo.toml index b44e19d5f..fe0158eb6 100644 --- a/crates/icrate/Cargo.toml +++ b/crates/icrate/Cargo.toml @@ -1816,6 +1816,10 @@ CoreAnimation_all = [ "CoreAnimation_CATransition", "CoreAnimation_CAValueFunction", ] +CoreAudioTypes = [] +CoreAudioTypes_all = [ + "CoreAudioTypes", +] CoreData = [ "Foundation", "CoreData_NSAsynchronousFetchResult", @@ -5318,6 +5322,7 @@ unstable-frameworks-macos-13 = [ "BackgroundAssets_all", "BusinessChat_all", "CallKit_all", + "CoreAudioTypes_all", "DeviceCheck_all", "ExtensionKit_all", "FileProviderUI_all", diff --git a/crates/icrate/src/CoreAudioTypes/mod.rs b/crates/icrate/src/CoreAudioTypes/mod.rs new file mode 100644 index 000000000..3f4b38440 --- /dev/null +++ b/crates/icrate/src/CoreAudioTypes/mod.rs @@ -0,0 +1,7 @@ +#[path = "../generated/CoreAudioTypes/mod.rs"] +mod generated; + +pub use self::generated::*; + +#[cfg_attr(feature = "apple", link(name = "CoreAudioTypes", kind = "framework"))] +extern "C" {} diff --git a/crates/icrate/src/lib.rs b/crates/icrate/src/lib.rs index ee38ba493..b5f153204 100644 --- a/crates/icrate/src/lib.rs +++ b/crates/icrate/src/lib.rs @@ -80,6 +80,8 @@ pub mod CloudKit; pub mod Contacts; #[cfg(feature = "CoreAnimation")] pub mod CoreAnimation; +#[cfg(feature = "CoreAudioTypes")] +pub mod CoreAudioTypes; #[cfg(feature = "CoreData")] pub mod CoreData; #[cfg(feature = "CoreLocation")] From d7884b472e29fadf4c0fd7c4cf8c1257e23f4849 Mon Sep 17 00:00:00 2001 From: samuelsleight Date: Sun, 18 Jun 2023 22:38:03 +0100 Subject: [PATCH 2/6] Handle enums consisting of four character codes --- Cargo.lock | 7 +++++++ crates/header-translator/Cargo.toml | 1 + crates/header-translator/src/expr.rs | 8 ++++++++ crates/icrate/tests/four_char_codes.rs | 9 +++++++++ 4 files changed, 25 insertions(+) create mode 100644 crates/icrate/tests/four_char_codes.rs diff --git a/Cargo.lock b/Cargo.lock index 1816cfe93..ac7283cf4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,6 +132,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "four-char-code" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c661315fd366b2a1f970df7b7cb1a28d2678d49ef4872f7dcc19b4a83150f20b" + [[package]] name = "glob" version = "0.3.1" @@ -146,6 +152,7 @@ dependencies = [ "basic-toml", "clang", "clang-sys", + "four-char-code", "heck", "proc-macro2", "semver", diff --git a/crates/header-translator/Cargo.toml b/crates/header-translator/Cargo.toml index 0a345ae18..63433cbb7 100644 --- a/crates/header-translator/Cargo.toml +++ b/crates/header-translator/Cargo.toml @@ -20,3 +20,4 @@ proc-macro2 = "1.0.49" syn = { version = "2.0", features = ["parsing"] } heck = "0.4" semver = { version = "1.0", features = ["serde"] } +four-char-code = "2.2.0" diff --git a/crates/header-translator/src/expr.rs b/crates/header-translator/src/expr.rs index f908e38c5..b0b20cbcc 100644 --- a/crates/header-translator/src/expr.rs +++ b/crates/header-translator/src/expr.rs @@ -132,6 +132,14 @@ impl Expr { s = s.trim_start_matches('(').trim_end_matches(')').to_string(); } + // Handle four character codes + if s.len() == 6 && s.starts_with('\'') && s.ends_with('\'') { + let fcc = four_char_code::FourCharCode::from_str(&s[1..5]) + .expect("Invalid four character code"); + + return Some(Self::Unsigned(fcc.as_u32().into())); + } + Some(Self::String(s)) } } diff --git a/crates/icrate/tests/four_char_codes.rs b/crates/icrate/tests/four_char_codes.rs new file mode 100644 index 000000000..707ff97c4 --- /dev/null +++ b/crates/icrate/tests/four_char_codes.rs @@ -0,0 +1,9 @@ +#![cfg(feature = "CoreAudioTypes")] + +use icrate::CoreAudioTypes::*; + +#[test] +fn generated_four_char_code_is_correct() { + // 'lpcm' == 1819304813 + assert_eq!(kAudioFormatLinearPCM, 1819304813); +} From 221c48f2186755f1cb52cfb2a7caa28d9854825a Mon Sep 17 00:00:00 2001 From: samuelsleight Date: Sun, 18 Jun 2023 22:38:18 +0100 Subject: [PATCH 3/6] Add `OSStatus` to `common.rs` --- crates/icrate/src/common.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/icrate/src/common.rs b/crates/icrate/src/common.rs index fd81e1f99..37e40578d 100644 --- a/crates/icrate/src/common.rs +++ b/crates/icrate/src/common.rs @@ -47,5 +47,6 @@ pub(crate) type FourCharCode = u32; pub(crate) type OSType = FourCharCode; pub(crate) type ResType = FourCharCode; pub(crate) type UTF32Char = u32; // Or maybe Rust's char? +pub(crate) type OSStatus = i32; pub(crate) const INT64_MAX: i64 = i64::MAX; From 4bde71646e240a2b67a4644ee24af8356ec7ac69 Mon Sep 17 00:00:00 2001 From: samuelsleight Date: Sun, 18 Jun 2023 22:38:43 +0100 Subject: [PATCH 4/6] Handle the anonymous constant requiring a cast --- crates/header-translator/translation-config.toml | 4 ++++ crates/icrate/src/CoreAudioTypes/fixes.rs | 11 +++++++++++ crates/icrate/src/CoreAudioTypes/mod.rs | 5 ++--- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 crates/icrate/src/CoreAudioTypes/fixes.rs diff --git a/crates/header-translator/translation-config.toml b/crates/header-translator/translation-config.toml index 8f08a9f00..12ef8f5c4 100644 --- a/crates/header-translator/translation-config.toml +++ b/crates/header-translator/translation-config.toml @@ -1575,3 +1575,7 @@ skipped-protocols = ["NSCopying", "NSMutableCopying"] skipped-protocols = ["NSCopying", "NSMutableCopying"] [class.NSPurgeableData] skipped-protocols = ["NSCopying", "NSMutableCopying"] + +# Requires a cast +[enum.anonymous.constants.AVAudioSessionErrorInsufficientPriority] +skipped = true diff --git a/crates/icrate/src/CoreAudioTypes/fixes.rs b/crates/icrate/src/CoreAudioTypes/fixes.rs new file mode 100644 index 000000000..b3c27bbc7 --- /dev/null +++ b/crates/icrate/src/CoreAudioTypes/fixes.rs @@ -0,0 +1,11 @@ +use crate::common::*; +use crate::CoreAudioTypes::*; + +extern_enum!( + #[underlying(c_uint)] + pub enum __anonymous__ { + #[deprecated] + AVAudioSessionErrorInsufficientPriority = + AVAudioSessionErrorCodeInsufficientPriority as c_uint, + } +); diff --git a/crates/icrate/src/CoreAudioTypes/mod.rs b/crates/icrate/src/CoreAudioTypes/mod.rs index 3f4b38440..ac4bcc182 100644 --- a/crates/icrate/src/CoreAudioTypes/mod.rs +++ b/crates/icrate/src/CoreAudioTypes/mod.rs @@ -1,7 +1,6 @@ +mod fixes; #[path = "../generated/CoreAudioTypes/mod.rs"] mod generated; +pub use self::fixes::*; pub use self::generated::*; - -#[cfg_attr(feature = "apple", link(name = "CoreAudioTypes", kind = "framework"))] -extern "C" {} From e269e175f0f56bb03ea9aca0523fe61ba07faf67 Mon Sep 17 00:00:00 2001 From: samuelsleight Date: Sun, 18 Jun 2023 22:44:37 +0100 Subject: [PATCH 5/6] Add some new `unexposed_attr`s --- crates/header-translator/src/unexposed_attr.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/header-translator/src/unexposed_attr.rs b/crates/header-translator/src/unexposed_attr.rs index 671ca0d38..5ee8cd6fb 100644 --- a/crates/header-translator/src/unexposed_attr.rs +++ b/crates/header-translator/src/unexposed_attr.rs @@ -68,7 +68,7 @@ impl UnexposedAttr { "__unused" => None, // We assume that a function is inline if it has a body, so not // interesting. - "NS_INLINE" => None, + "CF_INLINE" | "NS_INLINE" => None, // We don't synthethize properties, so irrelevant for us. "NS_REQUIRES_PROPERTY_DEFINITIONS" => None, // Weak specifiers - would be interesting if Rust supported weak statics @@ -129,6 +129,7 @@ impl UnexposedAttr { | "__WATCHOS_PROHIBITED" | "__WATCHOS_UNAVAILABLE" | "APPKIT_API_UNAVAILABLE_BEGIN_MACCATALYST" + | "CA_CANONICAL_DEPRECATED" | "MP_INIT_UNAVAILABLE" | "NS_AUTOMATED_REFCOUNT_UNAVAILABLE" | "NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE" From df8592feeadf5ee25e1eaf55d65b9149e08bebb7 Mon Sep 17 00:00:00 2001 From: samuelsleight Date: Mon, 19 Jun 2023 13:52:28 +0100 Subject: [PATCH 6/6] Update the `generated` submodule --- crates/icrate/src/generated | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/icrate/src/generated b/crates/icrate/src/generated index bc00d3906..bd5e14aad 160000 --- a/crates/icrate/src/generated +++ b/crates/icrate/src/generated @@ -1 +1 @@ -Subproject commit bc00d39068aa4089564979de43317703a406a603 +Subproject commit bd5e14aadb3b6c5fe3167b3631f76a2846e81046