From 67f4130753dcc4d465f5ef4843e9ae4c4d4d6b10 Mon Sep 17 00:00:00 2001 From: Sebastien Pouliot Date: Fri, 15 Sep 2017 20:27:42 -0400 Subject: [PATCH] Merge xcode9 into master (#2707) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix warning caused by duplicate (#2354) * [FileProviderUI] Add Xcode 9 Beta 1 to 3 bindings (#2356) * Bump to Xcode 9 beta 4 * [arkit] ARLightEstimate does not conform to NSCopying anymore (fix unit test) * [uikit] NSFileProviderExtension.ReparentItem got a new parameter in beta4 (fix unit test) * [coreimage] CIImageAccumulator init returns nil in beta 4 There's no header change to mention `init` is not allowed but it's not clear how this default initializer could be used. Also make public some other API to construct this type (outside of XM). It's not clear why there were `internal` as they are (at least now) part of the header files. * [photos] Add helpers when PHLivePhotoEditingOption/NSDictionary is null (to avoid ambiguous API) (#2360) Adding a strongly typed `PHLivePhotoEditingOption` (a strongly typed version of an `NSDictionary`) can cause a `CS0121` (call is ambiguous) since using a `null` argument is common (only one option exist so far). This PR adds overloads that makes the code nicer in such case, e.g. before Xcode9: > // null is used when no options are given > _foo.SaveLivePhoto (output, null, completion); current (Xcode 9) > // casting required to remove ambiguity with PHLivePhotoEditingOption > _foo.SaveLivePhoto (output, (NSDictionary)null, completion); with this PR > // no option, no argument > _foo.SaveLivePhoto (output, completion); The same applies to `PrepareLivePhotoForPlayback`. * [tests] Disable/tweak two tests that breaks on (almost) all Xcode updates Those tests were not added to validate xOS so just keep the parts that helps us (without constantly checking back the new break flavor) * Disable watchOS to check if this hides others issues * [mapkit] Update for beta 4 * [coredata] Update for beta 4 * [wkwebkit] Update for beta 4 Note: WKWindowFeatures.h is not compiled (part of the framework umbrella) and the `@interface WKWindowFeatures (WKPrivate)` sounds like it should not have been exposed (it's all fields starting with `_`) * [corelocation] Update for beta 4 * Revert "Disable watchOS to check if this hides others issues" This reverts commit fed2249fa43290a1956ab2fe0d48f83ab6db9711. * [tests] Disable watchOS from harness only. Workaround #58348 https://bugzilla.xamarin.com/show_bug.cgi?id=58348 * [spritekit] Update for beta 4 (#2368) * [arkit] Update for beta 4 (#2370) * Bump version before preview 3 (#2375) * [generator] Fix smart enum FieldAttribute LibraryName generation (#2376) This fix is needed by PDFKit because it is a remapped framework[0], the current code generates incorrect FieldAttribute on smart enums because it uses `fa.LibraryName` as first option and this causes remmaped frameworks have incorrect LibraryName generated for example if a Field uses `+CoreImage` as `LibraryName` the following incorrect code is generated: ``` [Field ("First", "+CoreImage")] internal unsafe static IntPtr First { get { fixed (IntPtr *storage = &values [0]) return Dlfcn.CachePointer (Libraries.+CoreImage.Handle, "First", storage); } } ``` [0]: https://github.com/xamarin/xamarin-macios/blob/f5956d6cc1eb5dfa7bab16628cf282d40237f64e/src/generator.cs#L5985 * [FinderSync] Update to beta 4 (#2377) * [ImageIO] Update to Xcode 9 (#2353) * [PhotosUI] Move macOS photosui bindings out of photos.cs into photosui.cs (#2358) * [quicklook] Update up to beta 4 (#2374) * [uikit] UIDragInteraction & UIDragInteractionDelegate (Xcode 9 b1,2,3) (#2357) * [safariservices] Update up to beta 4 (#2380) * [coreanimation] Update to beta 4 (#2382) Apple removed (mistake?) some API in beta 1. Filed as rdar 33590997 Internal tracking in https://trello.com/c/J8BDDUV9/86-33590997-coreanimation-quartzcore-api-removals * [storekit] Update up to beta 4 (#2379) * [CoreML] Update to Xcode 9 Beta 4 (#2387) * [uikit] UICollectionView/UITableView Drag & Drop (Xcode 9 b1,2,3 & 4) (#2355) * Update code after radar 32929318 and 32897776 are fixed in b4 (#2394) * [xcode9 CoreAudio] New definitions from Beta1 to Beta3 (#2359) * [Vision] Strongify VNBarcodeSymbology API, Fixes Bug 58512 (#2397) * [Vision] Strongify VNBarcodeSymbology API, Fixes Bug 58512 https://bugzilla.xamarin.com/show_bug.cgi?id=58512 Created strong API (VNBarcodeSymbology) on the following properties * VNDetectBarcodesRequest.SupportedSymbologies * VNDetectBarcodesRequest.Symbologies * VNBarcodeObservation.Symbology * Remove modern C# because classic can't do it 😡 * [mediaplayer] Update up to beta 4 (#2388) * [watchkit] Update to beta 4 (#2398) * Bump Visual Studio for Mac max version (#2408) * [coreimage] Add CIBarcodeDescriptor and enabled missing API for VNBarcodeObservation. Fix #58197 (#2411) https://bugzilla.xamarin.com/show_bug.cgi?id=58197 * [uikit] Update UIFocus related APIs to Xcode 9 beta 4 (#2407) * [uikit] Update UIFocus related APIs to Xcode 9 beta 4 * [uikit] Fixes based on comments * [coreimage] CIImageAccumulator API fixes. Fix #58349 (#2412) * Obsolete the default `init`; * XM exposed some older APIs using `int` instead of `CIFormat`. This is fixed and old APIs are obsoleted; * Both new & old APIs are now using `CIFormat` for both XI and XM. https://bugzilla.xamarin.com/show_bug.cgi?id=58349 * [uikit] UIText drag & drop - up to Xcode 9 beta 4 (#2410) * [uikit] UISplitView & UIStackView up to Xcode 9 beta 4 (#2425) * Bump XI/XM versions before preview 4 (#2422) * [PDFKit] Update to Xcode 9 Beta 1, 2, 3 & 4 (#2378) * [PDFKit] Update to Xcode 9 Beta 1, 2, 3 & 4 * [PDFKit] Implement feedback * [PDFKit] the forgotten enum * [PDFKit] More feedback * [PDFKit] Add Mac changes * Missing change * Fix test RectangleF VS CGRect * Pass -Wunguarded-availability-new to quiet a new clang warning (#2424) - https://bugzilla.xamarin.com/show_bug.cgi?id=58574 * [mtouch/mmp] Ignore warnings about unguarded code section with regards to availability. (#2441) * [monotouch-test] Remove workaround for fixed Apple bug. (#2445) * Bump to Xcode 9 beta 5. (#2447) * Bump to Xcode 9 beta 5. * [mmp] Disable the partial static registrar, because Apple's macOS SDK is broken. > In file included from Xamarin.Mac.registrar.mobile.i386.m:1: > In file included from ./Xamarin.Mac.registrar.mobile.i386.h:11: > /Applications/Xcode9-beta5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVFoundation.h:88:9: fatal error: 'AVFoundation/AVRouteDetector.h' file not found https://bugzilla.xamarin.com/show_bug.cgi?id=58629 * [mmp] Fix partial static registrar removal. * [CallKit] Update to Xcode 9 beta 5. * [ARKit] ARPointCloud doesn't conform to NSCopying anymore in Xcode 9 beta 5. * [ARKit] Update to Xcode 9 beta 5 enough to make tests happy. * [CoreImage] Stub out new filters in Xcode 9 beta 5. * [tests][monotouch] Simplify some MDLMesh asserts since values change a lot between OS versions. * [mmp] Default to the dynamic registrar for release builds again, due to bug #58629. https://bugzilla.xamarin.com/show_bug.cgi?id=58629 * [tests][introspection] CXCall started implementing NSCopying without saying so in the headers. * Disable mmp static registrar tests due to 58629 for now * [quicklook] Update to beta 5 (#2450) * [photos] Update for beta 5 (#2452) Also update some existing enum members were added in beta 1 on macOS * [safariservices] Update for beta 5 (#2455) * [mediaplayer] Update to beta 5 (#2456) * [CoreLocation] Update Xcode 9 Beta 5 (#2453) * [CoreML] Update to Xcode 9 Beta 5 (#2454) * [Contacts] Update to Xcode 9 Beta 5 (#2451) * [Vision] Update to Xcode 9 Beta 5 (#2458) * [builds] Tell LLVM to stay away from newer macOS functions. (#2459) Fixes this build problem on Sierra: > ld: weak import of symbol '_futimens' not supported because of option: -no_weak_imports for architecture x86_64 This is a symbol that was (will be?) introduced in High Sierra. Interestingly this only occurs if the Xcode 8.X Command Line Tools haven't been manually installed. Because if the Xcode 8.X Command Line Tools are installed, this happens: 1. llvm's configure script detects that 'futimens' is not usable. 2. llvm's configure script detects that 'futimens' is not usable, because xcrun sets SDKROOT=/ when calling clang. a. When the SDKROOT variable is set, clang passes '-syslibroot /usr/lib' to ld. b. When ld gets '-syslibroot /usr/lib', ld looks in '/usr/lib' for a library that contains 'futimens' in the OS itself, and since we're on Sierra, that fails to link. c. So when llvm's configure script creates a test program that checks if 'futimens' is present, the program fails. This is correct, and makes llvm *not* use futimens. 3. xcrun sets SDKROOT=/ because /usr/share/current-os.sdk/Info.plist exists. If that file does not exist, then xcrun sets SDKROOT to Xcode9's macOS SDK (because that's what xcode-select reports). a. When SDKROOT is set to Xcode9's macOS SDK, the configure check for 'futimens' succeeds, because the macOS 10.13 SDK contains that function. b. llvm happily uses 'futimens', and then the final link fails because we're using a symbol not available on all target platforms. * [arkit] Update for Xcode 9 beta 5 - Part 1 (#2460) * [tests] The container app for watchOS tests should be 64-bit. (#2463) * [xharness] watchOS tests need to run in a clean environment. Works around #58348. (#2462) https://bugzilla.xamarin.com/show_bug.cgi?id=58348 * [xharness] It watchOS tests don't need to be clean anymore. Fixes #58348. (#2473) https://bugzilla.xamarin.com/show_bug.cgi?id=58348 * [uikit] UIView/UIScrollView/UIViewController up to Xcode 9 beta 5 (#2431) - Add NSDirectionalEdgeInsets type. - Includes DirectionalEdgeInsetsTest. * [AudioToolbox] Update bindings to Xcode 9 beta3 (not later changes). (#2294) * [xharness] Add a file existence check. (#2478) Fixes this exception: ``` Harness exception for 'introspection': System.IO.FileNotFoundException: Could not find file '/Users/builder/Library/Logs/CoreSimulator/27618A4A-7E49-4BAB-8F77-FA938CE88682/system.log'. File name: '/Users/builder/Library/Logs/CoreSimulator/27618A4A-7E49-4BAB-8F77-FA938CE88682/system.log' at System.IO.__Error.WinIOError (System.Int32 errorCode, System.String maybeFullPath) [0x00207] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/io/__error.cs:188 at System.IO.FileInfo.get_Length () [0x00038] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/io/fileinfo.cs:171 at xharness.CaptureLog.StopCapture () [0x00021] in /Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/xharness/Log.cs:252 at (wrapper remoting-invoke-with-check) xharness.CaptureLog:StopCapture () at xharness.AppRunner+d__68.MoveNext () [0x0127f] in /Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/xharness/AppRunner.cs:642 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:151 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00037] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () [0x00000] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 at xharness.RunSimulatorTask+d__7.MoveNext () [0x0029d] in /Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/xharness/Jenkins.cs:2894 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:151 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00037] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 at xharness.RunTestTask+d__8.MoveNext () [0x0010b] in /Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/xharness/Jenkins.cs:2538 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:151 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00037] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /private/tmp/source-mono-2017-04/bockbuild-2017-04/profiles/mono-mac-xamarin/build-root/mono-x64/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 at xharness.TestTask+d__87.MoveNext () [0x0010d] in /Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/xharness/Jenkins.cs:1870 ``` I'm not sure how this can happen, but it has on the bots [1]. [1] https://jenkins.mono-project.com/job/xamarin-macios-pr-builder/4548/Test_Report/ * Bump versions for preview 5 (#2479) * [passkit] Update to beta 5 (#2481) * [tests] Remove workaround for radar #32688391. (#2486) * [replaykit] Update up to beta 5 (#2484) * Bump maccore to get fix for bug #55064. (#2487) * [apidiff] Update definition to new 10.12 (d15-3) stable release (#2490) * [SceneKit] basic work (#2483) * [coredata] Update to beta 5 (#2488) * [homekit] Update for Xcode 9 beta 5 (#2492) * [Foundation] Update for xcode9 (#2468) * [Intents] Add bindings for Xcode 9 Beta 1, 2, 3, 4 & 5 (#2493) * [Intents] Add bindings for Xcode 9 Beta 1, 2, 3, 4 & 5 * [Intents] Implement feedback * [Intents] Add a generic version for INInteraction.GetParameterValue * [Intents] Missing check * [Contacts] Add missing foundation NSItemProviderWriting protocol to CNContact (#2496) https://bugzilla.xamarin.com/show_bug.cgi?id=58203 This is available on all Contacts supported platforms ``` ./iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/Contacts.framework/Headers/CNContact+NSItemProvider.h:@interface CNContact (NSItemProvider) ./iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.0.sdk/System/Library/Frameworks/Contacts.framework/Headers/CNContact+NSItemProvider.h:@interface CNContact (NSItemProvider) ./MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Contacts.framework/Headers/CNContact+NSItemProvider.h:@interface CNContact (NSItemProvider) ./WatchOS.platform/Developer/SDKs/WatchOS4.0.sdk/System/Library/Frameworks/Contacts.framework/Headers/CNContact+NSItemProvider.h:@interface CNContact (NSItemProvider) ./WatchSimulator.platform/Developer/SDKs/WatchSimulator4.0.sdk/System/Library/Frameworks/Contacts.framework/Headers/CNContact+NSItemProvider.h:@interface CNContact (NSItemProvider) ``` * [IntentsUI] Update to Xcode 9 Beta 1 & 2 (No changes on later betas) (#2497) * [IntentsUI] Update to Xcode 9 Beta 1 & 2 (No changes on later betas) * [IntentsUI] Better use a delegate instead so we have named params * Bump versions before 6th preview (#2514) * [arkit] Add missing MarshalDirective to ARPlaneAnchor (#2517) - Fixes bug #58648: ARPlaneAnchor.Extent property seems incorrect but changes to correct value after Debug access (https://bugzilla.xamarin.com/show_bug.cgi?id=58648) * [xtro-sharpie] Fix a compiler warning. (#2516) Fixes these warnings: Runner.cs(197,5): warning CS0642: Possible mistaken empty statement Runner.cs(199,5): warning CS0642: Possible mistaken empty statement Runner.cs(201,5): warning CS0642: Possible mistaken empty statement Runner.cs(203,5): warning CS0642: Possible mistaken empty statement Runner.cs(205,5): warning CS0642: Possible mistaken empty statement * [uikit] Update for Xcode 9 beta 5 - Part 3 (#2511) - UIKeyCommand - UINavigationBar - UINavigationItem - UIPasteboard - UITableViewHeaderFooterView * [xtro-sharpie] Remove xtro-plugin and misc other fixes. (#2522) * [xtro-sharpie] Build with msbuild and be as quiet as requested when building. * [xtro-sharpie] Must run as a 64-bit process, since the required native libraries are 64-bit. * [xtro-sharpie] Add run configurations to the project file to ease debugging in the IDE. * [xtro-sharpie] Remove xtro-plugin and the related commands. This was needed when there wasn't a 64-bit mono, in order to run xtro-sharpie in a 64-bit process. Now there is a 64-bit mono, so it's not needed anymore. Also improve makefile targets a bit, to auto-build stuff when needed, by setting the right dependencies. * Bump Xcode 9 to beta 6 (#2519) Disable watchOS tests again It seems like the Carousel crash from beta 4 is back to haunt us. This was working fine with beta 5. * Backport d15-3 SR2 fixes (#2515) * [coredata] Update to beta 6 (#2528) This seems to only revert some nullability changes from beta 5. * [coreml] Update to beta 6 (#2531) Fix our rdar 33643011 where additional setters were added in the headers but did not exists. * [videosubscriberaccount] Update to beta 6 (#2533) Only b1 and b2 introduced some additions/changes * [uikit] Update for Xcode 9 beta 6 - Part 4 (#2527) The following headers are now up to date: - UICollectionViewFlowLayout.h - UIDocumentPickerViewController.h - UIFontDescriptor.h - UIImage.h - UIImageView.h - UIImagePickerController.h * [xharness] Re-enable the watchOS tests. (#2534) It works fine for me locally, so let's see what Jenkins says. * [macos] Add new APIs in CoreWlan from Xcode9b3 (#2525) * Update AppKit bindings based on radar 33271241 results (#2518) * Update AppKit bindings based on radar 33271241 results - The header comment was updated to note it was NSSliderTouchBarItem view that has the protocol * Remove NSUserInterfaceCompression where not listed in header * [vision] Update to beta 6 (#2532) Removal of some deprecated (during beta) `init*` selectors. Also sync the versions that were inlined in subclasses - the old ones were not removed and the new ones were not added. * [xtro-sharpie] Many methods don't have selectors in Clang's API, so default to the name if no selector. (#2523) This makes a few more unclassified entries show up (mostly missing designated initializers): https://gist.github.com/rolfbjarne/07aa20f9b50b75bf3e69ac6a825e873a * [macos] Add ExternalAccessory APIs from xcode9 (#2526) * [58851] Disable NSMenuView in AllItemsWithNSMenuShouldAllowNull (#2504) * [arkit] Update for Xcode 9 beta 5 - Part 2 (#2505) - Add last missing selector. - Add tests for manual code. * [monotouch-test] Disable FontDescriptorTest.WithFeature (#2537) Disabled because it looks like the tvOS font we use: "Gujarati Sangam MN" does not have rare ligatures anymore (and the entire test is based on it). Before getting an actual fix for that, let's disable the test so it doesn't break all current builds. See: https://bugzilla.xamarin.com/show_bug.cgi?id=58929 * [xtro-sharpie] Teach xtro-sharpie about how to get protocol name from the ProtocolAttribute. (#2524) Teach xtro-sharpie about how to get protocol name from the ProtocolAttribute to calculate the native name for a TypeDefinition. Unclassified changes: https://gist.github.com/rolfbjarne/828f8ee41eebb0a3b60a38d71822fe59 * [foundation/uikit] Inline NSItemProvider_UIKitAdditions in NSItemProvider (#2538) As suggested here: https://github.com/xamarin/xamarin-macios/pull/2527#discussion_r134670981 * [intents] Fix breaking changes (api-diff) (#2543) Additions of @required members inside `INSpeakable` cannot be `[Abstract]` * [contacts] Fix breaking change (api-diff) (#2542) Type Changed: Contacts.CNPostalAddress Removed method: public static string LocalizeProperty (CNPostalAddressKeyOption option); * [macos] Reenable static registrar since Xcode9b6 un-broke SDK headers (#2544) - Fix a subtle spacing issues in PartialStaticLibrary property * [corebluetooth] Update up to beta 6 and enable it on watchOS (#2540) macOS 10.13 has finally catch up with iOS and this simplifies the bindings a bit. * [foundation] API fixes (apidiff) (#2545) 1. Let's not add new, already [Obsolete] API Type Changed: Foundation.NSDimension Added constructors: [Obsolete ("Not intended to be directly instantiated, this is an abstract class.")] public NSDimension (); 2. Fix inconsistently named API, e.g. Type Changed: Foundation.NSAttributedString Added properties: public static string[] ReadableTypeIdentifiersForItemProvider { get; } public static string[] WritableTypeIdentifiers { get; } * [pdfkit] Do not add already [Obsolete] API in new profiles (#2547) and ensure using the newer, correct API works cross-platforms iOS (before) [Obsolete ("Use 'Find (string, NSStringCompareOptions)' instead.")] public virtual PdfSelection[] Find (string text, nint options); public PdfSelection Find (string text, PdfSelection selection, Foundation.NSStringCompareOptions compareOptions); [Obsolete ("Use 'Find (string, PdfSelection, NSStringCompareOptions)' instead.")] public virtual PdfSelection Find (string text, PdfSelection selection, nint options); public void FindAsync (string text, Foundation.NSStringCompareOptions compareOptions); [Obsolete ("Use 'FindAsync (string, NSStringCompareOptions)' instead.")] public virtual void FindAsync (string text, nint options); public void FindAsync (string[] text, Foundation.NSStringCompareOptions compareOptions); [Obsolete ("Use 'FindAsync (string [], NSStringCompareOptions)' instead.")] public virtual void FindAsync (string[] text, nint options); iOS (after) public virtual PdfSelection[] Find (string text, Foundation.NSStringCompareOptions compareOptions); public virtual PdfSelection Find (string text, PdfSelection selection, Foundation.NSStringCompareOptions compareOptions); public virtual void FindAsync (string text, Foundation.NSStringCompareOptions compareOptions); public virtual void FindAsync (string[] text, Foundation.NSStringCompareOptions compareOptions); * Bump versions for the 7th preview (#2541) * Remove additions of AVKit removed in beta5 (#2536) * NSUrlSessionTask should implement NSProgressReporting for iOS (#2548) NSUrlSessionTask implements NSProgressReporting on iOS as well as Mac, so the #if MONOMAC isn't needed. * Add missing availability attributes causing failures on older iOS versions (#2550) * [vision] Minor fix wrt xtro (#2551) including some things we need to ignore manually !missing-field! VNVisionVersionNumber not bound !missing-pinvoke! VNImagePointForFaceLandmarkPoint is not bound !missing-pinvoke! VNNormalizedFaceBoundingBoxPointForLandmarkPoint is not bound * [uikit] NSFileProviderMessaging was removed in beta 2. Fixes #58222 (#2552) reference: https://bugzilla.xamarin.com/show_bug.cgi?id=58222 * [uikit] Update for Xcode 9 - Part 5 (#2546) Bindings for the following headers: - UIActivity.h - UIActivityItemProvider.h - UIAlertController.h - UIApplication.h - UIBarButtonItem.h - UIButton.h - UICollectionViewLayout.h - UIColor.h - UIControl.h - UIDocumentMenuViewController.h - UIFontMetrics.h - UIGestureRecognizer.h - UIGraphicsImageRenderer.h - UIInputViewController.h * [CoreText] Fix an extraneous free in CTFont.GetDefaultCascadeList. (#2555) We do not own the return value from CFArrayGetValueAtIndex, so don't say we do when creating CTFontDescriptor instances, since that leads to angry dragons: 2017-08-28 20:15:20.293 monotouchtest[33186:2311738] A_FontTest 2017-08-28 20:15:20.294 monotouchtest[33186:2311738] [PASS] A_FontTest.CTFontCreateWithFontDescriptorAndOptions 2017-08-28 20:15:20.295 monotouchtest[33186:2311738] [PASS] A_FontTest.CTFontCreateWithNameAndOptions 2017-08-28 20:15:20.296 monotouchtest[33186:2311738] critical: Stacktrace: at <0xffffffff> at (wrapper managed-to-native) CoreText.CTFont.CTFontCopyDefaultCascadeListForLanguages (intptr,intptr) [0x0000a] in :0 at CoreText.CTFont.GetDefaultCascadeList (string[]) [0x00013] in /work/maccore/xcode9/xamarin-macios/src/CoreText/CTFont.cs:2185 at MonoTouchFixtures.CoreText.A_FontTest.GetCascadeList () [0x0001e] in /work/maccore/xcode9/xamarin-macios/tests/monotouch-test/CoreText/FontTest.cs:78 at (wrapper runtime-invoke) object.runtime_invoke_void__this__ (object,intptr,intptr,intptr) [0x0004f] in <7c58d77f8ca548d5b9b32e70a64ba2fd>:0 at <0xffffffff> at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) [0x00016] in <7c58d77f8ca548d5b9b32e70a64ba2fd>:0 at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) [0x00032] in /work/maccore/xcode9/xamarin-macios/external/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:305 at System.Reflection.MethodBase.Invoke (object,object[]) [0x00000] in /work/maccore/xcode9/xamarin-macios/external/mono/mcs/class/referencesource/mscorlib/system/reflection/methodbase.cs:229 at NUnit.Framework.Internal.Reflect.InvokeMethod (System.Reflection.MethodInfo,object,object[]) [0x00009] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Reflect.cs:215 at NUnit.Framework.Internal.Commands.TestMethodCommand.RunNonAsyncTestMethod (NUnit.Framework.Internal.TestExecutionContext) [0x00025] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/TestMethodCommand.cs:116 at NUnit.Framework.Internal.Commands.TestMethodCommand.RunTestMethod (NUnit.Framework.Internal.TestExecutionContext) [0x0001a] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/TestMethodCommand.cs:90 at NUnit.Framework.Internal.Commands.TestMethodCommand.Execute (NUnit.Framework.Internal.TestExecutionContext) [0x00000] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/TestMethodCommand.cs:66 at NUnit.Framework.Internal.Commands.SetUpTearDownCommand.Execute (NUnit.Framework.Internal.TestExecutionContext) [0x00007] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/Commands/SetUpTearDownCommand.cs:84 at NUnit.Framework.Internal.WorkItems.SimpleWorkItem.PerformWork () [0x00000] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/SimpleWorkItem.cs:64 at NUnit.Framework.Internal.WorkItems.WorkItem.RunTest () [0x00071] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:196 at NUnit.Framework.Internal.WorkItems.WorkItem.Execute (NUnit.Framework.Internal.TestExecutionContext) [0x00063] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:136 at NUnit.Framework.Internal.WorkItems.CompositeWorkItem.RunChildren () [0x00035] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CompositeWorkItem.cs:154 at NUnit.Framework.Internal.WorkItems.CompositeWorkItem.PerformWork () [0x000de] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CompositeWorkItem.cs:93 at NUnit.Framework.Internal.WorkItems.WorkItem.RunTest () [0x00071] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:196 at NUnit.Framework.Internal.WorkItems.WorkItem.Execute (NUnit.Framework.Internal.TestExecutionContext) [0x00063] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:136 at NUnit.Framework.Internal.WorkItems.CompositeWorkItem.RunChildren () [0x00035] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CompositeWorkItem.cs:154 at NUnit.Framework.Internal.WorkItems.CompositeWorkItem.PerformWork () [0x000de] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CompositeWorkItem.cs:93 at NUnit.Framework.Internal.WorkItems.WorkItem.RunTest () [0x00071] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:196 at NUnit.Framework.Internal.WorkItems.WorkItem.Execute (NUnit.Framework.Internal.TestExecutionContext) [0x00063] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:136 at NUnit.Framework.Internal.WorkItems.CompositeWorkItem.RunChildren () [0x00035] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CompositeWorkItem.cs:154 at NUnit.Framework.Internal.WorkItems.CompositeWorkItem.PerformWork () [0x000de] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/CompositeWorkItem.cs:93 at NUnit.Framework.Internal.WorkItems.WorkItem.RunTest () [0x00071] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:196 at NUnit.Framework.Internal.WorkItems.WorkItem.Execute (NUnit.Framework.Internal.TestExecutionContext) [0x00063] in /work/maccore/xcode9/xamarin-macios/external/mono/external/nunit-lite/NUnitLite-1.0.0/src/framework/Internal/WorkItems/WorkItem.cs:136 at MonoTouch.NUnit.UI.BaseTouchRunner.Run (NUnit.Framework.Internal.Test) [0x0004d] in /work/maccore/xcode9/xamarin-macios/external/Touch.Unit/NUnitLite/TouchRunner/TouchRunner.cs:442 at MonoTouch.NUnit.UI.BaseTouchRunner.Run () [0x00030] in /work/maccore/xcode9/xamarin-macios/external/Touch.Unit/NUnitLite/TouchRunner/TouchRunner.cs:171 at MonoTouch.Dialog.StringElement.Selected (MonoTouch.Dialog.DialogViewController,UIKit.UITableView,Foundation.NSIndexPath) [0x00008] in /work/maccore/xcode9/xamarin-macios/external/MonoTouch.Dialog/MonoTouch.Dialog/Elements.cs:765 at MonoTouch.Dialog.DialogViewController.Selected (Foundation.NSIndexPath) [0x00026] in /work/maccore/xcode9/xamarin-macios/external/MonoTouch.Dialog/MonoTouch.Dialog/DialogViewController.cs:577 at MonoTouch.Dialog.DialogViewController/Source.RowSelected (UIKit.UITableView,Foundation.NSIndexPath) [0x00016] in /work/maccore/xcode9/xamarin-macios/external/MonoTouch.Dialog/MonoTouch.Dialog/DialogViewController.cs:402 at (wrapper runtime-invoke) .runtime_invoke_void__this___object_object (object,intptr,intptr,intptr) [0x0005d] in <32f0c196c5bc4aa18daea2ee64a7814e>:0 at <0xffffffff> at (wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) [0x0005c] in :0 at UIKit.UIApplication.Main (string[],intptr,intptr) [0x00005] in /work/maccore/xcode9/xamarin-macios/src/UIKit/UIApplication.cs:79 at UIKit.UIApplication.Main (string[],string,string) [0x00038] in /work/maccore/xcode9/xamarin-macios/src/UIKit/UIApplication.cs:63 at monotouchtest.Application.Main (string[]) [0x00011] in /work/maccore/xcode9/xamarin-macios/tests/monotouch-test/Main.cs:27 at (wrapper runtime-invoke) .runtime_invoke_void_object (object,intptr,intptr,intptr) [0x00051] in <30a7f7e09de9467b8b454221034a0e38>:0 Native stacktrace: 0 monotouchtest 0x000000010fca03c4 mono_handle_native_crash + 244 1 monotouchtest 0x000000010fcadd30 mono_sigsegv_signal_handler + 288 2 libsystem_platform.dylib 0x000000011feb3b3a _sigtramp + 26 3 CoreFoundation 0x000000011de035a2 computeSanitizedString + 146 4 CoreText 0x00000001168df314 _ZN15TPurgeableCache19RetainedValueForKeyEPKv + 54 5 CoreText 0x00000001168def85 _ZNK17TDescriptorSource22CopyDescriptorUncachedEPK7__CFURLbPK10__CFString + 55 6 CoreText 0x00000001168df34f _ZNK17TDescriptorSource14CopyDescriptorEPK7__CFURLbPK10__CFString + 27 7 CoreText 0x00000001168e20ad _ZNK17TDescriptorSource35CopyFontDescriptorPerPostScriptNameEPK10__CFStringmm + 297 8 CoreText 0x00000001168dfd9e _ZNK17TDescriptorSource30CopySystemFontDescriptorByNameEPK10__CFString10UIFontFlag + 54 9 CoreText 0x00000001168e54c4 _ZNK14TFontFallbacks17CopyFontFallbacksEPK10__CFStringS2_PK9__CFArray + 652 10 CoreText 0x00000001168e4a00 _ZNK14TFontFallbacks29CopyFontFallbacksForLanguagesEPK10__CFStringPK9__CFArray + 122 11 CoreText 0x00000001168e4971 _ZN17TDescriptorSource39CopyDefaultSubstitutionListForLanguagesEPK10__CFStringPK9__CFArray + 61 12 CoreText 0x00000001169397a7 _ZNK9TBaseFont28CreateSystemDefaultFallbacksEPK10__CFStringPK9__CFArray + 51 13 CoreText 0x000000011693999c _ZNK9TBaseFont15CreateFallbacksE10UIFontFlagPPK16__CFCharacterSetPK9__CFArray + 346 14 CoreText 0x00000001168c1036 _ZNK5TFont24CreateDefaultCascadeListEPK9__CFArray + 242 15 CoreText 0x00000001168b8ff9 CTFontCopyDefaultCascadeListForLanguages + 97 16 ??? 0x0000000140eaefd3 0x0 + 5384105939 17 ??? 0x0000000140eae761 0x0 + 5384103777 18 ??? 0x000000013c9c8e74 0x0 + 5311860340 19 monotouchtest 0x000000010fcb0c89 mono_jit_runtime_invoke + 1273 20 monotouchtest 0x000000010fd6e3a8 do_runtime_invoke + 88 21 monotouchtest 0x000000010fd71bac mono_runtime_try_invoke_array + 1292 22 monotouchtest 0x000000010fd15587 ves_icall_InternalInvoke + 647 23 ??? 0x000000013e9fcd13 0x0 + 5345627411 24 ??? 0x000000013e9fc738 0x0 + 5345625912 25 ??? 0x000000013e9fded5 0x0 + 5345631957 26 ??? 0x000000013e9fbb76 0x0 + 5345622902 27 ??? 0x000000013e9e237e 0x0 + 5345518462 28 ??? 0x000000013e9e237e 0x0 + 5345518462 29 ??? 0x000000013e9e237e 0x0 + 5345518462 30 ??? 0x000000013e9e237e 0x0 + 5345518462 31 ??? 0x000000013e873006 0x0 + 5344014342 32 monotouchtest 0x000000010fcb0c89 mono_jit_runtime_invoke + 1273 33 monotouchtest 0x000000010fd6e3a8 do_runtime_invoke + 88 34 monotouchtest 0x000000010fd6e320 mono_runtime_invoke + 208 35 monotouchtest 0x000000010fe71af1 xamarin_invoke_trampoline + 5617 36 monotouchtest 0x000000010fe79ddd xamarin_arch_trampoline + 189 37 monotouchtest 0x000000010fe7b1a1 xamarin_x86_64_common_trampoline + 110 38 UIKit 0x0000000111b9876b -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1810 39 UIKit 0x0000000111b98986 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 344 40 UIKit 0x0000000111a6b5c9 _runAfterCACommitDeferredBlocks + 318 41 UIKit 0x0000000111a59dad _cleanUpAfterCAFlushAndRunDeferredBlocks + 280 42 UIKit 0x0000000111a89f68 _afterCACommitHandler + 137 43 CoreFoundation 0x000000011de3ddb7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 44 CoreFoundation 0x000000011de3dd0e __CFRunLoopDoObservers + 430 45 CoreFoundation 0x000000011de22324 __CFRunLoopRun + 1572 46 CoreFoundation 0x000000011de21a89 CFRunLoopRunSpecific + 409 47 GraphicsServices 0x0000000121b7e9c6 GSEventRunModal + 62 48 UIKit 0x0000000111a5f7d0 UIApplicationMain + 159 49 ??? 0x000000013c9c4474 0x0 + 5311841396 50 ??? 0x000000013c9c40ad 0x0 + 5311840429 ================================================================= Got a SIGSEGV while executing native code. This usually indicates a fatal error in the mono runtime or one of the native libraries used by your application. ================================================================= * [monotouch-test] Don't subclass MKMapView. (#2556) MKMapView doesn't like being subclassed (Apple says "you should not subclass the MKMapView class itself"). Bad things like this starts happening: Thread 0 name: tid_303 Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libsystem_kernel.dylib 0x0000000186b25348 __pthread_kill + 8 1 libsystem_pthread.dylib 0x0000000186c39354 pthread_kill$VARIANT$mp + 396 2 libsystem_c.dylib 0x0000000186a94fd8 abort + 140 3 monotouchtest 0x0000000101c02c14 mono_handle_native_crash + 22047764 (mini-exceptions.c:2548) 4 monotouchtest 0x0000000101c0d02c mono_sigsegv_signal_handler + 22089772 (mini-runtime.c:2886) 5 libsystem_platform.dylib 0x0000000186c33b60 _sigtramp + 52 6 CoreFoundation 0x0000000186f93108 cow_cleanup + 112 7 CoreFoundation 0x0000000186f93108 cow_cleanup + 112 8 CoreFoundation 0x0000000186eda51c -[__NSArrayM dealloc] + 68 9 CoreFoundation 0x000000018703f5c8 __CFBasicHashDrain + 312 10 CoreFoundation 0x0000000186fb5b44 _CFRelease + 224 11 CoreText 0x000000018a808404 TDescriptorSource::PurgeFontFallbacksCache+ 488452 () + 92 12 CoreText 0x000000018a808374 TDescriptorSource::PurgeFromCaches+ 488308 (__CFURL const*) const + 176 13 CoreText 0x000000018a7eec74 CTFontRemoveFromCaches + 168 14 VectorKit 0x0000000196a539b0 +[VKSharedResourcesManager removeResourceUser:] + 324 15 VectorKit 0x0000000196ca27a4 md::MapEngine::~MapEngine+ 2643876 () + 360 16 VectorKit 0x0000000196ca2634 md::MapEngine::~MapEngine+ 2643508 () + 12 17 libobjc.A.dylib 0x000000018651eef4 object_cxxDestructFromClass+ 28404 (objc_object*, objc_class*) + 148 18 libobjc.A.dylib 0x000000018652c638 objc_destructInstance + 88 19 libobjc.A.dylib 0x000000018652c690 object_dispose + 16 20 QuartzCore 0x000000018afca3ac -[CALayer dealloc] + 116 21 VectorKit 0x0000000196a43294 -[VKMapView dealloc] + 940 22 QuartzCore 0x000000018af6aafc CA::release_objects+ 744188 (X::List*) + 32 23 QuartzCore 0x000000018afd97d8 CA::Layer::~Layer+ 1198040 () + 276 24 QuartzCore 0x000000018afca37c -[CALayer dealloc] + 68 25 QuartzCore 0x000000018af6b16c CA::Transaction::commit+ 745836 () + 1052 26 UIKit 0x0000000190393290 _afterCACommitHandler + 256 27 CoreFoundation 0x0000000186fb38b8 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 28 CoreFoundation 0x0000000186fb1270 __CFRunLoopDoObservers + 412 29 CoreFoundation 0x0000000186fb182c __CFRunLoopRun + 1292 30 CoreFoundation 0x0000000186ed22d8 CFRunLoopRunSpecific + 436 31 GraphicsServices 0x0000000188d58f84 GSEventRunModal + 100 32 UIKit 0x000000019040427c UIApplicationMain + 208 33 monotouchtest 0x000000010106eb90 wrapper_managed_to_native_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr + 9907088 (/:1) 34 monotouchtest 0x0000000100f0d6ac UIKit_UIApplication_Main_string___intptr_intptr + 8459948 (UIApplication.cs:79) 35 monotouchtest 0x0000000100f0d66c UIKit_UIApplication_Main_string___string_string + 8459884 (UIApplication.cs:63) 36 monotouchtest 0x0000000100b10450 monotouchtest_Application_Main_string__ + 4277328 (Main.cs:27) 37 monotouchtest 0x0000000100e0c244 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 244 38 monotouchtest 0x0000000101c10048 mono_jit_runtime_invoke + 22102088 (mini-runtime.c:2526) 39 monotouchtest 0x0000000101c75eec do_runtime_invoke + 22519532 (object.c:2829) 40 monotouchtest 0x0000000101c78a3c do_exec_main_checked + 22530620 (object.c:4623) 41 monotouchtest 0x0000000101bf9a1c mono_jit_exec + 22010396 (driver.g.c:1040) 42 monotouchtest 0x0000000101d13d60 xamarin_main + 23166304 (monotouch-main.m:482) 43 monotouchtest 0x00000001007de710 main + 927504 (main.m:67) 44 libdyld.dylib 0x00000001869f656c start + 4 * [introspection] Let SkipDueToAttributeInProperty skip setters too (#2557) `SkipDueToAttributeInProperty` which is used to check the availability attribute of properties when the Availability info only exist on the property and not on the property Getter or Setter was wrong. This lead to `setSpringLoaded` (which was introduced in iOS 11) to not be ignored by the test (making it fail). - Fix bug #59085: [introspection-ios] selector not found for UIKit.UIBarButtonItem : setSpringLoaded: - Broken test (https://bugzilla.xamarin.com/show_bug.cgi?id=59085) * [corevideo][watchos] Enable CoreVideo on watchOS (#2553) * [storekit] Fix CampaignToken typo (#2559) (#2560) - Fixes bug #59078: StoreProductParameters and invalid property for CampaignToken (https://bugzilla.xamarin.com/show_bug.cgi?id=59078) * [coreml][watchos] Enable API using CoreVideo on watchOS. Fix #58097 (#2561) https://bugzilla.xamarin.com/show_bug.cgi?id=58097 * Add missing [MarshalDirective] attributes. (#2558) * [bindings-generator] Improve build & project file. * Add missing [MarshalDirective] attributes. Add missing [MarshalDirective] attributes, which also requires implementing support for out parameters in the binding generator, since one of the signatures missing the [MarshalDirective] contains such an out parameter. Also add tests for all the API I've added [MarshalDirective] to. * [bindings-generator] Remove redundant if check. * [monotouch-test] Rename file to end with 'Test.cs'. * [tests] Fix a few build errors for Xamarin.Mac. * [uikit] Fix UIColor and UIInputViewController tvOS availability (#2569) - Fixes introspection tests on tvOS 10. * [storekit] Fix SKCloudServiceSetupMessageIdentifier and SKProductStorePromotionController tvOS availability (#2568) - Fixes introspection tests on tvOS 10. * [mapkit] Fix MKMapItemTypeIdentifier tvOS availability (#2566) - Also remove double [Mac] availability attribute. - Fixes introspection tests on tvOS 10. * [ARKit] Fix marshalling for ARPointCloud.RawFeaturePoints. (#2565) ARPointCloud.RawFeaturePoints is an array of Vector3, but each vector is 16-byte aligned (as if it were an array of Vector4). This means we need to account for this when creating a managed array from pointer to the native C-style array. * [ModelIO] Fix MDLVoxelIndexExtent struct. (#2564) The MDLVoxelIndexExtent is a struct containing two 4-dimensional vectors of integers (not floats, as originally and incorrectly implemented). Fix this my creating a new MDLVoxelIndexExtent2 struct with the right fields, re-implement all the API that exposes this struct and obsolete the old API. Also add missing [MarshalDirective] attributes. And write a test to make sure it works fine now and forever. * [coredata] Enable new fields since rdar #33878590 is fixed w/beta 6 (#2570) reference: https://trello.com/c/dlSRYPFx * [xtro-sharpie] Add a Simd check class to verify signatures with Simd types. * [Simd] Add simd matrix types. The OpenTK matrices (Matrix2/3/4) has a different memory layout than Apple's matrix_float2x2/matrix_float3x3/matrix_float4x4 matrices: the OpenTK versions are row-major, while Apple's versions are column-major. This means that when blitting memory from one to the other, the matrix will appear to have been transposed. See bug #[58599][2] for an example. Unfortunately we've already bound several API with Apple's matrix_floatXxX matrices using OpenTK's matrices, and although they're bound wrong, and the matrices appear transposed on input/output, we can't change the behavior because we have to maintain compatibility. This means we have to introduce new API, and then also just define new matrix types with the right memory layout (column-major). Additionally, in the future we might be able to mark these matrices as Simd-matrixes, so that the JIT/AOT compiler can generate the correct alignment for them, avoiding having to define a native conversion method (using the [MarshalDirective] hack). The matrices have been designed to match API-wise the matrices in the System.Numerics.Vectors namespace [1], but for the moment with only a few basic operations implemented (Determinant/Transpose/Multiply) defined (we can always add more later if we want to). In addition explicit conversion operators to and from the corresponding OpenTK.MatrixX are implemented, which means any operation defined in the OpenTK matrices can be used by converting back and forth. [1]: https://msdn.microsoft.com/en-us/library/system.numerics.matrix4x4(v=vs.111).aspx [2]: https://bugzilla.xamarin.com/show_bug.cgi?id=58599 * [ARKit] Use the new Simd matrix types. * [Vision] Use the new Simd matrix types. * [ModelIO] Use the new Simd-compatible matrix types, and deprecate the old API. * [GameplayKit] Use the new Simd-compatible matrix types, and deprecate the old API. * [SpriteKit] Use the new Simd-compatible matrix types, and deprecate the old API. * [xtro] Don't report missing [MarshalDirective] for obsolete methods. * [xtro] Remove unnecessary ignores. The implementation changed, and these stayed accidentally. * [wkwebkit] Fix (native) protocol names (#2572) Also ignore xtro's WKSnapshotConfiguration since it's an Apple bug 34185961 reference (xtro) !missing-protocol! WKURLSchemeHandler not bound !missing-protocol! WKURLSchemeTask not bound !unknown-protocol! WKUrlSchemeHandler bound !unknown-protocol! WKUrlSchemeTask bound !unknown-type! WKSnapshotConfiguration bound * [uikit] Fix enums availability attributes (#2575) - Fixes bug #59132: [uikit] Extra types in watchOS (https://bugzilla.xamarin.com/show_bug.cgi?id=59132) * [watchkit] Add missing designated initializers (#2574) references (xtro) !missing-designated-initializer! WKInterfaceController::init is missing an [DesignatedInitializer] attribute !missing-designated-initializer! WKUserNotificationInterfaceController::init is missing an [DesignatedInitializer] attribute * [xtro] Reword some of the Simd diagnostic messages according to review. * [tests] Make sure test symbols don't clash between different test libraries. Fixes this build problem for framework-test: clang: error: linker command failed with exit code 1 (use -v to see invocation) MTOUCH: error MT5212: Native linking failed, duplicate symbol: '_x_mdltransform_get_rotation_matrix'. MTOUCH: error MT5213: Duplicate symbol in: /Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/framework-test/obj/iPhoneSimulator/Debug-unified/mtouch-cache/XStaticObjectTest.framework/XStaticObjectTest (Location related to previous error) MTOUCH: error MT5213: Duplicate symbol in: /Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/framework-test/obj/iPhoneSimulator/Debug-unified/mtouch-cache/XStaticArTest.framework/XStaticArTest(libtest-ar.x86_64.o) (Location related to previous error) MTOUCH: error MT5212: Native linking failed, duplicate symbol: '_x_mdltransformcomponent_get_local_transform'. MTOUCH: error MT5212: Native linking failed, duplicate symbol: '_x_mdltransform_create_global_transform'. MTOUCH: error MT5212: Native linking failed, duplicate symbol: '_x_get_matrix_float4x4'. MTOUCH: error MT5212: Native linking failed, duplicate symbol: '_x_get_matrix_float3x3'. MTOUCH: error MT5212: Native linking failed, duplicate symbol: '_x_get_matrix_float2x2'. MTOUCH: error MT5209: Native linking error: 6 duplicate symbols for architecture x86_64 MTOUCH: error MT5202: Native linking failed. Please review the build log. * [tests] Since libtest.a need ModelIO now, the corresponding LinkWith attributes need to state that too. * [introspection] Don't check native signatures on obsolete members, and ignore the right simd matrix types. Fixes this introspection/Mac problem: ***** ApiSignatureTest.NativeSignatures Selector: uniformWithName:matrixFloat2x2: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat2x2, nothing encoded Selector: uniformWithName:matrixFloat3x3: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat3x3, nothing encoded Selector: uniformWithName:matrixFloat4x4: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat4x4, nothing encoded Selector: setMatrixFloat2x2Value: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat2x2, nothing encoded Selector: setMatrixFloat3x3Value: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat3x3, nothing encoded Selector: setMatrixFloat4x4Value: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat4x4, nothing encoded Selector: initWithName:matrixFloat2x2: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat2x2, nothing encoded Selector: initWithName:matrixFloat3x3: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat3x3, nothing encoded Selector: initWithName:matrixFloat4x4: on type SpriteKit.SKUniform, Type: Simd.MatrixFloat4x4, nothing encoded * [monotouch-tests] Include more custom asserts for watchOS to make the build work. Fixes this: Simd/MatrixFloat4x4Test.cs(28,12): error CS0117: 'Asserts' does not contain a definition for 'AreEqual' Simd/MatrixFloat4x4Test.cs(29,12): error CS0117: 'Asserts' does not contain a definition for 'AreEqual' Simd/MatrixFloat4x4Test.cs(37,12): error CS0117: 'Asserts' does not contain a definition for 'AreEqual' Simd/MatrixFloat4x4Test.cs(48,12): error CS0117: 'Asserts' does not contain a definition for 'AreEqual' [...] * [monotouch-test] Exclude code that requires the binding project from xammac tests. Exclude code that requires the test binding project from xammac tests because there's currently no XM version of the test binding project. Fixes this: tests/monotouch-test/SpriteKit/UniformTest.cs(20,7): error CS0246: The type or namespace name 'Bindings' could not be found (are you missing a using directive or an assembly reference?) tests/monotouch-test/ModelIO/MDLMaterialProperty.cs(37,7): error CS0246: The type or namespace name 'Bindings' could not be found (are you missing a using directive or an assembly reference?) tests/monotouch-test/ModelIO/MDLTransform.cs(34,7): error CS0246: The type or namespace name 'Bindings' could not be found (are you missing a using directive or an assembly reference?) * Bump version for preview #8 (#2576) * [spritekit] Audit fixes (xtro) (#2577) 1. SKVideoNode is now, partially, available on watchOS and does not require the extra, manual code to swicth selectors depending on the OS version being run. !missing-type! SKVideoNode not bound !missing-selector! SKVideoNode::anchorPoint not bound !missing-selector! SKVideoNode::initWithCoder: not bound !missing-selector! SKVideoNode::initWithFileNamed: not bound !missing-selector! SKVideoNode::initWithURL: not bound !missing-selector! SKVideoNode::setAnchorPoint: not bound !missing-selector! SKVideoNode::setSize: not bound !missing-selector! SKVideoNode::size not bound !missing-selector! +SKVideoNode::videoNodeWithFileNamed: not bound !missing-selector! +SKVideoNode::videoNodeWithURL: not bound 2. SKNodeFocusBehavior is exposed needlessly on watchOS because SpriteKit/Enums.cs was not processed by the generator, so [NoWatch] did not matter. !unknown-native-enum! SKNodeFocusBehavior bound It's also visible on macOS but nothing uses it (so we do not expose it needlessly) !missing-enum! SKNodeFocusBehavior not bound 3. Add missing designated initializer on default `init` !missing-designated-initializer! SKAttributeValue::init is missing an [DesignatedInitializer] attribute !missing-designated-initializer! SKNode::init is missing an [DesignatedInitializer] attribute 4. Remove inconsistency for SKNode subclasses wrt XAMCORE_4_0 The trio attributeValues, setAttributeValues and setValue:forAttributeNamed: that was moved from SKNode (deprecated) into its subclasses. This was done using XAMCORE_4_0 but not on every subclasses. This adds them everywhere to be consistent (only SKNode versions are not defined in XAMCORE_4_0) !missing-selector! SKEffectNode::attributeValues not bound !missing-selector! SKEffectNode::setAttributeValues: not bound !missing-selector! SKEffectNode::setValue:forAttributeNamed: not bound !missing-selector! SKEffectNode::valueForAttributeNamed: not bound !missing-selector! SKEmitterNode::attributeValues not bound !missing-selector! SKEmitterNode::setAttributeValues: not bound !missing-selector! SKEmitterNode::setValue:forAttributeNamed: not bound !missing-selector! SKEmitterNode::valueForAttributeNamed: not bound !missing-selector! SKSpriteNode::attributeValues not bound !missing-selector! SKSpriteNode::setAttributeValues: not bound !missing-selector! SKSpriteNode::setValue:forAttributeNamed: not bound !missing-selector! SKSpriteNode::valueForAttributeNamed: not bound * [introspection] Make sure '[FAIL]' is printed before every failure. (#2578) This makes xharness able to list the failures in the inline summary. * [xtro] Reword some of the Simd diagnostic messages according to review. * [xharness] Add a missing IsServerMode check to generate correct html. (#2581) * [SpriteKit] SKTransformNode is new in Xcode 9 so no need to keep the broken (and obsolete) non-simd version of RotationMatrix. * [intents] Fix some (partial) xtro issues and #59156 (#2585) reference https://bugzilla.xamarin.com/show_bug.cgi?id=59156 Remaining issues are filled in https://bugzilla.xamarin.com/show_bug.cgi?id=59183 !missing-selector! +INCarSeatResolutionResult::confirmationRequiredWithCarSeatToConfirm: not bound !missing-selector! +INCarSeatResolutionResult::successWithResolvedCarSeat: not bound !missing-selector! +INNotebookItemTypeResolutionResult::disambiguationWithValuesToDisambiguate: not bound * [Intents] Confirm* interface methods should be bound as Confirm, Fixes Bug 59164 (#2591) * [Intents] Confirm* interface methods should probably be bound as Confirm, Fixes Bug 59164 https://bugzilla.xamarin.com/show_bug.cgi?id=59164 All Confirm* methods from *IntentHandling interfaces should be named just `Confirm` to avoid confusion because most of them do not directly confirm as an acion, but instead they **ask** for confirmation also we would follow swift's naming by doing this. * [Intents] XAMCORE_4_0 all Confirm* methods from *IntentHandling Turns any Confirm* into just Confirm inside a XAMCORE_4_0 block, * [Intents] Fix breaking changes in Intents added in Xcode 9 Bindings (#2590) Apple added more protocol conformances to INRidesharingDomainHandling and INPaymentsDomainHandling protocols in Xcode 9, I introduced these breaking changes back when I did intents binding so fixing them :) * [Metal] New bindings from Xcode 9 betas (#2457) * [AVFoundation] Updated bindings for xcode9. (#2272) * [Xcode9] Add IOSurface bindings (#2363) * This framework was a private framework before iOS 11. This framework was a private framework before iOS 11, yet the headers claim many API were introduced in iOS 10. So take account of this difference by using the private framework location in iOS 10.3 or earlier. Testing these API from Xcode works fine when run on an iOS 10.3 device, and I've confirmed the IOSurface framework is loaded from the private frameworks path on older devices (and when built using Xcode 9 and linked with the public framework path). * Disable code to make IOSurface work on iOS 10. Disable the code to make IOSurface work on iOS 10, since it may be rejected by the App Store. This also means adjusting the availability attributes, so that the introspection tests pass (and to document that technically these API won't work when used with Xamarin.iOS in iOS 10). I've filed bug #[59201][1] to keep track of this, maybe we can re-enable this later. [1]: https://bugzilla.xamarin.com/show_bug.cgi?id=59201 * [CoreMedia] Fix leak in CMAttachmentBearer.GetAttachments. (#2593) The caller owns the return value from CMCopyDictionaryOfAttachments, so tell Runtime.GetNSObject that. * [Intents] Adds missing API found by xtro, fixes Bug 59183 (#2596) https://bugzilla.xamarin.com/show_bug.cgi?id=59183 Fixes !missing-selector! +INNotebookItemTypeResolutionResult::disambiguationWithValuesToDisambiguate: not bound !missing-selector! +INCarSeatResolutionResult::confirmationRequiredWithCarSeatToConfirm: not bound !missing-selector! +INCarSeatResolutionResult::successWithResolvedCarSeat: not bound !incorrect-protocol-member! INUIHostedViewControlling::configureWithInteraction:context:completion: is OPTIONAL and should NOT be abstract * [xtro] Fix StartWorkingDirectory to enable debugging (#2598) * [iosurface] Enable for tvOS and XM classic (to avoid multiple defines around consumer API) (#2597) * [xtro] Fix EnumCheck (#2600) * [ARKit] Rename a few method to make them nicer. (#2604) * DisplayTransform -> GetDisplayTransform since methods should have verbs. * SessionWasInterrupted -> WasInterrupted and SessionInterruptionEnded -> InterruptionEnded since these names match better with the other names (CameraDidChangeTrackingState / DidFail / DidOutputAudioSampleBuffer: none are prefixed with 'Session'). Additionally, the type is a Model (for the delegate pattern), which means all methods are more-or-less event-like, and the first argument is always the same (the protocol itself), which is another indicator the methods should be named similarly. * [Foundation] Remove 'Key' suffix from some fields. (#2606) Of the 168 fields in NSMetadataItem, only these 5 hadn't removed the 'Key' suffix. So make them all equivalent by removing the 'Key' suffix from these 5 fields. * [ImageIO] Fix API to not duplicate the instance in instance methods. (#2609) An instance method does not need to take the instance as a parameter, so remove the first (instance) parameter for CGImageDestination.AddAuxiliaryDataInfo and CGImageSource.CopyAuxiliaryDataInfo. An alternative solution would be to make the methods static, but I like the instance API better. * [UIKit] De-model UIDataSourceTranslating. (#2603) It's not clear from neither the documentation nor the headers how this protocol is supposed to be used, and since it doesn't correspond to the delegate pattern, remove the [Model] attribute for now. We can always add it back later. * [CoreML] Improve API. (#2592) * [CoreML] Improve API. * The indices, shape and stride properties for MLMultiArray and MLMultiArrayConstraint can logically only be arrays of integers, so type them as such. This means adding overloads for MLMultiArray's constructors, GetObject and SetObject methods, and the indexers that takes nint[] arrays instead of NSNumber[] arrays. * Change MLFeatureValue's static factory methods to be a method ('Create') instead of a preposition, and call all the different factory methods the same, since they can be overloaded nicely. * [tests][monotouch-test] Add version check to MLMultiArrayTest and make sure the arrays we create are big enough for the data we put in them. * [tests][monotouch-test] MLMultiArray's elements aren't zero-initialized, so don't assume that in the tests. * Support overloading Objective-C methods based on static/instance. (#2607) Two Objective-C methods can be named identically as long as one is static and the other instance. We must support this since Apple did just this (in the NSItemProviderReading / NSItemProviderWriting protocols). We solve it by prepending a '+' or '-' to the selector when hashing it (to determine selector uniqueness, and to look the method up again at runtime). * [uikit] Update for Xcode 9 - Part 6 (#2602) NSAttributedString.h NSFileProviderExtension.h NSLayoutAnchor.h UIAccessibility.h UIAccessibilityAdditions.h UIAccessibilityContainer.h UIAccessibilityContentSizeCategoryImageAdjusting.h UIAccessibilityCustomRotor.h UIAccessibilityLocationDescriptor.h UITabBar.h UINavigationBar.h UIScreen.h * Xcode9 scenekit (#2512) * [SceneKit] basic work * Added key * [xcode9] SCNCameraController * [xcode9] SCNCamera updates * [xcode9] SCNMaterial * [xcode9] SCNGeometryTessellator, SCNCameraControlConfiguration, SCNView, small bits * Add trailing commas to last enum value * Remove whitespace noise * [scenekit] Update deprecated attributes messages * Addresses some of Rolf's feedback * Drop the WeakDelegate in SCNCameraController * Rename method to Render, remove ctor from class that can not be constructed in Palygrounds, add typo exception * [AppKit] Rename NSBezierPath.AppendBezierPathWithCGGlyph to match its sibling methods. (#2605) NSBezierPath contains a lot of 'AppendPathWithXXX' methods, that all map to 'appendBezierPathXXX' selectors. So rename AppendBezierPathWithCGGlyph accordingly, to make it more similar to the other methods in the same type. * [uikit] Add all UISpringLoadedInteractionSupporting (#2616) Types do not conform to the protocol but protocol methods work on those types (see monotouch-test). Fixed introspection tests accordingly and tested the selectors in monotouch-test. * [Intents] Add convenience ctor overload and call correct base ctor in manual ctor. (#2613) Add a convenience constructor overload in INGetUserCurrentRestaurantReservationBookingsIntent that uses nint instead of NSNumber, since logically "number of results" will always be some sort of integer. Also call the correct base constructor in INSpeakableString's custom constructor (same as any other generated constructor). Otherwise we end up doing something like this: [[[INSpeakableString alloc] init] initWith ...], i.e. calling two different init methods. * [coreimage] Add new headers API up to beta 6 (#2601) Filters are not complete (ref: #57350) https://bugzilla.xamarin.com/show_bug.cgi?id=57350 * Some new constants are not yet documented (type is known), so they are commented / ignored https://bugzilla.xamarin.com/show_bug.cgi?id=59296 * Filled bug for [Wrap] inside [Category] so strong dictionary helpers can be re-enabled later https://bugzilla.xamarin.com/show_bug.cgi?id=59294 * [foundation] xtro fixes for watchOS (#2586) !missing-enum! NSProcessInfoThermalState not bound !missing-field! NSProcessInfoThermalStateDidChangeNotification not bound !missing-selector! NSProcessInfo::thermalState not bound Headers are wrong and preferredPresentationStyle is not in tvOS and watchOS !missing-selector! NSItemProvider::preferredPresentationStyle not bound !missing-selector! NSItemProvider::setPreferredPresentationStyle: not bound * [uikit] Also remove UIPreferredPresentationStyle enum from platform where it's not used * [Foundation] Improve NSItemProviderReading & NSItemProviderWriting protocols/compliance. (#2614) * [Foundation] Improve NSItemProviderReading & NSItemProviderWriting protocols/compliance. * NSItemProviderWriting: * NSItemProviderReading: Implement correctly and completely by uncommenting commented out code. * NSMutableString: * NSAttributedString: remove inlined members, since these classes don't implement NSItemProviderReading / NSItemProviderWriting (according to the headers at least). * NSUrl: all platforms now seem to implement NSItemProviderReading / NSItemProviderWriting. * NSString: all platforms now seem to implement both NSItemProviderReading and NSItemProviderWriting * UIColor: * UIImage: Update inlined protocol members according to the latest beta. Additionally, due to the following conditions: * The protocols all have the correct members now. * In the API definition we tell the generator to inline members from a protocol by inheriting from the corresponding interface. * The generator doesn't inline static members from protocols. several 'new' keywords had to be added to silence a compiler warning that occurrs when we manually inline a static member, since the member would be included in the type both from the inherited interface and the manual implementation. * [Foundation] Comment out NSItemProviderWriting.GetItemProviderVisibility to avoid inlining/generating unusable methods. NSItemProviderWriting.GetItemProviderVisibility is an optional method, and none of the native classes that implements NSItemProviderWriting actually imlements the method. This means inlining the method in those classes ends up creating unusable API; so just comment out the method to avoid generating the unusable API. The introspection tests found this: [FAIL] Foundation.NSString : itemProviderVisibilityForRepresentationWithTypeIdentifier: [FAIL] Foundation.NSUrl : itemProviderVisibilityForRepresentationWithTypeIdentifier: [FAIL] Contacts.CNContact : itemProviderVisibilityForRepresentationWithTypeIdentifier: [FAIL] MapKit.MKMapItem : itemProviderVisibilityForRepresentationWithTypeIdentifier: [FAIL] UIKit.UIColor : itemProviderVisibilityForRepresentationWithTypeIdentifier: [FAIL] UIKit.UIImage : itemProviderVisibilityForRepresentationWithTypeIdentifier: [FAIL] iOSApiSelectorTest.ApiSelectorTest.StaticMethods : 6 errors found in 2348 static selector validated: See also https://bugzilla.xamarin.com/show_bug.cgi?id=59308 * [iosurface] Add missing [TV] attributes (#2619) * [opengles] Enable the new API using IOSurface (#2618) The symbol only exists inside device libraries, not on simulator, and the introspection tests were updated to ignore it. Part of https://bugzilla.xamarin.com/show_bug.cgi?id=58054 * [avfoundation][watchos] Enable AudioBufferList (fix #59145) + audit (xtro) (#2617) 1. AudioBufferList is part of CoreAudio (wrong namespace, which needs a few changes in the generator) and now available in watchOS 4 https://bugzilla.xamarin.com/show_bug.cgi?id=59145 2. Also fixes xtro found issues: !missing-type! AVAudioRecorder not bound !missing-selector! AVAudioRecorder::averagePowerForChannel: not bound !missing-selector! AVAudioRecorder::channelAssignments not bound !missing-selector! AVAudioRecorder::currentTime not bound !missing-selector! AVAudioRecorder::delegate not bound !missing-selector! AVAudioRecorder::deviceCurrentTime not bound !missing-selector! AVAudioRecorder::format not bound !missing-selector! AVAudioRecorder::initWithURL:format:error: not bound !missing-selector! AVAudioRecorder::initWithURL:settings:error: not bound !missing-selector! AVAudioRecorder::isMeteringEnabled not bound !missing-selector! AVAudioRecorder::isRecording not bound !missing-selector! AVAudioRecorder::peakPowerForChannel: not bound !missing-selector! AVAudioRecorder::recordAtTime: not bound !missing-selector! AVAudioRecorder::recordAtTime:forDuration: not bound !missing-selector! AVAudioRecorder::recordForDuration: not bound !missing-selector! AVAudioRecorder::setChannelAssignments: not bound !missing-selector! AVAudioRecorder::setDelegate: not bound !missing-selector! AVAudioRecorder::setMeteringEnabled: not bound !missing-selector! AVAudioRecorder::settings not bound !missing-selector! AVAudioRecorder::url not bound !missing-protocol! AVAudioRecorderDelegate not bound !missing-selector! AVAudioEngine::inputNode not bound !missing-selector! AVAudioEngine::manualRenderingBlock not bound !missing-selector! AVAudioInputNode::setManualRenderingInputPCMFormat:inputBlock: not bound !missing-selector! AVAudioPlayer::format not bound !missing-selector! AVAudioSession::requestRecordPermission: not bound !unknown-field! AVFileType3GPP bound !unknown-field! AVFileType3GPP2 bound !unknown-field! AVFileTypeAC3 bound !unknown-field! AVFileTypeAIFC bound !unknown-field! AVFileTypeAIFF bound !unknown-field! AVFileTypeAMR bound !unknown-field! AVFileTypeAVCI bound !unknown-field! AVFileTypeAppleM4A bound !unknown-field! AVFileTypeAppleM4V bound !unknown-field! AVFileTypeCoreAudioFormat bound !unknown-field! AVFileTypeDNG bound !unknown-field! AVFileTypeEnhancedAC3 bound !unknown-field! AVFileTypeHEIC bound !unknown-field! AVFileTypeHEIF bound !unknown-field! AVFileTypeJPEG bound !unknown-field! AVFileTypeMPEG4 bound !unknown-field! AVFileTypeMPEGLayer3 bound !unknown-field! AVFileTypeQuickTimeMovie bound !unknown-field! AVFileTypeSunAU bound !unknown-field! AVFileTypeTIFF bound !unknown-field! AVFileTypeWAVE bound * [Metal] Implement API using IOSurface now that IOSurface is implemented. Partially fixes #58054. (#2621) https://bugzilla.xamarin.com/show_bug.cgi?id=58054 * [PdfKit] Improve PdfAnnotation.QuadrilateralPoints binding by making it strongly typed. (#2620) * Implement Simd vector types (VectorFloat2/3/4/VectorInt4). (#2622) * Implement Simd vector types (VectorFloat2/3/4/VectorInt4). * [ARKit/Vision] Use the new simd vector types instead of the OpenTK versions. * [ModelIO] Use the new simd vectors in new API (MDLVoxelIndexExtent2). This way we won't have to create a MDLVoxelIndexExtent3 in the future. * [SpriteKit] Use the new simd vectors in new API. * [metal] Audit (xtro) based fixes (#2623) !extra-protocol-member! unexpected selector MTLArgumentEncoder::newArgumentEncoderForBufferAtIndex: found !extra-protocol-member! unexpected selector MTLComputeCommandEncoder::dispatchThreads:threadsPerThreadgroup: found macos-only !missing-field! MTLDeviceRemovalRequestedNotification not bound !missing-field! MTLDeviceWasAddedNotification not bound !missing-field! MTLDeviceWasRemovedNotification not bound !missing-pinvoke! MTLCopyAllDevices is not bound * [CloudKit] Update bindings to beta 6. (#2615) * [FileProvider] Turn NSFileProviderItemIdentifier enum into a static class, fixes bug 59329 (#2634) https://bugzilla.xamarin.com/show_bug.cgi?id=59329 At the time of binding NSFileProviderItemIdentifier it wasn't clear how it was supposed to be used, I mean apple provides two keys which I thought were the only possible values hence binding it as an smart enum. Unfortunately this wasn't the case and the user can use those two values provided from the SDK or their own NSString Identifier. Swift provides a wrapper unfortunately we can't do the same due to NSFileProviderItemIdentifier is used in the NSFileProviderItem protocol and we currently do not support changing signatures on them. * [mtouch] Teach mtouch about the 'IOSurface' framework for tvOS. Fixes #59333. (#2630) https://bugzilla.xamarin.com/show_bug.cgi?id=59333 * Bump Touch.Unit to get fix for API breakage. (#2631) spouliot/Touch.Unit@8f1e19d [NUnitOutputTextWriter] Reintroduce previous constructor to make sure we don't break binary ABI. spouliot/Touch.Unit@00b0c0b [NUnitOutputTextWriter] Don't write invalid xml comments. spouliot/Touch.Unit@de9fe20 [TouchRunner] Restore the original code path when not wrapping NUnit xml output. * [IOSurface] Add missing availability attributes for tvOS. (#2629) * Bump versions for preview 9 (#2624) * [AVFoundation] Add missing interface AVRouteDetector. (#2637) * [tests] Update xtro to reduce list sizes (#2636) * Skip OpenTK duplicate declaration (we can't change them); * Fix rule name change for ARKit / simd; * Add missing default initializer on `init` to pending actions; * Add note for AVPersistableContentKeyRequest changes wrt tvOS; * [ReplayKit] Make RPBroadcastActivityViewController.LoadBroadcastActivityViewController async-capable. (#2639) * [xcode9] More SceneKit bindings (#2633) * [GameplayKit] Incorrect GKPath.FromPoints (Vector3[], float, cyclical) implementation, Fixes bug 59380 (#2644) * [GameplayKit] Incorrect GKPath.FromPoints (Vector3[], float, cyclical) implementation, Fixes bug 59380 https://bugzilla.xamarin.com/show_bug.cgi?id=59380 vector_float3 is 16 bytes, which means the binding is incorrect, because Vector3 is 12 bytes, and our code does not that difference into account. * Add tests * [DeviceCheck] Disable default ctor for DCDevice. (#2642) It doesn't seem to be useful according to the documentation, since it appears that the only way to get an instance is to use the static CurrentDevice property. * [audiounit] Audit (xtro) fixes for tvOS (#2635) Availability attributes in non-generated files don't hide symbols/code. reference: !unknown-pinvoke! AudioUnitExtensionCopyComponentList bound !unknown-pinvoke! AudioUnitExtensionSetComponentList bound * [tests] Make sure tvOS tests don't use the (unexisting) API * [tests] Add all test project variations to tests-mac.sln (#2579) * [xharness] Make sure generated mac projects have different project guids. * [introspection] Change the project guid so that it doesn't match the dontlink-mac project guid. * [tests] Add all test project variations to tests-mac.sln. * [xharness] Fix else condition. * [FileProvider] Adds missing NSFileProviderPage constants, fixes bug 59297. (#2646) https://bugzilla.xamarin.com/show_bug.cgi?id=59297 Adds NSFileProviderInitialPageSortedByName and NSFileProviderInitialPageSortedByDate NSData constants * [Xcode9] Remove NSFileProviderMessage and NSFileProviderMessageInterface (#2647) APIs were removed in beta 2 * [Foundation/UIKit] Provide LoadObject[s] methods that return the expected type in the callback. Fixes #59049. (#2638) The callback for these LoadObject[s] methods take an INSItemProviderReading parameter. This tells our runtime that we must provide an instance of a managed object that implements this interface (but nothing else), so we create a `NSItemProviderReadingWrapper` instance, which complies with the API (since the wrapper type implements the corresponding interface). Unfortunately these methods are supposed to return an instance of the passed- in type, so in order to comply with this soft (documentation-only) requirement, provide a wrapper method that creates instances of the right types. https://bugzilla.xamarin.com/show_bug.cgi?id=59049 * [arkit] Ignore deprecated selectors (#2645) * [FileProvider] Adds missing protocol and keys from audit (#2652) ``` !missing-protocol! NSFileProviderServiceSource not bound !missing-field! NSFileProviderErrorCollidingItemKey not bound !missing-field! NSFileProviderErrorNonExistentItemIdentifierKey not bound !missing-field! NSFileProviderFavoriteRankUnranked not bound ``` Also adds `NSXpcListenerEndpoint` to foundation, needed by `NSFileProviderServiceSource` protocol. * [tests][xtro] Workaround xtro runner dupe entry exception and update data files (#2654) * [AVFoundation] Rename field to match others. (#2657) * [homekit] Audit (xtro) fixes (#2653) - HMCharacteristicEvent conforms to NSMutableCopying on iOS11 which makes it 64 bits only (so adjust intro tests) - Ignore extra setters on HMMutablePresenceEvent, rdar 33883958 !missing-selector! HMMutablePresenceEvent::setPresenceEventType: not bound !missing-selector! HMMutablePresenceEvent::setPresenceUserType: not bound * [xtro] Add missing pinvoke to pending (#2662) - Bug 59422: [uikit] Missing UIContentSizeCategoryCompareToCategory & UIContentSizeCategoryIsAccessibilityCategory (https://bugzilla.xamarin.com/show_bug.cgi?id=59422) * Merge latest d15-3 fixes into xcode9 (#2660) * [msbuild] Re-added wildcard (*) expandsion for application-identifier in Entitlements.plist (#2186) Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=57119 * Bump mono (#2213) * Framework tests were still binding non-linked Simple class which errors now (#2216) (#2218) - Improve Makefile to rebuild when projects build with errors * Bump mono to get cecil fix for bug #56808. (#2222) https://bugzilla.xamarin.com/show_bug.cgi?id=56808 * [msbuild] Use @(ReferencePath) instead of @(ResolvedFiles) (#2188) (#2214) This allows things to work on both xbuild and msbuild. In xbuild, both lists are exactly the same and on msbuild, only @(ReferencePath) exists. Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=55147 * NSActivityOptions.IdleDisplaySleepDisabled had wrong value (#2232) (#2239) This was due to an integer overflow. The original value was based on Int32 1 << 40 == 256 The correct value should be based on a UInt64. 1UL << 40 == 1099511627776 * [tests] Fix bug 57699 - [iOS]InternalsTest failure (Linkall) tests on device (#2243) Strip native debugging symbols should not be checked for debug builds * Bump mono to get fix for bug #57780. https://bugzilla.xamarin.com/show_bug.cgi?id=57780 * Update .gitmodules Change branch to d15-3 branch of mono * Bump maccore to get fix for bug #55064. https://bugzilla.xamarin.com/show_bug.cgi?id=55064 * [mono] Bump mono to get the head of cecil/mono-2017-04 and fix IsComObject #57919 Also fix #58789 [1], the typo in tools/mtouch/Tuning.cs showing in MT0000 errors instead MT2102. That's already in master and d15-4 mono bump includes: [2] commit 2a6502cee0df9de5198eafe7c8b5f6ac25106f34 (HEAD -> d15-3, origin/d15-3) Merge: 02457c20fcf 5e05cafc6f1 Author: Luis Aguilera Date: Fri Aug 18 10:04:06 2017 -0400 Merge pull request #5401 from marek-safar/com [Marshal.IsComObject] Make this predicate return false instead of thr… [3] commit 02457c20fcf57c0610e844d638eb1da82b5d1eb0 Merge: da80840ea55 73fd9a1b82e Author: Luis Aguilera Date: Fri Aug 18 09:59:06 2017 -0400 Merge pull request #5400 from spouliot/bump-cecil-58834-d15-3 [cecil] Bump to the head of the mono-2017-04 branch and pick the fix for bug #58834 References [1] https://bugzilla.xamarin.com/show_bug.cgi?id=58789 [2] https://bugzilla.xamarin.com/show_bug.cgi?id=57919 [3] https://bugzilla.xamarin.com/show_bug.cgi?id=58834 * [mtouch] Put 'mono_profiler_startup_log' in the symbol list. Fixes #58778. (#2501) We need the 'mono_profiler_startup_log' symbol when profiling is enabled, so make sure to add the symbol to the correct list of symbols we need. Previously we were passing `-u _mono_profiler_startup_log` to clang directly, which is fine, but not complete, since it does not write the symbol to the symbollist file (--symbollist=file), which means it wouldn't be preserved when the MSBuild tasks strip the executable. https://bugzilla.xamarin.com/show_bug.cgi?id=58778 * Bump versions for SR3 https://trello.com/c/EVze08ei * Bump mono to include HttpClientHandler fix #44027 https://trello.com/c/jYFXadH8/8-systemnethttp-close-request-stream-when-httpclienthandler https://bugzilla.xamarin.com/show_bug.cgi?id=44027 * [FileProvider] Add missing API and turn NSString to string (#2663) Turned NSString to string in order to match exisiting API. * [uikit] Add UIPasteConfigurationSupporting and UITextPasteConfigurationSupporting (#2649) - Fixes bug #59363: Missing UIPasteConfigurationSupporting, UITextPasteConfigurationSupporting, UITextDraggable and UITextDroppable on a couple of types (https://bugzilla.xamarin.com/show_bug.cgi?id=59363) * [uikit] Remove 129 types in UIPasteConfigurationSupporting case * [scenekit] Audit (xtro) fixes (#2648) This looks like an Apple breaking change (since `SCNAnimation` is new) but we now have: > typedef void (^SCNAnimationEventBlock)(id animation, id animatedObject, BOOL playingBackward); bound as > delegate void SCNAnimationEventHandler (CAAnimation animation, NSObject animatedObject, bool playingBackward); and `CAAnimation` conforms to `SCNAnimation` but *only* the later is available on watchOS. The delegate is only updated (since it's new) on our watchOS profile. xtro references: (watchos) !unknown-protocol! SCNCameraControlConfiguration bound (tvos/watchos) !missing-selector! SCNAnimation::animationEvents not bound !missing-selector! SCNAnimation::setAnimationEvents: not bound !missing-selector! SCNConstraint::isEnabled not bound !missing-selector! SCNConstraint::setEnabled: not bound !missing-field! SCNSceneSourceConvertToYUpKey not bound !missing-field! SCNSceneSourceConvertUnitsToMetersKey not bound (ios/tvos) !missing-protocol-conformance! SCNNode should conform to UIFocusItem * Bump maccore post 15.3 merge (#2665) * Bump Xcode 9 to GM (#2667) * Force build (on wrench) * [avfoundation] Fix breaking changes (apidiff) (#2664) * [TVServices] Update to Xcode 9 GM (#2675) * [GameController] Update to Xcode 9 GM (#2673) * [LocalAuthentication] Update to Xcode 9 GM (#2671) * [LocalAuthentication] Update to Xcode 9 GM * Remove availability from BiometryNotAvailable, BiometryNotEnrolled and BiometryLockout * [AVFoundation] Add missing types AVSampleBufferAudioRenderer and AVSampleBufferRenderSynchronizer (#2659) * [AVFoundation] Add missing types AVSampleBufferAudioRenderer and AVSampleBufferRenderSynchronizer Some of the new added types were already present BUT under a #if MONOMAC, they had to be moved. * [AVFoundation] Set the wrongly added API to be obsolete and ensure it returns logical values. (#2650) * [xtro] The right platform for macOS is 'macos', not 'osx'. (#2677) The platform name is used to filter availability attributes, and if we use the wrong platform, we'll incorrectly skip all availability attributes. The net result in unclassified entries: https://gist.github.com/rolfbjarne/a4474bc2a40c49a85cad495b51bb514f * Various Xcode 9 API improvements and also fixes bug 59433 (#2676) https://bugzilla.xamarin.com/show_bug.cgi?id=59433 While fixing bug 59433 I noticed some additional issues outlined below: AVDepthData: * Renamed **non** static `Create` methods because `Create` only makes sense with the **Static** method in this context. Also by renaming the methods we are now closer to the names that swift uses. * Kept descriptive method names in favor of self-documenting code. `Convert`, `Apply` and `Replace` do not fully give us the intent of the method. * Added a convenience `Create` static method that takes a `CGImageAuxiliaryDataInfo`. * AvailableDepthDataTypes is now an array of `CVPixelFormatType` instead of a `NSNumber` array (The aactual fix for bug 59433). ImageIO: * Refactored `CGImageAuxiliaryDataInfo` to be a `StrongDictionary` in order to avoid most of the manual code and also to avoid reimplementing the `ToDictionary` method (which contained a subtle bug). * Adjusted code to reflect the above change. * Added missing `.ctor (IntPtr, bool)` to `CGImageMetadata` so the class is able to be created by our `Runtime.Get*`. * Simplified `CopyAuxiliaryDataInfo` method by using `CGImageAuxiliaryDataInfo` as a `DictionaryContainer`. Tests: * Added `xamarinmonkey.heic` which is an image that contains depth data needed to test above changes. * Adds `AVDepthDataTests` that touches most of the changes listed here. * Tweak the Simd-compatible matrices and vectors (#2668) * Rename them to be OpenTK.NMatrix# (instead of Simd.MatrixFloat#x#). * Remove the Vector2 and Vector4 variants, we'll use the OpenTK types instead (but we'll keep the NVector3 variant, since it's not identical to the OpenTK version). * Update the API to match their OpenTK counterparts better: * NMatrix2 and NMatrix3 have a 0-based R#C# scheme for their fields. * NMatrix4 has a 1-based M## scheme for its fields (i.e. no change). * [AVFoundation] Use Simd-matrix for API that needs it. (#2679) This also requires implementing the corresponding matrix (NMatrix4x3). Fixes this xtro issue: > !unknown-simd-type-in-signature! OpenTK.Matrix3 AVFoundation.AVCameraCalibrationData::get_GetIntrinsicMatrix(): the native signature has a simd type (matrix_float3x3), while the corresponding managed method is using an incorrect (non-simd) type. * [xtro] Fix checking availability on categories. (#2682) When checking for category availability, check if both the current declaration is a category, and if the current's declaration container is a category. Otherwise this scenario fails: * Category method is available. * Category does not have availability attributes. * Main class is unavailable. with this typical code sequence: ```csharp // don't process methods (or types) that are unavailable for the current platform if (!decl.IsAvailable () || !(decl.DeclContext as Decl).IsAvailable ()) return; ``` In which case we'd: * First check the method (`decl`): * It's available, so no further checks is done on the method. * Then we'd check the method's container (`decl.DeclContext`): * The container (the category) does not have availability attributes. * Then we'd check if the container's container is a category (it isn't, it's the namespace). and as such determine that the method is available. With this change, the second step will become: * Then we'd check the method's container (`decl.DeclContext`): * The container (the category) does not have availability attributes. * Then we'd check if the container is a category (it is), and if its main class is available (it isn't). and as such determine that the method is unavailable. * Check for attributes on the method's container (no attributes, so we continue). * Check if the method's Unclassified diff: https://gist.github.com/rolfbjarne/8fa80962596978a426eadf9b7ba39dc1 * [uikit] Update for Xcode 9 GM (#2670) * [AVFoundation] Implement AVCapturePhoto. Partially fixes #59388. (#2678) Fixes: > common.unclassified:!missing-type! AVCapturePhoto not bound https://bugzilla.xamarin.com/show_bug.cgi?id=59388 * Use strong dictionaries for AVCapturePhoto.Metadata and AVCapturePhoto.EmbeddedThumbnailPhotoFormat. * [SIMD] Implement Simd double types (VectorDouble3/MatrixDouble4x4). (#2632) The following types will be used by ModelIO bindings * Fix delta to be double * Rename Simd-compatible matrices and vectors to match our final naming. This also means removing the new Vector2 and Vector4 variants (but not Vector3). * [avfoundation] Remove AVAssetDownloadDelegate.DidLoadTimeRange since it was removed in one of the betas (#2687) * [foundation] Move NSUrlSessionMultipathServiceType to a file processed by the generator (for the availability attributes) (#2688) * [arkit] Update for Xcode 9 GM (#2681) * [Intents] Fix watchOS INCarSeatResolutionResult breaking changes (#2690) * [Intents] Fix watchOS INCarSeatResolutionResult breaking changes Type Changed: Intents.INCarSeatResolutionResult Removed methods: public static INCarSeatResolutionResult GetConfirmationRequired (INCarSeat valueToConfirm); public static INCarSeatResolutionResult GetSuccess (INCarSeat resolvedValue); * [avfoundation] Add missing protocol members and deprecations (#2691) !missing-protocol-member! AVCapturePhotoCaptureDelegate::captureOutput:didFinishProcessingPhoto:error: not found and the selector removed from PR#2687 was actually replaced with this one !missing-protocol-member! AVAssetDownloadDelegate::URLSession:aggregateAssetDownloadTask:didLoadTimeRange:totalTimeRangesLoaded:timeRangeExpectedToLoad:forMediaSelection: not found * [tests][xtro] Map some enums, more fix with protocols and update entries (#2692) * [Tests] Reenable dns tests on the watch. (#2674) * [arkit] Add ARBlendShapeLocationOptions strong dictionary (#2696) * [coreimage] Skip not yet bound filters added in Xcode9 (#2698) Tracked in https://bugzilla.xamarin.com/show_bug.cgi?id=57350 * [Metal] Renamed MTLArgumentDescriptor.ArgumentDescriptor to Create, fixes bug 59498 (#2702) https://bugzilla.xamarin.com/show_bug.cgi?id=59498 From [argumentDescriptor docs](https://developer.apple.com/documentation/metal/mtlargumentdescriptor/2915746-argumentdescriptor?language=objc) > Creates an empty argument descriptor. * [msbuild] Always codesign app bundles if the codesign key is non-null (#2697) ...even if it is a simulator build. Turns out that starting with Xcode9, sim builds need to be codesigned for App Groups entitlements to work properly. Interestingly, the DetectSigningIdentity logic had a comment about needing to codesign simulator builds for some entitlements to work already starting with Xcode 8 but apparently the iOS targets did not respect this. Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=59379 * [Foundation] Add NSProxy stub in order to workaround bug 59247 (#2693) https://bugzilla.xamarin.com/show_bug.cgi?id=59247 We need to have a better solution that removes all what NSProxy does not responds to. Right now this works because NSObject implements NSObject protocol just like NSProxy, but NSProxy responds to far less selectors hence doing it internal so it is not a breaking change when we provide the correct fix. * Keep NSProxy around and avoid XML linker description We need to keep NSProxy (avoid linking it) if WKNavigationDelegate or IWKNavigationDelegate is used. We know WKWebView will be there and can hold a reference to it. * [Xcode 9] Update Metal for GM (#2689) * [iosurface] IOSurface is not usable before iOS/tvOS 11. Fixes #59201 (#2706) Apple rejects apps that links with the previously private IOSurface.framework. We were not sure about this [1] and had it disabled (this is removed). However another bug stopped our adjustment logic [2] from being executed. This is needed since `clang` picks up the private framework if it does not find the public one (even when asking for a weak framework), [1] https://bugzilla.xamarin.com/show_bug.cgi?id=59201 [2] Added a while ago for JavascriptCore * Bump maccore to point to commit with the docs fix. (#2703) * Bump XI to 11.0.x (and XM to 3.99.9.x) (#2684) * Update Make.config - branch name was still pointing to `xcode9`, not `master` - version was 11.5, half true since we need to re-branch 15.5 (11.4), so down to 11.3 to be temporarily correct - remove useless comment about xcode version, both the path and download link include the version * fix merge issue * fix merge issues --- Make.config | 27 +- README.md | 1 - Versions-ios.plist.in | 3 + Versions-mac.plist.in | 1 + builds/Makefile | 4 + docs/website/mtouch-errors.md | 16 +- external/Touch.Unit | 2 +- external/Xamarin.MacDev | 2 +- external/llvm | 2 +- external/mono | 2 +- external/opentk | 2 +- jenkins/nunit-summary.xslt | 52 - mk/xamarin.mk | 2 +- .../Xamarin.iOS.Common.targets | 2 +- .../tests/MyPhotoEditingExtension/Info.plist | 2 + msbuild/tests/MyShareExtension/Info.plist | 2 + msbuild/tests/MySingleView/Info.plist | 2 +- msbuild/tests/MyTodayExtension/Info.plist | 2 + .../TargetTests/TargetTests.cs | 5 +- runtime/Makefile | 2 +- runtime/bindings-generator.cs | 920 ++++- runtime/bindings-generator.csproj | 7 +- runtime/bindings.h | 73 + runtime/bindings.m | 65 + runtime/delegates.t4 | 4 +- runtime/runtime.m | 2 +- runtime/trampolines-invoke.m | 4 +- runtime/xamarin/runtime.h | 4 +- src/.gitignore | 2 + src/ARKit/ARPointCloud.cs | 43 + src/AVFoundation/AVAssetDownloadUrlSession.cs | 2 +- src/AVFoundation/AVCompat.cs | 144 +- src/AVFoundation/AVDepthData.cs | 41 + src/AVFoundation/AVOutputSettingsAssistant.cs | 13 + src/AVFoundation/AVPlayerLooper.cs | 46 + src/AVFoundation/Enums.cs | 142 +- src/Accounts/Enums.cs | 2 +- src/AddressBook/ABAddressBook.cs | 4 +- src/AddressBook/ABEnums.cs | 4 +- src/AddressBook/ABGroup.cs | 2 +- src/AddressBook/ABMultiValue.cs | 12 +- src/AddressBook/ABPerson.cs | 42 +- src/AddressBook/ABRecord.cs | 6 +- src/AddressBook/ABSource.cs | 8 +- src/AddressBookUI/ABAddressFormatting.cs | 2 +- .../ABNewPersonViewController.cs | 4 +- .../ABPeoplePickerNavigationController.cs | 10 +- src/AddressBookUI/ABPersonViewController.cs | 4 +- .../ABUnknownPersonViewController.cs | 4 +- .../DisplayedPropertiesCollection.cs | 2 +- src/AppKit/Enums.cs | 124 +- src/AppKit/NSApplication.cs | 2 +- src/AppKit/NSBezierPath.cs | 22 +- src/AppKit/NSComboBox.cs | 2 +- src/AppKit/NSFont.cs | 56 + src/AppKit/NSTextContainer.cs | 4 +- src/AssetsLibrary/ALAsset.cs | 4 +- src/AssetsLibrary/ALAssetsGroup.cs | 2 +- src/AssetsLibrary/ALAssetsLibrary.cs | 2 +- src/AssetsLibrary/Enums.cs | 8 +- src/AudioToolbox/AudioFile.cs | 4 + src/AudioToolbox/AudioQueue.cs | 2 +- src/AudioToolbox/AudioSession.cs | 2 +- src/AudioToolbox/AudioType.cs | 37 +- src/AudioUnit/AudioComponent.cs | 226 +- src/AudioUnit/AudioComponentDescription.cs | 4 +- src/AudioUnit/AudioUnit.cs | 65 +- src/CFNetwork/CFHTTPStream.cs | 2 +- src/CloudKit/CKCompat.cs | 4 +- src/CloudKit/Enums.cs | 19 +- src/Constants.iOS.cs.in | 12 + src/Constants.mac.cs.in | 7 + src/Constants.tvos.cs.in | 5 + src/Constants.watch.cs.in | 7 +- src/Contacts/CNEnums.cs | 8 +- src/Contacts/CNObsolete.cs | 2 +- src/Contacts/CNPostalAddress.cs | 55 - src/CoreAnimation/CAEnums.cs | 11 + src/CoreBluetooth/AdvertisementDataOptions.cs | 1 + src/CoreBluetooth/CBUUID.cs | 10 + src/CoreBluetooth/CoreBluetooth.cs | 4 +- src/CoreBluetooth/Enums.cs | 34 +- src/CoreBluetooth/GuidWrapper.cs | 18 +- .../PeripheralConnectionOptions.cs | 1 + src/CoreData/Enums.cs | 41 +- src/CoreFoundation/CFStream.cs | 2 +- src/CoreGraphics/CGColorConverter.cs | 14 +- src/CoreGraphics/CGColorSpace.cs | 4 +- src/CoreGraphics/CGContext.cs | 24 +- src/CoreGraphics/CGPDFOperatorTable.cs | 2 +- src/CoreImage/CIFilter.cs | 2 +- src/CoreImage/Enums.cs | 41 +- src/CoreLocation/CLCompat.cs | 6 +- src/CoreLocation/CLEnums.cs | 2 +- src/CoreML/MLDictionaryFeatureProvider.cs | 25 + src/CoreML/MLMultiArray.cs | 91 + src/CoreML/MLMultiArrayConstraint.cs | 25 + src/CoreMedia/CMAttachmentBearer.cs | 17 + src/CoreMedia/CMSync.cs | 8 +- src/CoreMedia/CoreMedia.cs | 2 +- src/CoreMotion/CMCompat.cs | 2 +- .../CSSearchableItemAttributeSet.cs | 29 + src/CoreText/CTFont.cs | 2 +- src/CoreText/CTFontManager.cs | 2 +- src/CoreVideo/CVBuffer.cs | 12 + src/CoreVideo/CVImageBuffer.cs | 1 + src/CoreVideo/CVOpenGLESTexture.cs | 5 + src/CoreVideo/CVOpenGLESTextureCache.cs | 5 + src/CoreVideo/CVPixelBuffer.cs | 5 +- src/CoreVideo/CVPixelBufferAttributes.cs | 5 +- src/CoreVideo/CVPixelBufferPool.cs | 1 + src/CoreVideo/CVPixelBufferPoolSettings.cs | 2 + src/CoreVideo/CVPixelFormatDescription.cs | 1 + src/CoreVideo/CVTime.cs | 1 + src/CoreVideo/CoreVideo.cs | 17 + src/CoreWlan/CWInterface.cs | 19 + src/EventKit/EKEnums.cs | 2 +- src/EventKit/EventKit.cs | 7 + src/EventKitUI/EKUIBundle.cs | 27 + src/ExternalAccessory/EAEnums.cs | 4 + src/Foundation/Compat.cs | 4 +- src/Foundation/Enum.cs | 52 +- src/Foundation/Enums.cs | 9 + src/Foundation/NSDictionary_2.cs | 2 +- .../NSDistributedNotificationCenter.cs | 6 +- src/Foundation/NSExpression.cs | 2 +- src/Foundation/NSFileManagerDelegate.cs | 4 +- src/Foundation/NSFormatter.cs | 2 +- src/Foundation/NSItemProvider.cs | 49 +- src/Foundation/NSMetadataItem.cs | 1040 ++++++ src/Foundation/NSMutableDictionary_2.cs | 2 +- src/Foundation/NSObject.iOS.cs | 2 +- src/Foundation/NSObject.mac.cs | 6 +- src/Foundation/NSPortMessage.cs | 8 +- src/Foundation/NSProgress.cs | 30 + src/Foundation/NSProxy.cs | 37 + src/Foundation/NSUnit.cs | 121 + src/GameKit/GKCompat.cs | 4 +- src/GameKit/GKLocalPlayerListener.cs | 4 +- src/GameKit/GameKit2.cs | 4 +- src/GameplayKit/GKCompat.cs | 4 +- src/GameplayKit/GKPath.cs | 4 +- src/HealthKit/Enums.cs | 4 +- src/HealthKit/HKObsolete.cs | 8 +- src/HomeKit/HMEnums.cs | 65 +- src/HomeKit/HMEventTrigger.cs | 22 +- src/HomeKit/HMMutableSignificantTimeEvent.cs | 17 + src/HomeKit/HMSignificantTimeEvent.cs | 17 + src/IOSurface/IODefs.cs | 38 + src/IOSurface/IOSurface.cs | 104 + src/ImageIO/CGImageDestination.cs | 26 +- src/ImageIO/CGImageMetadata.cs | 8 + src/ImageIO/CGImageSource.cs | 25 +- src/Intents/INBillTypeResolutionResult.cs | 43 + src/Intents/INCallRecord.cs | 27 + .../INCallRecordTypeResolutionResult.cs | 47 + ...INCarAirCirculationModeResolutionResult.cs | 43 + .../INCarAudioSourceResolutionResult.cs | 43 + src/Intents/INCarDefrosterResolutionResult.cs | 43 + src/Intents/INCarSeatResolutionResult.cs | 42 + .../INCarSignalOptionsResolutionResult.cs | 43 + src/Intents/INCompat.cs | 8 + src/Intents/INInteraction.cs | 24 + ...MessageAttributeOptionsResolutionResult.cs | 47 + .../INMessageAttributeResolutionResult.cs | 47 + .../INPaymentStatusResolutionResult.cs | 43 + src/Intents/INRadioTypeResolutionResult.cs | 43 + .../INRelativeReferenceResolutionResult.cs | 43 + .../INRelativeSettingResolutionResult.cs | 43 + src/Intents/INSearchCallHistoryIntent.cs | 23 + src/Intents/INSpeakableString.cs | 33 + .../INWorkoutGoalUnitTypeResolutionResult.cs | 43 + .../INWorkoutLocationTypeResolutionResult.cs | 43 + src/LocalAuthentication/LAEnums.cs | 18 +- src/Makefile | 2 +- src/MapKit/MKEnums.cs | 28 +- src/MapKit/MKFeatureDisplayPriority.cs | 16 + src/MediaAccessibility/MediaAccessibility.cs | 4 +- src/MediaPlayer/MPNowPlayingInfoCenter.cs | 10 +- src/MediaPlayer/MPPlayableContentDelegate.cs | 6 +- src/MediaPlayer/MediaPlayer.cs | 4 + src/Metal/Defs.cs | 15 + src/Metal/MTLArgumentEncoder.cs | 13 + src/Metal/MTLArrays.cs | 26 + src/Metal/MTLCompat.cs | 13 - src/Metal/MTLDevice.cs | 81 +- src/Metal/MTLEnums.cs | 170 +- src/Metal/MTLRenderCommandEncoder.cs | 45 + src/Metal/MTLRenderPassDescriptor.cs | 21 + src/ModelIO/MDLTransform.cs | 16 + src/ModelIO/MDLTransformComponent.cs | 33 + src/ModelIO/MIEnums.cs | 25 + src/NativeTypes/Drawing.tt | 4 +- src/NetworkExtension/NECompat.cs | 6 +- src/ObjCRuntime/Dlfcn.cs | 56 + src/ObjCRuntime/DynamicRegistrar.cs | 14 +- src/ObjCRuntime/PlatformAvailability.cs | 10 +- src/ObjCRuntime/Registrar.cs | 43 +- src/ObjCRuntime/Runtime.cs | 13 +- src/ObjCRuntime/Runtime.iOS.cs | 4 +- src/PassKit/PKEnums.cs | 23 + src/PassKit/PKPaymentRequest.cs | 56 + src/PdfKit/Enums.cs | 45 + src/PdfKit/PdfAnnotation.cs | 73 + src/PdfKit/PdfKit.cs | 2 + src/Photos/Enums.cs | 70 +- src/Photos/PHCompat.cs | 4 +- src/PhotosUI/PHEnums.cs | 3 +- src/ReplayKit/RPEnums.cs | 12 + src/SafariServices/SSEnums.cs | 32 +- src/SceneKit/Defs.cs | 82 +- src/SceneKit/SCNCompat.cs | 18 +- src/SceneKit/SCNGeometry.cs | 2 +- src/SceneKit/SCNNode.cs | 2 +- src/SceneKit/SCNQuaternion.cs | 2 +- src/Security/Enums.cs | 8 +- src/Security/SecureTransport.cs | 6 + src/Security/SslContext.cs | 6 +- src/Simd/MatrixDouble4x4.cs | 335 ++ src/Simd/MatrixFloat2x2.cs | 136 + src/Simd/MatrixFloat3x3.cs | 191 ++ src/Simd/MatrixFloat4x3.cs | 187 ++ src/Simd/MatrixFloat4x4.cs | 334 ++ src/Simd/VectorDouble3.cs | 77 + src/Simd/VectorFloat3.cs | 76 + src/Social/SLCompat.cs | 2 +- src/SpriteKit/Enums.cs | 10 + src/SpriteKit/ObsoleteCompat.cs | 24 +- src/SpriteKit/SKFieldNode.cs | 2 +- src/SpriteKit/SKUniform.cs | 67 +- src/StoreKit/Enums.cs | 8 + src/TVServices/TVEnums.cs | 10 + src/Twitter/TWCompat.cs | 2 +- src/UIKit/Compat.cs | 18 +- src/UIKit/UIActivityViewController.cs | 4 +- src/UIKit/UIDragDropSessionExtensions.cs | 44 + src/UIKit/UIEnums.cs | 340 +- src/UIKit/UIImagePickerController.cs | 14 + src/UIKit/UIPopoverPresentationController.cs | 4 +- src/UIKit/UIResponder.cs | 2 +- src/UIKit/UITypes.cs | 77 + src/UIKit/UIVibrancyEffect.cs | 2 +- src/UIKit/UIView.cs | 12 +- src/Vision/VNBarcodeSymbologyExtensions.cs | 39 + src/Vision/VNDetectBarcodesRequest.cs | 22 + src/Vision/VNFaceLandmarkRegion2D.cs | 54 + src/Vision/VNRequest.cs | 29 + src/Vision/VNUtils.cs | 66 + src/WKWebKit/Defs.cs | 8 + src/WatchKit/WKAccessibility.cs | 9 + src/WatchKit/WKDefs.cs | 34 + src/accounts.cs | 24 +- src/addressbookui.cs | 22 +- src/appkit.cs | 1128 ++++++- src/arkit.cs | 895 +++++ src/assetslibrary.cs | 26 +- src/audiounit.cs | 66 +- src/avfoundation.cs | 918 ++++- src/avkit.cs | 126 +- src/callkit.cs | 39 +- src/clockkit.cs | 4 + src/cloudkit.cs | 205 +- src/contacts.cs | 65 +- src/coreanimation.cs | 41 +- src/coreaudiokit.cs | 27 + src/corebluetooth.cs | 263 +- src/coredata.cs | 253 +- src/coreimage.cs | 1012 +++++- src/corelocation.cs | 62 +- src/coreml.cs | 350 ++ src/coremotion.cs | 37 +- src/corenfc.cs | 300 ++ src/corespotlight.cs | 45 + src/coretelephony.cs | 9 +- src/corevideo.cs | 3 + src/corewlan.cs | 12 + src/devicecheck.cs | 45 + src/eventkit.cs | 27 +- src/externalaccessory.cs | 20 +- src/fileprovider.cs | 354 ++ src/fileproviderui.cs | 61 + src/findersync.cs | 36 +- src/foundation.cs | 1262 ++++++- src/frameworks.sources | 112 +- src/gamecontroller.cs | 16 +- src/gamekit.cs | 136 +- src/gameplaykit.cs | 23 +- src/generator-enums.cs | 22 +- src/generator-typemanager.cs | 9 +- src/generator.cs | 213 +- src/healthkit.cs | 16 +- src/homekit.cs | 364 +- src/iad.cs | 7 +- src/identitylookup.cs | 96 + src/imageio.cs | 75 + src/intents.cs | 2961 ++++++++++++++++- src/intentsui.cs | 22 + src/iosurface.cs | 220 ++ src/localauthentication.cs | 19 + src/mapkit.cs | 197 +- src/medialibrary.cs | 12 + src/mediaplayer.cs | 139 +- src/messages.cs | 55 +- src/messageui.cs | 4 + src/metal.cs | 891 ++++- src/metalperformanceshaders.cs | 19 +- src/modelio.cs | 180 +- src/multipeerconnectivity.cs | 2 +- src/networkextension.cs | 2 +- src/notificationcenter.cs | 2 +- src/opengles.cs | 12 + src/passkit.cs | 238 +- src/pdfkit.cs | 1160 ++++++- src/photos.cs | 195 +- src/photosui.cs | 218 +- src/pushkit.cs | 11 +- src/quicklook.cs | 50 + src/replaykit.cs | 51 +- src/safariservices.cs | 73 +- src/scenekit.cs | 487 ++- src/social.cs | 9 + src/spritekit.cs | 288 +- src/storekit.cs | 75 +- src/tvmlkit.cs | 20 +- src/tvservices.cs | 10 + src/twitter.cs | 4 +- src/uikit.cs | 2482 +++++++++++++- src/usernotifications.cs | 27 +- src/videosubscriberaccount.cs | 40 + src/vision.cs | 1251 +++++++ src/watchkit.cs | 107 +- src/webkit.cs | 14 +- src/wkwebkit.cs | 182 +- system-dependencies.sh | 4 + tests/apitest/apitest.csproj | 1 + tests/apitest/src/AppKit/NSFont.cs | 54 + tests/apitest/src/AppKit/NSView.cs | 7 +- tests/apitest/src/MonoMac/CBUUID.cs | 4 +- .../XTest.framework.linkwith.cs | 15 +- tests/bindings-test/StructsAndEnums.cs | 105 + tests/bindings-test/libtest.linkwith.cs | 11 +- tests/common/Configuration.cs | 2 + tests/common/TestRuntime.cs | 93 + tests/generator/Makefile | 15 +- tests/generator/fieldenumtests.cs | 66 + tests/generator/smartenumwithframework.cs | 14 + tests/introspection/ApiBaseTest.cs | 11 +- .../introspection/ApiCoreImageFiltersTest.cs | 18 + tests/introspection/ApiCtorInitTest.cs | 58 + tests/introspection/ApiFieldTest.cs | 4 +- tests/introspection/ApiProtocolTest.cs | 16 + tests/introspection/ApiSelectorTest.cs | 141 + tests/introspection/ApiSignatureTest.cs | 16 +- tests/introspection/ApiTypoTest.cs | 132 +- tests/introspection/Mac/MacApiCtorInitTest.cs | 30 + tests/introspection/Mac/MacApiFieldTest.cs | 10 +- tests/introspection/Mac/MacApiProtocolTest.cs | 37 + tests/introspection/Mac/MacApiSelectorTest.cs | 12 + .../introspection/Mac/MacApiSignatureTest.cs | 17 + .../Mac/MacCoreImageFiltersTest.cs | 1 + .../Mac/introspection-mac.csproj | 2 +- tests/introspection/iOS/iOSApiCtorInitTest.cs | 23 + tests/introspection/iOS/iOSApiFieldTest.cs | 14 +- tests/introspection/iOS/iOSApiProtocolTest.cs | 110 +- tests/introspection/iOS/iOSApiSelectorTest.cs | 94 +- .../iOS/iOSApiWeakPropertyTest.cs | 3 + tests/linker-ios/link sdk/DllImportTest.cs | 37 +- tests/mmptest/src/FrameworkLinksTests.cs | 8 +- tests/mmptest/src/MMPTest.cs | 6 + .../src/TargetFrameworkDetectionTests.cs | 2 +- .../monotouch-test/ARKit/ARPointCloudTest.cs | 104 + .../AVFoundation/AVDepthDataTests.cs | 49 + .../AVFoundation/AVPlayerLooperTest.cs | 35 + .../monotouch-test/AddressBook/SourceTest.cs | 6 +- .../AddressBookUI/AddressFormattingTest.cs | 15 +- tests/monotouch-test/Asserts.cs | 515 ++- .../AudioToolbox/AudioComponentTest.cs | 122 + .../CoreData/NSQueryGenerationTokenTest.cs | 32 + .../CoreImage/xamarinmonkey.heic | Bin 0 -> 880014 bytes .../monotouch-test/CoreML/MLMultiArrayTest.cs | 143 + .../CoreText/FontDescriptorTest.cs | 2 + tests/monotouch-test/EventKit/AlarmTest.cs | 2 +- .../EventKit/CalendarItemTest.cs | 43 - .../monotouch-test/EventKit/EKUIBundleTest.cs | 34 + .../FileProvider/NSFileProviderPageTest.cs | 36 + tests/monotouch-test/Foundation/BundleTest.cs | 2 + .../monotouch-test/Foundation/CalendarTest.cs | 3 +- .../Foundation/UrlSessionTaskTest.cs | 7 + .../GameplayKit/GKAgent3DTest.cs | 67 + .../monotouch-test/GameplayKit/GKPathTests.cs | 39 + .../HMMutableSignificantTimeEventTest.cs | 43 + .../HomeKit/HMSignificantTimeEventTest.cs | 41 + .../MediaPlayer/VolumeViewTest.cs | 5 +- .../MediaToolbox/FormatNamesTest.cs | 6 +- .../Metal/HeapDescriptorTest.cs | 79 +- .../Metal/MTLArgumentDescriptorTest.cs | 78 + tests/monotouch-test/Metal/MTLDeviceTests.cs | 36 + .../Metal/MTLPipelineBufferDescriptorTests.cs | 43 + .../Metal/MTLPointerTypeTests.cs | 66 + .../Metal/MTLTextureReferenceType.cs | 60 + ...rPipelineColorAttachmentDescriptorTests.cs | 43 + .../Metal/MTLTileRenderPipelineDescriptor.cs | 74 + .../MPSImageHistogramEqualizationTest.cs | 42 + .../MPSImageHistogramSpecificationTest.cs | 42 + .../MPSImageHistogramTest.cs | 52 + tests/monotouch-test/ModelIO/MDLAssetTest.cs | 65 + tests/monotouch-test/ModelIO/MDLCameraTest.cs | 91 + .../ModelIO/MDLMaterialProperty.cs | 26 +- tests/monotouch-test/ModelIO/MDLMesh.cs | 22 +- .../ModelIO/MDLStereoscopicCameraTest.cs | 101 + tests/monotouch-test/ModelIO/MDLTransform.cs | 58 + .../ModelIO/MDLTransformComponentTest.cs | 212 ++ .../ModelIO/MDLVoxelArrayTest.cs | 83 + .../ObjCRuntime/RegistrarTest.cs | 17 +- .../PassKit/PKPaymentRequestTest.cs | 77 + .../PdfKit/PdfAnnotationTest.cs | 61 + .../ReplayKit/BroadcastHandlerTest.cs | 10 + tests/monotouch-test/Security/TrustTest.cs | 20 +- .../monotouch-test/Simd/MatrixFloat2x2Test.cs | 304 ++ .../monotouch-test/Simd/MatrixFloat3x3Test.cs | 321 ++ .../monotouch-test/Simd/MatrixFloat4x3Test.cs | 188 ++ .../monotouch-test/Simd/MatrixFloat4x4Test.cs | 348 ++ tests/monotouch-test/Simd/NMatrix4dTest.cs | 346 ++ tests/monotouch-test/Simd/NVector3dTest.cs | 143 + tests/monotouch-test/Simd/VectorFloat3Test.cs | 145 + .../SpriteKit/SKTransformNodeTest.cs | 100 + tests/monotouch-test/SpriteKit/UniformTest.cs | 111 + .../System.Net.Http/MessageHandlers.cs | 14 +- .../UIKit/DirectionalEdgeInsetsTest.cs | 59 + tests/monotouch-test/UIKit/NibTest.cs | 2 + .../UIKit/TabBarControllerTest.cs | 2 + tests/monotouch-test/UIKit/TextFieldTest.cs | 18 +- .../UIKit/UIDragDropSessionExtensionsTest.cs | 79 + .../UIPasteConfigurationSupportingTest.cs | 90 + ...UISpringLoadedInteractionSupportingTest.cs | 104 + tests/monotouch-test/monotouch-test.csproj | 53 +- tests/mtouch/MTouch.cs | 83 +- tests/mtouch/MTouchTool.cs | 7 +- tests/mtouch/RegistrarTest.cs | 5 +- tests/scripted/Makefile | 4 +- tests/scripted/bug-13945/Makefile | 16 +- tests/scripted/bug-35786/Makefile | 2 +- .../templates/WatchContainer/Container.csproj | 8 +- tests/test-libraries/libtest.h | 16 + tests/test-libraries/libtest.m | 229 ++ tests/test-libraries/rename.h | 14 + tests/tests-mac.sln | 224 +- tests/xammac_tests/xammac_tests.csproj | 25 +- tests/xharness/AppRunner.cs | 182 +- tests/xharness/DeviceLogCapturer.cs | 2 +- tests/xharness/Harness.cs | 14 +- tests/xharness/Jenkins.cs | 10 +- tests/xharness/Log.cs | 5 + tests/xharness/MakefileGenerator.cs | 7 +- tests/xharness/Process_Extensions.cs | 2 +- tests/xharness/SimpleFileListener.cs | 85 + tests/xharness/SimpleHttpListener.cs | 2 +- tests/xharness/SimpleListener.cs | 44 +- tests/xharness/SimpleTcpListener.cs | 2 +- tests/xharness/Simulators.cs | 8 +- tests/xharness/Target.cs | 5 +- tests/xharness/xharness.csproj | 6 +- tests/xtro-sharpie/EnumCheck.cs | 5 +- tests/xtro-sharpie/Helpers.cs | 84 +- tests/xtro-sharpie/Makefile | 39 +- tests/xtro-sharpie/ObjCProtocolCheck.cs | 24 +- tests/xtro-sharpie/Runner.cs | 26 +- tests/xtro-sharpie/SharpieEntryPoint.cs | 35 - tests/xtro-sharpie/SimdCheck.cs | 385 +++ tests/xtro-sharpie/common.ignore | 76 +- tests/xtro-sharpie/common.pending | 115 +- tests/xtro-sharpie/ios.ignore | 92 + tests/xtro-sharpie/ios.pending | 27 +- tests/xtro-sharpie/osx.ignore | 18 +- tests/xtro-sharpie/osx.pending | 76 +- tests/xtro-sharpie/tvos.ignore | 135 +- tests/xtro-sharpie/tvos.pending | 15 + tests/xtro-sharpie/watchos.ignore | 41 + tests/xtro-sharpie/watchos.pending | 21 + tests/xtro-sharpie/xtro-plugin.csproj | 51 - tests/xtro-sharpie/xtro-sharpie.csproj | 22 + tests/xtro-sharpie/xtro-sharpie.sln | 6 - tools/common/Assembly.cs | 2 + tools/common/Frameworks.cs | 22 + tools/common/MachO.cs | 4 + tools/common/StaticRegistrar.cs | 23 +- tools/common/Target.cs | 2 + tools/linker/ObjCExtensions.cs | 17 +- tools/mmp/Makefile | 4 +- tools/mmp/driver.cs | 17 +- .../linker/MonoMac.Tuner/MonoMacNamespaces.cs | 7 +- tools/mtouch/Application.cs | 15 +- tools/mtouch/BuildTasks.mtouch.cs | 2 +- tools/mtouch/Makefile | 14 +- tools/mtouch/Target.cs | 11 +- 495 files changed, 35679 insertions(+), 2599 deletions(-) delete mode 100644 jenkins/nunit-summary.xslt create mode 100644 src/ARKit/ARPointCloud.cs create mode 100644 src/AVFoundation/AVDepthData.cs create mode 100644 src/AVFoundation/AVPlayerLooper.cs create mode 100644 src/AppKit/NSFont.cs delete mode 100644 src/Contacts/CNPostalAddress.cs create mode 100644 src/CoreML/MLDictionaryFeatureProvider.cs create mode 100644 src/CoreML/MLMultiArray.cs create mode 100644 src/CoreML/MLMultiArrayConstraint.cs create mode 100644 src/EventKitUI/EKUIBundle.cs create mode 100644 src/Foundation/NSProgress.cs create mode 100644 src/Foundation/NSProxy.cs create mode 100644 src/Foundation/NSUnit.cs create mode 100644 src/HomeKit/HMMutableSignificantTimeEvent.cs create mode 100644 src/HomeKit/HMSignificantTimeEvent.cs create mode 100644 src/IOSurface/IODefs.cs create mode 100644 src/IOSurface/IOSurface.cs create mode 100644 src/Intents/INBillTypeResolutionResult.cs create mode 100644 src/Intents/INCallRecord.cs create mode 100644 src/Intents/INCallRecordTypeResolutionResult.cs create mode 100644 src/Intents/INCarAirCirculationModeResolutionResult.cs create mode 100644 src/Intents/INCarAudioSourceResolutionResult.cs create mode 100644 src/Intents/INCarDefrosterResolutionResult.cs create mode 100644 src/Intents/INCarSeatResolutionResult.cs create mode 100644 src/Intents/INCarSignalOptionsResolutionResult.cs create mode 100644 src/Intents/INInteraction.cs create mode 100644 src/Intents/INMessageAttributeOptionsResolutionResult.cs create mode 100644 src/Intents/INMessageAttributeResolutionResult.cs create mode 100644 src/Intents/INPaymentStatusResolutionResult.cs create mode 100644 src/Intents/INRadioTypeResolutionResult.cs create mode 100644 src/Intents/INRelativeReferenceResolutionResult.cs create mode 100644 src/Intents/INRelativeSettingResolutionResult.cs create mode 100644 src/Intents/INSearchCallHistoryIntent.cs create mode 100644 src/Intents/INSpeakableString.cs create mode 100644 src/Intents/INWorkoutGoalUnitTypeResolutionResult.cs create mode 100644 src/Intents/INWorkoutLocationTypeResolutionResult.cs create mode 100644 src/MapKit/MKFeatureDisplayPriority.cs create mode 100644 src/Metal/MTLArgumentEncoder.cs create mode 100644 src/Metal/MTLRenderCommandEncoder.cs create mode 100644 src/Metal/MTLRenderPassDescriptor.cs create mode 100644 src/ModelIO/MDLTransform.cs create mode 100644 src/ModelIO/MDLTransformComponent.cs create mode 100644 src/PassKit/PKPaymentRequest.cs create mode 100644 src/PdfKit/PdfAnnotation.cs create mode 100644 src/Simd/MatrixDouble4x4.cs create mode 100644 src/Simd/MatrixFloat2x2.cs create mode 100644 src/Simd/MatrixFloat3x3.cs create mode 100644 src/Simd/MatrixFloat4x3.cs create mode 100644 src/Simd/MatrixFloat4x4.cs create mode 100644 src/Simd/VectorDouble3.cs create mode 100644 src/Simd/VectorFloat3.cs create mode 100644 src/UIKit/UIDragDropSessionExtensions.cs create mode 100644 src/Vision/VNBarcodeSymbologyExtensions.cs create mode 100644 src/Vision/VNDetectBarcodesRequest.cs create mode 100644 src/Vision/VNFaceLandmarkRegion2D.cs create mode 100644 src/Vision/VNRequest.cs create mode 100644 src/Vision/VNUtils.cs create mode 100644 src/arkit.cs create mode 100644 src/coreml.cs create mode 100644 src/corenfc.cs create mode 100644 src/devicecheck.cs create mode 100644 src/fileprovider.cs create mode 100644 src/fileproviderui.cs create mode 100644 src/identitylookup.cs create mode 100644 src/iosurface.cs create mode 100644 src/vision.cs create mode 100644 tests/apitest/src/AppKit/NSFont.cs create mode 100644 tests/generator/fieldenumtests.cs create mode 100644 tests/generator/smartenumwithframework.cs create mode 100644 tests/monotouch-test/ARKit/ARPointCloudTest.cs create mode 100644 tests/monotouch-test/AVFoundation/AVDepthDataTests.cs create mode 100644 tests/monotouch-test/AVFoundation/AVPlayerLooperTest.cs create mode 100644 tests/monotouch-test/AudioToolbox/AudioComponentTest.cs create mode 100644 tests/monotouch-test/CoreData/NSQueryGenerationTokenTest.cs create mode 100644 tests/monotouch-test/CoreImage/xamarinmonkey.heic create mode 100644 tests/monotouch-test/CoreML/MLMultiArrayTest.cs delete mode 100644 tests/monotouch-test/EventKit/CalendarItemTest.cs create mode 100644 tests/monotouch-test/EventKit/EKUIBundleTest.cs create mode 100644 tests/monotouch-test/FileProvider/NSFileProviderPageTest.cs create mode 100644 tests/monotouch-test/GameplayKit/GKAgent3DTest.cs create mode 100644 tests/monotouch-test/HomeKit/HMMutableSignificantTimeEventTest.cs create mode 100644 tests/monotouch-test/HomeKit/HMSignificantTimeEventTest.cs create mode 100644 tests/monotouch-test/Metal/MTLArgumentDescriptorTest.cs create mode 100644 tests/monotouch-test/Metal/MTLDeviceTests.cs create mode 100644 tests/monotouch-test/Metal/MTLPipelineBufferDescriptorTests.cs create mode 100644 tests/monotouch-test/Metal/MTLPointerTypeTests.cs create mode 100644 tests/monotouch-test/Metal/MTLTextureReferenceType.cs create mode 100644 tests/monotouch-test/Metal/MTLTileRenderPipelineColorAttachmentDescriptorTests.cs create mode 100644 tests/monotouch-test/Metal/MTLTileRenderPipelineDescriptor.cs create mode 100644 tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramEqualizationTest.cs create mode 100644 tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramSpecificationTest.cs create mode 100644 tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramTest.cs create mode 100644 tests/monotouch-test/ModelIO/MDLAssetTest.cs create mode 100644 tests/monotouch-test/ModelIO/MDLCameraTest.cs create mode 100644 tests/monotouch-test/ModelIO/MDLStereoscopicCameraTest.cs create mode 100644 tests/monotouch-test/ModelIO/MDLTransformComponentTest.cs create mode 100644 tests/monotouch-test/ModelIO/MDLVoxelArrayTest.cs create mode 100644 tests/monotouch-test/PassKit/PKPaymentRequestTest.cs create mode 100644 tests/monotouch-test/PdfKit/PdfAnnotationTest.cs create mode 100644 tests/monotouch-test/ReplayKit/BroadcastHandlerTest.cs create mode 100644 tests/monotouch-test/Simd/MatrixFloat2x2Test.cs create mode 100644 tests/monotouch-test/Simd/MatrixFloat3x3Test.cs create mode 100644 tests/monotouch-test/Simd/MatrixFloat4x3Test.cs create mode 100644 tests/monotouch-test/Simd/MatrixFloat4x4Test.cs create mode 100644 tests/monotouch-test/Simd/NMatrix4dTest.cs create mode 100644 tests/monotouch-test/Simd/NVector3dTest.cs create mode 100644 tests/monotouch-test/Simd/VectorFloat3Test.cs create mode 100644 tests/monotouch-test/SpriteKit/SKTransformNodeTest.cs create mode 100644 tests/monotouch-test/UIKit/DirectionalEdgeInsetsTest.cs create mode 100644 tests/monotouch-test/UIKit/UIDragDropSessionExtensionsTest.cs create mode 100644 tests/monotouch-test/UIKit/UIPasteConfigurationSupportingTest.cs create mode 100644 tests/monotouch-test/UIKit/UISpringLoadedInteractionSupportingTest.cs create mode 100644 tests/xharness/SimpleFileListener.cs delete mode 100644 tests/xtro-sharpie/SharpieEntryPoint.cs create mode 100644 tests/xtro-sharpie/SimdCheck.cs delete mode 100644 tests/xtro-sharpie/xtro-plugin.csproj diff --git a/Make.config b/Make.config index 95bb98c184c8..9239051e95c8 100644 --- a/Make.config +++ b/Make.config @@ -18,6 +18,7 @@ PACKAGE_HEAD_REV=$(shell git rev-parse HEAD) # PACKAGE_HEAD_BRANCH (set to the release branch name, this shows up in the IDE's version information, as well as mtouch/mmp --version) # IOS_PACKAGE_VERSION (major/minor #) # MAC_PACKAGE_VERSION (major/minor #) +# PACKAGE_VERSION_REV (set to 0 and increment for service releases or previews) # (and updating the same on master as well, to next version) # @@ -37,21 +38,23 @@ else CURRENT_BRANCH:=$(PACKAGE_HEAD_BRANCH) endif +# for service releases and previews +PACKAGE_VERSION_REV=0 + IOS_PRODUCT=Xamarin.iOS IOS_PACKAGE_NAME=Xamarin.iOS IOS_PACKAGE_NAME_LOWER=$(shell echo $(IOS_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]") # NEVER customize IOS_PACKAGE_VERSION itself, other parts (mtouch, web updater) are using the IOS_PACKAGE_VERSION_* variables -IOS_PACKAGE_VERSION=10.15.0.$(IOS_COMMIT_DISTANCE) +IOS_PACKAGE_VERSION=11.3.$(PACKAGE_VERSION_REV).$(IOS_COMMIT_DISTANCE) IOS_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(IOS_PACKAGE_VERSION))) IOS_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(IOS_PACKAGE_VERSION))) -IOS_PACKAGE_VERSION_REV=$(word 3, $(subst ., ,$(IOS_PACKAGE_VERSION))) +IOS_PACKAGE_VERSION_REV=$(PACKAGE_VERSION_REV) IOS_PACKAGE_VERSION_BUILD=$(IOS_COMMIT_DISTANCE) IOS_PACKAGE_UPDATE_ID=$(shell printf "2%02d%02d%02d%03d" $(IOS_PACKAGE_VERSION_MAJOR) $(IOS_PACKAGE_VERSION_MINOR) $(IOS_PACKAGE_VERSION_REV) $(IOS_PACKAGE_VERSION_BUILD)) -# Xcode 8.3 -XCODE_VERSION=8.3 -XCODE_URL=http://xamarin-storage/bot-provisioning/Xcode_8.3.xip -XCODE_DEVELOPER_ROOT=/Applications/Xcode83.app/Contents/Developer +XCODE_VERSION=9 +XCODE_URL=http://xamarin-storage/bot-provisioning/Xcode_9_GM_seed.xip +XCODE_DEVELOPER_ROOT=/Applications/Xcode9-GM.app/Contents/Developer # Minimum Mono version MIN_MONO_VERSION=5.4.0.60 @@ -72,10 +75,10 @@ MIN_OSX_BUILD_VERSION=10.12 MIN_OSX_VERSION_FOR_IOS=10.11 MIN_OSX_VERSION_FOR_MAC=10.11 -IOS_SDK_VERSION=10.3 -OSX_SDK_VERSION=10.12 -WATCH_SDK_VERSION=3.2 -TVOS_SDK_VERSION=10.2 +IOS_SDK_VERSION=11.0 +OSX_SDK_VERSION=10.13 +WATCH_SDK_VERSION=4.0 +TVOS_SDK_VERSION=11.0 MIN_IOS_SDK_VERSION=6.0 MIN_OSX_SDK_VERSION=10.7 @@ -249,10 +252,10 @@ MAC_PRODUCT=Xamarin.Mac MAC_PACKAGE_NAME=xamarin.mac MAC_PACKAGE_NAME_LOWER=$(shell echo $(MAC_PACKAGE_NAME) | tr "[:upper:]" "[:lower:]") -MAC_PACKAGE_VERSION=3.9.0.$(MAC_COMMIT_DISTANCE) +MAC_PACKAGE_VERSION=4.1.$(PACKAGE_VERSION_REV).$(MAC_COMMIT_DISTANCE) MAC_PACKAGE_VERSION_MAJOR=$(word 1, $(subst ., ,$(MAC_PACKAGE_VERSION))) MAC_PACKAGE_VERSION_MINOR=$(word 2, $(subst ., ,$(MAC_PACKAGE_VERSION))) -MAC_PACKAGE_VERSION_REV=$(word 3, $(subst ., ,$(MAC_PACKAGE_VERSION))) +MAC_PACKAGE_VERSION_REV=$(PACKAGE_VERSION_REV) MAC_PACKAGE_VERSION_BUILD=$(word 4, $(subst ., ,$(MAC_PACKAGE_VERSION))) MAC_PACKAGE_VERSION_MAJOR_MINOR=$(MAC_PACKAGE_VERSION_MAJOR).$(MAC_PACKAGE_VERSION_MINOR) MAC_PACKAGE_UPDATE_ID=$(shell echo $(subst ., ,$(MAC_PACKAGE_VERSION).$(MAC_PACKAGE_VERSION_BUILD)) | awk '{printf "2%02d%02d%02d%03d",$$1,$$2,$$3,$$4}') diff --git a/README.md b/README.md index 3ad16fb71e72..1ac8445b6092 100644 --- a/README.md +++ b/README.md @@ -142,4 +142,3 @@ We use [Mono's Coding Guidelines](http://www.mono-project.com/community/contribu ### Reporting Bugs We use [Bugzilla](https://bugzilla.xamarin.com/newbug) to track issues. - diff --git a/Versions-ios.plist.in b/Versions-ios.plist.in index 859bc81aed45..738f00f802a5 100644 --- a/Versions-ios.plist.in +++ b/Versions-ios.plist.in @@ -23,6 +23,7 @@ 10.1 10.2 10.3 + 11.0 tvOS @@ -32,6 +33,7 @@ 10.0 10.1 10.2 + 11.0 watchOS @@ -42,6 +44,7 @@ 3.0 3.1 3.2 + 4.0 RecommendedXcodeVersion diff --git a/Versions-mac.plist.in b/Versions-mac.plist.in index 02734a11e841..8b90fc642e3f 100644 --- a/Versions-mac.plist.in +++ b/Versions-mac.plist.in @@ -12,6 +12,7 @@ 10.10 10.11 10.12 + 10.13 RecommendedXcodeVersion diff --git a/builds/Makefile b/builds/Makefile index 2241e3d477ec..6545c0ac0100 100644 --- a/builds/Makefile +++ b/builds/Makefile @@ -805,6 +805,7 @@ SIM_ACVARS = \ $(COMMON_ACVARS) \ ac_cv_func_clock_nanosleep=no \ mono_cv_uscore=yes \ + ac_cv_func_system=no \ define SimulatorBuildTemplate @@ -1856,6 +1857,7 @@ endif LLVM_BASE_CONFIGURE_FLAGS=--enable-libcpp --enable-optimized --enable-assertions=no --disable-jit --disable-docs --disable-doxygen LLVM_CXXFLAGS=$(CCACHE_CXXFLAGS) +LLVM_BASE_CONFIGURE_ENVIRONMENT=$(COMMON_ACVARS) # This is used just for linking with the 32 bit cross compiler # FIXME: Avoid building the libs not needed by mono @@ -1863,6 +1865,7 @@ LLVM_CXXFLAGS=$(CCACHE_CXXFLAGS) @mkdir -p llvm/ @echo "Configuring llvm" @cd llvm && \ + $(LLVM_BASE_CONFIGURE_ENVIRONMENT) \ $(abspath $(LLVM_PATH)/configure) --prefix=$$PWD/usr --build=i386-apple-darwin10.7 --enable-targets="arm" $(LLVM_BASE_CONFIGURE_FLAGS) --cache-file=../llvm.config.cache CC="$(CCACHE)clang" CXX="$(CCACHE)clang++" CXXFLAGS="$(LLVM_CXXFLAGS)" > $@.log 2>&1 || (echo "Configuring llvm failed:" && cat $@.log | sed "s/^/ /" && exit 1) $(Q) @touch $@ @echo Configured llvm @@ -1871,6 +1874,7 @@ LLVM_CXXFLAGS=$(CCACHE_CXXFLAGS) @mkdir -p llvm64/ @echo "Configuring llvm64" @cd llvm64 && \ + $(LLVM_BASE_CONFIGURE_ENVIRONMENT) \ $(abspath $(LLVM_PATH)/configure) --prefix=$$PWD/usr --enable-targets="arm arm64" $(LLVM_BASE_CONFIGURE_FLAGS) --cache-file=../llvm64.config.cache CC="$(CCACHE)clang" CXX="$(CCACHE)clang++" CXXFLAGS="-Qunused-arguments" > $@.log 2>&1 || (echo "Configuring llvm64 failed:" && cat $@.log | sed "s/^/ /" && exit 1) $(Q) @touch $@ @echo "Configured llvm64" diff --git a/docs/website/mtouch-errors.md b/docs/website/mtouch-errors.md index 12eb1da7d5ed..b255e499c7b7 100644 --- a/docs/website/mtouch-errors.md +++ b/docs/website/mtouch-errors.md @@ -560,9 +560,21 @@ linker. This will most likely result in native linker errors. The solution is to remove the `--dynamic-symbol-mode=linker` argument from the additional mtouch arguments in the project's Build options. -### MT0116: Aot files could not be found at the expected directory '{msymdir}'. +### MT0116: Invalid architecture: {arch}. 32-bit architectures are not supported when deployment target is 11 or later. Make sure the project does not build for a 32-bit architecture. - +iOS 11 does not contain support for 32-bit applications, so it's not supported +to build for a 32-bit application when the deployment target is iOS 11 or +later. + +Either change the target architecture in the project's iOS build options to +arm64, or change the deployment target in the project's Info.plist to an +earlier iOS version. + +### MT0117: Can't launch a 32-bit app on a simulator that only supports 64-bit. + +### MT0116: Aot files could not be found at the expected directory '{msymdir}'. + + ### MT0123: The current language was set to '{language}' according to the LANG environment variable (LANG={LANG}). diff --git a/external/Touch.Unit b/external/Touch.Unit index 055659f10af4..8f1e19d731c7 160000 --- a/external/Touch.Unit +++ b/external/Touch.Unit @@ -1 +1 @@ -Subproject commit 055659f10af409c7e369ee3372bd3f4b1a99fd2c +Subproject commit 8f1e19d731c7490993e5b25aaa2fc340498079b5 diff --git a/external/Xamarin.MacDev b/external/Xamarin.MacDev index da6aeb0f4924..59023905966b 160000 --- a/external/Xamarin.MacDev +++ b/external/Xamarin.MacDev @@ -1 +1 @@ -Subproject commit da6aeb0f49243a497a921c0cef24264b1ca1279c +Subproject commit 59023905966b465cc92bb46535cf66a59a38d39f diff --git a/external/llvm b/external/llvm index 6aa74ae5723b..975e3a690300 160000 --- a/external/llvm +++ b/external/llvm @@ -1 +1 @@ -Subproject commit 6aa74ae5723b13433adce76e94adcc090f2768ee +Subproject commit 975e3a6903003d7dba1b01f8a3c4a42a55049842 diff --git a/external/mono b/external/mono index b2acee0ade0c..7d7887780057 160000 --- a/external/mono +++ b/external/mono @@ -1 +1 @@ -Subproject commit b2acee0ade0c53b0e70a322f3adb15071517add0 +Subproject commit 7d7887780057e40f3921ceedca6c1579a928655d diff --git a/external/opentk b/external/opentk index 2335bde3612c..396bc90c7ac2 160000 --- a/external/opentk +++ b/external/opentk @@ -1 +1 @@ -Subproject commit 2335bde3612c0cfcc1f0057d494c2ce681b54df4 +Subproject commit 396bc90c7ac2e7ce442840a5e8bd91e5e79b381e diff --git a/jenkins/nunit-summary.xslt b/jenkins/nunit-summary.xslt deleted file mode 100644 index bf270e66d55a..000000000000 --- a/jenkins/nunit-summary.xslt +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - [PASS] - - - [FAIL] - - - [IGNORED] - - - [INCONCLUSIVE] - - - [INFO] - - - . : - - - - - - - - - - - - - - - - - - - - diff --git a/mk/xamarin.mk b/mk/xamarin.mk index e09a031c6bcc..5ea227abed32 100644 --- a/mk/xamarin.mk +++ b/mk/xamarin.mk @@ -1,5 +1,5 @@ ifdef ENABLE_XAMARIN -NEEDED_MACCORE_VERSION := 93175c63568e00cf7cf7ac4be5a5cbd4d51bb0b9 +NEEDED_MACCORE_VERSION := e2905474b133977db654cf4036e78616ed92c3bf NEEDED_MACCORE_BRANCH := master MACCORE_DIRECTORY := maccore diff --git a/msbuild/Xamarin.iOS.Tasks.Core/Xamarin.iOS.Common.targets b/msbuild/Xamarin.iOS.Tasks.Core/Xamarin.iOS.Common.targets index 3c0c2782f7cd..f601b56c0459 100644 --- a/msbuild/Xamarin.iOS.Tasks.Core/Xamarin.iOS.Common.targets +++ b/msbuild/Xamarin.iOS.Tasks.Core/Xamarin.iOS.Common.targets @@ -1856,7 +1856,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved. - diff --git a/msbuild/tests/MyPhotoEditingExtension/Info.plist b/msbuild/tests/MyPhotoEditingExtension/Info.plist index 3698f5d349be..37a6585165db 100644 --- a/msbuild/tests/MyPhotoEditingExtension/Info.plist +++ b/msbuild/tests/MyPhotoEditingExtension/Info.plist @@ -18,6 +18,8 @@ 1.0 CFBundleSignature ???? + MinimumOSVersion + 8.0 CFBundleVersion 1 NSExtension diff --git a/msbuild/tests/MyShareExtension/Info.plist b/msbuild/tests/MyShareExtension/Info.plist index 70c38f8e2eb6..7d795b753f7a 100644 --- a/msbuild/tests/MyShareExtension/Info.plist +++ b/msbuild/tests/MyShareExtension/Info.plist @@ -18,6 +18,8 @@ 1.0 CFBundleSignature ???? + MinimumOSVersion + 8.0 CFBundleVersion 1 NSExtension diff --git a/msbuild/tests/MySingleView/Info.plist b/msbuild/tests/MySingleView/Info.plist index bb938e4d18a9..dbf35be44e97 100644 --- a/msbuild/tests/MySingleView/Info.plist +++ b/msbuild/tests/MySingleView/Info.plist @@ -15,7 +15,7 @@ UIMainStoryboardFile MainStoryboard MinimumOSVersion - 6.1 + 7.0 CFBundleDisplayName ApplicationName CFBundleIdentifier diff --git a/msbuild/tests/MyTodayExtension/Info.plist b/msbuild/tests/MyTodayExtension/Info.plist index 3081b14e398a..bde8933a3016 100644 --- a/msbuild/tests/MyTodayExtension/Info.plist +++ b/msbuild/tests/MyTodayExtension/Info.plist @@ -18,6 +18,8 @@ 1.0 CFBundleSignature ???? + MinimumOSVersion + 8.0 CFBundleVersion 1 NSExtension diff --git a/msbuild/tests/Xamarin.iOS.Tasks.Tests/TargetTests/TargetTests.cs b/msbuild/tests/Xamarin.iOS.Tasks.Tests/TargetTests/TargetTests.cs index 2b2560b97b83..de2f3b7e3e60 100644 --- a/msbuild/tests/Xamarin.iOS.Tasks.Tests/TargetTests/TargetTests.cs +++ b/msbuild/tests/Xamarin.iOS.Tasks.Tests/TargetTests/TargetTests.cs @@ -36,6 +36,7 @@ string[] ExpectedExecutableBundleResources { "LaunchImage-568h@2x.png", "LaunchImage.png", "LaunchImage@2x.png", + "Assets.car", }; return files.Select (s => Path.Combine (AppBundlePath, s)).ToArray (); } @@ -435,7 +436,7 @@ public void BundleResources () var path = Path.Combine (MonoTouchProjectPath, "Info.plist"); var plist = PDictionary.FromFile (path); - plist.SetMinimumOSVersion ("6.1"); + plist.SetMinimumOSVersion ("7.0"); plist.Save (path, true); RunTarget (MonoTouchProject, TargetName.CollectBundleResources); @@ -480,7 +481,7 @@ public void AddAppIcon_NoClean() // Start without app icon. plist.Remove("XSAppIconAssets"); - plist.SetMinimumOSVersion ("6.1"); + plist.SetMinimumOSVersion ("7.0"); plist.Save (path, true); RunTarget (project, TargetName.CompileImageAssets); diff --git a/runtime/Makefile b/runtime/Makefile index aea83e631024..82b82ffb2010 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -41,7 +41,7 @@ Delegates.generated.cs: Delegates.cs.t4 delegates.t4 $(Q_GEN) $(TT) $< -o $@ bindings-generator.exe: bindings-generator.cs - $(Q) $(SYSTEM_MCS) $< -o:$@ + $(Q) $(SYSTEM_MCS) $< -o:$@ -debug:full bindings-generated.m: bindings-generator.exe $(Q_GEN) $(SYSTEM_MONO) --debug $< $@ diff --git a/runtime/bindings-generator.cs b/runtime/bindings-generator.cs index f22abaa890b6..72906481807f 100644 --- a/runtime/bindings-generator.cs +++ b/runtime/bindings-generator.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; /* @@ -35,6 +36,7 @@ public static int Main (string[] args) writer.WriteLine ("/* This file is generated */"); writer.WriteLine (); writer.WriteLine ("#include \"bindings.h\""); + writer.WriteLine ("#include "); writer.WriteLine (); writer.WriteLine ("#ifdef __cplusplus"); writer.WriteLine ("extern \"C\" {"); @@ -75,6 +77,26 @@ static IEnumerable GetFunctionData () { var data = new List (); + data.Add ( + new FunctionData { + Comment = " // NVector3 func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NVector3, + } + ); + + data.Add ( + new FunctionData { + Comment = " // void func (NVector3)", + Prefix = "simd__", + Variants = Variants.msgSend | Variants.msgSendSuper, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.NVector3 } + }, + } + ); + data.Add ( new FunctionData { Comment = " // void func (Vector3)", @@ -669,6 +691,32 @@ static IEnumerable GetFunctionData () } ); + data.Add ( + new FunctionData { + Comment = " // MDLAxisAlignedBoundingBox func (float)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.MDLAxisAlignedBoundingBox, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.Float }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, MDLAxisAlignedBoundingBox, float)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.MDLAxisAlignedBoundingBox }, + new ParameterData { TypeData = Types.Float }, + }, + } + ); + data.Add ( new FunctionData { Comment = " // Vector3 func (Vector4i)", @@ -1443,6 +1491,26 @@ static IEnumerable GetFunctionData () } ); + data.Add ( + new FunctionData { + Comment = " // Quaternion func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.QuatF, + } + ); + + data.Add ( + new FunctionData { + Comment = " // void func (Quaternion)", + Prefix = "simd__", + Variants = Variants.NonStret, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.QuatF }, + }, + } + ); + // Required for ModelIO data.Add ( new FunctionData { @@ -1862,6 +1930,372 @@ static IEnumerable GetFunctionData () } ); + // Required for ARKit + + data.Add ( + new FunctionData { + Comment = " // Matrix4 func (/* UIInterfaceOrientation */ Int32, CGSize, nfloat, nfloat)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.Matrix4f, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.Int32 }, + new ParameterData { TypeData = Types.CGSize }, + new ParameterData { TypeData = Types.NFloat }, + new ParameterData { TypeData = Types.NFloat }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // Matrix4 func (/* UIInterfaceOrientation */ Int64, CGSize, nfloat, nfloat)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.Matrix4f, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.Int64 }, + new ParameterData { TypeData = Types.CGSize }, + new ParameterData { TypeData = Types.NFloat }, + new ParameterData { TypeData = Types.NFloat }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // CGPoint func (Vector3, /* UIInterfaceOrientation */ Int32, CGSize)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.CGPoint, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.NVector3 }, + new ParameterData { TypeData = Types.Int32 }, + new ParameterData { TypeData = Types.CGSize }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // CGPoint func (Vector3, /* UIInterfaceOrientation */ Int64, CGSize)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.CGPoint, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.NVector3 }, + new ParameterData { TypeData = Types.Int64 }, + new ParameterData { TypeData = Types.CGSize }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // Matrix4 func (/* UIInterfaceOrientation */ nint)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.Matrix4f, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.NInt }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // MPSImageHistogramInfo func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.MPSImageHistogramInfo, + } + ); + + data.Add ( + new FunctionData { + Comment = " // void func (NMatrix2)", + Prefix = "simd__", + Variants = Variants.NonStret, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.NMatrix2 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix2 func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix2, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, ref MPSImageHistogramInfo)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.MPSImageHistogramInfo, IsRef = true }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, NMatrix2)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.NMatrix2 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // void func (NMatrix3)", + Prefix = "simd__", + Variants = Variants.NonStret, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.NMatrix3 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (NMatrix3)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.NMatrix3 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // MDLVoxelIndexExtent2 func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.MDLVoxelIndexExtent2, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix3 func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix3, + } + ); + + data.Add ( + new FunctionData { + Comment = " // void func (MDLVoxelIndexExtent2)", + Prefix = "simd__", + Variants = Variants.NonStret, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.MDLVoxelIndexExtent2 }, + } + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, NMatrix3)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.NMatrix3 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // void func (NMatrix4)", + Prefix = "simd__", + Variants = Variants.NonStret, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.NMatrix4 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (NMatrix4)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData[] { + new ParameterData { TypeData = Types.NMatrix4 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // void func (NMatrix4, double)", + Prefix = "simd__", + Variants = Variants.NonStret, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.NMatrix4 }, + new ParameterData { TypeData = Types.Double }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (NMatrix4, bool)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.NMatrix4 }, + new ParameterData { TypeData = Types.Bool }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (MDLVoxelIndexExtent2)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.MDLVoxelIndexExtent2 }, + }, + } + ); + + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, nuint, NMatrix4)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.NUInt }, + new ParameterData { TypeData = Types.NMatrix4 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix4 func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix4, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix4 func (int, CGSize, nfloat, nfloat)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix4, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.Int32 }, + new ParameterData { TypeData = Types.CGSize }, + new ParameterData { TypeData = Types.NFloat }, + new ParameterData { TypeData = Types.NFloat }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix4 func (Int64, CGSize, nfloat, nfloat)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix4, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.Int64 }, + new ParameterData { TypeData = Types.CGSize }, + new ParameterData { TypeData = Types.NFloat }, + new ParameterData { TypeData = Types.NFloat }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix4 func (double)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix4, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.Double }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix4 func (nint)", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix4, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.NInt }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, nint, NMatrix4)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.NInt }, + new ParameterData { TypeData = Types.NMatrix4 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // IntPtr func (IntPtr, NMatrix4)", + Prefix = "simd__", + Variants = Variants.NonStret, + ReturnType = Types.IntPtr, + Parameters = new ParameterData [] { + new ParameterData { TypeData = Types.IntPtr }, + new ParameterData { TypeData = Types.NMatrix4 }, + }, + } + ); + + data.Add ( + new FunctionData { + Comment = " // NMatrix4x3 func ()", + Prefix = "simd__", + Variants = Variants.All, + ReturnType = Types.NMatrix4x3, + } + ); + // We must expand functions with native types to their actual type as well. for (int i = data.Count - 1; i >= 0; i--) { if (!data [i].HasNativeType) @@ -1878,176 +2312,260 @@ static string GetTypeNameForSignature (string managed_type) return managed_type; } - static void MarshalToManaged (StringWriter writer, TypeData type, string nativeVariable, string managedVariable) + static void MarshalToManaged (StringWriter writer, TypeData type, string nativeVariable, string managedVariable, bool isRef = false) { + var accessor = isRef ? "->" : "."; switch (type.ManagedType) { case "Vector2d": case "Vector2i": case "Vector2": - writer.WriteLine ("\t{0}.a = {1} [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.b = {1} [1];", managedVariable, nativeVariable); + writer.WriteLine ("\t{0}{2}a = {1} [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}b = {1} [1];", managedVariable, nativeVariable, accessor); break; case "Vector3d": case "Vector3i": case "Vector3": - writer.WriteLine ("\t{0}.a = {1} [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.b = {1} [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.c = {1} [2];", managedVariable, nativeVariable); + case "NVector3": + case "NVector3d": + writer.WriteLine ("\t{0}{2}a = {1} [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}b = {1} [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}c = {1} [2];", managedVariable, nativeVariable, accessor); break; case "Vector4d": case "Vector4i": case "Vector4": if (type.NativeType == "vector_float3") { - writer.WriteLine ("\t{0}.a = {1} [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.b = {1} [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.c = {1} [2];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.d = 0;", managedVariable); + writer.WriteLine ("\t{0}{2}a = {1} [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}b = {1} [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}c = {1} [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{1}d = 0;", managedVariable, accessor); } else if (type.NativeType == "vector_float4" || type.NativeType == "vector_int4" || type.NativeType == "vector_double4") { - writer.WriteLine ("\t{0}.a = {1} [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.b = {1} [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.c = {1} [2];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.d = {1} [3];", managedVariable, nativeVariable); + writer.WriteLine ("\t{0}{2}a = {1} [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}b = {1} [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}c = {1} [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}d = {1} [3];", managedVariable, nativeVariable, accessor); } else { goto default; } break; case "Matrix2": + case "NMatrix2": writer.WriteLine ("\tfor (int i = 0; i < 2; i++) {"); - writer.WriteLine ("\t\t{0}.columns [i].a = {1}.columns [i] [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.columns [i].b = {1}.columns [i] [1];", managedVariable, nativeVariable); + writer.WriteLine ("\t\t{0}{2}columns [i].a = {1}.columns [i] [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].b = {1}.columns [i] [1];", managedVariable, nativeVariable, accessor); writer.WriteLine ("\t}"); break; case "Matrix3": + case "NMatrix3": writer.WriteLine ("\tfor (int i = 0; i < 3; i++) {"); - writer.WriteLine ("\t\t{0}.columns [i].a = {1}.columns [i] [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.columns [i].b = {1}.columns [i] [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.columns [i].c = {1}.columns [i] [2];", managedVariable, nativeVariable); + writer.WriteLine ("\t\t{0}{2}columns [i].a = {1}.columns [i] [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].b = {1}.columns [i] [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].c = {1}.columns [i] [2];", managedVariable, nativeVariable, accessor); writer.WriteLine ("\t}"); break; case "Matrix4": + case "NMatrix4": + case "NMatrix4d": + writer.WriteLine ("\tfor (int i = 0; i < 4; i++) {"); + writer.WriteLine ("\t\t{0}{2}columns [i].a = {1}.columns [i] [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].b = {1}.columns [i] [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].c = {1}.columns [i] [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].d = {1}.columns [i] [3];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t}"); + break; + case "NMatrix4x3": writer.WriteLine ("\tfor (int i = 0; i < 4; i++) {"); - writer.WriteLine ("\t\t{0}.columns [i].a = {1}.columns [i] [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.columns [i].b = {1}.columns [i] [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.columns [i].c = {1}.columns [i] [2];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.columns [i].d = {1}.columns [i] [3];", managedVariable, nativeVariable); + writer.WriteLine ("\t\t{0}{2}columns [i].a = {1}.columns [i] [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].b = {1}.columns [i] [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}columns [i].c = {1}.columns [i] [2];", managedVariable, nativeVariable, accessor); writer.WriteLine ("\t}"); break; case "MDLAxisAlignedBoundingBox": - writer.WriteLine ("\t{0}.maxBounds.a = {1}.maxBounds [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.maxBounds.b = {1}.maxBounds [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.maxBounds.c = {1}.maxBounds [2];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.a = {1}.minBounds [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.b = {1}.minBounds [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.c = {1}.minBounds [2];", managedVariable, nativeVariable); + writer.WriteLine ("\t{0}{2}maxBounds.a = {1}.maxBounds [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxBounds.b = {1}.maxBounds [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxBounds.c = {1}.maxBounds [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.a = {1}.minBounds [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.b = {1}.minBounds [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.c = {1}.minBounds [2];", managedVariable, nativeVariable, accessor); break; case "GKBox": - writer.WriteLine ("\t{0}.maxBounds.a = {1}.maxBounds [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.maxBounds.b = {1}.maxBounds [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.maxBounds.c = {1}.maxBounds [2];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.a = {1}.minBounds [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.b = {1}.minBounds [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.c = {1}.minBounds [2];", managedVariable, nativeVariable); + writer.WriteLine ("\t{0}{2}maxBounds.a = {1}.maxBounds [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxBounds.b = {1}.maxBounds [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxBounds.c = {1}.maxBounds [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.a = {1}.minBounds [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.b = {1}.minBounds [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.c = {1}.minBounds [2];", managedVariable, nativeVariable, accessor); break; case "GKQuad": - writer.WriteLine ("\t{0}.maxBounds.a = {1}.maxBounds [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.maxBounds.b = {1}.maxBounds [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.a = {1}.minBounds [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t{0}.minBounds.b = {1}.minBounds [1];", managedVariable, nativeVariable); + writer.WriteLine ("\t{0}{2}maxBounds.a = {1}.maxBounds [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxBounds.b = {1}.maxBounds [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.a = {1}.minBounds [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minBounds.b = {1}.minBounds [1];", managedVariable, nativeVariable, accessor); break; case "GKTriangle": writer.WriteLine ("\tfor (int i = 0; i < 3; i++) {"); - writer.WriteLine ("\t\t{0}.points [i].a = {1}.points [i] [0];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.points [i].b = {1}.points [i] [1];", managedVariable, nativeVariable); - writer.WriteLine ("\t\t{0}.points [i].c = {1}.points [i] [2];", managedVariable, nativeVariable); + writer.WriteLine ("\t\t{0}{2}points [i].a = {1}.points [i] [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}points [i].b = {1}.points [i] [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t\t{0}{2}points [i].c = {1}.points [i] [2];", managedVariable, nativeVariable, accessor); writer.WriteLine ("\t}"); break; + case "Quaternion": + writer.WriteLine ("\t{0}{2}vector.a = {1}.vector [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}vector.b = {1}.vector [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}vector.c = {1}.vector [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}vector.d = {1}.vector [3];", managedVariable, nativeVariable, accessor); + break; + case "MPSImageHistogramInfo": + writer.WriteLine ("\t{0}{2}numberOfHistogramEntries = {1}.numberOfHistogramEntries;", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}histogramForAlpha = {1}.histogramForAlpha;", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minPixelValue.a = {1}.minPixelValue [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minPixelValue.b = {1}.minPixelValue [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minPixelValue.c = {1}.minPixelValue [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minPixelValue.d = {1}.minPixelValue [3];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxPixelValue.a = {1}.maxPixelValue [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxPixelValue.b = {1}.maxPixelValue [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxPixelValue.c = {1}.maxPixelValue [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maxPixelValue.d = {1}.maxPixelValue [3];", managedVariable, nativeVariable, accessor); + break; + case "MDLVoxelIndexExtent2": + writer.WriteLine ("\t{0}{2}minimumExtent.a = {1}.minimumExtent [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minimumExtent.b = {1}.minimumExtent [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minimumExtent.c = {1}.minimumExtent [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}minimumExtent.d = {1}.minimumExtent [3];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maximumExtent.a = {1}.maximumExtent [0];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maximumExtent.b = {1}.maximumExtent [1];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maximumExtent.c = {1}.maximumExtent [2];", managedVariable, nativeVariable, accessor); + writer.WriteLine ("\t{0}{2}maximumExtent.d = {1}.maximumExtent [3];", managedVariable, nativeVariable, accessor); + break; default: throw new NotImplementedException (string.Format ("MarshalToManaged for: NativeType: {0} ManagedType: {1}", type.NativeType, type.ManagedType)); } } - static void MarshalToNative (StringWriter writer, TypeData type, string nativeVariable, string managedVariable) + static void MarshalToNative (StringWriter writer, TypeData type, string nativeVariable, string managedVariable, bool isRef) { + var accessor = isRef ? "->" : "."; switch (type.ManagedType) { case "Vector2d": case "Vector2i": case "Vector2": - writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); + writer.WriteLine ("\t{0} [0] = {1}{2}a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [1] = {1}{2}b;", nativeVariable, managedVariable, accessor); break; case "Vector3d": case "Vector3i": case "Vector3": - writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [2] = {1}.c;", nativeVariable, managedVariable); + case "NVector3": + case "NVector3d": + writer.WriteLine ("\t{0} [0] = {1}{2}a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [1] = {1}{2}b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [2] = {1}{2}c;", nativeVariable, managedVariable, accessor); break; case "Vector4d": case "Vector4i": case "Vector4": if (type.NativeType == "vector_float3") { - writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [2] = {1}.c;", nativeVariable, managedVariable); + writer.WriteLine ("\t{0} [0] = {1}{2}a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [1] = {1}{2}b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [2] = {1}{2}c;", nativeVariable, managedVariable, accessor); } else if (type.NativeType == "vector_float4" || type.NativeType == "vector_int4" || type.NativeType == "vector_double4") { - writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [2] = {1}.c;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0} [3] = {1}.d;", nativeVariable, managedVariable); + writer.WriteLine ("\t{0} [0] = {1}{2}a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [1] = {1}{2}b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [2] = {1}{2}c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0} [3] = {1}{2}d;", nativeVariable, managedVariable, accessor); } else { goto default; } break; case "Matrix2": + case "NMatrix2": writer.WriteLine ("\tfor (int i = 0; i < 2; i++) {"); - writer.WriteLine ("\t\t{0}.columns [i][0] = {1}.columns [i].a;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.columns [i][1] = {1}.columns [i].b;", nativeVariable, managedVariable); + writer.WriteLine ("\t\t{0}.columns [i][0] = {1}{2}columns [i].a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][1] = {1}{2}columns [i].b;", nativeVariable, managedVariable, accessor); writer.WriteLine ("\t}"); break; case "Matrix3": + case "NMatrix3": writer.WriteLine ("\tfor (int i = 0; i < 3; i++) {"); - writer.WriteLine ("\t\t{0}.columns [i][0] = {1}.columns [i].a;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.columns [i][1] = {1}.columns [i].b;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.columns [i][2] = {1}.columns [i].c;", nativeVariable, managedVariable); + writer.WriteLine ("\t\t{0}.columns [i][0] = {1}{2}columns [i].a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][1] = {1}{2}columns [i].b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][2] = {1}{2}columns [i].c;", nativeVariable, managedVariable, accessor); writer.WriteLine ("\t}"); break; case "Matrix4": + case "NMatrix4": + case "NMatrix4d": + writer.WriteLine ("\tfor (int i = 0; i < 4; i++) {"); + writer.WriteLine ("\t\t{0}.columns [i][0] = {1}{2}columns [i].a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][1] = {1}{2}columns [i].b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][2] = {1}{2}columns [i].c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][3] = {1}{2}columns [i].d;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t}"); + break; + case "NMatrix4x3": writer.WriteLine ("\tfor (int i = 0; i < 4; i++) {"); - writer.WriteLine ("\t\t{0}.columns [i][0] = {1}.columns [i].a;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.columns [i][1] = {1}.columns [i].b;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.columns [i][2] = {1}.columns [i].c;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.columns [i][3] = {1}.columns [i].d;", nativeVariable, managedVariable); + writer.WriteLine ("\t\t{0}.columns [i][0] = {1}{2}columns [i].a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][1] = {1}{2}columns [i].b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.columns [i][2] = {1}{2}columns [i].c;", nativeVariable, managedVariable, accessor); writer.WriteLine ("\t}"); break; case "MDLAxisAlignedBoundingBox": - writer.WriteLine ("\t{0}.maxBounds [0] = {1}.maxBounds.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.maxBounds [1] = {1}.maxBounds.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.maxBounds [2] = {1}.maxBounds.c;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [0] = {1}.minBounds.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [1] = {1}.minBounds.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [2] = {1}.minBounds.c;", nativeVariable, managedVariable); + writer.WriteLine ("\t{0}.maxBounds [0] = {1}{2}maxBounds.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxBounds [1] = {1}{2}maxBounds.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxBounds [2] = {1}{2}maxBounds.c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [0] = {1}{2}minBounds.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [1] = {1}{2}minBounds.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [2] = {1}{2}minBounds.c;", nativeVariable, managedVariable, accessor); break; case "GKBox": - writer.WriteLine ("\t{0}.maxBounds [0] = {1}.maxBounds.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.maxBounds [1] = {1}.maxBounds.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.maxBounds [2] = {1}.maxBounds.c;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [0] = {1}.minBounds.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [1] = {1}.minBounds.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [2] = {1}.minBounds.c;", nativeVariable, managedVariable); + writer.WriteLine ("\t{0}.maxBounds [0] = {1}{2}maxBounds.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxBounds [1] = {1}{2}maxBounds.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxBounds [2] = {1}{2}maxBounds.c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [0] = {1}{2}minBounds.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [1] = {1}{2}minBounds.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [2] = {1}{2}minBounds.c;", nativeVariable, managedVariable, accessor); break; case "GKQuad": - writer.WriteLine ("\t{0}.maxBounds [0] = {1}.maxBounds.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.maxBounds [1] = {1}.maxBounds.b;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [0] = {1}.minBounds.a;", nativeVariable, managedVariable); - writer.WriteLine ("\t{0}.minBounds [1] = {1}.minBounds.b;", nativeVariable, managedVariable); + writer.WriteLine ("\t{0}.maxBounds [0] = {1}{2}maxBounds.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxBounds [1] = {1}{2}maxBounds.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [0] = {1}{2}minBounds.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minBounds [1] = {1}{2}minBounds.b;", nativeVariable, managedVariable, accessor); break; case "GKTriangle": writer.WriteLine ("\tfor (int i = 0; i < 3; i++) {"); - writer.WriteLine ("\t\t{0}.points [i][0] = {1}.points [i].a;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.points [i][1] = {1}.points [i].b;", nativeVariable, managedVariable); - writer.WriteLine ("\t\t{0}.points [i][2] = {1}.points [i].c;", nativeVariable, managedVariable); + writer.WriteLine ("\t\t{0}.points [i][0] = {1}{2}points [i].a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.points [i][1] = {1}{2}points [i].b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t\t{0}.points [i][2] = {1}{2}points [i].c;", nativeVariable, managedVariable, accessor); writer.WriteLine ("\t}"); break; + case "Quaternion": + writer.WriteLine ("\t{0}.vector [0] = {1}{2}vector.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.vector [1] = {1}{2}vector.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.vector [2] = {1}{2}vector.c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.vector [3] = {1}{2}vector.d;", nativeVariable, managedVariable, accessor); + break; + case "MPSImageHistogramInfo": + writer.WriteLine ("\t{0}.numberOfHistogramEntries = {1}{2}numberOfHistogramEntries;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.histogramForAlpha = {1}{2}histogramForAlpha;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minPixelValue [0] = {1}{2}minPixelValue.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minPixelValue [1] = {1}{2}minPixelValue.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minPixelValue [2] = {1}{2}minPixelValue.c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minPixelValue [3] = {1}{2}minPixelValue.d;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxPixelValue [0] = {1}{2}maxPixelValue.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxPixelValue [1] = {1}{2}maxPixelValue.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxPixelValue [2] = {1}{2}maxPixelValue.c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maxPixelValue [3] = {1}{2}maxPixelValue.d;", nativeVariable, managedVariable, accessor); + break; + case "MDLVoxelIndexExtent2": + writer.WriteLine ("\t{0}.minimumExtent [0] = {1}{2}minimumExtent.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minimumExtent [1] = {1}{2}minimumExtent.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minimumExtent [2] = {1}{2}minimumExtent.c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.minimumExtent [3] = {1}{2}minimumExtent.d;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maximumExtent [0] = {1}{2}maximumExtent.a;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maximumExtent [1] = {1}{2}maximumExtent.b;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maximumExtent [2] = {1}{2}maximumExtent.c;", nativeVariable, managedVariable, accessor); + writer.WriteLine ("\t{0}.maximumExtent [3] = {1}{2}maximumExtent.d;", nativeVariable, managedVariable, accessor); + break; default: throw new NotImplementedException (string.Format ("MarshalToNative for: NativeType: {0} ManagedType: {1}", type.NativeType, type.ManagedType)); } @@ -2086,7 +2604,7 @@ static void WriteParametersMarshal (StringWriter writer, ParameterData [] ps) continue; writer.WriteLine ("\t{0} v{1};", p.TypeData.NativeType, i); - MarshalToNative (writer, p.TypeData, "v" + i.ToString (), "p" + i.ToString ()); + MarshalToNative (writer, p.TypeData, "v" + i.ToString (), "p" + i.ToString (), p.IsRef); } } @@ -2097,14 +2615,35 @@ static void WriteParametersInvoke (StringWriter writer, ParameterData [] ps) for (int i = 0; i < ps.Length; i++) { var p = ps [i]; + writer.Write (", "); + if (p.IsRef && p.TypeData != Types.IntPtr) + writer.Write ("&"); if (p.TypeData.RequireMarshal) { - writer.Write (", v{0}", i); + writer.Write ("v{0}", i); } else { - writer.Write (", p{0}", i); + writer.Write ("p{0}", i); } } } + static void WriteParametersNativeDeclaration (StringWriter writer, ParameterData [] parameters, bool isTypedef) + { + if (parameters == null) + return; + + + for (int i = 0; i < parameters.Length; i++) { + var p = parameters [i]; + writer.Write (", "); + writer.Write (isTypedef ? p.TypeData.NativeType : p.TypeData.NativeWrapperType); + if (p.IsRef && p.TypeData != Types.IntPtr) + writer.Write ("*"); + writer.Write (" "); + writer.Write (isTypedef ? "f" : "p"); + writer.Write (i); + } + } + static void WriteMessageStretSenderCode (StringWriter writer, TypeData type, bool isSuper) { var nonstret = isSuper ? "objc_msgSendSuper" : "objc_msgSend"; @@ -2130,35 +2669,56 @@ static void WriteCatchHandler (StringWriter writer) writer.WriteLine ("\t}"); } + static void WriteMarshalParametersToManaged (StringWriter writer, FunctionData func) + { + if (func.Parameters == null) + return; + + for (int i = 0; i < func.Parameters.Length; i++) { + var p = func.Parameters [i]; + if (!p.IsRef || !p.TypeData.RequireMarshal) + continue; + MarshalToManaged (writer, p.TypeData, $"v{i}", $"p{i}", true); + } + } + + static void WriteMarshalReturnValue (StringWriter writer, FunctionData func, string indent, bool tmpReturnValue) + { + if (func.ReturnType != null) { + if (func.ReturnType.RequireMarshal) { + // Marshal return value back + writer.WriteLine ("{0}{1} rvm;", indent, func.ReturnType.NativeWrapperType); + MarshalToManaged (writer, func.ReturnType, "rv", "rvm"); + writer.WriteLine ("{0}return rvm;", indent); + } else if (tmpReturnValue) { + writer.WriteLine ("{0}return rv;", indent); + } + } + } + static void Write_objc_msgSend (StringWriter writer, FunctionData func) { + var tmpReturnValue = func.ReturnType != null && (func.ReturnType.RequireMarshal == true || func.Parameters?.Any ((v) => v.IsRef && v.TypeData.RequireMarshal) == true); + // func name var overload = "objc_msgSend"; var funcName = GetFuncName (func, overload); // typedef writer.Write ("typedef {0} (*func_{1}) (id self, SEL sel", func.ReturnType == null ? "void" : func.ReturnType.NativeType, funcName.ToString ()); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} f{1}", func.Parameters [i].TypeData.NativeType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, true); writer.WriteLine (");"); // declaration writer.WriteLine (func.ReturnType != null ? func.ReturnType.NativeWrapperType : "void"); writer.Write (funcName); writer.Write (" (id self, SEL sel"); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} p{1}", func.Parameters [i].TypeData.NativeWrapperType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, false); writer.WriteLine (")"); // body writer.WriteLine ("{"); - if (func.ReturnType != null && func.ReturnType.RequireMarshal) { + if (tmpReturnValue) { writer.WriteLine ("\t{0} rv;", func.ReturnType.NativeType); } @@ -2178,7 +2738,7 @@ static void Write_objc_msgSend (StringWriter writer, FunctionData func) // invoke writer.Write (indent); if (func.ReturnType != null) { - if (func.ReturnType.RequireMarshal) { + if (tmpReturnValue) { writer.Write ("rv = "); } else { writer.Write ("return "); @@ -2188,14 +2748,8 @@ static void Write_objc_msgSend (StringWriter writer, FunctionData func) WriteParametersInvoke (writer, func.Parameters); writer.WriteLine (");"); - if (func.ReturnType != null) { - if (func.ReturnType.RequireMarshal) { - // Marshal return value back - writer.WriteLine ("{0}{1} rvm;", indent, func.ReturnType.NativeWrapperType); - MarshalToManaged (writer, func.ReturnType, "rv", "rvm"); - writer.WriteLine ("{0}return rvm;", indent); - } - } + WriteMarshalParametersToManaged (writer, func); + WriteMarshalReturnValue (writer, func, indent, tmpReturnValue); // @catch if (func.MarshalExceptions) @@ -2207,33 +2761,27 @@ static void Write_objc_msgSend (StringWriter writer, FunctionData func) static void Write_objc_msgSendSuper (StringWriter writer, FunctionData func) { + var tmpReturnValue = func.ReturnType != null && (func.ReturnType.RequireMarshal == true || func.Parameters?.Any ((v) => v.IsRef && v.TypeData.RequireMarshal) == true); + // func name var overload = "objc_msgSendSuper"; var funcName = GetFuncName (func, overload); // typedef writer.Write ("typedef {0} (*func_{1}) (struct objc_super *super, SEL sel", func.ReturnType == null ? "void" : func.ReturnType.NativeType, funcName.ToString ()); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} f{1}", func.Parameters [i].TypeData.NativeType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, true); writer.WriteLine (");"); // declaration writer.WriteLine (func.ReturnType != null ? func.ReturnType.NativeWrapperType : "void"); writer.Write (funcName); writer.Write (" (struct objc_super *super, SEL sel"); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} p{1}", func.Parameters [i].TypeData.NativeWrapperType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, false); writer.WriteLine (")"); // body writer.WriteLine ("{"); - if (func.ReturnType != null && func.ReturnType.RequireMarshal) { + if (tmpReturnValue) { writer.WriteLine ("\t{0} rv;", func.ReturnType.NativeType); } @@ -2253,7 +2801,7 @@ static void Write_objc_msgSendSuper (StringWriter writer, FunctionData func) // invoke writer.Write (indent); if (func.ReturnType != null) { - if (func.ReturnType.RequireMarshal) { + if (tmpReturnValue) { writer.Write ("rv = "); } else { writer.Write ("return "); @@ -2263,14 +2811,8 @@ static void Write_objc_msgSendSuper (StringWriter writer, FunctionData func) WriteParametersInvoke (writer, func.Parameters); writer.WriteLine (");"); - if (func.ReturnType != null) { - if (func.ReturnType.RequireMarshal) { - // Marshal return value back - writer.WriteLine ("{0}{1} rvm;", indent, func.ReturnType.NativeWrapperType); - MarshalToManaged (writer, func.ReturnType, "rv", "rvm"); - writer.WriteLine ("{0}return rvm;", indent); - } - } + WriteMarshalParametersToManaged (writer, func); + WriteMarshalReturnValue (writer, func, indent, tmpReturnValue); // @catch if (func.MarshalExceptions) @@ -2291,22 +2833,14 @@ static void Write_objc_msgSend_stret (StringWriter writer, FunctionData func) // typedef writer.Write ("typedef {0} (*func_{1}) (id self, SEL sel", func.ReturnType.NativeType, funcName.ToString ()); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} f{1}", func.Parameters [i].TypeData.NativeType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, true); writer.WriteLine (");"); // declaration writer.WriteLine ("void"); writer.Write (funcName); writer.Write (" ({0} *stret_rv, id self, SEL sel", func.ReturnType.NativeWrapperType); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} p{1}", func.Parameters [i].TypeData.NativeWrapperType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, false); writer.WriteLine (")"); // body @@ -2338,6 +2872,7 @@ static void Write_objc_msgSend_stret (StringWriter writer, FunctionData func) WriteParametersInvoke (writer, func.Parameters); writer.WriteLine (");"); + WriteMarshalParametersToManaged (writer, func); if (func.ReturnType.RequireMarshal) { // Marshal return value back MarshalToManaged (writer, func.ReturnType, "rv", "(*stret_rv)"); @@ -2362,22 +2897,14 @@ static void Write_objc_msgSendSuper_stret (StringWriter writer, FunctionData fun // typedef writer.Write ("typedef {0} (*func_{1}) (struct objc_super *super, SEL sel", func.ReturnType.NativeType, funcName.ToString ()); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} f{1}", func.Parameters [i].TypeData.NativeType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, true); writer.WriteLine (");"); // declaration writer.WriteLine ("void"); writer.Write (funcName); writer.Write (" ({0} *stret_rv, struct objc_super *super, SEL sel", func.ReturnType.NativeWrapperType); - if (func.Parameters != null) { - for (int i = 0; i < func.Parameters.Length; i++) { - writer.Write (", {0} p{1}", func.Parameters [i].TypeData.NativeWrapperType, i); - } - } + WriteParametersNativeDeclaration (writer, func.Parameters, false); writer.WriteLine (")"); // body @@ -2409,6 +2936,7 @@ static void Write_objc_msgSendSuper_stret (StringWriter writer, FunctionData fun WriteParametersInvoke (writer, func.Parameters); writer.WriteLine (");"); + WriteMarshalParametersToManaged (writer, func); if (func.ReturnType.RequireMarshal) { // Marshal return value back MarshalToManaged (writer, func.ReturnType, "rv", "(*stret_rv)"); @@ -2436,6 +2964,12 @@ public static class Types { NativeWrapperType = "struct Vector3f", RequireMarshal = true, }; + public static TypeData NVector3 = new TypeData { + ManagedType = "NVector3", + NativeType = "vector_float3", + NativeWrapperType = "struct Vector4f", // Yes, Vector4f, since NVector3 has 4 floats. + RequireMarshal = true, + }; public static TypeData Vector4 = new TypeData { ManagedType = "Vector4", NativeType = "vector_float4", @@ -2479,6 +3013,12 @@ public static class Types { NativeWrapperType = "struct Vector3d", RequireMarshal = true, }; + public static TypeData VectorDouble3 = new TypeData { + ManagedType = "VectorDouble3", + NativeType = "vector_double3", + NativeWrapperType = "struct Vector3d", + RequireMarshal = true, + }; public static TypeData Vector4d = new TypeData { ManagedType = "Vector4d", NativeType = "vector_double4", @@ -2494,6 +3034,15 @@ public static class Types { IsX86Stret = true, IsX64Stret = false, }; + public static TypeData NMatrix2 = new TypeData { + ManagedType = "NMatrix2", + NativeType = "matrix_float2x2", + NativeWrapperType = "struct NMatrix2", + RequireMarshal = true, + IsARMStret = true, + IsX86Stret = true, + IsX64Stret = false, + }; public static TypeData Matrix3f = new TypeData { ManagedType = "Matrix3", NativeType = "matrix_float3x3", @@ -2503,6 +3052,15 @@ public static class Types { IsX86Stret = true, IsX64Stret = true, }; + public static TypeData NMatrix3 = new TypeData { + ManagedType = "NMatrix3", + NativeType = "matrix_float3x3", + NativeWrapperType = "struct NMatrix3", + RequireMarshal = true, + IsARMStret = true, + IsX86Stret = true, + IsX64Stret = true, + }; public static TypeData Matrix4f = new TypeData { ManagedType = "Matrix4", NativeType = "matrix_float4x4", @@ -2512,6 +3070,35 @@ public static class Types { IsX86Stret = true, IsX64Stret = true, }; + public static TypeData NMatrix4 = new TypeData { + ManagedType = "NMatrix4", + NativeType = "matrix_float4x4", + NativeWrapperType = "struct NMatrix4", + RequireMarshal = true, + IsARMStret = true, + IsX86Stret = true, + IsX64Stret = true, + }; + + public static TypeData NMatrix4d = new TypeData { + ManagedType = "NMatrix4d", + NativeType = "matrix_double4x4", + NativeWrapperType = "struct NMatrix4d", + RequireMarshal = true, + IsARMStret = true, + IsX86Stret = true, + IsX64Stret = true, + }; + + public static TypeData NMatrix4x3 = new TypeData { + ManagedType = "NMatrix4x3", + NativeType = "matrix_float4x3", + NativeWrapperType = "struct NMatrix4x3", + RequireMarshal = true, + IsARMStret = true, + IsX86Stret = true, + IsX64Stret = true, + }; public static TypeData Double = new TypeData { ManagedType = "Double", NativeType = "double", @@ -2618,6 +3205,47 @@ public static class Types { IsX86Stret = true, IsX64Stret = true, }; + + public static TypeData CGSize = new TypeData { + ManagedType = "CGSize", + NativeType = "CGSize", + NativeWrapperType = "CGSize", + RequireMarshal = false, + }; + + public static TypeData CGPoint = new TypeData { + ManagedType = "CGPoint", + NativeType = "CGPoint", + NativeWrapperType = "CGPoint", + RequireMarshal = false, + }; + + public static TypeData QuatF = new TypeData { + ManagedType = "Quaternion", + NativeType = "simd_quatf", + NativeWrapperType = "struct QuatF", + RequireMarshal = true, + }; + + public static TypeData MPSImageHistogramInfo = new TypeData { + ManagedType = "MPSImageHistogramInfo", + NativeType = "MPSImageHistogramInfo", + NativeWrapperType = "struct MPSImageHistogramInfoWrapper", + RequireMarshal = true, + IsARMStret = true, + IsX86Stret = true, + IsX64Stret = true, + }; + + public static TypeData MDLVoxelIndexExtent2 = new TypeData { + ManagedType = "MDLVoxelIndexExtent2", + NativeType = "MDLVoxelIndexExtent", + NativeWrapperType = "struct MDLVoxelIndexExtentWrapper", + RequireMarshal = true, + IsARMStret = true, + IsX86Stret = true, + IsX64Stret = true, + }; } } diff --git a/runtime/bindings-generator.csproj b/runtime/bindings-generator.csproj index 700f3a30966d..2400ef66e078 100644 --- a/runtime/bindings-generator.csproj +++ b/runtime/bindings-generator.csproj @@ -6,7 +6,7 @@ {6B616492-49F0-43EF-8390-F9D1B4CCC632} Exe zzg - zzg + bindings-generator v4.5 8.0.30703 2.0 @@ -21,7 +21,6 @@ 4 x86 false - /work/maccore/xcode7/maccore/bindings-generated.m full @@ -32,6 +31,10 @@ true x86 + + Project + ${ProjectDir}/bindings-generated.m + diff --git a/runtime/bindings.h b/runtime/bindings.h index fd91e261a072..e98d8d3e0544 100644 --- a/runtime/bindings.h +++ b/runtime/bindings.h @@ -2,6 +2,7 @@ #define __BINDINGS_H__ #import +#import #include #include #include @@ -82,6 +83,11 @@ typedef __attribute__((__ext_vector_type__(4))) float vector_float4; typedef struct { vector_float2 columns[2]; } matrix_float2x2; typedef struct { vector_float3 columns[3]; } matrix_float3x3; typedef struct { vector_float4 columns[4]; } matrix_float4x4; +typedef struct { vector_float3 columns[4]; } matrix_float4x3; + +typedef struct { vector_double4 columns[4]; } matrix_double4x4; + +typedef struct { vector_float4 vector; } simd_quatf; typedef struct { vector_float3 maxBounds; @@ -102,6 +108,20 @@ typedef struct { vector_float3 points[3]; } GKTriangle; +typedef struct +{ + NSUInteger numberOfHistogramEntries; + BOOL histogramForAlpha; + vector_float4 minPixelValue; + vector_float4 maxPixelValue; +} MPSImageHistogramInfo; + +typedef vector_int4 MDLVoxelIndex; +typedef struct { + MDLVoxelIndex minimumExtent; + MDLVoxelIndex maximumExtent; +} MDLVoxelIndexExtent; + /* * iOS has a vector type (vector_float3) which can't be expressed * in P/Invoke signatures, so we need custom wrappers. @@ -141,14 +161,39 @@ struct Matrix2f { Vector2f columns [2]; }; +struct NMatrix2 { + Vector2f columns [2]; +}; + struct Matrix3f { Vector3f columns [3]; }; +struct NMatrix3 { + Vector4f columns [3]; +}; + struct Matrix4f { Vector4f columns [4]; }; +struct NMatrix4 { + Vector4f columns [4]; +}; + +struct NMatrix4d { + Vector4d columns [4]; +}; + +struct NMatrix4x3 { + // Use Vector4f here, since the managed version has padding to match accordingly. + Vector4f columns [4]; +}; + +struct QuatF { + Vector4f vector; +}; + struct MDLAxisAlignedBoundingBoxWrapper { Vector3f maxBounds; Vector3f minBounds; @@ -168,6 +213,32 @@ struct GKTriangleWrapper { Vector3f points [3]; }; +struct MPSImageHistogramInfoWrapper { + NSUInteger numberOfHistogramEntries; + BOOL histogramForAlpha; + // The minPixelValue field starts at offset 16, but we can't use + // __attribute__ ((aligned (16))), because that will make clang align the + // entire struct on a 16-byte boundary, which doesn't match how we've + // defined it in managed code (explicit layout, but no specific alignment). + // So we need to manually pad the struct to match the managed definition. +#if defined (__x86_64__) || defined (__arm64__) + uint8_t dummy[7]; +#else + uint8_t dummy[11]; +#endif + Vector4f minPixelValue; + Vector4f maxPixelValue; +}; + +typedef Vector4i MDLVoxelIndexWrapper; + +struct MDLVoxelIndexExtentWrapper { + MDLVoxelIndexWrapper minimumExtent; + MDLVoxelIndexWrapper maximumExtent; +}; + +static_assert (sizeof (MPSImageHistogramInfoWrapper) == sizeof (MPSImageHistogramInfo), "Sizes aren't equal"); + struct Vector4f xamarin_vector_float3__Vector4_objc_msgSend (id self, SEL sel); void xamarin_vector_float3__Vector4_objc_msgSend_stret (struct Vector4f *v4, id self, SEL sel); void xamarin_vector_float3__void_objc_msgSend_Vector4 (id self, SEL sel, struct Vector4f p0); @@ -185,6 +256,8 @@ void xamarin_vector_float3__Vector3_objc_msgSendSuper_stret (struct void xamarin_vector_float3__void_objc_msgSendSuper_Vector3 (struct objc_super *super, SEL sel, struct Vector3f p0); void xamarin_vector_float3__Vector3_objc_msgSendSuper_stret_Vector3 (struct Vector3f *v3, struct objc_super *super, SEL sel, struct Vector3f p0); struct Vector3f xamarin_vector_float3__Vector3_objc_msgSendSuper_Vector3 (struct objc_super *super, SEL sel, struct Vector3f p0); +CGPoint xamarin_CGPoint__VNNormalizedFaceBoundingBoxPointForLandmarkPoint_Vector2_CGRect_nuint_nuint_string (struct Vector2f faceLandmarkPoint, CGRect faceBoundingBox, xm_nuint_t imageWidth, xm_nuint_t imageHeight, const char **error_msg); +CGPoint xamarin_CGPoint__VNImagePointForFaceLandmarkPoint_Vector2_CGRect_nuint_nuint_string (struct Vector2f faceLandmarkPoint, CGRect faceBoundingBox, xm_nuint_t imageWidth, xm_nuint_t imageHeight, const char **error_msg); #ifndef XAMCORE_2_0 #ifdef MONOMAC diff --git a/runtime/bindings.m b/runtime/bindings.m index 3be38bf87c28..0ffdf803e451 100644 --- a/runtime/bindings.m +++ b/runtime/bindings.m @@ -11,6 +11,7 @@ */ #include "bindings.h" +#include /* * Hand-written bindings to support ObjectiveC exceptions. @@ -88,3 +89,67 @@ #endif #endif +/* + * Vector c bindings + * + * The following code uses dlsym to not have a linking dependency on Xcode 9, + * the code can be simplified once we require to remove dlsym or xcode 9 becomes the minimum supported version + */ + +typedef CGPoint (*vision_func) (vector_float2 faceLandmarkPoint, CGRect faceBoundingBox, size_t imageWidth, size_t imageHeight); + +CGPoint +xamarin_CGPoint__VNNormalizedFaceBoundingBoxPointForLandmarkPoint_Vector2_CGRect_nuint_nuint_string (struct Vector2f faceLandmarkPoint, CGRect faceBoundingBox, xm_nuint_t imageWidth, xm_nuint_t imageHeight, const char **error_msg) { + + static vision_func func = NULL; + *error_msg = NULL; + + if (func == NULL) { + void *vision_handle = dlopen ("/System/Library/Frameworks/Vision.framework/Vision", RTLD_LAZY); + if (vision_handle == NULL) { + *error_msg = "Could not open Vision Framework"; + return CGPointMake (0, 0); + } + + func = (vision_func) dlsym (vision_handle, "VNNormalizedFaceBoundingBoxPointForLandmarkPoint"); + + if (func == NULL) { + *error_msg = "Could not obtain the address for VNNormalizedFaceBoundingBoxPointForLandmarkPoint"; + return CGPointMake (0, 0); + } + } + + vector_float2 flp; + flp [0] = faceLandmarkPoint.a; + flp [1] = faceLandmarkPoint.b; + + return func (flp, faceBoundingBox, imageWidth, imageHeight); +} + +CGPoint +xamarin_CGPoint__VNImagePointForFaceLandmarkPoint_Vector2_CGRect_nuint_nuint_string (struct Vector2f faceLandmarkPoint, CGRect faceBoundingBox, xm_nuint_t imageWidth, xm_nuint_t imageHeight, const char **error_msg) { + + static vision_func func = NULL; + *error_msg = NULL; + + if (func == NULL) { + void *vision_handle = dlopen ("/System/Library/Frameworks/Vision.framework/Vision", RTLD_LAZY); + if (vision_handle == NULL) { + *error_msg = "Could not open Vision Framework"; + return CGPointMake (0, 0); + } + + func = (vision_func) dlsym (vision_handle, "VNImagePointForFaceLandmarkPoint"); + + if (func == NULL) { + *error_msg = "Could not obtain the address for VNImagePointForFaceLandmarkPoint"; + return CGPointMake (0, 0); + } + } + + vector_float2 flp; + flp [0] = faceLandmarkPoint.a; + flp [1] = faceLandmarkPoint.b; + + return func (flp, faceBoundingBox, imageWidth, imageHeight); +} diff --git a/runtime/delegates.t4 b/runtime/delegates.t4 index 8f311a3d0b40..f56fb3114174 100644 --- a/runtime/delegates.t4 +++ b/runtime/delegates.t4 @@ -71,7 +71,8 @@ new XDelegate ("MethodDescription", "UnmanagedMethodDescription", "xamarin_get_method_for_selector", "Class", "IntPtr", "cls", - "SEL", "IntPtr", "sel" + "SEL", "IntPtr", "sel", + "bool", "bool", "is_static" ) { WrappedManagedFunction = "GetMethodForSelector" }, new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_nsobject", @@ -140,6 +141,7 @@ new XDelegate ("MethodDescription", "UnmanagedMethodDescription", "xamarin_get_method_and_object_for_selector", "Class", "IntPtr", "cls", "SEL", "IntPtr", "sel", + "bool", "bool", "is_static", "id", "IntPtr", "obj", "MonoObject **", "ref IntPtr", "mthis" ) { WrappedManagedFunction = "GetMethodAndObjectForSelector" }, diff --git a/runtime/runtime.m b/runtime/runtime.m index 8b25e4c99138..f820eb6df0b3 100644 --- a/runtime/runtime.m +++ b/runtime/runtime.m @@ -1119,7 +1119,7 @@ -(void) xamarinSetGCHandle: (int) gc_handle; Dl_info info; if (dladdr ((void *) xamarin_initialize_embedded, &info) != 0) { - char *last_sep = strrchr (info.dli_fname, '/'); + const char *last_sep = strrchr (info.dli_fname, '/'); if (last_sep == NULL) { libname = strdup (info.dli_fname); } else { diff --git a/runtime/trampolines-invoke.m b/runtime/trampolines-invoke.m index 5c52a83ccc28..28aa4db00fd6 100644 --- a/runtime/trampolines-invoke.m +++ b/runtime/trampolines-invoke.m @@ -88,9 +88,9 @@ int mofs = 0; if (is_ctor || is_static) { - desc = xamarin_get_method_for_selector ([self class], sel, &exception_gchandle); + desc = xamarin_get_method_for_selector ([self class], sel, is_static, &exception_gchandle); } else { - desc = xamarin_get_method_and_object_for_selector ([self class], sel, self, &mthis, &exception_gchandle); + desc = xamarin_get_method_and_object_for_selector ([self class], sel, is_static, self, &mthis, &exception_gchandle); } if (exception_gchandle != 0) goto exception_handling; diff --git a/runtime/xamarin/runtime.h b/runtime/xamarin/runtime.h index e79af184a479..32affb4bee21 100644 --- a/runtime/xamarin/runtime.h +++ b/runtime/xamarin/runtime.h @@ -225,7 +225,7 @@ MonoObject* xamarin_get_class (Class ptr, guint32 *exception_gchandle) MonoObject* xamarin_get_selector (SEL ptr, guint32 *exception_gchandle); Class xamarin_get_class_handle (MonoObject *obj, guint32 *exception_gchandle); SEL xamarin_get_selector_handle (MonoObject *obj, guint32 *exception_gchandle); -MethodDescription xamarin_get_method_for_selector (Class cls, SEL sel, guint32 *exception_gchandle); +MethodDescription xamarin_get_method_for_selector (Class cls, SEL sel, bool is_static, guint32 *exception_gchandle); bool xamarin_has_nsobject (id obj, guint32 *exception_gchandle); MonoObject* xamarin_get_nsobject (id obj, guint32 *exception_gchandle); id xamarin_get_handle_for_inativeobject (MonoObject *obj, guint32 *exception_gchandle); @@ -239,7 +239,7 @@ MonoObject* xamarin_get_nsobject_with_type (id obj, void *type, int32_t * void xamarin_dispose (MonoObject *mobj, guint32 *exception_gchandle); bool xamarin_is_parameter_transient (MonoReflectionMethod *method, int parameter /* 0-based */, guint32 *exception_gchandle); bool xamarin_is_parameter_out (MonoReflectionMethod *method, int parameter /* 0-based */, guint32 *exception_gchandle); -MethodDescription xamarin_get_method_and_object_for_selector (Class cls, SEL sel, id self, MonoObject **mthis, guint32 *exception_gchandle); +MethodDescription xamarin_get_method_and_object_for_selector (Class cls, SEL sel, bool is_static, id self, MonoObject **mthis, guint32 *exception_gchandle); guint32 xamarin_create_product_exception_for_error (int code, const char *message, guint32 *exception_gchandle); #ifdef __cplusplus diff --git a/src/.gitignore b/src/.gitignore index 670a8c1c0e24..c59267add1fb 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -11,3 +11,5 @@ xammac.csproj xamtvos.csproj xamwatch.csproj generator-ikvm.csproj +~.pmcs-* +*~ diff --git a/src/ARKit/ARPointCloud.cs b/src/ARKit/ARPointCloud.cs new file mode 100644 index 000000000000..3684d1d92f4a --- /dev/null +++ b/src/ARKit/ARPointCloud.cs @@ -0,0 +1,43 @@ +// +// ARPointCloud.cs: Nicer code for ARPointCloud +// +// Authors: +// Vincent Dondain +// +// Copyright 2017 Microsoft Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using System.Runtime.InteropServices; +using Vector3 = global::OpenTK.NVector3; + +namespace XamCore.ARKit { + public partial class ARPointCloud { + + public unsafe Vector3 [] Points { + get { + var count = (int)Count; + var rv = new Vector3 [count]; + var ptr = (Vector3 *) GetRawPoints (); + for (int i = 0; i < count; i++) + rv [i] = *ptr++; + return rv; + } + } + + public unsafe ulong [] Identifiers { + get { + var count = (int)Count; + var rv = new ulong [count]; + var ptr = (ulong*)GetRawIdentifiers (); + for (int i = 0; i < count; i++) + rv [i] = *ptr++; + return rv; + } + } + } +} + +#endif \ No newline at end of file diff --git a/src/AVFoundation/AVAssetDownloadUrlSession.cs b/src/AVFoundation/AVAssetDownloadUrlSession.cs index 0d9ba9cddf82..1462c3f83056 100644 --- a/src/AVFoundation/AVAssetDownloadUrlSession.cs +++ b/src/AVFoundation/AVAssetDownloadUrlSession.cs @@ -27,7 +27,7 @@ public partial class AVAssetDownloadUrlSession : NSUrlSession { } #if !XAMCORE_4_0 - [Obsolete ("Use the overload with a `INSUrlSessionDelegate` parameter.")] + [Obsolete ("Use the overload with a 'INSUrlSessionDelegate' parameter.")] public new static NSUrlSession FromConfiguration (NSUrlSessionConfiguration configuration, NSUrlSessionDelegate sessionDelegate, NSOperationQueue delegateQueue) { throw new NotSupportedException ("NS_UNAVAILABLE"); diff --git a/src/AVFoundation/AVCompat.cs b/src/AVFoundation/AVCompat.cs index 1996dfad95db..74031ae39839 100644 --- a/src/AVFoundation/AVCompat.cs +++ b/src/AVFoundation/AVCompat.cs @@ -14,7 +14,7 @@ namespace XamCore.AVFoundation { #if !XAMCORE_2_0 partial class AVAssetResourceLoadingDataRequest { - [Obsolete ("Type is not meant to be created by user code")] + [Obsolete ("Type is not meant to be created by user code.")] public AVAssetResourceLoadingDataRequest () { } @@ -24,7 +24,7 @@ public AVAssetResourceLoadingDataRequest () #if !XAMCORE_3_0 partial class AVAsset { - [Obsolete ("Use GetChapterMetadataGroups")] + [Obsolete ("Use 'GetChapterMetadataGroups'.")] public virtual AVMetadataItem[] ChapterMetadataGroups (NSLocale forLocale, AVMetadataItem[] commonKeys) { return null; @@ -33,7 +33,7 @@ public virtual AVMetadataItem[] ChapterMetadataGroups (NSLocale forLocale, AVMet partial class AVAssetTrack { - [Obsolete ("Use GetAssociatedTracks")] + [Obsolete ("Use 'GetAssociatedTracks'.")] public virtual NSString GetAssociatedTracksOfType (NSString avAssetTrackTrackAssociationType) { return null; @@ -42,7 +42,7 @@ public virtual NSString GetAssociatedTracksOfType (NSString avAssetTrackTrackAss partial class AVMutableCompositionTrack { - [Obsolete ("Use InsertTimeRanges overload accepting an NSValue array")] + [Obsolete ("Use 'InsertTimeRanges' overload accepting an 'NSValue' array.")] public virtual bool InsertTimeRanges (NSValue cmTimeRanges, AVAssetTrack[] tracks, CMTime startTime, out NSError error) { return InsertTimeRanges (new NSValue [] { cmTimeRanges }, tracks, startTime, out error); @@ -52,7 +52,7 @@ public virtual bool InsertTimeRanges (NSValue cmTimeRanges, AVAssetTrack[] track partial class AVCaptureAudioDataOutputSampleBufferDelegate { - [Obsolete ("This member only exists for AVCaptureVideoDataOutputSampleBufferDelegate")] + [Obsolete ("This member only exists for 'AVCaptureVideoDataOutputSampleBufferDelegate'.")] public virtual void DidDropSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection) { } @@ -60,7 +60,7 @@ public virtual void DidDropSampleBuffer (AVCaptureOutput captureOutput, CMSample static partial class AVCaptureAudioDataOutputSampleBufferDelegate_Extensions { - [Obsolete ("This member only exists for AVCaptureVideoDataOutputSampleBufferDelegate")] + [Obsolete ("This member only exists for 'AVCaptureVideoDataOutputSampleBufferDelegate'.")] public static void DidDropSampleBuffer (IAVCaptureAudioDataOutputSampleBufferDelegate This, AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection) { } @@ -68,9 +68,17 @@ public static void DidDropSampleBuffer (IAVCaptureAudioDataOutputSampleBufferDel #endif #if !XAMCORE_4_0 + partial class AVCaptureInputPort { + + [Obsolete ("Valid instance of this type cannot be directly created.")] + public AVCaptureInputPort () + { + } + } + partial class AVAudioChannelLayout { - [Obsolete ("Valid instance of this type cannot be directly created")] + [Obsolete ("Valid instance of this type cannot be directly created.")] public AVAudioChannelLayout () { } @@ -78,7 +86,7 @@ public AVAudioChannelLayout () partial class AVAudioConnectionPoint { - [Obsolete ("Valid instance of this type cannot be directly created")] + [Obsolete ("Valid instance of this type cannot be directly created.")] public AVAudioConnectionPoint () { } @@ -86,8 +94,8 @@ public AVAudioConnectionPoint () #if TVOS // tvOS removed some types - we need to keep stubs of them for binary compatibility - [Obsolete ("Removed in tvOS 10")] - [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None, "Removed in tvOS 10")] + [Obsolete ("Removed in tvOS 10.")] + [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None)] public class AVAssetDownloadDelegate : NSObject, IAVAssetDownloadDelegate { public AVAssetDownloadDelegate () { @@ -152,13 +160,13 @@ public virtual void WillPerformHttpRedirection (NSUrlSession session, NSUrlSessi } } - [Obsolete ("Removed in tvOS 10")] - [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None, "Removed in tvOS 10")] + [Obsolete ("Removed in tvOS 10.")] + [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None)] public interface IAVAssetDownloadDelegate : INativeObject, IDisposable, INSUrlSessionTaskDelegate, INSUrlSessionDelegate { } - [Obsolete ("Removed in tvOS 10")] - [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None, "Removed in tvOS 10")] + [Obsolete ("Removed in tvOS 10.")] + [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None)] public static class AVAssetDownloadDelegate_Extensions { public static void DidFinishDownloadingToUrl (this IAVAssetDownloadDelegate This, NSUrlSession session, AVAssetDownloadTask assetDownloadTask, NSUrl location) @@ -177,8 +185,8 @@ public static void DidResolveMediaSelection (this IAVAssetDownloadDelegate This, } } - [Obsolete ("Removed in tvOS 10")] - [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None, "Removed in tvOS 10")] + [Obsolete ("Removed in tvOS 10.")] + [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None)] public class AVAssetDownloadTask : NSUrlSessionTask { public override IntPtr ClassHandle { @@ -242,8 +250,8 @@ protected internal AVAssetDownloadTask (IntPtr handle) } } - [Obsolete ("Removed in tvOS 10")] - [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None, "Removed in tvOS 10")] + [Obsolete ("Removed in tvOS 10.")] + [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None)] public class AVAssetDownloadUrlSession : NSUrlSession { public new static NSUrlSession SharedSession { @@ -280,7 +288,7 @@ public static AVAssetDownloadUrlSession CreateSession (NSUrlSessionConfiguration throw new NotImplementedException (); } - [Obsolete ("Use the overload with a `INSUrlSessionDelegate` parameter.")] + [Obsolete ("Use the overload with a 'INSUrlSessionDelegate' parameter.")] public new static NSUrlSession FromConfiguration (NSUrlSessionConfiguration configuration, NSUrlSessionDelegate sessionDelegate, NSOperationQueue delegateQueue) { throw new NotImplementedException (); @@ -387,104 +395,6 @@ public AVAssetDownloadTask GetAssetDownloadTask (AVUrlAsset urlAsset, string tit } } - [Obsolete ("Removed in tvOS 10")] - [Deprecated (PlatformName.TvOS, 10, 0, PlatformArchitecture.None, "Removed in tvOS 10")] - public class AVAudioInputNode : AVAudioIONode, IAVAudio3DMixing, IAVAudioMixing, IAVAudioStereoMixing { - - public override IntPtr ClassHandle { - get { - throw new NotImplementedException (); - } - } - - public virtual float Obstruction { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - public virtual float Occlusion { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - public virtual float Pan { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - public virtual Vector3 Position { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - public virtual float Rate { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - public virtual AVAudio3DMixingRenderingAlgorithm RenderingAlgorithm { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - public virtual float ReverbBlend { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - public virtual float Volume { - get { - throw new NotImplementedException (); - } - set { - throw new NotImplementedException (); - } - } - - [EditorBrowsable (EditorBrowsableState.Advanced)] - protected AVAudioInputNode (NSObjectFlag t) : base (t) - { - throw new NotImplementedException (); - } - - [EditorBrowsable (EditorBrowsableState.Advanced)] - protected internal AVAudioInputNode (IntPtr handle) : base (handle) - { - } - - public virtual AVAudioMixingDestination DestinationForMixer (AVAudioNode mixer, nuint bus) - { - throw new NotImplementedException (); - } - } #endif // TVOS #endif // !XAMCORE_4_0 } diff --git a/src/AVFoundation/AVDepthData.cs b/src/AVFoundation/AVDepthData.cs new file mode 100644 index 000000000000..3bc17e77707d --- /dev/null +++ b/src/AVFoundation/AVDepthData.cs @@ -0,0 +1,41 @@ +// +// AVDepthData.cs +// +// Authors: +// Alex Soto (alexsoto@microsoft.com) +// +// Copyright 2017 Xamarin Inc. +// + +#if !WATCH +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; +using XamCore.CoreVideo; +using XamCore.ImageIO; + +namespace XamCore.AVFoundation { + public partial class AVDepthData { + + public static AVDepthData Create (CGImageAuxiliaryDataInfo dataInfo, out NSError error) + { + return Create (dataInfo.Dictionary, out error); + } + + public CVPixelFormatType [] AvailableDepthDataTypes { + get { + var values = WeakAvailableDepthDataTypes; + if (values == null) + return null; + + var count = values.Length; + var arr = new CVPixelFormatType [count]; + for (int i = 0; i < count; i++) + arr [i] = (CVPixelFormatType) values [i].UInt32Value; // CVPixelFormatType is uint. + + return arr; + } + } + } +} +#endif \ No newline at end of file diff --git a/src/AVFoundation/AVOutputSettingsAssistant.cs b/src/AVFoundation/AVOutputSettingsAssistant.cs index be7d66f90f47..dd25aeb5825b 100644 --- a/src/AVFoundation/AVOutputSettingsAssistant.cs +++ b/src/AVFoundation/AVOutputSettingsAssistant.cs @@ -43,6 +43,19 @@ public AVOutputSettingsAssistant Preset3840x2160 { return FromPreset (_Preset3840x2160); } } + + public AVOutputSettingsAssistant PresetHevc1920x1080 { + get { + return FromPreset (_PresetHevc1920x1080); + } + } + + public AVOutputSettingsAssistant PresetHevc3840x2160 { + get { + return FromPreset (_PresetHevc3840x2160); + } + } + } } diff --git a/src/AVFoundation/AVPlayerLooper.cs b/src/AVFoundation/AVPlayerLooper.cs new file mode 100644 index 000000000000..2be117f53c3e --- /dev/null +++ b/src/AVFoundation/AVPlayerLooper.cs @@ -0,0 +1,46 @@ +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if !WATCH + +using XamCore.Foundation; +using XamCore.CoreFoundation; +using XamCore.AudioToolbox; +using XamCore.ObjCRuntime; +using System; + +namespace XamCore.AVFoundation { + + public partial class AVPlayerLooper { + +#if !XAMCORE_4_0 // This API got introduced in Xcode 8.0 binding but is not currently present nor in Xcode 8.3 or Xcode 9.0 needs research + + bool loopingEnabled = true; + + [Obsolete ("This selector does not exist in the header and was wrongly added.")] + public virtual bool LoopingEnabled { + get { + return loopingEnabled; + } + } +#endif + } +} +#endif // !WATCH diff --git a/src/AVFoundation/Enums.cs b/src/AVFoundation/Enums.cs index b9cd4a88da41..0f1900cde407 100644 --- a/src/AVFoundation/Enums.cs +++ b/src/AVFoundation/Enums.cs @@ -803,7 +803,11 @@ public enum AVContentKeyRequestRetryReason { [TV (10, 2), Mac (10, 12, 4), iOS (10, 3), NoWatch] public enum AVContentKeySystem { [Field ("AVContentKeySystemFairPlayStreaming")] - FairPlayStreaming, + FairPlayStreaming = 0, + + [TV (11, 0), NoWatch, Mac (10, 13), iOS (11, 0)] + [Field ("AVContentKeySystemClearKey")] + AVContentKeySystemClearKey = 1, } // Convience enum for native string values @@ -836,5 +840,141 @@ public enum AVAssetExportSessionPreset { AppleM4A = 8, // AVAssetExportPresetAppleM4A [Field ("AVAssetExportPresetPassthrough")] Passthrough = 9, // AVAssetExportPresetPassthrough + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVOutputSettingsPresetHEVC1920x1080")] + PresetHevc1920x1080 = 11, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVOutputSettingsPresetHEVC3840x2160")] + PresetHevc3840x2160 = 12, + } + + [TV (11,0), NoWatch, iOS (11,0)] + [Native] + public enum AVDepthDataAccuracy : nint { + Relative = 0, + Absolute = 1, + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum AVAudioEngineManualRenderingMode : nint { + Offline = 0, + Realtime = 1 + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum AVAudioEngineManualRenderingStatus : nint { + Error = -1, + Success = 0, + InsufficientDataFromInputNode = 1, + CannotDoInCurrentContext = 2 + } + + [TV (11,0), NoWatch, Mac (10,13), iOS (11,0)] + [Native] + public enum AVAudioSessionRouteSharingPolicy : nuint { + Default = 0, + LongForm = 1, + Independent = 2 + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum AVAudioPlayerNodeCompletionCallbackType : nint { + Consumed = 0, + Rendered = 1, + PlayedBack = 2 + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + public enum AVAudioEngineManualRenderingError + { + InvalidMode = -80800, + Initialized = -80801, + NotRunning = -80802, + } + + [NoTV, iOS (11,0)] + [NoWatch] + [Native] + public enum AVCaptureLensStabilizationStatus : nint + { + Unsupported = 0, + Off = 1, + Active = 2, + OutOfRange = 3, + Unavailable = 4 + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum AVCaptureOutputDataDroppedReason : nint + { + None = 0, + LateData = 1, + OutOfBuffers = 2, + Discontinuity = 3, + } + + [TV (11, 0), NoWatch, Mac (10, 13), iOS (11, 0)] + public enum AVVideoApertureMode { + [Field ("AVVideoApertureModeCleanAperture")] + CleanAperture = 0, + + [Field ("AVVideoApertureModeProductionAperture")] + ProductionAperture = 1, + + [Field ("AVVideoApertureModeEncodedPixels")] + EncodedPixels = 2, + } + + /* + // Enum values are present in header but missing rdar filed at: https://bugreport.apple.com/web/?problemID=34184435 + [NoWatch, NoTV, NoMac, iOS (11, 0)] + public enum AVAssetDownloadedAssetEvictionPriority { + [Field ("AVAssetDownloadedAssetEvictionPriorityDefault")] + Default = 0, + + [Field ("AVAssetDownloadedAssetEvictionPriorityImportant")] + Important = 1, + } + */ + + [NoWatch, iOS (11, 0), TV (11,0), Mac (10,13)] + public enum AVAssetWriterInputMediaDataLocation { + [Field ("AVAssetWriterInputMediaDataLocationInterleavedWithMainMediaData")] + InterleavedWithMainMediaData = 0, + + [Field ("AVAssetWriterInputMediaDataLocationBeforeMainMediaDataNotInterleaved")] + BeforeMainMediaDataNotInterleaved = 1, + } + + [TV (11, 0), NoWatch, Mac (10, 13), iOS (11, 0)] + public enum AVVideoCodecType { + [Field ("AVVideoCodecTypeH264")] + H264 = 0, + + [Field ("AVVideoCodecTypeJPEG")] + Jpeg = 1, + + [Field ("AVVideoCodecTypeAppleProRes422")] + AppleProRes422 = 3, + + [Field ("AVVideoCodecTypeAppleProRes4444")] + AppleProRes4444 = 4, + + [Field ("AVVideoCodecTypeHEVC")] + Hevc = 5, + + } + + [TV (11,0), NoWatch, iOS (11,0)] + [Native] + public enum AVDepthDataQuality : nint { + Low = 0, + High = 1 } } diff --git a/src/Accounts/Enums.cs b/src/Accounts/Enums.cs index 46ccf9e20995..3e7d95b91c55 100644 --- a/src/Accounts/Enums.cs +++ b/src/Accounts/Enums.cs @@ -29,7 +29,7 @@ public enum ACErrorCode { #if XAMCORE_3_0 MissingTransportMessageId, #else - [Obsolete ("Use MissingTransportMessageId")] + [Obsolete ("Use 'MissingTransportMessageId'.")] MissingMessageID, #pragma warning disable 618 // MissingMessageID is obsolete MissingTransportMessageId = MissingMessageID, diff --git a/src/AddressBook/ABAddressBook.cs b/src/AddressBook/ABAddressBook.cs index c1bbcf69e449..f71fff844dfc 100644 --- a/src/AddressBook/ABAddressBook.cs +++ b/src/AddressBook/ABAddressBook.cs @@ -39,7 +39,7 @@ using XamCore.ObjCRuntime; namespace XamCore.AddressBook { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ExternalChangeEventArgs : EventArgs { public ExternalChangeEventArgs (ABAddressBook addressBook, NSDictionary info) { @@ -91,7 +91,7 @@ static InitConstants () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABAddressBook : INativeObject, IDisposable, IEnumerable { public static readonly NSString ErrorDomain; diff --git a/src/AddressBook/ABEnums.cs b/src/AddressBook/ABEnums.cs index 43f41d813dd4..836d66417a0f 100644 --- a/src/AddressBook/ABEnums.cs +++ b/src/AddressBook/ABEnums.cs @@ -34,7 +34,7 @@ using XamCore.ObjCRuntime; namespace XamCore.AddressBook { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [Native] [ErrorDomain ("ABAddressBookErrorDomain")] public enum ABAddressBookError : nint { @@ -42,7 +42,7 @@ public enum ABAddressBookError : nint { OperationNotPermittedByUserError } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [Native] public enum ABAuthorizationStatus : nint { NotDetermined = 0, diff --git a/src/AddressBook/ABGroup.cs b/src/AddressBook/ABGroup.cs index d8ab3461fda7..7a61d9245d06 100644 --- a/src/AddressBook/ABGroup.cs +++ b/src/AddressBook/ABGroup.cs @@ -63,7 +63,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABGroup : ABRecord, IEnumerable { [DllImport (Constants.AddressBookLibrary)] diff --git a/src/AddressBook/ABMultiValue.cs b/src/AddressBook/ABMultiValue.cs index 0c0507836a6b..fd4985e56221 100644 --- a/src/AddressBook/ABMultiValue.cs +++ b/src/AddressBook/ABMultiValue.cs @@ -94,7 +94,7 @@ public static IntPtr ToIntPtr (NSObject value) } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public struct ABMultiValueEntry { ABMultiValue self; @@ -166,7 +166,7 @@ public int Identifier { } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABMultiValue : INativeObject, IDisposable, IEnumerable> { IntPtr handle; @@ -286,7 +286,7 @@ public ABMutableMultiValue ToMutableMultiValue () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABMutableMultiValue : ABMultiValue { internal ABMutableMultiValue (IntPtr handle) @@ -331,7 +331,7 @@ public bool RemoveAt (nint index) } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABMutableDateMultiValue : ABMutableMultiValue { public ABMutableDateMultiValue () : base (ABMultiValue.CreateMutable (ABPropertyType.MultiDateTime)) @@ -339,7 +339,7 @@ public ABMutableDateMultiValue () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABMutableDictionaryMultiValue : ABMutableMultiValue { public ABMutableDictionaryMultiValue () : base (ABMultiValue.CreateMutable (ABPropertyType.MultiDictionary)) @@ -347,7 +347,7 @@ public ABMutableDictionaryMultiValue () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABMutableStringMultiValue : ABMutableMultiValue { public ABMutableStringMultiValue () : base (ABMultiValue.CreateMutable (ABPropertyType.MultiString), diff --git a/src/AddressBook/ABPerson.cs b/src/AddressBook/ABPerson.cs index f031e426ccaf..ff513a767f64 100644 --- a/src/AddressBook/ABPerson.cs +++ b/src/AddressBook/ABPerson.cs @@ -39,19 +39,19 @@ using XamCore.ObjCRuntime; namespace XamCore.AddressBook { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABPersonSortBy : uint /* uint32_t */ { FirstName = 0, LastName = 1, } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABPersonCompositeNameFormat : uint /* uint32_t */ { FirstNameFirst = 0, LastNameFirst = 1, } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABPersonProperty { Address, Birthday, @@ -80,7 +80,7 @@ public enum ABPersonProperty { SocialProfile } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [Native] [iOS (4,1)] public enum ABPersonImageFormat : nint_compat_int { @@ -88,7 +88,7 @@ public enum ABPersonImageFormat : nint_compat_int { OriginalSize = 2 } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] static class ABPersonPropertyId { public static int Address {get; private set;} @@ -223,7 +223,7 @@ public static ABPersonProperty ToPersonProperty (int id) } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonAddressKey { public static NSString City {get; private set;} @@ -257,7 +257,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonDateLabel { public static NSString Anniversary {get; private set;} @@ -280,14 +280,14 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABPersonKind { None, Organization, Person, } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] static class ABPersonKindId { public static NSNumber Organization {get; private set;} public static NSNumber Person {get; private set;} @@ -330,7 +330,7 @@ public static NSNumber FromPersonKind (ABPersonKind value) } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] static class ABPersonSocialProfile { public static readonly NSString URLKey; public static readonly NSString ServiceKey; @@ -353,7 +353,7 @@ static ABPersonSocialProfile () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonSocialProfileService { public static readonly NSString Twitter; @@ -384,7 +384,7 @@ static ABPersonSocialProfileService () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonPhoneLabel { public static NSString HomeFax {get; private set;} public static NSString iPhone {get; private set;} @@ -421,7 +421,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonInstantMessageService { public static NSString Aim {get; private set;} public static NSString Icq {get; private set;} @@ -463,7 +463,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonInstantMessageKey { public static NSString Service {get; private set;} public static NSString Username {get; private set;} @@ -488,7 +488,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonUrlLabel { public static NSString HomePage {get; private set;} @@ -511,7 +511,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABPersonRelatedNamesLabel { public static NSString Assistant {get; private set;} public static NSString Brother {get; private set;} @@ -554,7 +554,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public static class ABLabel { public static NSString Home {get; private set;} public static NSString Other {get; private set;} @@ -581,7 +581,7 @@ internal static void Init () } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABPerson : ABRecord, IComparable, IComparable { [DllImport (Constants.AddressBookLibrary)] extern static IntPtr ABPersonCreate (); @@ -1089,7 +1089,7 @@ public static ABPerson[] CreateFromVCard (ABRecord source, NSData vCardData) } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class SocialProfile : DictionaryContainer { public SocialProfile () @@ -1147,7 +1147,7 @@ public string Url { } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class InstantMessageService : DictionaryContainer { public InstantMessageService () @@ -1190,7 +1190,7 @@ public string Username { } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class PersonAddress : DictionaryContainer { public PersonAddress () diff --git a/src/AddressBook/ABRecord.cs b/src/AddressBook/ABRecord.cs index 42b83b959b89..4d9b2f775ce1 100644 --- a/src/AddressBook/ABRecord.cs +++ b/src/AddressBook/ABRecord.cs @@ -37,14 +37,14 @@ using XamCore.ObjCRuntime; namespace XamCore.AddressBook { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABRecordType : uint /* uint32_t */ { Person = 0, Group = 1, Source = 2 } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABPropertyType : uint /* uint32_t */ { Invalid = 0, String = 0x1, @@ -59,7 +59,7 @@ public enum ABPropertyType : uint /* uint32_t */ { MultiDictionary = ABMultiValue.Mask | Dictionary, } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public abstract class ABRecord : INativeObject, IDisposable { public const int InvalidRecordId = -1; diff --git a/src/AddressBook/ABSource.cs b/src/AddressBook/ABSource.cs index de699c362ca0..700528a68689 100644 --- a/src/AddressBook/ABSource.cs +++ b/src/AddressBook/ABSource.cs @@ -39,7 +39,7 @@ namespace XamCore.AddressBook { // note: not a true flag - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABSourceType : int /* typedef int */ { Local = 0x0, Exchange = 0x1, @@ -52,7 +52,7 @@ public enum ABSourceType : int /* typedef int */ { SearchableMask = 0x01000000 }; - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABSource : ABRecord { #if !XAMCORE_2_0 [Advice ("Use ABSourceType.SearchableMask")] @@ -82,13 +82,13 @@ public ABSourceType SourceType { } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public enum ABSourceProperty { Name, Type, } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] static class ABSourcePropertyId { public static int Name { get; private set;} diff --git a/src/AddressBookUI/ABAddressFormatting.cs b/src/AddressBookUI/ABAddressFormatting.cs index 470e4873fc16..c35bfb684b3c 100644 --- a/src/AddressBookUI/ABAddressFormatting.cs +++ b/src/AddressBookUI/ABAddressFormatting.cs @@ -16,7 +16,7 @@ namespace XamCore.AddressBookUI { // http://developer.apple.com/library/ios/#DOCUMENTATION/AddressBookUI/Reference/AddressBookUI_Functions/Reference/reference.html#//apple_ref/c/func/ABCreateStringWithAddressDictionary - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] static public class ABAddressFormatting { [DllImport (Constants.AddressBookUILibrary)] diff --git a/src/AddressBookUI/ABNewPersonViewController.cs b/src/AddressBookUI/ABNewPersonViewController.cs index 956c8abbd0b3..bbd7a4bdc197 100644 --- a/src/AddressBookUI/ABNewPersonViewController.cs +++ b/src/AddressBookUI/ABNewPersonViewController.cs @@ -14,7 +14,7 @@ namespace XamCore.AddressBookUI { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABNewPersonCompleteEventArgs : EventArgs { public ABNewPersonCompleteEventArgs (ABPerson person) @@ -53,7 +53,7 @@ public override void DidCompleteWithNewPerson (ABNewPersonViewController control #endif } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] partial class ABNewPersonViewController { ABPerson displayedPerson; diff --git a/src/AddressBookUI/ABPeoplePickerNavigationController.cs b/src/AddressBookUI/ABPeoplePickerNavigationController.cs index d51eced3ec8b..913fb7f9ac5d 100644 --- a/src/AddressBookUI/ABPeoplePickerNavigationController.cs +++ b/src/AddressBookUI/ABPeoplePickerNavigationController.cs @@ -14,7 +14,7 @@ using XamCore.ObjCRuntime; namespace XamCore.AddressBookUI { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABPeoplePickerSelectPersonEventArgs : EventArgs { public ABPeoplePickerSelectPersonEventArgs (ABPerson person) @@ -27,7 +27,7 @@ public ABPeoplePickerSelectPersonEventArgs (ABPerson person) public bool Continue {get; set;} } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABPeoplePickerPerformActionEventArgs : ABPeoplePickerSelectPersonEventArgs { public ABPeoplePickerPerformActionEventArgs (ABPerson person, ABPersonProperty property, int? identifier) @@ -41,7 +41,7 @@ public ABPeoplePickerPerformActionEventArgs (ABPerson person, ABPersonProperty p public int? Identifier {get; private set;} } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABPeoplePickerSelectPerson2EventArgs : EventArgs { public ABPeoplePickerSelectPerson2EventArgs (ABPerson person) @@ -52,7 +52,7 @@ public ABPeoplePickerSelectPerson2EventArgs (ABPerson person) public ABPerson Person {get; private set;} } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABPeoplePickerPerformAction2EventArgs : ABPeoplePickerSelectPerson2EventArgs { public ABPeoplePickerPerformAction2EventArgs (ABPerson person, ABPersonProperty property, int? identifier) @@ -170,7 +170,7 @@ public override void Cancelled (ABPeoplePickerNavigationController peoplePicker) } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] partial class ABPeoplePickerNavigationController { DisplayedPropertiesCollection displayedProperties; diff --git a/src/AddressBookUI/ABPersonViewController.cs b/src/AddressBookUI/ABPersonViewController.cs index 15974cbafa4a..f16d0571ea5e 100644 --- a/src/AddressBookUI/ABPersonViewController.cs +++ b/src/AddressBookUI/ABPersonViewController.cs @@ -13,7 +13,7 @@ using XamCore.ObjCRuntime; namespace XamCore.AddressBookUI { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABPersonViewPerformDefaultActionEventArgs : EventArgs { public ABPersonViewPerformDefaultActionEventArgs (ABPerson person, ABPersonProperty property, int? identifier) { @@ -56,7 +56,7 @@ public override bool ShouldPerformDefaultActionForPerson (ABPersonViewController } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] partial class ABPersonViewController { ABPerson displayedPerson; diff --git a/src/AddressBookUI/ABUnknownPersonViewController.cs b/src/AddressBookUI/ABUnknownPersonViewController.cs index 321fee8e4035..1194341bad3e 100644 --- a/src/AddressBookUI/ABUnknownPersonViewController.cs +++ b/src/AddressBookUI/ABUnknownPersonViewController.cs @@ -13,7 +13,7 @@ using XamCore.ObjCRuntime; namespace XamCore.AddressBookUI { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class ABUnknownPersonCreatedEventArgs : EventArgs { public ABUnknownPersonCreatedEventArgs (ABPerson person) @@ -65,7 +65,7 @@ public override bool ShouldPerformDefaultActionForPerson (ABUnknownPersonViewCon } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] partial class ABUnknownPersonViewController { ABPerson displayedPerson; diff --git a/src/AddressBookUI/DisplayedPropertiesCollection.cs b/src/AddressBookUI/DisplayedPropertiesCollection.cs index 6ca79146009a..c23c6f25dada 100644 --- a/src/AddressBookUI/DisplayedPropertiesCollection.cs +++ b/src/AddressBookUI/DisplayedPropertiesCollection.cs @@ -18,7 +18,7 @@ namespace XamCore.AddressBookUI { delegate T ABFunc (); - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] public class DisplayedPropertiesCollection : ICollection { ABFunc g; diff --git a/src/AppKit/Enums.cs b/src/AppKit/Enums.cs index 6275208e28be..11dfbb68b7ea 100644 --- a/src/AppKit/Enums.cs +++ b/src/AppKit/Enums.cs @@ -116,7 +116,7 @@ public enum NSComposite : nuint_compat_int { DestinationAtop, XOR, PlusDarker, - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSCompositeSourceOver instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSCompositeSourceOver instead.")] Highlight, PlusLighter, [Mac (10,10)] Multiply, @@ -138,7 +138,11 @@ public enum NSComposite : nuint_compat_int { [Native] public enum NSBackingStore : nuint_compat_int { - Retained, Nonretained, Buffered + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_13, Message = "Use 'Buffered' instead.")] + Retained, + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_13, Message = "Use 'Buffered' instead.")] + Nonretained, + Buffered, } [Native] @@ -194,7 +198,7 @@ public enum NSColorSpaceModel : nint { #if !XAMCORE_3_0 [Flags] [Native] - [Obsolete ("Use NSFileWrapperReadingOptions in Foundation instead")] + [Obsolete ("Use NSFileWrapperReadingOptions in Foundation instead.")] public enum NSFileWrapperReadingOptions : nuint_compat_int { Immediate = 1, WithoutMapping = 2 } @@ -223,7 +227,7 @@ public enum NSLineBreakMode : nuint_compat_int { #if !XAMCORE_4_0 [Native] - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use formatters instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use formatters instead.")] public enum NSType : nuint_compat_int { Any = 0, Int = 1, @@ -929,7 +933,7 @@ public enum NSSelectionDirection : nuint_compat_int { [Native] public enum NSWindowButton : nuint_compat_int { CloseButton, MiniaturizeButton, ZoomButton, ToolbarButton, DocumentIconButton, DocumentVersionsButton = 6, - [Availability (Deprecated = Platform.Mac_10_12, Message = "The standard window button for FullScreenButton is always null; use ZoomButton instead")] + [Availability (Deprecated = Platform.Mac_10_12, Message = "The standard window button for FullScreenButton is always null; use ZoomButton instead.")] FullScreenButton } @@ -1444,6 +1448,7 @@ public enum NSPrintingPaginationMode : nuint_compat_int { [Flags] #if !XAMCORE_4_0 [Native] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use 'NSGlyphProperty' instead.")] public enum NSGlyphStorageOptions : nuint_compat_int { #else public enum NSGlyphStorageOptions : int @@ -1454,7 +1459,7 @@ public enum NSGlyphStorageOptions : int } #if !XAMCORE_4_0 - [Availability (Deprecated = Platform.Mac_10_11, Message = "Use NSTextStorageEditActions instead")] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use NSTextStorageEditActions instead.")] [Flags] [Native] public enum NSTextStorageEditedFlags : nuint_compat_int { @@ -1558,7 +1563,10 @@ public enum NSFontSymbolicTraits : int { // uint32_t NSFontSymbolicTraits MonoSpaceTrait = (1 << 10), VerticalTrait = (1 << 11), UIOptimizedTrait = (1 << 12), - + [Mac (10,13)] + TraitTightLeading = 1 << 15, + [Mac (10,13)] + TraitLooseLeading = 1 << 16, UnknownClass = 0 << 28, OldStyleSerifsClass = 1 << 28, TransitionalSerifsClass = 2 << 28, @@ -1608,7 +1616,7 @@ public enum NSToolbarSizeMode : nuint_compat_int { Default, Regular, Small } - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSAlertButtonReturn instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSAlertButtonReturn instead.")] #if !XAMCORE_4_0 [Native] public enum NSAlertType : nint { @@ -1622,7 +1630,7 @@ public enum NSAlertType : int { } #if !XAMCORE_4_0 - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSModalResponse instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSModalResponse instead.")] [Native] public enum NSPanelButtonType : nint { Cancel, Ok @@ -2112,6 +2120,7 @@ public static class NSFileTypeForHFSTypeCode { // These constants specify the possible states of a drawer. [Native] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSSplitViewController' instead.")] public enum NSDrawerState : nuint_compat_int { Closed = 0, Opening = 1, @@ -2148,6 +2157,7 @@ public enum NSRuleEditorNestingMode : nuint_compat_int { } [Native] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use 'NSGlyphProperty' instead.")] public enum NSGlyphInscription : nuint_compat_int { Base, Below, Above, Overstrike, OverBelow } @@ -2735,4 +2745,100 @@ public enum NSScrubberAlignment : nint Center } + [Mac (10,13)] + public enum NSFontError : int { + AssetDownloadError = 66304, + ErrorMinimum = 66304, + ErrorMaximum = 66335, + } + + [Mac (10,13)] + [Native] + public enum NSAccessibilityAnnotationPosition : nint { + FullRange, + Start, + End, + } + + [Mac (10,13)] + [Native] + public enum NSAccessibilityCustomRotorSearchDirection : nint { + Previous, + Next, + } + + [Mac (10,13)] + [Native] + public enum NSAccessibilityCustomRotorType : nint { + Custom = 0, + Any = 1, + Annotation, + BoldText, + Heading, + HeadingLevel1, + HeadingLevel2, + HeadingLevel3, + HeadingLevel4, + HeadingLevel5, + HeadingLevel6, + Image, + ItalicText, + Landmark, + Link, + List, + MisspelledWord, + Table, + TextField, + UnderlinedText, + VisitedLink, + } + + [Mac (10, 13)] + [Native] + public enum NSColorType : nint { + ComponentBased, + Pattern, + Catalog, + } + + [Mac (10,13)] + [Native] + [Flags] + public enum NSFontAssetRequestOptions : nuint { + UsesStandardUI = 1 << 0, + } + + [Mac (10,13)] + [Native] + [Flags] + public enum NSFontPanelModeMask : nuint { + Face = 1 << 0, + Size = 1 << 1, + Collection = 1 << 2, + UnderlineEffect = 1 << 8, + StrikethroughEffect = 1 << 9, + TextColorEffect = 1 << 10, + DocumentColorEffect = 1 << 11, + ShadowEffect = 1 << 12, + AllEffects = (nuint)0XFFF00, + StandardModes = (nuint)0XFFFF, + AllModes = (nuint)0XFFFFFFFF, + } + + [Mac (10,13)] + [Native] + public enum NSLevelIndicatorPlaceholderVisibility : nint { + Automatic = 0, + Always = 1, + WhileEditing = 2, + } + + [Mac (10,13)] + [Native] + public enum NSSegmentDistribution : nint { + Fit = 0, + Fill, + FillEqually, + FillProportionally, + } } diff --git a/src/AppKit/NSApplication.cs b/src/AppKit/NSApplication.cs index 90841fddacb5..e6206d88293a 100644 --- a/src/AppKit/NSApplication.cs +++ b/src/AppKit/NSApplication.cs @@ -132,7 +132,7 @@ public void DiscardEvents (NSEventMask mask, NSEvent lastEvent) DiscardEvents ((nuint)(ulong) mask, lastEvent); } - [Obsolete ("This method does nothing")] + [Obsolete ("This method does nothing.")] public static void RestoreWindow (string identifier, Foundation.NSCoder state, NSWindowCompletionHandler onCompletion) { } diff --git a/src/AppKit/NSBezierPath.cs b/src/AppKit/NSBezierPath.cs index ec44e5cac158..b069738604f6 100644 --- a/src/AppKit/NSBezierPath.cs +++ b/src/AppKit/NSBezierPath.cs @@ -88,7 +88,7 @@ public unsafe void SetAssociatedPointsAtIndex (CGPoint[] points, nint index) _SetAssociatedPointsAtIndex ((IntPtr)ptr, index); } - public unsafe void AppendPathWithPoints (CGPoint[] points) + public unsafe void Append (CGPoint[] points) { if (points == null) throw new ArgumentNullException ("points"); @@ -99,6 +99,14 @@ public unsafe void AppendPathWithPoints (CGPoint[] points) _AppendPathWithPoints ((IntPtr)ptr, points.Length); } +#if !XAMCORE_4_0 + [Obsolete ("Use 'Append (CGPoint[])' instead.")] + public unsafe void AppendPathWithPoints (CGPoint[] points) + { + Append (points); + } + + [Obsolete ("Use 'Append (uint[], NSFont)' instead.")] public unsafe void AppendPathWithGlyphs (uint[] glyphs, NSFont font) { if (glyphs == null) @@ -109,6 +117,18 @@ public unsafe void AppendPathWithGlyphs (uint[] glyphs, NSFont font) fixed (uint* ptr = &glyphs [0]) _AppendPathWithGlyphs ((IntPtr)ptr, glyphs.Length, font); } +#endif + [Mac (10,13)] + public unsafe void Append (uint[] glyphs, NSFont font) + { + if (glyphs == null) + throw new ArgumentNullException ("glyphs"); + if (glyphs.Length < 1) + throw new ArgumentException ("glyphs array is empty"); + + fixed (uint* ptr = &glyphs [0]) + _AppendBezierPathWithCGGlyphs ((IntPtr)ptr, glyphs.Length, font); + } } } diff --git a/src/AppKit/NSComboBox.cs b/src/AppKit/NSComboBox.cs index 63917b1250f4..1440a353a146 100644 --- a/src/AppKit/NSComboBox.cs +++ b/src/AppKit/NSComboBox.cs @@ -5,7 +5,7 @@ namespace XamCore.AppKit { public partial class NSComboBox { - [Obsolete ("Use GetItemObject instead")] + [Obsolete ("Use GetItemObject instead.")] public virtual NSComboBox GetItem (nint index) { return (NSComboBox) GetItemObject (index); diff --git a/src/AppKit/NSFont.cs b/src/AppKit/NSFont.cs new file mode 100644 index 000000000000..2a53fbb14bcc --- /dev/null +++ b/src/AppKit/NSFont.cs @@ -0,0 +1,56 @@ +using System; +using System.Runtime.InteropServices; +using XamCore.CoreFoundation; +using XamCore.Foundation; +using XamCore.ObjCRuntime; +using XamCore.CoreGraphics; +using XamCore.CoreAnimation; +using XamCore.CoreText; + +using CGGlyph = System.UInt16; + +namespace XamCore.AppKit { + public partial class NSFont + { + public static NSFont FromCTFont (CTFont font) + { + if (font == null) + return null; + return new NSFont (font.Handle); + } + + [Mac (10,13)] + public unsafe CGRect [] GetBoundingRects (CGGlyph [] glyphs) + { + if (glyphs == null) + throw new ArgumentNullException ("glyphs"); + if (glyphs.Length < 1) + throw new ArgumentException ("glyphs array is empty"); + + CGRect [] bounds = new CGRect [glyphs.Length]; + fixed (CGRect* boundsPtr = &bounds [0]) { + fixed (CGGlyph* glyphsPtr = &glyphs [0]) { + _GetBoundingRects ((IntPtr)boundsPtr, (IntPtr)glyphsPtr, (nuint)glyphs.Length); + } + } + return bounds; + } + + [Mac (10,13)] + public unsafe CGSize [] GetAdvancements (CGGlyph [] glyphs) + { + if (glyphs == null) + throw new ArgumentNullException ("glyphs"); + if (glyphs.Length < 1) + throw new ArgumentException ("glyphs array is empty"); + + CGSize [] advancements = new CGSize [glyphs.Length]; + fixed (CGSize* advancementsPtr = &advancements [0]) { + fixed (CGGlyph* glyphsPtr = &glyphs [0]) { + _GetAdvancements ((IntPtr)advancementsPtr, (IntPtr)glyphsPtr, (nuint)glyphs.Length); + } + } + return advancements; + } + } +} diff --git a/src/AppKit/NSTextContainer.cs b/src/AppKit/NSTextContainer.cs index ced7c2d17a72..04901e790c28 100644 --- a/src/AppKit/NSTextContainer.cs +++ b/src/AppKit/NSTextContainer.cs @@ -6,7 +6,7 @@ namespace XamCore.AppKit { public partial class NSTextContainer { - [Availability (Obsoleted = Platform.Mac_10_11, Message = "Use NSTextContainer.FromSize instead")] + [Availability (Obsoleted = Platform.Mac_10_11, Message = "Use NSTextContainer.FromSize instead.")] public NSTextContainer (CGSize size) { Handle = InitWithContainerSize (size); @@ -26,7 +26,7 @@ public static NSTextContainer FromSize (CGSize size) return new NSTextContainer (size, false); } - [Availability (Deprecated = Platform.Mac_10_11, Message = "Use NSTextContainer.FromSize instead")] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use NSTextContainer.FromSize instead.")] public static NSTextContainer FromContainerSize (CGSize containerSize) { return new NSTextContainer (containerSize, true); diff --git a/src/AssetsLibrary/ALAsset.cs b/src/AssetsLibrary/ALAsset.cs index bc71600b93ca..516bed6938ca 100644 --- a/src/AssetsLibrary/ALAsset.cs +++ b/src/AssetsLibrary/ALAsset.cs @@ -17,12 +17,12 @@ namespace XamCore.AssetsLibrary { // internally used (not exposed by ObjC) - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] public enum ALAssetType { Video, Photo, Unknown } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] public partial class ALAsset { public ALAssetType AssetType { get { diff --git a/src/AssetsLibrary/ALAssetsGroup.cs b/src/AssetsLibrary/ALAssetsGroup.cs index 1ad52b6b5663..805fa57d4357 100644 --- a/src/AssetsLibrary/ALAssetsGroup.cs +++ b/src/AssetsLibrary/ALAssetsGroup.cs @@ -16,7 +16,7 @@ namespace XamCore.AssetsLibrary { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] public partial class ALAssetsGroup { public NSString Name { get { diff --git a/src/AssetsLibrary/ALAssetsLibrary.cs b/src/AssetsLibrary/ALAssetsLibrary.cs index 6c97c2378aa3..3fdcf7235ab5 100644 --- a/src/AssetsLibrary/ALAssetsLibrary.cs +++ b/src/AssetsLibrary/ALAssetsLibrary.cs @@ -20,7 +20,7 @@ namespace XamCore.AssetsLibrary { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] public partial class ALAssetsLibrary { [Obsolete ("Use the overload that takes a CGImage instead")] diff --git a/src/AssetsLibrary/Enums.cs b/src/AssetsLibrary/Enums.cs index eabe42c11ce1..47c15acc289d 100644 --- a/src/AssetsLibrary/Enums.cs +++ b/src/AssetsLibrary/Enums.cs @@ -4,7 +4,7 @@ namespace XamCore.AssetsLibrary { // NSInteger -> ALAssetsLibrary.h - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [Native] public enum ALAssetOrientation : nint { Up, @@ -18,7 +18,7 @@ public enum ALAssetOrientation : nint { } // NSUInteger -> ALAssetsLibrary.h - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [Native] [Flags] public enum ALAssetsGroupType : nuint { @@ -32,7 +32,7 @@ public enum ALAssetsGroupType : nuint { } // untyped enum -> ALAssetsLibrary.h - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [ErrorDomain ("ALAssetsLibraryErrorDomain")] public enum ALAssetsError { UnknownError = -1, @@ -48,7 +48,7 @@ public enum ALAssetsError { } // NSInteger -> ALAssetsLibrary.h - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [Native] public enum ALAuthorizationStatus : nint { NotDetermined, diff --git a/src/AudioToolbox/AudioFile.cs b/src/AudioToolbox/AudioFile.cs index 463981623f44..f6f1ad929f4a 100644 --- a/src/AudioToolbox/AudioFile.cs +++ b/src/AudioToolbox/AudioFile.cs @@ -46,6 +46,8 @@ public enum AudioFileType { // UInt32 AudioFileTypeID AIFF = 0x41494646, // AIFF AIFC = 0x41494643, // AIFC WAVE = 0x57415645, // WAVE + [NoWatch, iOS (11,0), Mac(10,13), TV (11,0)] + RF64 = 0x52463634, // RF64 SoundDesigner2 = 0x53643266, // Sd2f Next = 0x4e655854, // NeXT MP3 = 0x4d504733, // MPG3 @@ -60,6 +62,8 @@ public enum AudioFileType { // UInt32 AudioFileTypeID ThreeGP = 0x33677070, // 3gpp ThreeGP2 = 0x33677032, // 3gp2 AMR = 0x616d7266, // amrf + [NoWatch, iOS (11,0), Mac(10,13), TV (11,0)] + FLAC = 0x666c6163, // flac } public enum AudioFileError {// Implictly cast to OSType in AudioFile.h diff --git a/src/AudioToolbox/AudioQueue.cs b/src/AudioToolbox/AudioQueue.cs index b0585c980c23..fde1576377a3 100644 --- a/src/AudioToolbox/AudioQueue.cs +++ b/src/AudioToolbox/AudioQueue.cs @@ -262,7 +262,7 @@ public unsafe void CopyToAudioData (IntPtr source, int size) [StructLayout(LayoutKind.Explicit)] public struct AudioQueueParameterEvent { [FieldOffset(0)] - [Advice ("Use Parameter")] + [Advice ("Use Parameter.")] public uint ID; [FieldOffset(0)] diff --git a/src/AudioToolbox/AudioSession.cs b/src/AudioToolbox/AudioSession.cs index 974df9491977..91723e52f977 100644 --- a/src/AudioToolbox/AudioSession.cs +++ b/src/AudioToolbox/AudioSession.cs @@ -194,7 +194,7 @@ public AudioSessionOutputRouteKind [] CurrentOutputRoutes { } } - [Availability (Deprecated = Platform.iOS_7_0, Message = "Use AVAudioSession instead")] + [Availability (Deprecated = Platform.iOS_7_0, Message = "Use 'AVAudioSession' instead.")] public static class AudioSession { static bool initialized; public static event EventHandler Interrupted; diff --git a/src/AudioToolbox/AudioType.cs b/src/AudioToolbox/AudioType.cs index f0a1607b2517..34919b9e5c8d 100644 --- a/src/AudioToolbox/AudioType.cs +++ b/src/AudioToolbox/AudioType.cs @@ -78,6 +78,8 @@ public enum AudioFormatType : uint_compat_int { // UInt32 in AudioStreamBasicDes MicrosoftGSM = 0x6d730031, AES3 = 0x61657333, // 'aes3' EnhancedAES3 = 0x65632d33, // 'ec-3' + Flac = 0x666c6163, // 'flac' + Opus = 0x6f707573, // 'opus' } [Flags] @@ -142,7 +144,7 @@ public struct AudioStreamBasicDescription { const int AudioUnitSampleFractionBits = 24; const AudioFormatFlags AudioFormatFlagIsBigEndian = 0; - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Canonical is no longer encouraged, since fixed-point no longer provides a performance advantage over floating point. AudioFormatFlagsNativeFloatPacked is preffered instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Canonical is no longer encouraged, since fixed-point no longer provides a performance advantage over floating point. 'AudioFormatFlagsNativeFloatPacked' is preffered instead.")] public static readonly AudioFormatFlags AudioFormatFlagsAudioUnitCanonical = AudioFormatFlags.IsSignedInteger | (BitConverter.IsLittleEndian ? 0 : AudioFormatFlags.IsBigEndian) | AudioFormatFlags.IsPacked | AudioFormatFlags.IsNonInterleaved | (AudioFormatFlags) (AudioUnitSampleFractionBits << (int)AudioFormatFlags.LinearPCMSampleFractionShift); @@ -424,7 +426,31 @@ public enum AudioChannelLabel : int { // UInt32 AudioChannelLabel Discrete_13 = (1<<16) | 13, Discrete_14 = (1<<16) | 14, Discrete_15 = (1<<16) | 15, - Discrete_65535 = (1<<16) | 65535 + Discrete_65535 = (1<<16) | 65535, + + // HOA ACN channels + + // generic + HoaAcn = 500, + + // numbered + HoaAcn0 = (2 << 16) | 0, + HoaAcn1 = (2 << 16) | 1, + HoaAcn2 = (2 << 16) | 2, + HoaAcn3 = (2 << 16) | 3, + HoaAcn4 = (2 << 16) | 4, + HoaAcn5 = (2 << 16) | 5, + HoaAcn6 = (2 << 16) | 6, + HoaAcn7 = (2 << 16) | 7, + HoaAcn8 = (2 << 16) | 8, + HoaAcn9 = (2 << 16) | 9, + HoaAcn10 = (2 << 16) | 10, + HoaAcn11 = (2 << 16) | 11, + HoaAcn12 = (2 << 16) | 12, + HoaAcn13 = (2 << 16) | 13, + HoaAcn14 = (2 << 16) | 14, + HoaAcn15 = (2 << 16) | 15, + HoaAcn65024 = (2 << 16) | 65024 } [Flags] @@ -663,7 +689,10 @@ public enum AudioChannelLayoutTag : uint { // UInt32 AudioChannelLayoutTag DTS_8_0_B = (179<<16) | 8, DTS_8_1_A = (180<<16) | 9, DTS_8_1_B = (181<<16) | 9, - DTS_6_1_D = (182<<16) | 7, + DTS_6_1_D = (182<<16) | 7, + + HOA_ACN_SN3D = (190U<<16), + HOA_ACN_N3D = (191U<<16), DiscreteInOrder = (147<<16) | 0, // needs to be ORed with the actual number of channels Unknown = 0xFFFF0000 // needs to be ORed with the actual number of channels @@ -1111,7 +1140,6 @@ public override string ToString () } } -#if !WATCH [StructLayout(LayoutKind.Sequential)] public struct AudioBuffer { public int NumberChannels; @@ -1136,5 +1164,4 @@ public struct CABarBeatTime { public /* UInt16 */ ushort Reserved; } #endif -#endif // !WATCH } diff --git a/src/AudioUnit/AudioComponent.cs b/src/AudioUnit/AudioComponent.cs index a39846606230..a4fad8fefec2 100644 --- a/src/AudioUnit/AudioComponent.cs +++ b/src/AudioUnit/AudioComponent.cs @@ -38,6 +38,177 @@ namespace XamCore.AudioUnit { + +#if !COREBUILD + // keys are not constants and had to be found in AudioToolbox.framework/Headers/AudioComponent.h + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + public partial class ResourceUsageInfo : DictionaryContainer { + static NSString userClientK = new NSString ("iokit.user-client"); + static NSString globalNameK = new NSString ("mach-lookup.global-name"); + static NSString networkClientK = new NSString ("network.client"); + static NSString exceptionK = new NSString ("temporary-exception.files.all.read-write"); + + public ResourceUsageInfo () : base () {} + + public ResourceUsageInfo (NSDictionary dic) : base (dic) {} + + public string[] IOKitUserClient { + get { + var array = GetNativeValue (userClientK); + if (array == null ) + return null; + return NSArray.StringArrayFromHandle (array.Handle); + } + set { + if (value == null) + RemoveValue (userClientK); + else + SetArrayValue (userClientK, value); + } + } + + public string[] MachLookUpGlobalName { + get { + var array = GetNativeValue (globalNameK); + if (array == null) + return null; + return NSArray.StringArrayFromHandle (array.Handle); + } + set { + if (value == null) + RemoveValue (globalNameK); + else + SetArrayValue (globalNameK, value); + } + } + + public bool? NetworkClient { + get { + return GetBoolValue (networkClientK); + } + set { + SetBooleanValue (networkClientK, value); + } + } + + public bool? TemporaryExceptionReadWrite { + get { + return GetBoolValue (exceptionK); + } + set { + SetBooleanValue (exceptionK, value); + } + } + } + + // keys are not constants and had to be found in AudioToolbox.framework/Headers/AudioComponent.h + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + public partial class AudioComponentInfo : DictionaryContainer { + static NSString typeK = new NSString ("type"); + static NSString subtypeK = new NSString ("subtype"); + static NSString manufacturerK = new NSString ("manufacturer"); + static NSString nameK = new NSString ("name"); + static NSString versionK = new NSString ("version"); + static NSString factoryFunctionK = new NSString ("factoryFunction"); + static NSString sandboxSafeK = new NSString ("sandboxSafe"); + static NSString resourceUsageK = new NSString ("resourceUsage"); + static NSString tagsK = new NSString ("tags"); + + public AudioComponentInfo () : base () {} + + public AudioComponentInfo (NSDictionary dic) : base (dic) {} + + public string Type { + get { + return GetStringValue (typeK); + } + set { + SetStringValue (typeK, value); + } + } + + public string Subtype { + get { + return GetStringValue (subtypeK); + } + set { + SetStringValue (subtypeK, value); + } + } + + public string Manufacturer { + get { + return GetStringValue (manufacturerK); + } + set { + SetStringValue (manufacturerK, value); + } + } + + public string Name { + get { + return GetStringValue (nameK); + } + set { + SetStringValue (nameK, value); + } + } + + public nuint? Version { + get { + return GetNUIntValue (versionK); + } + set { + SetNumberValue (versionK, value); + } + } + + public string FactoryFunction { + get { + return GetStringValue (factoryFunctionK); + } + set { + SetStringValue (factoryFunctionK, value); + } + } + + public bool? SandboxSafe { + get { + return GetBoolValue (sandboxSafeK); + } + set { + SetBooleanValue (sandboxSafeK, value); + } + } + + public ResourceUsageInfo ResourceUsage { + get { + return GetStrongDictionary (resourceUsageK); + } + set { + SetNativeValue (resourceUsageK, value?.Dictionary, true); + } + } + + public string[] Tags { + get { + var array = GetNativeValue (tagsK); + if (array == null) + return null; + return NSArray.StringArrayFromHandle (array.Handle); + } + set { + if (value == null) + RemoveValue (tagsK); + else + SetArrayValue (tagsK, value); + } + } + } + +#endif + + public class AudioComponent : INativeObject { #if !COREBUILD internal IntPtr handle; @@ -224,6 +395,59 @@ public XamCore.AppKit.NSImage GetIcon () return new XamCore.AppKit.NSImage (AudioComponentGetIcon (handle)); } #endif + +#if IOS || MONOMAC + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [DllImport (Constants.AudioUnitLibrary)] + static extern int /* OSStatus */ AudioUnitExtensionSetComponentList (IntPtr /* CFString */ extensionIdentifier, /* CFArrayRef */ IntPtr audioComponentInfo); + + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [DllImport (Constants.AudioUnitLibrary)] + static extern /* CFArrayRef */ IntPtr AudioUnitExtensionCopyComponentList (IntPtr /* CFString */ extensionIdentifier); + + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + public AudioComponentInfo[] ComponentList { + get { + using (var cfString = new CFString (Name)) { + var cHandle = AudioUnitExtensionCopyComponentList (cfString.Handle); + if (cHandle == IntPtr.Zero) + return null; + using (var nsArray = Runtime.GetNSObject (cHandle, owns: true)) { + if (nsArray == null) + return null; + // make things easier for developers since we do not know how to have an implicit conversion from NSObject to AudioComponentInfo + var dics = NSArray.FromArray (nsArray); + var result = new AudioComponentInfo [dics.Length]; + for (var i = 0; i < result.Length; i++) { + result [i] = new AudioComponentInfo (dics[i]); + } + return result; + } + } + } + set { + if (value == null) + throw new ArgumentNullException (nameof (value)); + using (var cfString = new CFString (Name)) { + var dics = new NSDictionary [value.Length]; + for (var i = 0; i < value.Length; i++) { + dics [i] = value [i].Dictionary; + } + using (var array = NSArray.FromNSObjects (dics)) { + var result = (AudioConverterError) AudioUnitExtensionSetComponentList (cfString.Handle, array.Handle); + switch (result) { + case AudioConverterError.None: + return; + default: + throw new InvalidOperationException ($"ComponentList could not be set, error {result.ToString ()}"); + + } + } + } + } + } +#endif + #endif // !COREBUILD } @@ -241,4 +465,4 @@ public static class AudioComponentConfigurationInfo { public static NSString ValidationResult = new NSString ("ValidationResult"); } #endif -} \ No newline at end of file +} diff --git a/src/AudioUnit/AudioComponentDescription.cs b/src/AudioUnit/AudioComponentDescription.cs index 8b2bc1a20445..6198fabb8279 100644 --- a/src/AudioUnit/AudioComponentDescription.cs +++ b/src/AudioUnit/AudioComponentDescription.cs @@ -142,10 +142,10 @@ public enum AudioTypeMixer { // OSType in AudioComponentDescription Spacial=0x3364656d, // Same as Embedded3D #if MONOMAC Stereo=0x736d7872, // 'smxr' - [Availability (Deprecated = Platform.Mac_10_10, Message = "Use Spacial instead")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Use 'Spacial' instead.")] ThreeD=0x33646d78, // '3dmx' #else - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use Spacial instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'Spacial' instead.")] Embedded3D=0x3364656d, // '3dem' #endif } diff --git a/src/AudioUnit/AudioUnit.cs b/src/AudioUnit/AudioUnit.cs index 3838a7681122..60ae7eef178a 100644 --- a/src/AudioUnit/AudioUnit.cs +++ b/src/AudioUnit/AudioUnit.cs @@ -63,6 +63,10 @@ public enum AudioUnitStatus { // Implictly cast to OSType Initialized = -10849, InvalidOfflineRender = -10848, Unauthorized = -10847, + [iOS (11,0), Mac (10,13, onlyOn64: true), TV (11,0), NoWatch] + MidiOutputBufferFull = -66753, + [iOS (11,0), Mac (10,13, onlyOn64: true), TV (11,0), NoWatch] + ExtensionNotFound = -66744, } public enum AudioComponentStatus { // Implictly cast to OSType @@ -352,6 +356,50 @@ public enum AudioUnitClumpID // UInt32 in AudioUnitParameterInfo System = 0 } + public enum AUParameterEventType : uint + { + Immediate = 1, + Ramped = 2, + } + + [StructLayout (LayoutKind.Sequential)] + public struct AudioUnitParameterEvent + { + public uint Scope; + public uint Element; + public uint Parameter; + public AUParameterEventType EventType; + + [StructLayout (LayoutKind.Explicit)] + public struct EventValuesStruct + { + [StructLayout (LayoutKind.Sequential)] + public struct RampStruct + { + public int StartBufferOffset; + public uint DurationInFrames; + public float StartValue; + public float EndValue; + } + + + [FieldOffset (0)] + public RampStruct Ramp; + + [StructLayout (LayoutKind.Sequential)] + public struct ImmediateStruct + { + public uint BufferOffset; + public float Value; + } + + [FieldOffset (0)] + public ImmediateStruct Immediate; + } + + public EventValuesStruct EventValues; + } + public class AudioUnit : IDisposable, XamCore.ObjCRuntime.INativeObject { internal IntPtr handle; @@ -460,7 +508,7 @@ static int renderCallback(IntPtr inRefCon, ref AudioUnitRenderActionFlags _ioAct #endif #if !XAMCORE_3_0 - [Obsolete ("Use SetFormat instead as it has the ability of returning a status code")] + [Obsolete ("Use 'SetFormat' instead as it has the ability of returning a status code.")] public void SetAudioFormat(XamCore.AudioToolbox.AudioStreamBasicDescription audioFormat, AudioUnitScopeType scope, uint audioUnitElement = 0) { var err = AudioUnitSetProperty(handle, @@ -501,7 +549,7 @@ public uint GetCurrentDevice (AudioUnitScopeType scope, uint audioUnitElement = #if !XAMCORE_3_0 || MONOMAC #if !MONOMAC - [Obsolete ("This API is not available on iOS")] + [Obsolete ("This API is not available on iOS.")] #endif public static uint GetCurrentInputDevice () { @@ -873,6 +921,11 @@ public AudioUnitStatus SetParameter (AudioUnitParameterType type, float value, A return AudioUnitSetParameter (handle, type, scope, audioUnitElement, value, 0); } + public AudioUnitStatus ScheduleParameter (AudioUnitParameterEvent inParameterEvent, uint inNumParamEvents) + { + return AudioUnitScheduleParameters (handle, inParameterEvent, inNumParamEvents); + } + public void Dispose() { Dispose (true); @@ -1032,6 +1085,9 @@ static extern AudioUnitStatus AudioUnitGetPropertyInfo (IntPtr inUnit, AudioUnit static extern AudioUnitStatus AudioUnitSetParameter (IntPtr inUnit, AudioUnitParameterType inID, AudioUnitScopeType inScope, uint inElement, float inValue, uint inBufferOffsetInFrames); + [DllImport (Constants.AudioUnitLibrary)] + static extern AudioUnitStatus AudioUnitScheduleParameters (IntPtr inUnit, AudioUnitParameterEvent inParameterEvent, uint inNumParamEvents); + #if MONOMAC [DllImport (Constants.AudioUnitLibrary)] static extern int AudioObjectGetPropertyData ( @@ -1959,7 +2015,8 @@ public enum AUSpatializationAlgorithm : uint Hrtf = 2, SoundField = 3, VectorBasedPanning = 4, - StereoPassThrough = 5 + StereoPassThrough = 5, + HrtfHQ = 6, } public enum AU3DMixerAttenuationCurve : uint @@ -2073,7 +2130,7 @@ public enum AudioUnitSubType : uint } #if !XAMCORE_4_0 && !COREBUILD #if XAMCORE_2_0 || !MONOMAC - [Obsolete ("Use AUImplementorStringFromValueCallback instead")] + [Obsolete ("Use 'AUImplementorStringFromValueCallback' instead.")] public delegate NSString _AUImplementorStringFromValueCallback (AUParameter param, IntPtr value); #endif #endif diff --git a/src/CFNetwork/CFHTTPStream.cs b/src/CFNetwork/CFHTTPStream.cs index b0c124cd70ef..047645f693c4 100644 --- a/src/CFNetwork/CFHTTPStream.cs +++ b/src/CFNetwork/CFHTTPStream.cs @@ -20,7 +20,7 @@ namespace XamCore.CoreServices { #endif // all fields constants that this is using are deprecated in Xcode 7 - [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use NSUrlSession")] + [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use 'NSUrlSession'.")] public partial class CFHTTPStream : CFReadStream { internal CFHTTPStream (IntPtr handle) diff --git a/src/CloudKit/CKCompat.cs b/src/CloudKit/CKCompat.cs index d9aef88830c5..202d95c9c984 100644 --- a/src/CloudKit/CKCompat.cs +++ b/src/CloudKit/CKCompat.cs @@ -12,7 +12,7 @@ namespace XamCore.CloudKit { #if !XAMCORE_4_0 && !WATCH public partial class CKOperation { - [Obsoleted (PlatformName.iOS, 9,3, message: "Do not use; this API was removed in iOS 9.3 and will always return 0")] + [Obsoleted (PlatformName.iOS, 9,3, message: "Do not use; this API was removed and will always return 0.")] public virtual ulong ActivityStart () { return 0; @@ -21,7 +21,7 @@ public virtual ulong ActivityStart () public partial class CKNotificationID { - [Obsolete ("This type is not meant to be created by user code")] + [Obsolete ("This type is not meant to be created by user code.")] public CKNotificationID () { } diff --git a/src/CloudKit/Enums.cs b/src/CloudKit/Enums.cs index 199d99ab8792..7075c64976dc 100644 --- a/src/CloudKit/Enums.cs +++ b/src/CloudKit/Enums.cs @@ -80,6 +80,7 @@ public enum CKErrorCode : nint { [iOS (10,0), TV (10,0), Mac (10,12)] ReferenceViolation = 31, [iOS (10,0), TV (10,0), Mac (10,12)] ManagedAccountRestricted = 32, [iOS (10,0), TV (10,0), Mac (10,12)] ParticipantMayNeedVerification = 33, + [iOS (11,0), TV (11,0), Mac (10,13), Watch (4,0)] ResponseLost = 34, } // NSInteger -> CKModifyRecordsOperation.h @@ -102,7 +103,7 @@ public enum CKNotificationType : nint { Query = 1, RecordZone = 2, ReadNotification = 3, - [iOS (10,0), TV (10,0), Mac (10,12)] Database = 4, + [iOS (10,0), TV (10,0), Mac (10,12), Watch (3,0)] Database = 4, } // NSInteger -> CKNotification.h @@ -152,7 +153,7 @@ public enum CKSubscriptionType : nint { // NSInteger -> CKSubscription.h [NoWatch] - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use CKQuerySubscriptionOptions instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'CKQuerySubscriptionOptions' instead.")] [Flags] [Native] public enum CKSubscriptionOptions : nuint { @@ -215,4 +216,18 @@ public enum CKQuerySubscriptionOptions : nuint RecordDeletion = 1 << 2, FiresOnce = 1 << 3, } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum CKOperationGroupTransferSize : nint + { + Unknown, + Kilobytes, + Megabytes, + TensOfMegabytes, + HundredsOfMegabytes, + Gigabytes, + TensOfGigabytes, + HundredsOfGigabytes, + } } diff --git a/src/Constants.iOS.cs.in b/src/Constants.iOS.cs.in index fe2270d46543..d7247c38c0fb 100644 --- a/src/Constants.iOS.cs.in +++ b/src/Constants.iOS.cs.in @@ -37,6 +37,7 @@ namespace MonoTouch { public const string MapKitLibrary = "/System/Library/Frameworks/MapKit.framework/MapKit"; public const string GameKitLibrary = "/System/Library/Frameworks/GameKit.framework/GameKit"; public const string EventKitLibrary = "/System/Library/Frameworks/EventKit.framework/EventKit"; + public const string EventKitUILibrary = "/System/Library/Frameworks/EventKitUI.framework/EventKitUI"; public const string ImageIOLibrary = "/System/Library/Frameworks/ImageIO.framework/ImageIO"; public const string AssetsLibraryLibrary = "/System/Library/Frameworks/AssetsLibrary.framework/AssetsLibrary"; public const string CoreVideoLibrary = "/System/Library/Frameworks/CoreVideo.framework/CoreVideo"; @@ -105,5 +106,16 @@ namespace MonoTouch { public const string UserNotificationsUILibrary = "/System/Library/Frameworks/UserNotificationsUI.framework/UserNotificationsUI"; public const string IntentsLibrary = "/System/Library/Frameworks/Intents.framework/Intents"; public const string IntentsUILibrary = "/System/Library/Frameworks/IntentsUI.framework/IntentsUI"; + // iOS 11.0 + public const string ARKitLibrary = "/System/Library/Frameworks/ARKit.framework/ARKit"; + public const string CoreNFCLibrary = "/System/Library/Frameworks/CoreNFC.framework/CoreNFC"; + public const string DeviceCheckLibrary = "/System/Library/Frameworks/DeviceCheck.framework/DeviceCheck"; + public const string IdentityLookupLibrary = "/System/Library/Frameworks/IdentityLookup.framework/IdentityLookup"; + public const string CoreMLLibrary = "/System/Library/Frameworks/CoreML.framework/CoreML"; + public const string VisionLibrary = "/System/Library/Frameworks/Vision.framework/Vision"; + public const string FileProviderLibrary = "/System/Library/Frameworks/FileProvider.framework/FileProvider"; + public const string FileProviderUILibrary = "/System/Library/Frameworks/FileProviderUI.framework/FileProviderUI"; + public const string IOSurfaceLibrary = "/System/Library/Frameworks/IOSurface.framework/IOSurface"; + public const string PdfKitLibrary = "/System/Library/Frameworks/PDFKit.framework/PDFKit"; } } diff --git a/src/Constants.mac.cs.in b/src/Constants.mac.cs.in index 629560446c24..5f08f1c7a019 100644 --- a/src/Constants.mac.cs.in +++ b/src/Constants.mac.cs.in @@ -125,5 +125,12 @@ namespace MonoMac { public const string PhotosLibrary = "/System/Library/Frameworks/Photos.framework/Photos"; public const string IntentsLibrary = "/System/Library/Frameworks/Intents.framework/Intents"; public const string MediaPlayerLibrary = "/System/Library/Frameworks/MediaPlayer.framework/MediaPlayer"; + + // macOS 10.13 + public const string CoreMLLibrary = "/System/Library/Frameworks/CoreML.framework/CoreML"; + public const string VisionLibrary = "/System/Library/Frameworks/Vision.framework/Vision"; + public const string IOSurfaceLibrary = "/System/Library/Frameworks/IOSurface.framework/IOSurface"; + public const string PhotosUILibrary = "/System/Library/Frameworks/Photos.framework/PhotosUI"; + public const string ExternalAccessoryLibrary = "/System/Library/Frameworks/ExternalAccessory.framework/ExternalAccessory"; } } diff --git a/src/Constants.tvos.cs.in b/src/Constants.tvos.cs.in index ce9c31ea4d79..940bd22ac0a2 100644 --- a/src/Constants.tvos.cs.in +++ b/src/Constants.tvos.cs.in @@ -69,5 +69,10 @@ namespace ObjCRuntime { // tvOS 10.2 public const string VideoToolboxLibrary = "/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox"; + // tvOS 11.0 + public const string DeviceCheckLibrary = "/System/Library/Frameworks/DeviceCheck.framework/DeviceCheck"; + public const string CoreMLLibrary = "/System/Library/Frameworks/CoreML.framework/CoreML"; + public const string VisionLibrary = "/System/Library/Frameworks/Vision.framework/Vision"; + public const string IOSurfaceLibrary = "/System/Library/Frameworks/IOSurface.framework/IOSurface"; } } diff --git a/src/Constants.watch.cs.in b/src/Constants.watch.cs.in index df181fa9691a..52cf432001ef 100644 --- a/src/Constants.watch.cs.in +++ b/src/Constants.watch.cs.in @@ -42,6 +42,11 @@ namespace ObjCRuntime { // WatchOS 3.2 public const string IntentsLibrary = "/System/Library/Frameworks/Intents.framework/Intents"; - + + // WatchOS 4.0 + public const string CoreBluetoothLibrary = "/System/Library/Frameworks/CoreBluetooth.framework/CoreBluetooth"; + public const string CoreMLLibrary = "/System/Library/Frameworks/CoreML.framework/CoreML"; + public const string CoreVideoLibrary = "/System/Library/Frameworks/CoreVideo.framework/CoreVideo"; + public const string VisionLibrary = "/System/Library/Frameworks/Vision.framework/Vision"; } } diff --git a/src/Contacts/CNEnums.cs b/src/Contacts/CNEnums.cs index 4de1f60b2575..d1ef6a26a155 100644 --- a/src/Contacts/CNEnums.cs +++ b/src/Contacts/CNEnums.cs @@ -94,7 +94,13 @@ public enum CNErrorCode : nint { ValidationTypeMismatch = 301, ValidationConfigurationError = 302, PredicateInvalid = 400, - PolicyViolation = 500 + PolicyViolation = 500, + [iOS (11,0), Mac (10,13)] + ClientIdentifierInvalid = 600, + [iOS (11,0), Mac (10,13)] + ClientIdentifierDoesNotExist = 601, + [iOS (11,0), Mac (10,13)] + VCardMalformed = 700, } // NSInteger -> CNPostalAddressFormatter.h diff --git a/src/Contacts/CNObsolete.cs b/src/Contacts/CNObsolete.cs index 377370dbfe98..a52a5d698001 100644 --- a/src/Contacts/CNObsolete.cs +++ b/src/Contacts/CNObsolete.cs @@ -13,7 +13,7 @@ namespace XamCore.Contacts { public static partial class CNGroup_PredicatesExtension { #if !MONOMAC - [Obsolete ("This API is only available on OSX 10.11+")] + [Obsolete ("This API is only available on macOS 10.11+.")] public static Foundation.NSPredicate GetPredicateForSubgroupsInGroup (CNGroup This, string parentGroupIdentifier) { return null; diff --git a/src/Contacts/CNPostalAddress.cs b/src/Contacts/CNPostalAddress.cs deleted file mode 100644 index 847003821982..000000000000 --- a/src/Contacts/CNPostalAddress.cs +++ /dev/null @@ -1,55 +0,0 @@ -// -// CNPostalAddress.cs: Implements some nicer methods for CNPostalAddress -// -// Authors: -// Alex Soto -// -// Copyright 2015 Xamarin Inc. All rights reserved. -// - -using System; -using XamCore.Foundation; - -namespace XamCore.Contacts { -#if XAMCORE_2_0 // The Contacts framework uses generics heavily, which is only supported in Unified (for now at least) - // Strong typed Keys to enum - public enum CNPostalAddressKeyOption { - Street, - City, - State, - PostalCode, - Country, - IsoCountryCode - } - - public partial class CNPostalAddress { - - public static string LocalizeProperty (CNPostalAddressKeyOption option) - { - var srvc = LocalizeOptionsToNSString (option); - return LocalizeProperty (srvc); - } - - static NSString LocalizeOptionsToNSString (CNPostalAddressKeyOption option) - { - switch (option) { - case CNPostalAddressKeyOption.Street: - return CNPostalAddressKey.Street; - case CNPostalAddressKeyOption.City: - return CNPostalAddressKey.City; - case CNPostalAddressKeyOption.State: - return CNPostalAddressKey.State; - case CNPostalAddressKeyOption.PostalCode: - return CNPostalAddressKey.PostalCode; - case CNPostalAddressKeyOption.Country: - return CNPostalAddressKey.Country; - case CNPostalAddressKeyOption.IsoCountryCode: - return CNPostalAddressKey.IsoCountryCode; - default: - throw new ArgumentOutOfRangeException ("option"); - } - } - } -#endif // XAMCORE_2_0 -} - diff --git a/src/CoreAnimation/CAEnums.cs b/src/CoreAnimation/CAEnums.cs index f20cd0c670b3..23caa9ecc8c5 100644 --- a/src/CoreAnimation/CAEnums.cs +++ b/src/CoreAnimation/CAEnums.cs @@ -31,6 +31,7 @@ using XamCore.Foundation; using System.Runtime.InteropServices; using XamCore.CoreGraphics; +using XamCore.ObjCRuntime; namespace XamCore.CoreAnimation { @@ -47,6 +48,16 @@ public enum CAEdgeAntialiasingMask : uint_compat_int { TopBottomEdges = TopEdge | BottomEdge } + [NoWatch] // headers not updated + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Native][Flags] + public enum CACornerMask : nuint { + MinXMinYCorner = 1 << 0, + MaxXMinYCorner = 1 << 1, + MinXMaxYCorner = 1 << 2, + MaxXMaxYCorner = 1 << 3, + } + #if MONOMAC // untyped enum -> CALayer.h (only on OSX headers) // note: autoresizingMask is an `unsigned int` @property diff --git a/src/CoreBluetooth/AdvertisementDataOptions.cs b/src/CoreBluetooth/AdvertisementDataOptions.cs index 96a398a59f30..35d8b242e354 100644 --- a/src/CoreBluetooth/AdvertisementDataOptions.cs +++ b/src/CoreBluetooth/AdvertisementDataOptions.cs @@ -37,6 +37,7 @@ namespace XamCore.CoreBluetooth { // It's intentionally not called AdvertisementDataOptions because different options // are valid in different contexts // + [Watch (4,0)] [iOS (6,0)] public class StartAdvertisingOptions : DictionaryContainer { diff --git a/src/CoreBluetooth/CBUUID.cs b/src/CoreBluetooth/CBUUID.cs index 8d09c3963b06..43b6d6f62679 100644 --- a/src/CoreBluetooth/CBUUID.cs +++ b/src/CoreBluetooth/CBUUID.cs @@ -205,5 +205,15 @@ public unsafe string ToString (bool fullUuid) return sb.ToString (); } + +#if MONOMAC + // workaround for 27160443 – Trello: https://trello.com/c/oqB27JA6 + // try new constant (10.13+) and fallback to the old/misnamed one + public static NSString CharacteristicValidRangeString { + get { + return CBUUIDCharacteristicValidRangeString ?? CBUUIDValidRangeString; + } + } +#endif } } diff --git a/src/CoreBluetooth/CoreBluetooth.cs b/src/CoreBluetooth/CoreBluetooth.cs index b35e460060f1..dc5ed96ae03d 100644 --- a/src/CoreBluetooth/CoreBluetooth.cs +++ b/src/CoreBluetooth/CoreBluetooth.cs @@ -113,10 +113,10 @@ public CBPeer () } } #endif -#if !MONOMAC && !XAMCORE_4_0 +#if !WATCH && !XAMCORE_4_0 public partial class CBCentralManager { - public virtual CBCentralManagerState State { + public new virtual CBCentralManagerState State { get { return (CBCentralManagerState)base.State; } diff --git a/src/CoreBluetooth/Enums.cs b/src/CoreBluetooth/Enums.cs index f1bca3817337..6e7aa4194262 100644 --- a/src/CoreBluetooth/Enums.cs +++ b/src/CoreBluetooth/Enums.cs @@ -13,13 +13,11 @@ namespace XamCore.CoreBluetooth { -#if !MONOMAC + [Mac (10,13)] + [Watch (4,0)] [iOS (10,0)] [Native] public enum CBManagerState : nint { -#else - internal enum CBManagerState { -#endif Unknown = 0, Resetting, Unsupported, @@ -30,7 +28,8 @@ internal enum CBManagerState { // NSInteger -> CBCentralManager.h [Introduced (PlatformName.iOS, 5, 0)] - [Deprecated (PlatformName.iOS, 10, 0, message: "Use CBManagerState instead")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'CBManagerState' instead.")] + [NoWatch] [Native] public enum CBCentralManagerState : nint { Unknown = CBManagerState.Unknown, @@ -43,7 +42,8 @@ public enum CBCentralManagerState : nint { // NSInteger -> CBPeripheralManager.h [Introduced (PlatformName.iOS, 6, 0)] - [Deprecated (PlatformName.iOS, 10, 0, message: "Use CBManagerState instead")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'CBManagerState' instead.")] + [NoWatch] [Native] public enum CBPeripheralManagerState : nint { Unknown = CBManagerState.Unknown, @@ -55,16 +55,19 @@ public enum CBPeripheralManagerState : nint { } // NSInteger -> CBPeripheralManager.h + [Watch (4,0)] [Native] public enum CBPeripheralState : nint { Disconnected, Connecting, Connected, - Disconnecting + [iOS (9,0)][Mac (10,13)] + Disconnecting, } #if !XAMCORE_4_0 // NSInteger -> CBPeripheralManager.h + [Watch (4,0)] [Native] public enum CBPeripheralManagerAuthorizationStatus : nint { NotDetermined, @@ -75,6 +78,7 @@ public enum CBPeripheralManagerAuthorizationStatus : nint { #endif // NSUInteger -> CBCharacteristic.h + [Watch (4,0)] [Flags] [Native] public enum CBCharacteristicProperties : nuint_compat_int { @@ -86,10 +90,13 @@ public enum CBCharacteristicProperties : nuint_compat_int { Indicate = 32, AuthenticatedSignedWrites = 64, ExtendedProperties = 128, + [Mac (10,9)] NotifyEncryptionRequired = 0x100, + [Mac (10,9)] IndicateEncryptionRequired = 0x200 } + [Watch (4,0)] [ErrorDomain ("CBErrorDomain")] [Native] // NSInteger -> CBError.h public enum CBError : nint { @@ -104,12 +111,15 @@ public enum CBError : nint { PeripheralDisconnected, UUIDNotAllowed, AlreadyAdvertising, - // iOS7.1 + [iOS (7,1)][Mac (10,13)] ConnectionFailed, - // iOS 9 - ConnectionLimitReached + [iOS (9,0)][Mac (10,13)] + ConnectionLimitReached, + [iOS (11,0)][TV (11,0)][Mac (10,13)] + UnknownDevice, } + [Watch (4,0)] [ErrorDomain ("CBATTErrorDomain")] [Native] // NSInteger -> CBError.h public enum CBATTError : nint { @@ -134,6 +144,7 @@ public enum CBATTError : nint { } // NSInteger -> CBPeripheral.h + [Watch (4,0)] [Native] public enum CBCharacteristicWriteType : nint { WithResponse, @@ -141,6 +152,8 @@ public enum CBCharacteristicWriteType : nint { } // NSUInteger -> CBCharacteristic.h + [Mac (10,9)] + [Watch (4,0)] [Flags] [Native] public enum CBAttributePermissions : nuint_compat_int { @@ -151,6 +164,7 @@ public enum CBAttributePermissions : nuint_compat_int { } // NSInteger -> CBPeripheralManager.h + [Watch (4,0)] [Native] public enum CBPeripheralManagerConnectionLatency : nint { Low = 0, diff --git a/src/CoreBluetooth/GuidWrapper.cs b/src/CoreBluetooth/GuidWrapper.cs index ff98b6d7bc76..599496b8289d 100644 --- a/src/CoreBluetooth/GuidWrapper.cs +++ b/src/CoreBluetooth/GuidWrapper.cs @@ -58,8 +58,8 @@ public void ConnectPeripheral (CBPeripheral peripheral, PeripheralConnectionOpti ConnectPeripheral (peripheral, options == null ? null : options.Dictionary); } -#if !TVOS - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_9_0, Message = "Use RetrievePeripheralsWithIdentifiers instead")] +#if !TVOS && !WATCH + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_9_0, Message = "Use 'RetrievePeripheralsWithIdentifiers' instead.")] public void RetrievePeripherals (CBUUID [] peripheralUuids) { if (peripheralUuids == null) @@ -83,19 +83,19 @@ public void RetrievePeripherals (CBUUID peripheralUuid) #endif #if !XAMCORE_2_0 - [Obsolete ("Use the CBUUID overload since Guid internal memory representation is different")] + [Obsolete ("Use the 'CBUUID' overload since Guid internal memory representation is different.")] public void RetrievePeripherals (Guid [] peripheralUuids) { CFUUID.WithArray (peripheralUuids, "peripheralUuids", x => RetrievePeripherals (x)); } - [Obsolete ("Use the CBUUID overload since Guid internal memory representation is different")] + [Obsolete ("Use the 'CBUUID' overload since Guid internal memory representation is different.")] public void RetrievePeripherals (Guid peripheralUuid) { RetrievePeripherals (new [] { peripheralUuid }); } - [Obsolete ("Use the CBUUID overload since Guid internal memory representation is different")] + [Obsolete ("Use the 'CBUUID' overload since Guid internal memory representation is different.")] public void ScanForPeripherals (Guid [] serviceUuids, NSDictionary options) { if (serviceUuids == null) @@ -104,25 +104,25 @@ public void ScanForPeripherals (Guid [] serviceUuids, NSDictionary options) CFUUID.WithArray (serviceUuids, "serviceUuids", x => ScanForPeripherals (x, options)); } - [Obsolete ("Use the CBUUID overload since Guid internal memory representation is different")] + [Obsolete ("Use the 'CBUUID' overload since Guid internal memory representation is different.")] public void ScanForPeripherals (Guid[] serviceUuids, PeripheralScanningOptions options = null) { ScanForPeripherals (serviceUuids, options == null ? null : options.Dictionary); } - [Obsolete ("Use the CBUUID overload since Guid internal memory representation is different")] + [Obsolete ("Use the 'CBUUID' overload since Guid internal memory representation is different.")] public void ScanForPeripherals (Guid [] serviceUuids) { ScanForPeripherals (serviceUuids, null as NSDictionary); } - [Obsolete ("Use the CBUUID overload since Guid internal memory representation is different")] + [Obsolete ("Use the 'CBUUID' overload since Guid internal memory representation is different.")] public void ScanForPeripherals (Guid serviceUuid, NSDictionary options) { ScanForPeripherals (new [] { serviceUuid }, options); } - [Obsolete ("Use the CBUUID overload since Guid internal memory representation is different")] + [Obsolete ("Use the 'CBUUID' overload since Guid internal memory representation is different.")] public void ScanForPeripherals (Guid serviceUuid) { ScanForPeripherals (new [] { serviceUuid }, null as NSDictionary); diff --git a/src/CoreBluetooth/PeripheralConnectionOptions.cs b/src/CoreBluetooth/PeripheralConnectionOptions.cs index 6622f3110304..1a6e4679780c 100644 --- a/src/CoreBluetooth/PeripheralConnectionOptions.cs +++ b/src/CoreBluetooth/PeripheralConnectionOptions.cs @@ -33,6 +33,7 @@ namespace XamCore.CoreBluetooth { + [Watch (4,0)] public class PeripheralConnectionOptions : DictionaryContainer { #if !COREBUILD diff --git a/src/CoreData/Enums.cs b/src/CoreData/Enums.cs index 36a542259277..3b09557d5f6a 100644 --- a/src/CoreData/Enums.cs +++ b/src/CoreData/Enums.cs @@ -51,6 +51,10 @@ public enum NSAttributeType : nuint { Boolean = 800, Date = 900, Binary = 1000, + [iOS (11,0), TV (11,0), Mac (10,13), Watch (4,0)] + Uuid = 1100, + [iOS (11,0), TV (11,0), Mac (10,13), Watch (4,0)] + Uri = 1200, Transformable = 1800, ObjectID = 2000 } @@ -147,7 +151,9 @@ public enum ValidationErrorType : nuint { InvalidDate = 1650, StringTooLong = 1660, StringTooShort = 1670, - StringPatternMatching = 1680 + StringPatternMatching = 1680, + [iOS (11,0), TV (11,0), Mac (10,13), Watch (4,0)] + InvalidUri = 1690, } [Native] @@ -183,6 +189,37 @@ public enum MigrationErrorType { MigrationManagerDestinationStore = 134160, EntityMigrationPolicy = 134170, InferredMappingModel = 134190, - ExternalRecordImport = 134200 + ExternalRecordImport = 134200, + [iOS (11,0), TV (11,0), Mac (10,3), Watch (4,0)] + HistoryTokenExpired = 134301, + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum NSFetchIndexElementType : nuint + { + Binary, + RTree + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum NSPersistentHistoryChangeType : nint + { + Insert, + Update, + Delete + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum NSPersistentHistoryResultType : nint + { + StatusOnly = 0, + ObjectIds = 1, + Count = 2, + TransactionsOnly = 3, + ChangesOnly = 4, + TransactionsAndChanges = 5 } } diff --git a/src/CoreFoundation/CFStream.cs b/src/CoreFoundation/CFStream.cs index 2ea4d1170443..1e4b6cda17b0 100644 --- a/src/CoreFoundation/CFStream.cs +++ b/src/CoreFoundation/CFStream.cs @@ -244,7 +244,7 @@ public static void CreatePairWithSocketToHost (string host, int port, internal extern static /* CFReadStreamRef __nonnull */ IntPtr CFReadStreamCreateForHTTPRequest ( /* CFAllocatorRef __nullable */ IntPtr alloc, /* CFHTTPMessageRef __nonnull */ IntPtr request); - [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use NSUrlSession")] + [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use 'NSUrlSession'.")] public static CFHTTPStream CreateForHTTPRequest (CFHTTPMessage request) { if (request == null) diff --git a/src/CoreGraphics/CGColorConverter.cs b/src/CoreGraphics/CGColorConverter.cs index 3ee9cb913c58..6f9a3645e087 100644 --- a/src/CoreGraphics/CGColorConverter.cs +++ b/src/CoreGraphics/CGColorConverter.cs @@ -21,17 +21,17 @@ namespace XamCore.CoreGraphics { // uint32_t enum -> CGColorConverter.h - [TV (9,2)][Obsoleted (PlatformName.TvOS, 10,0, message: "Replaced by CGColorConversionInfoTransformType. This code does not work on tvOS 10+")] - [iOS (9,3)][Obsoleted (PlatformName.iOS, 10,0, message: "Replaced by CGColorConversionInfoTransformType. This code does not work on iOS 10+")] - [Obsolete ("Use CGColorConversionInfoTransformType")] + [TV (9,2)][Obsoleted (PlatformName.TvOS, 10,0, message: "Replaced by 'CGColorConversionInfoTransformType'.")] + [iOS (9,3)][Obsoleted (PlatformName.iOS, 10,0, message: "Replaced by 'CGColorConversionInfoTransformType'.")] + [Obsolete ("Use 'CGColorConversionInfoTransformType'.")] public enum CGColorConverterTransformType : uint { FromSpace, ToSpace, ApplySpace } - [TV (9,2)][Obsoleted (PlatformName.TvOS, 10,0, message: "Replaced by GColorConversionInfoTriple. This code does not work on tvOS 10+")] - [iOS (9,3)][Obsoleted (PlatformName.iOS, 10,0, message: "Replaced by GColorConversionInfoTriple. This code does not work on iOS 10+")] + [TV (9,2)][Obsoleted (PlatformName.TvOS, 10,0, message: "Replaced by 'GColorConversionInfoTriple'.")] + [iOS (9,3)][Obsoleted (PlatformName.iOS, 10,0, message: "Replaced by 'GColorConversionInfoTriple'.")] [StructLayout (LayoutKind.Sequential)] public struct CGColorConverterTriple { public CGColorSpace Space; @@ -40,8 +40,8 @@ public struct CGColorConverterTriple { } // CGColorConverter.h - [TV (9,2)][Obsoleted (PlatformName.TvOS, 10,0, message: "Replaced by CGColorConversionInfo. This code does not work on tvOS 10+")] - [iOS (9,3)][Obsoleted (PlatformName.iOS, 10,0, message: "Replaced by CGColorConversionInfo. This code does not work on iOS 10+")] + [TV (9,2)][Obsoleted (PlatformName.TvOS, 10,0, message: "Replaced by 'CGColorConversionInfo'.")] + [iOS (9,3)][Obsoleted (PlatformName.iOS, 10,0, message: "Replaced by 'CGColorConversionInfo'.")] public class CGColorConverter : INativeObject, IDisposable { /* invoked by marshallers */ diff --git a/src/CoreGraphics/CGColorSpace.cs b/src/CoreGraphics/CGColorSpace.cs index 1534e137ab79..4f2994e4c2f0 100644 --- a/src/CoreGraphics/CGColorSpace.cs +++ b/src/CoreGraphics/CGColorSpace.cs @@ -66,7 +66,7 @@ public class CGColorSpace : INativeObject internal IntPtr handle; #if !XAMCORE_3_0 - [Obsolete ("Use a real `null` value instead of this managed wrapper over a null native instance")] + [Obsolete ("Use a real 'null' value instead of this managed wrapper over a null native instance.")] #if XAMCORE_2_0 readonly #endif @@ -143,7 +143,7 @@ public static CGColorSpace CreateDeviceRGB () } #if !XAMCORE_3_0 - [Obsolete ("This method has been renamed CreateDeviceCmyk()")] + [Obsolete ("This method has been renamed 'CreateDeviceCmyk'.")] [EditorBrowsable (EditorBrowsableState.Never)] public static /* CGColorSpaceRef */ CGColorSpace CreateDeviceCMYK () { diff --git a/src/CoreGraphics/CGContext.cs b/src/CoreGraphics/CGContext.cs index 170b14fbebfe..70cfc810de23 100644 --- a/src/CoreGraphics/CGContext.cs +++ b/src/CoreGraphics/CGContext.cs @@ -970,7 +970,7 @@ public void SetFontSize (nfloat size) extern static void CGContextSelectFont (/* CGContextRef */ IntPtr c, /* const char* __nullable */ string name, /* CGFloat */ nfloat size, CGTextEncoding textEncoding); - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void SelectFont (string name, nfloat size, CGTextEncoding textEncoding) { CGContextSelectFont (handle, name, size, textEncoding); @@ -1002,7 +1002,7 @@ public void ShowGlyphsAtPositions (ushort [] glyphs, CGPoint [] positions, int s [DllImport (Constants.CoreGraphicsLibrary)] extern static void CGContextShowText (/* CGContextRef */ IntPtr c, /* const char* __nullable */ string s, /* size_t */ nint length); - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowText (string str, int count) { if (str == null) @@ -1012,7 +1012,7 @@ public void ShowText (string str, int count) CGContextShowText (handle, str, count); } - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowText (string str) { CGContextShowText (handle, str, str == null ? 0 : str.Length); @@ -1021,7 +1021,7 @@ public void ShowText (string str) [DllImport (Constants.CoreGraphicsLibrary)] extern static void CGContextShowText (/* CGContextRef */ IntPtr c, /* const char* __nullable */ byte[] bytes, /* size_t */ nint length); - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowText (byte[] bytes, int count) { if (bytes == null) @@ -1031,7 +1031,7 @@ public void ShowText (byte[] bytes, int count) CGContextShowText (handle, bytes, count); } - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowText (byte[] bytes) { CGContextShowText (handle, bytes, bytes == null ? 0 : bytes.Length); @@ -1041,13 +1041,13 @@ public void ShowText (byte[] bytes) extern static void CGContextShowTextAtPoint (/* CGContextRef __nullable */ IntPtr c, /* CGFloat */ nfloat x, /* CGFloat */ nfloat y, /* const char* __nullable */ string str, /* size_t */ nint length); - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowTextAtPoint (nfloat x, nfloat y, string str, int length) { CGContextShowTextAtPoint (handle, x, y, str, length); } - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowTextAtPoint (nfloat x, nfloat y, string str) { CGContextShowTextAtPoint (handle, x, y, str, str == null ? 0 : str.Length); @@ -1070,13 +1070,13 @@ public void ShowTextAtPoint (nfloat x, nfloat y, byte[] bytes) extern static void CGContextShowGlyphs (/* CGContextRef __nullable */ IntPtr c, /* const CGGlyph * __nullable */ ushort [] glyphs, /* size_t */ nint count); - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowGlyphs (ushort [] glyphs) { CGContextShowGlyphs (handle, glyphs, glyphs == null ? 0 : glyphs.Length); } - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowGlyphs (ushort [] glyphs, int count) { if (glyphs == null) @@ -1090,7 +1090,7 @@ public void ShowGlyphs (ushort [] glyphs, int count) extern static void CGContextShowGlyphsAtPoint (/* CGContextRef */ IntPtr context, /* CGFloat */ nfloat x, /* CGFloat */ nfloat y, /* const CGGlyph * __nullable */ ushort [] glyphs, /* size_t */ nint count); - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowGlyphsAtPoint (nfloat x, nfloat y, ushort [] glyphs, int count) { if (glyphs == null) @@ -1100,7 +1100,7 @@ public void ShowGlyphsAtPoint (nfloat x, nfloat y, ushort [] glyphs, int count) CGContextShowGlyphsAtPoint (handle, x, y, glyphs, count); } - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowGlyphsAtPoint (nfloat x, nfloat y, ushort [] glyphs) { CGContextShowGlyphsAtPoint (handle, x, y, glyphs, glyphs == null ? 0 : glyphs.Length); @@ -1111,7 +1111,7 @@ extern static void CGContextShowGlyphsWithAdvances (/* CGContextRef __nullable * /* const CGGlyph * __nullable */ ushort [] glyphs, /* const CGSize * __nullable */ CGSize [] advances, /* size_t */ nint count); - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the CoreText API instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use the 'CoreText' API instead.")] public void ShowGlyphsWithAdvances (ushort [] glyphs, CGSize [] advances, int count) { if (glyphs == null) diff --git a/src/CoreGraphics/CGPDFOperatorTable.cs b/src/CoreGraphics/CGPDFOperatorTable.cs index b0420adf8c20..9c21f6f891cb 100644 --- a/src/CoreGraphics/CGPDFOperatorTable.cs +++ b/src/CoreGraphics/CGPDFOperatorTable.cs @@ -92,7 +92,7 @@ public void SetCallback (string name, Action callback) })); } - [Advice ("Use the nicer SetCallback(string,Action) API when possible (OSX)")] + [Advice ("Use the nicer SetCallback(string,Action) API when possible.")] #endif // this API is ugly - but I do not see a better way with the AOT limitation public void SetCallback (string name, Action callback) diff --git a/src/CoreImage/CIFilter.cs b/src/CoreImage/CIFilter.cs index f6872048c952..df6245ed98f3 100644 --- a/src/CoreImage/CIFilter.cs +++ b/src/CoreImage/CIFilter.cs @@ -643,7 +643,7 @@ bool SupportsInputImage { } #if MONOMAC && !XAMCORE_3_0 - [Obsolete ("This type has been renamed to CICmykHalftone")] + [Obsolete ("This type has been renamed to CICmykHalftone.")] public class CICMYKHalftone : CICmykHalftone { public CICMYKHalftone () {} public CICMYKHalftone (IntPtr handle) : base (handle) {} diff --git a/src/CoreImage/Enums.cs b/src/CoreImage/Enums.cs index 7349c7d45056..0694bfa1e562 100644 --- a/src/CoreImage/Enums.cs +++ b/src/CoreImage/Enums.cs @@ -22,6 +22,7 @@ // using System; +using XamCore.ObjCRuntime; namespace XamCore.CoreImage { @@ -44,14 +45,14 @@ public enum CIFormat { RGBAh = 1, #if MONOMAC RGBA16 = 2, - [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kRGBAf instead")] + [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kRGBAf instead.")] RGBAf = 3, // Please, do not add values into MonoMac/iOS without adding an explicit value #elif !XAMCORE_3_0 - [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kBGRA8 instead")] + [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kBGRA8 instead.")] BGRA8 = 2 , - [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kRGBA8 instead")] + [Obsolete ("This value can not be shared across Mac/iOS binaries, future proof with kRGBA8 instead.")] RGBA8 = 3, // Please, do not add values into MonoMac/iOS without adding an explicit value #endif @@ -72,4 +73,38 @@ public enum CIFormat { RGh = 21, RGf = 22 } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [Native] + public enum CIQRCodeErrorCorrectionLevel : nint { + L = 76, + M = 77, + Q = 81, + H = 72, + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [Native] + public enum CIDataMatrixCodeEccVersion : nint { + V000 = 0, + V050 = 50, + V080 = 80, + V100 = 100, + V140 = 140, + V200 = 200, + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [Native] + public enum CIRenderDestinationAlphaMode : nuint { + None = 0, + Premultiplied = 1, + Unpremultiplied = 2, + } } diff --git a/src/CoreLocation/CLCompat.cs b/src/CoreLocation/CLCompat.cs index 6b7473be9f0f..ecd3af01fbde 100644 --- a/src/CoreLocation/CLCompat.cs +++ b/src/CoreLocation/CLCompat.cs @@ -8,7 +8,7 @@ namespace XamCore.CoreLocation { #if !XAMCORE_2_0 public partial class CLBeaconRegion { - [Obsolete ("Does not return a valid instance on iOS8")] + [Obsolete ("Does not return a valid instance on iOS 8.")] public CLBeaconRegion () { } @@ -20,7 +20,7 @@ public CLBeaconRegion () #if !TVOS public partial class CLHeading { - [Obsolete ("Use the Description property from NSObject")] + [Obsolete ("Use the 'Description' property from 'NSObject'.")] public new virtual string Description () { return base.Description; @@ -30,7 +30,7 @@ public partial class CLHeading { public partial class CLLocation { - [Obsolete ("Use the Description property from NSObject")] + [Obsolete ("Use the 'Description' property from 'NSObject'.")] public new virtual string Description () { return base.Description; diff --git a/src/CoreLocation/CLEnums.cs b/src/CoreLocation/CLEnums.cs index 2def304da7af..44b36dd4e5a6 100644 --- a/src/CoreLocation/CLEnums.cs +++ b/src/CoreLocation/CLEnums.cs @@ -87,7 +87,7 @@ public enum CLAuthorizationStatus : uint_compat_int { Restricted, Denied, - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use AuthorizedAlways instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'AuthorizedAlways' instead.")] Authorized, AuthorizedAlways = Authorized, AuthorizedWhenInUse diff --git a/src/CoreML/MLDictionaryFeatureProvider.cs b/src/CoreML/MLDictionaryFeatureProvider.cs new file mode 100644 index 000000000000..b426a8d4395a --- /dev/null +++ b/src/CoreML/MLDictionaryFeatureProvider.cs @@ -0,0 +1,25 @@ +// +// MLDictionaryFeatureProvider.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.CoreML { + public partial class MLDictionaryFeatureProvider { + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public MLFeatureValue this [string featureName] { + get { return GetFeatureValue (featureName); } + } + } +} +#endif diff --git a/src/CoreML/MLMultiArray.cs b/src/CoreML/MLMultiArray.cs new file mode 100644 index 000000000000..650689f1ad0d --- /dev/null +++ b/src/CoreML/MLMultiArray.cs @@ -0,0 +1,91 @@ +// +// MLMultiArray.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.CoreML { + public partial class MLMultiArray { + static NSNumber[] ConvertArray (nint[] value) + { + if (value == null) + return null; + + return Array.ConvertAll (value, NSNumber.FromNInt); + } + + // NSArray => nint[] + internal static nint[] ConvertArray (IntPtr handle) + { + return NSArray.ArrayFromHandle (handle, (v) => Messaging.nint_objc_msgSend (v, Selector.GetHandle ("integerValue"))); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public MLMultiArray (nint [] shape, MLMultiArrayDataType dataType, out NSError error) + : this (ConvertArray (shape), dataType, out error) + { + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public MLMultiArray (IntPtr dataPointer, nint [] shape, MLMultiArrayDataType dataType, nint [] strides, Action deallocator, out NSError error) + : this (dataPointer, ConvertArray (shape), dataType, ConvertArray (strides), deallocator, out error) + { + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public NSNumber this [nint idx] { + get { return GetObject (idx); } + set { SetObject (value, idx); } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public NSNumber this [params nint[] indices] { + get { return GetObject (indices); } + set { SetObject (value, indices); } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public NSNumber this [NSNumber [] key] { + get { return GetObject (key); } + set { SetObject (value, key); } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public NSNumber GetObject (params nint[] indices) + { + using (var arr = NSArray.FromNSObjects (NSNumber.FromNInt, indices)) + return GetObject (arr.GetHandle ()); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public void SetObject (NSNumber obj, params nint[] indices) + { + using (var arr = NSArray.FromNSObjects (NSNumber.FromNInt, indices)) + SetObject (obj, arr.GetHandle ()); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public nint[] Shape { + get { + return ConvertArray (_Shape); + } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public nint[] Strides { + get { + return ConvertArray (_Strides); + } + } + } +} +#endif diff --git a/src/CoreML/MLMultiArrayConstraint.cs b/src/CoreML/MLMultiArrayConstraint.cs new file mode 100644 index 000000000000..d8c3a3613ac0 --- /dev/null +++ b/src/CoreML/MLMultiArrayConstraint.cs @@ -0,0 +1,25 @@ +// +// MLMultiArrayConstraint.cs +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright 2017 Microsoft Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.CoreML { + public partial class MLMultiArrayConstraint { + public nint[] Shape { + get { + return MLMultiArray.ConvertArray (_Shape); + } + } + } +} +#endif diff --git a/src/CoreMedia/CMAttachmentBearer.cs b/src/CoreMedia/CMAttachmentBearer.cs index 68ca48e213b5..428899145e80 100644 --- a/src/CoreMedia/CMAttachmentBearer.cs +++ b/src/CoreMedia/CMAttachmentBearer.cs @@ -28,6 +28,23 @@ public static NSDictionary GetAttachments (this ICMAttachmentBearer target, CMAt return Runtime.GetNSObject (attachments, true); } +#if XAMCORE_2_0 + // There is some API that needs a more strongly typed version of a NSDictionary + // and there is no easy way to downcast from NSDictionary to NSDictionary + public static NSDictionary GetAttachments (this ICMAttachmentBearer target, CMAttachmentMode attachmentMode) + where TKey : class, INativeObject + where TValue : class, INativeObject + { + if (target == null) + throw new ArgumentNullException (nameof (target)); + var attachments = CMCopyDictionaryOfAttachments (IntPtr.Zero, target.Handle, attachmentMode); + if (attachments == IntPtr.Zero) + return null; + + return Runtime.GetNSObject> (attachments, true); + } +#endif + [DllImport(Constants.CoreMediaLibrary)] extern static /* CFTypeRef */ IntPtr CMGetAttachment (/* CMAttachmentBearerRef */ IntPtr target, /* CFStringRef */ IntPtr key, /* CMAttachmentMode */ out CMAttachmentMode attachmentModeOut); diff --git a/src/CoreMedia/CMSync.cs b/src/CoreMedia/CMSync.cs index 482751c38d94..f5972bcd80d5 100644 --- a/src/CoreMedia/CMSync.cs +++ b/src/CoreMedia/CMSync.cs @@ -212,7 +212,7 @@ public double Rate { [DllImport(Constants.CoreMediaLibrary)] extern static /* CMTimebaseRef */ IntPtr CMTimebaseGetMasterTimebase (/* CMTimebaseRef */ IntPtr timebase); - [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Please use CopyMasterTimebase")] + [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Use 'CopyMasterTimebase' instead.")] public CMTimebase GetMasterTimebase () { var ptr = CMTimebaseGetMasterTimebase (Handle); @@ -225,7 +225,7 @@ public CMTimebase GetMasterTimebase () [DllImport(Constants.CoreMediaLibrary)] extern static /* CMClockRef */ IntPtr CMTimebaseGetMasterClock (/* CMTimebaseRef */ IntPtr timebase); - [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Please use CopyMasterClock")] + [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Use 'CopyMasterClock' instead.")] public CMClock GetMasterClock () { var ptr = CMTimebaseGetMasterClock (Handle); @@ -238,7 +238,7 @@ public CMClock GetMasterClock () [DllImport(Constants.CoreMediaLibrary)] extern static /* CMClockOrTimebaseRef */ IntPtr CMTimebaseGetMaster (/* CMTimebaseRef */ IntPtr timebase); - [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Please use CopyMaster")] + [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Use 'CopyMaster' instead.")] public CMClockOrTimebase GetMaster () { var ptr = CMTimebaseGetMaster (Handle); @@ -251,7 +251,7 @@ public CMClockOrTimebase GetMaster () [DllImport(Constants.CoreMediaLibrary)] extern static /* CMClockRef */ IntPtr CMTimebaseGetUltimateMasterClock (/* CMTimebaseRef */ IntPtr timebase); - [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Please use CopyUltimateMasterClock")] + [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message="Use 'CopyUltimateMasterClock' instead.")] public CMClock GetUltimateMasterClock () { var ptr = CMTimebaseGetUltimateMasterClock (Handle); diff --git a/src/CoreMedia/CoreMedia.cs b/src/CoreMedia/CoreMedia.cs index 88dd775eba91..54382224bd47 100644 --- a/src/CoreMedia/CoreMedia.cs +++ b/src/CoreMedia/CoreMedia.cs @@ -104,7 +104,7 @@ public struct CMTimeRange { public static readonly CMTimeRange Zero; #if !XAMCORE_3_0 - [Obsolete ("Use InvalidRange")] + [Obsolete ("Use 'InvalidRange'.")] public static readonly CMTimeRange Invalid; #endif public static readonly CMTimeRange InvalidRange; diff --git a/src/CoreMotion/CMCompat.cs b/src/CoreMotion/CMCompat.cs index 4ce59806016d..a99ca4679344 100644 --- a/src/CoreMotion/CMCompat.cs +++ b/src/CoreMotion/CMCompat.cs @@ -9,7 +9,7 @@ namespace XamCore.CoreMotion { public partial class CMSensorRecorder { - [Obsolete ("Apple removed this API in iOS 9.3")] + [Obsolete ("Apple removed this API in iOS 9.3.")] public virtual CMSensorDataList GetAccelerometerDataSince (ulong identifier) { return null; diff --git a/src/CoreSpotlight/CSSearchableItemAttributeSet.cs b/src/CoreSpotlight/CSSearchableItemAttributeSet.cs index f761e94e0c2a..807861c077ea 100644 --- a/src/CoreSpotlight/CSSearchableItemAttributeSet.cs +++ b/src/CoreSpotlight/CSSearchableItemAttributeSet.cs @@ -4,6 +4,7 @@ using System; using XamCore.Foundation; +using XamCore.ObjCRuntime; namespace XamCore.CoreSpotlight { @@ -17,6 +18,34 @@ public INSSecureCoding this [CSCustomAttributeKey key] { SetValue (value, key); } } + + // Manually deal with these properties until we get BindAs working + [iOS (11,0), NoTV, Mac (10, 11)] + public bool? IsUserCreated { + get { + return _IsUserCreated?.BoolValue; + } set { + _IsUserCreated = value.HasValue ? new NSNumber (value.Value) : null; + } + } + + [iOS (11, 0), NoTV, Mac (10, 11)] + public bool? IsUserOwned { + get { + return _IsUserOwned?.BoolValue; + } set { + _IsUserOwned = value.HasValue ? new NSNumber (value.Value) : null; + } + } + + [iOS (11, 0), NoTV, Mac (10, 11)] + public bool? IsUserCurated { + get { + return _IsUserCurated?.BoolValue; + } set { + _IsUserCurated = value.HasValue ? new NSNumber (value.Value) : null; + } + } } } diff --git a/src/CoreText/CTFont.cs b/src/CoreText/CTFont.cs index 298d9ad993ee..911f342c2831 100644 --- a/src/CoreText/CTFont.cs +++ b/src/CoreText/CTFont.cs @@ -2191,7 +2191,7 @@ public CTFontDescriptor [] GetDefaultCascadeList (string [] languages) var ret = new CTFontDescriptor [n]; for (nint i = 0; i < n; i++) - ret [i] = new CTFontDescriptor (retArray.GetValue (i), true); + ret [i] = new CTFontDescriptor (retArray.GetValue (i), false); return ret; } diff --git a/src/CoreText/CTFontManager.cs b/src/CoreText/CTFontManager.cs index e1ece334be36..5c23e28105cd 100644 --- a/src/CoreText/CTFontManager.cs +++ b/src/CoreText/CTFontManager.cs @@ -64,7 +64,7 @@ public static bool IsFontSupported (NSUrl url) return CTFontManagerIsSupportedFont (url.Handle); } #elif !XAMCORE_3_0 - [Obsolete ("API not available on iOS, it will always return false")] + [Obsolete ("API not available on iOS, it will always return false.")] [Availability (Deprecated = Platform.Mac_10_6, Unavailable = Platform.iOS_Version)] public static bool IsFontSupported (NSUrl url) { diff --git a/src/CoreVideo/CVBuffer.cs b/src/CoreVideo/CVBuffer.cs index bb905d0e1e3e..6925166e7345 100644 --- a/src/CoreVideo/CVBuffer.cs +++ b/src/CoreVideo/CVBuffer.cs @@ -34,6 +34,7 @@ namespace XamCore.CoreVideo { // CVBuffer.h + [Watch (4,0)] [iOS (4,0)] public partial class CVBuffer : INativeObject #if !COREBUILD @@ -166,6 +167,17 @@ public NSDictionary GetAttachments (CVAttachmentMode attachmentMode) return (NSDictionary) Runtime.GetNSObject (CVBufferGetAttachments (handle, attachmentMode)); } +#if XAMCORE_2_0 + // There is some API that needs a more strongly typed version of a NSDictionary + // and there is no easy way to downcast from NSDictionary to NSDictionary + public NSDictionary GetAttachments (CVAttachmentMode attachmentMode) + where TKey : class, INativeObject + where TValue : class, INativeObject + { + return Runtime.GetNSObject> (CVBufferGetAttachments (handle, attachmentMode)); + } +#endif + [DllImport (Constants.CoreVideoLibrary)] extern static void CVBufferPropagateAttachments (/* CVBufferRef */ IntPtr sourceBuffer, /* CVBufferRef */ IntPtr destinationBuffer); diff --git a/src/CoreVideo/CVImageBuffer.cs b/src/CoreVideo/CVImageBuffer.cs index 185e9977d756..357ac4907ebf 100644 --- a/src/CoreVideo/CVImageBuffer.cs +++ b/src/CoreVideo/CVImageBuffer.cs @@ -36,6 +36,7 @@ namespace XamCore.CoreVideo { // CVImageBuffer.h [iOS (4,0)] + [Watch (4,0)] public partial class CVImageBuffer : CVBuffer { #if !COREBUILD #if !XAMCORE_2_0 diff --git a/src/CoreVideo/CVOpenGLESTexture.cs b/src/CoreVideo/CVOpenGLESTexture.cs index 2748e8a97010..4d75f8ad1553 100644 --- a/src/CoreVideo/CVOpenGLESTexture.cs +++ b/src/CoreVideo/CVOpenGLESTexture.cs @@ -7,6 +7,9 @@ // Copyright 2012-2015 Xamarin Inc // // + +#if !WATCH + using System; using System.Runtime.InteropServices; @@ -133,3 +136,5 @@ public void GetCleanTexCoords (out float [] lowerLeft, out float [] lowerRight, } } + +#endif diff --git a/src/CoreVideo/CVOpenGLESTextureCache.cs b/src/CoreVideo/CVOpenGLESTextureCache.cs index 09c0ab0f7212..0452f931624e 100644 --- a/src/CoreVideo/CVOpenGLESTextureCache.cs +++ b/src/CoreVideo/CVOpenGLESTextureCache.cs @@ -7,6 +7,9 @@ // Copyright 2012-2015 Xamarin Inc // // + +#if !WATCH + using System; using System.Runtime.InteropServices; @@ -155,3 +158,5 @@ extern static CVReturn CVOpenGLESTextureCacheCreateTextureFromImage ( /* CVOpenGLESTextureRef __nullable * __nonnull */ out IntPtr textureOut); } } + +#endif diff --git a/src/CoreVideo/CVPixelBuffer.cs b/src/CoreVideo/CVPixelBuffer.cs index 66a1a1ab7db8..8fc24b5bf1e7 100644 --- a/src/CoreVideo/CVPixelBuffer.cs +++ b/src/CoreVideo/CVPixelBuffer.cs @@ -14,6 +14,7 @@ namespace XamCore.CoreVideo { + [Watch (4,0)] [iOS (4,0)] public partial class CVPixelBuffer : CVImageBuffer { #if !COREBUILD @@ -454,7 +455,7 @@ extern static CVReturn CVPixelBufferLockBaseAddress ( /* CVPixelBufferRef __nonnull */ IntPtr pixelBuffer, CVPixelBufferLock lockFlags); #if !XAMCORE_3_0 - [Obsolete ("Use Lock(CVPixelBufferLock) instead")] + [Obsolete ("Use 'Lock (CVPixelBufferLock)' instead.")] public CVReturn Lock (CVOptionFlags lockFlags) { return CVPixelBufferLockBaseAddress (handle, (CVPixelBufferLock) lockFlags); @@ -471,7 +472,7 @@ extern static CVReturn CVPixelBufferUnlockBaseAddress ( /* CVPixelBufferRef __nonnull */ IntPtr pixelBuffer, CVPixelBufferLock unlockFlags); #if !XAMCORE_3_0 - [Obsolete ("Use Unlock(CVPixelBufferLock)")] + [Obsolete ("Use 'Unlock (CVPixelBufferLock)'.")] public CVReturn Unlock (CVOptionFlags unlockFlags) { return CVPixelBufferUnlockBaseAddress (handle, (CVPixelBufferLock) unlockFlags); diff --git a/src/CoreVideo/CVPixelBufferAttributes.cs b/src/CoreVideo/CVPixelBufferAttributes.cs index 2686072103eb..45c0cbe2962b 100644 --- a/src/CoreVideo/CVPixelBufferAttributes.cs +++ b/src/CoreVideo/CVPixelBufferAttributes.cs @@ -32,6 +32,7 @@ namespace XamCore.CoreVideo { + [Watch (4,0)] [iOS (6,0)] public class CVPixelBufferAttributes : DictionaryContainer { @@ -192,7 +193,8 @@ public bool? AllocateWithIOSurface { return GetNSDictionary (CVPixelBuffer.IOSurfacePropertiesKey) != null; } } - + +#if !WATCH [iOS (6,0)] public bool? OpenGLESCompatibility { set { @@ -212,6 +214,7 @@ public bool? MetalCompatibility { return GetBoolValue (CVPixelBuffer.MetalCompatibilityKey); } } +#endif // !WATCH #endif #endif } diff --git a/src/CoreVideo/CVPixelBufferPool.cs b/src/CoreVideo/CVPixelBufferPool.cs index 52160ad09a0a..eabf107c9a66 100644 --- a/src/CoreVideo/CVPixelBufferPool.cs +++ b/src/CoreVideo/CVPixelBufferPool.cs @@ -16,6 +16,7 @@ namespace XamCore.CoreVideo { // CVPixelBufferPool.h + [Watch (4,0)] [iOS (4,0)] public partial class CVPixelBufferPool : INativeObject #if !COREBUILD diff --git a/src/CoreVideo/CVPixelBufferPoolSettings.cs b/src/CoreVideo/CVPixelBufferPoolSettings.cs index a715bf934e7d..382a3c0e345c 100644 --- a/src/CoreVideo/CVPixelBufferPoolSettings.cs +++ b/src/CoreVideo/CVPixelBufferPoolSettings.cs @@ -33,6 +33,7 @@ namespace XamCore.CoreVideo { + [Watch (4,0)] public class CVPixelBufferPoolSettings : DictionaryContainer { #if !COREBUILD @@ -66,6 +67,7 @@ public double? MaximumBufferAgeInSeconds { #endif } + [Watch (4,0)] public partial class CVPixelBufferPoolAllocationSettings : DictionaryContainer { #if !COREBUILD public CVPixelBufferPoolAllocationSettings () diff --git a/src/CoreVideo/CVPixelFormatDescription.cs b/src/CoreVideo/CVPixelFormatDescription.cs index bdd61b5a534b..1fb3d3edffa0 100644 --- a/src/CoreVideo/CVPixelFormatDescription.cs +++ b/src/CoreVideo/CVPixelFormatDescription.cs @@ -33,6 +33,7 @@ namespace XamCore.CoreVideo { + [Watch (4,0)] [iOS (4,0)] public static class CVPixelFormatDescription { #if !COREBUILD diff --git a/src/CoreVideo/CVTime.cs b/src/CoreVideo/CVTime.cs index 36a71763e2b4..6f5f5de02aad 100644 --- a/src/CoreVideo/CVTime.cs +++ b/src/CoreVideo/CVTime.cs @@ -33,6 +33,7 @@ namespace XamCore.CoreVideo { // CVBase.h + [Watch (4,0)] public struct CVTime { public /* int64_t */ long TimeValue; diff --git a/src/CoreVideo/CoreVideo.cs b/src/CoreVideo/CoreVideo.cs index 773e730ad880..1d617251db58 100644 --- a/src/CoreVideo/CoreVideo.cs +++ b/src/CoreVideo/CoreVideo.cs @@ -33,12 +33,14 @@ namespace XamCore.CoreVideo { // uint32_t -> CVBuffer.h + [Watch (4,0)] public enum CVAttachmentMode : uint { ShouldNotPropagate = 0, ShouldPropagate = 1, } [Flags] + [Watch (4,0)] #if XAMCORE_4_0 public enum CVPixelBufferLock : ulong { #else @@ -51,29 +53,34 @@ public enum CVPixelBufferLock : uint_compat_int { } // CVPixelBuffer.h + [Watch (4,0)] public struct CVPlanarComponentInfo { public /* int32_t */ int Offset; public /* uint32_t */ uint RowBytes; } // CVPixelBuffer.h + [Watch (4,0)] public struct CVPlanarPixelBufferInfo { public CVPlanarComponentInfo[] ComponentInfo; } // CVPixelBuffer.h + [Watch (4,0)] public struct CVPlanarPixelBufferInfo_YCbCrPlanar { public CVPlanarComponentInfo ComponentInfoY; public CVPlanarComponentInfo ComponentInfoCb; public CVPlanarComponentInfo ComponentInfoCr; } + [Watch (4,0)] public struct CVPlanarPixelBufferInfo_YCbCrBiPlanar { public CVPlanarComponentInfo ComponentInfoY; public CVPlanarComponentInfo ComponentInfoCbCr; } // int32_t -> CVReturn.h + [Watch (4,0)] public enum CVReturn : int { Success = 0, First = -6660, @@ -99,10 +106,12 @@ public enum CVReturn : int { // uint64_t -> CVBase.h + [Watch (4,0)] public enum CVOptionFlags : long { None = 0, } + [Watch (4,0)] public struct CVTimeStamp { public UInt32 Version; public Int32 VideoTimeScale; @@ -115,6 +124,7 @@ public struct CVTimeStamp { public UInt64 Reserved; } + [Watch (4,0)] public struct CVSMPTETime { public Int16 Subframes; public Int16 SubframeDivisor; @@ -128,11 +138,13 @@ public struct CVSMPTETime { } [Flags] + [Watch (4,0)] public enum CVTimeFlags : int { IsIndefinite = 1 << 0 } [Flags] + [Watch (4,0)] #if XAMCORE_2_0 public enum CVTimeStampFlags : ulong { #else @@ -150,11 +162,13 @@ public enum CVTimeStampFlags { } [Flags] + [Watch (4,0)] public enum CVSMPTETimeFlags : uint_compat_int { Valid = (1 << 0), Running = (1 << 1) } + [Watch (4,0)] public enum CVSMPTETimeType : uint_compat_int { Type24 = 0, Type25 = 1, @@ -166,15 +180,18 @@ public enum CVSMPTETimeType : uint_compat_int { Type5994 = 7 } + [Watch (4,0)] public struct CVFillExtendedPixelsCallBackData { public nint /* CFIndex */ Version; public CVFillExtendedPixelsCallBack FillCallBack; public IntPtr UserInfo; } + [Watch (4,0)] public delegate bool CVFillExtendedPixelsCallBack (IntPtr pixelBuffer, IntPtr refCon); // CVOptionFlags (uint64_t) -> CVPixelBufferPool.h + [Watch (4,0)] [iOS (9,0)][Mac (10,11)] public enum CVPixelBufferPoolFlushFlags : ulong { FlushExcessBuffers = 1, diff --git a/src/CoreWlan/CWInterface.cs b/src/CoreWlan/CWInterface.cs index 8f330c5906e7..1fd6e7b6b248 100644 --- a/src/CoreWlan/CWInterface.cs +++ b/src/CoreWlan/CWInterface.cs @@ -49,5 +49,24 @@ public CWNetwork [] ScanForNetworksWithName (string networkName, out NSError err return networks.ToArray (); return null; } + + [Mac (10,13)] + public CWNetwork [] ScanForNetworksWithSsid (NSData ssid, bool includeHidden, out NSError error) + { + NSSet networks = _ScanForNetworksWithSsid (ssid, includeHidden, out error); + if (networks != null) + return networks.ToArray (); + return null; + } + + [Mac (10,13)] + public CWNetwork [] ScanForNetworksWithName (string networkName, bool includeHidden, out NSError error) + { + NSSet networks = _ScanForNetworksWithName (networkName, includeHidden, out error); + if (networks != null) + return networks.ToArray (); + return null; + } + } } diff --git a/src/EventKit/EKEnums.cs b/src/EventKit/EKEnums.cs index 81336520f056..b15ec7c2e1f8 100644 --- a/src/EventKit/EKEnums.cs +++ b/src/EventKit/EKEnums.cs @@ -79,7 +79,7 @@ public enum EKErrorCode : nint { // untyped enum -> EKTypes.h // Special note: some API (like `dayOfWeek:` and `dayOfWeek:weekNumber:` use an `NSInteger` instead of the enum - [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use EKWeekday")] + [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use 'EKWeekday'.")] public enum EKDay { NotSet = 0, Sunday = 1, diff --git a/src/EventKit/EventKit.cs b/src/EventKit/EventKit.cs index 3c4553aa4146..cb6b4e93773a 100644 --- a/src/EventKit/EventKit.cs +++ b/src/EventKit/EventKit.cs @@ -72,6 +72,13 @@ public virtual EKRecurrenceRule RecurrenceRule { get { throw new NotSupportedException (); } set { throw new NotSupportedException (); } } +#endif + } + + partial class EKAlarm { +#if !XAMCORE_4_0 + [Obsolete ("Use the static methods FromDate or FromTimeInterval to create alarms")] + public EKAlarm () {} #endif } } diff --git a/src/EventKitUI/EKUIBundle.cs b/src/EventKitUI/EKUIBundle.cs new file mode 100644 index 000000000000..e4fb93a21b61 --- /dev/null +++ b/src/EventKitUI/EKUIBundle.cs @@ -0,0 +1,27 @@ +// +// EventKitUIBundle C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using System.Runtime.InteropServices; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.EventKitUI { + public static class EKUIBundle { + + [iOS (11,0)] + [DllImport (Constants.EventKitUILibrary)] + static extern IntPtr EventKitUIBundle (); + + [iOS (11,0)] + public static NSBundle UIBundle { get; } = Runtime.GetNSObject (EventKitUIBundle ()); + } +} +#endif diff --git a/src/ExternalAccessory/EAEnums.cs b/src/ExternalAccessory/EAEnums.cs index 19cbcebc6816..bf22376b3fa9 100644 --- a/src/ExternalAccessory/EAEnums.cs +++ b/src/ExternalAccessory/EAEnums.cs @@ -9,6 +9,7 @@ namespace XamCore.ExternalAccessory { + [NoMac] [TV (10,0)] [iOS (8,0)] [Native] @@ -19,6 +20,7 @@ public enum EAWiFiUnconfiguredAccessoryProperties : nuint { SupportsHomeKit = (1 << 2), // iOS 8 beta 5 } + [NoMac] [TV (10,0)] [iOS (8,0)] [Native] @@ -30,6 +32,7 @@ public enum EAWiFiUnconfiguredAccessoryBrowserState : nint { } // NSInteger -> EAWiFiUnconfiguredAccessoryBrowser.h + [NoMac] [TV (10,0)] [iOS (8,0)] [Native] @@ -42,6 +45,7 @@ public enum EAWiFiUnconfiguredAccessoryConfigurationStatus : nint { // NSInteger -> EAAccessoryManager.h [TV (10,0)] [iOS (6,0)] + [Mac (10, 13)] [Native] [ErrorDomain ("EABluetoothAccessoryPickerErrorDomain")] public enum EABluetoothAccessoryPickerError : nint { diff --git a/src/Foundation/Compat.cs b/src/Foundation/Compat.cs index c90643b77328..29c435f71f8f 100644 --- a/src/Foundation/Compat.cs +++ b/src/Foundation/Compat.cs @@ -14,7 +14,7 @@ namespace XamCore.Foundation { #if !XAMCORE_3_0 public partial class NSOperation { - [Obsolete ("Use WaitUntilFinished method")] + [Obsolete ("Use 'WaitUntilFinished' method.")] public virtual void WaitUntilFinishedNS () { WaitUntilFinished (); @@ -25,7 +25,7 @@ public virtual void WaitUntilFinishedNS () #if !XAMCORE_4_0 && (XAMCORE_2_0 || !MONOMAC) && !WATCH public partial class NSUserActivity { - [Obsolete ("Use the constructor that allows you to set an activity type")] + [Obsolete ("Use the constructor that allows you to set an activity type.")] public NSUserActivity () #if XAMCORE_2_0 : this (String.Empty) diff --git a/src/Foundation/Enum.cs b/src/Foundation/Enum.cs index dbcf9d2de913..8f7131780a53 100644 --- a/src/Foundation/Enum.cs +++ b/src/Foundation/Enum.cs @@ -226,7 +226,7 @@ public enum NSDataWritingOptions : nuint { WithoutOverwriting = 2, #if !XAMCORE_2_0 - [Obsolete ("No longer available")] + [Obsolete ("No longer available.")] Coordinated = 1 << 2, #endif @@ -363,6 +363,8 @@ public enum NSCocoaError : int { CoderReadCorruptError = 4864, CoderValueNotFoundError = 4865, + [Mac (10,13), iOS (11,0), Watch (4,0), TV (11,0)] + CoderInvalidValueError = 4866, CoderErrorMinimum = 4864, CoderErrorMaximum = 4991, @@ -722,7 +724,9 @@ public enum NSJsonReadingOptions : nuint_compat_int { [Flags] [Native] public enum NSJsonWritingOptions : nuint_compat_int { - PrettyPrinted = 1 + PrettyPrinted = 1, + [Mac (10,13), iOS (11,0), TV (11,0), Watch (4,0)] + SortedKeys = (1 << 1), } [Native] @@ -805,7 +809,7 @@ public enum NSUnderlineStyle : nint { #if !MONOMAC || !XAMCORE_3_0 [Native] #if MONOMAC - [Obsolete ("Use NSWritingDirection in AppKit instead")] + [Obsolete ("Use NSWritingDirection in AppKit instead.")] #endif public enum NSWritingDirection : nint { Natural = -1, LeftToRight = 0, RightToLeft = 1, @@ -929,7 +933,7 @@ public enum NSDataBase64EncodingOptions : nuint_compat_int { } #if !XAMCORE_3_0 - [iOS (7,0)][Deprecated (PlatformName.iOS, 9, 0, message: "Use NSWritingDirectionFormatType")] + [iOS (7,0)][Deprecated (PlatformName.iOS, 9, 0, message: "Use 'NSWritingDirectionFormatType'.")] [Flags] [Native] public enum NSTextWritingDirection : nint { @@ -1109,12 +1113,14 @@ public override string ToString () } } -#if MONOMAC + [Mac (10,10,3)] + [Watch (4,0)] + [TV (11,0)] + [iOS (11,0)] [Native] public enum NSProcessInfoThermalState : nint { Nominal, Fair, Serious, Critical } -#endif [Native] #if XAMCORE_2_0 @@ -1235,6 +1241,8 @@ public enum NSIso8601DateFormatOptions : nuint { DashSeparatorInDate = 1 << 8, ColonSeparatorInTime = 1 << 9, ColonSeparatorInTimeZone = 1 << 10, + [Mac (10,13), iOS (11,0), TV (11,0), Watch (4,0)] + FractionalSeconds = 1 << 11, FullDate = Year | Month | Day | DashSeparatorInDate, FullTime = Time | ColonSeparatorInTime | TimeZone | ColonSeparatorInTimeZone, InternetDateTime = FullDate | FullTime, @@ -1258,4 +1266,36 @@ public enum NSMeasurementFormatterUnitOptions : nuint { TemperatureWithoutUnit = (1 << 2) } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Native] + public enum NSItemProviderRepresentationVisibility : nint { + All = 0, + Team = 1, + Group = 2, + OwnProcess = 3, + } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Native] + public enum NSItemProviderFileOptions : nint { + OpenInPlace = 1, + } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Native] + public enum NSLinguisticTaggerUnit : nint { + Word, + Sentence, + Paragraph, + Document, + } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Native] + public enum NSUrlSessionDelayedRequestDisposition : nint { + ContinueLoading = 0, + UseNewRequest = 1, + Cancel = 2, + } } diff --git a/src/Foundation/Enums.cs b/src/Foundation/Enums.cs index 8e1b2bd67e4d..2c845f177176 100644 --- a/src/Foundation/Enums.cs +++ b/src/Foundation/Enums.cs @@ -116,4 +116,13 @@ public enum NSStringTransform { [Field ("NSStringTransformStripDiacritics")] StripDiacritics, } + + [NoWatch, NoTV, NoMac, iOS (11, 0)] + [Native] + public enum NSUrlSessionMultipathServiceType : nint { + None = 0, + Handover = 1, + Interactive = 2, + Aggregate = 3, + } } diff --git a/src/Foundation/NSDictionary_2.cs b/src/Foundation/NSDictionary_2.cs index d25804b0b864..50a9528491fe 100644 --- a/src/Foundation/NSDictionary_2.cs +++ b/src/Foundation/NSDictionary_2.cs @@ -166,7 +166,7 @@ public static NSDictionary FromObjectsAndKeys (TValue [] objects, #if XAMCORE_4_0 public static NSDictionary FromObjectsAndKeys (TValue [] objects, TKey [] keys) #else - [Obsolete ("TKey and TValue are inversed and won't work unless both types are identical. Use the generic overload that takes a count parameter instead")] + [Obsolete ("'TKey' and 'TValue' are inversed and won't work unless both types are identical. Use the generic overload that takes a count parameter instead.")] public static NSDictionary FromObjectsAndKeys (TKey [] objects, TValue [] keys) #endif { diff --git a/src/Foundation/NSDistributedNotificationCenter.cs b/src/Foundation/NSDistributedNotificationCenter.cs index c417c5c95336..762f7dde1f83 100644 --- a/src/Foundation/NSDistributedNotificationCenter.cs +++ b/src/Foundation/NSDistributedNotificationCenter.cs @@ -14,15 +14,15 @@ namespace XamCore.Foundation { - [Obsolete ("This is not available in iOS")] + [Obsolete ("This is not available in iOS.")] public partial class NSDistributedNotificationCenter { - [Obsolete ("This is not available in iOS")] + [Obsolete ("This is not available in iOS.")] public void AddObserver (NSObject observer, Selector aSelector, string aName, string anObject) { } - [Obsolete ("This is not available in iOS")] + [Obsolete ("This is not available in iOS.")] public void RemoveObserver (NSObject observer, string aName, string anObject) { } diff --git a/src/Foundation/NSExpression.cs b/src/Foundation/NSExpression.cs index acb130491f0e..79462354fc9a 100644 --- a/src/Foundation/NSExpression.cs +++ b/src/Foundation/NSExpression.cs @@ -166,7 +166,7 @@ public virtual NSExpression Operand { } #if !XAMCORE_4_0 && !WATCH - [Obsolete("ValueWithObject is deprecated, please use EvaluateWith instead.")] + [Obsolete("Use 'EvaluateWith' instead.")] public virtual NSExpression ExpressionValueWithObject (NSObject obj, NSMutableDictionary context) { var result = EvaluateWith (obj, context); // if it can be casted, do return an NSEXpression else null diff --git a/src/Foundation/NSFileManagerDelegate.cs b/src/Foundation/NSFileManagerDelegate.cs index 291bd15de7b7..8ec4b64b0fef 100644 --- a/src/Foundation/NSFileManagerDelegate.cs +++ b/src/Foundation/NSFileManagerDelegate.cs @@ -19,7 +19,7 @@ public virtual bool ShouldCopyItemAtPath (NSFileManager fileManager, string srcP } #if !XAMCORE_3_0 - [Obsolete ("API removed after iOS 2.0 / OSX 10.5. It will never be called by the OS.")] + [Obsolete ("API removed after iOS 2.0 / macOS 10.5. It will never be called by the OS.")] public virtual bool ShouldProceedAfterError (NSFileManager fm, NSDictionary errorInfo) { return false; @@ -35,7 +35,7 @@ public static bool ShouldCopyItemAtPath (this INSFileManagerDelegate This, NSFil } #if !XAMCORE_3_0 - [Obsolete ("API removed after iOS 2.0 / OSX 10.5. It will never be called by the OS.")] + [Obsolete ("API removed after iOS 2.0 / macOS 10.5. It will never be called by the OS.")] public static bool ShouldProceedAfterError (INSFileManagerDelegate This, NSFileManager fm, NSDictionary errorInfo) { return false; diff --git a/src/Foundation/NSFormatter.cs b/src/Foundation/NSFormatter.cs index 2d83a7da3dc3..7a5546f8f484 100644 --- a/src/Foundation/NSFormatter.cs +++ b/src/Foundation/NSFormatter.cs @@ -3,7 +3,7 @@ namespace XamCore.Foundation { public partial class NSFormatter { #if !XAMCORE_4_0 - [Obsolete ("Use IsPartialStringValid (ref string partialString, out NSRange proposedSelRange, string origString, NSRange origSelRange, out string error) instead")] + [Obsolete ("Use 'IsPartialStringValid (ref string partialString, out NSRange proposedSelRange, string origString, NSRange origSelRange, out string error)' instead.")] public virtual bool IsPartialStringValid (out string partialString, out NSRange proposedSelRange, string origString, NSRange origSelRange, out NSString error) { partialString = origString; diff --git a/src/Foundation/NSItemProvider.cs b/src/Foundation/NSItemProvider.cs index 8359ad60453a..b511b55ca2e3 100644 --- a/src/Foundation/NSItemProvider.cs +++ b/src/Foundation/NSItemProvider.cs @@ -1,14 +1,15 @@ using System; using System.Threading.Tasks; using XamCore.CloudKit; +using XamCore.ObjCRuntime; namespace XamCore.Foundation { -#if MONOMAC && XAMCORE_2_0 // Only 64-bit on mac +#if (MONOMAC || IOS) && XAMCORE_2_0 // Only 64-bit on mac public partial class NSItemProvider { -#if !XAMCORE_4_0 - [Obsolete ("Use RegisterCloudKitShare (CloudKitRegistrationPreparationAction) instead")] +#if !XAMCORE_4_0 && MONOMAC + [Obsolete ("Use RegisterCloudKitShare (CloudKitRegistrationPreparationAction) instead.")] public virtual void RegisterCloudKitShare (Action preparationHandler) { CloudKitRegistrationPreparationAction action = handler => preparationHandler (handler); @@ -16,6 +17,7 @@ public virtual void RegisterCloudKitShare (Action RegisterCloudKitShareAsync () { var tcs = new TaskCompletionSource (); @@ -25,6 +27,45 @@ public virtual Task RegisterCloudKitShar RegisterCloudKitShare (action); return tcs.Task; } - } #endif + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + public NSProgress LoadObject (Action completionHandler) where T: NSObject, INSItemProviderReading + { + return LoadObject (new Class (typeof (T)), (rv, err) => + { + var obj = rv as T; + if (obj == null && rv != null) + obj = Runtime.ConstructNSObject (rv.Handle); + completionHandler (obj, err); + }); + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + public Task LoadObjectAsync () where T: NSObject, INSItemProviderReading + { + var rv = LoadObjectAsync (new Class (typeof (T))); + return rv.ContinueWith ((v) => + { + var obj = v.Result as T; + if (obj == null && v.Result != null) + obj = Runtime.ConstructNSObject (v.Result.Handle); + return obj; + }); + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + public Task LoadObjectAsync (out NSProgress result) where T: NSObject, INSItemProviderReading + { + var rv = LoadObjectAsync (new Class (typeof (T)), out result); + return rv.ContinueWith ((v) => + { + var obj = v.Result as T; + if (obj == null && v.Result != null) + obj = Runtime.ConstructNSObject (v.Result.Handle); + return obj; + }); + } + } +#endif // (MONOMAC || IOS) && XAMCORE_2_0 } diff --git a/src/Foundation/NSMetadataItem.cs b/src/Foundation/NSMetadataItem.cs index 72de9c50220d..f2b7a3b5a20e 100644 --- a/src/Foundation/NSMetadataItem.cs +++ b/src/Foundation/NSMetadataItem.cs @@ -18,12 +18,34 @@ bool GetBool (NSString key) return n == null ? false : n.BoolValue; } + bool? GetNullableBool (NSString key) + { + var n = Runtime.GetNSObject (GetHandle (key)); + return n?.BoolValue; + } + double GetDouble (NSString key) { var n = Runtime.GetNSObject (GetHandle (key)); return n == null ? 0 : n.DoubleValue; } + double? GetNullableDouble (NSString key) + { + var n = Runtime.GetNSObject (GetHandle (key)); + return n?.DoubleValue; + } + + nint? GetNInt (NSString key) + { + var n = Runtime.GetNSObject (GetHandle (key)); +#if XAMCORE_2_0 + return n?.NIntValue; +#else + return n?.IntValue; +#endif + } + // same order as NSMetadataAttributes.h public NSString FileSystemName { @@ -83,12 +105,14 @@ public NSString[] ContentTypeTree { } } + // XAMCORE_4_0 FIXME return nullable public bool IsUbiquitous { get { return GetBool (NSMetadataQuery.ItemIsUbiquitousKey); } } + // XAMCORE_4_0 FIXME return nullable public bool UbiquitousItemHasUnresolvedConflicts { get { return GetBool (NSMetadataQuery.UbiquitousItemHasUnresolvedConflictsKey); @@ -106,30 +130,35 @@ public NSItemDownloadingStatus DownloadingStatus { } } + // XAMCORE_4_0 FIXME return nullable public bool UbiquitousItemIsDownloading { get { return GetBool (NSMetadataQuery.UbiquitousItemIsDownloadingKey); } } + // XAMCORE_4_0 FIXME return nullable public bool UbiquitousItemIsUploaded { get { return GetBool (NSMetadataQuery.UbiquitousItemIsUploadedKey); } } + // XAMCORE_4_0 FIXME return nullable public bool UbiquitousItemIsUploading { get { return GetBool (NSMetadataQuery.UbiquitousItemIsUploadingKey); } } + // XAMCORE_4_0 FIXME return nullable public double UbiquitousItemPercentDownloaded { get { return GetDouble (NSMetadataQuery.UbiquitousItemPercentDownloadedKey); } } + // XAMCORE_4_0 FIXME return nullable public double UbiquitousItemPercentUploaded { get { return GetDouble (NSMetadataQuery.UbiquitousItemPercentUploadedKey); @@ -150,6 +179,7 @@ public NSError UbiquitousItemUploadingError { } } + // XAMCORE_4_0 FIXME return nullable [iOS (8,0)][Mac (10,10)] public bool UbiquitousItemDownloadRequested { get { @@ -157,6 +187,7 @@ public bool UbiquitousItemDownloadRequested { } } + // XAMCORE_4_0 FIXME return nullable [iOS (8,0)][Mac (10,10)] public bool UbiquitousItemIsExternalDocument { get { @@ -177,5 +208,1014 @@ public NSUrl UbiquitousItemUrlInLocalContainer { return Runtime.GetNSObject (GetHandle (NSMetadataQuery.UbiquitousItemURLInLocalContainerKey)); } } + +#if MONOMAC + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Keywords { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.KeywordsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Title { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.TitleKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Authors { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.AuthorsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Editors { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.EditorsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Participants { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.ParticipantsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Projects { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.ProjectsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate DownloadedDate { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.DownloadedDateKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] WhereFroms { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.WhereFromsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Comment { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.CommentKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Copyright { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.CopyrightKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate LastUsedDate { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.LastUsedDateKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate ContentCreationDate { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.ContentCreationDateKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate ContentModificationDate { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.ContentModificationDateKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate DateAdded { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.DateAddedKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? DurationSeconds { + get { + return GetNullableDouble (NSMetadataQuery.DurationSecondsKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] ContactKeywords { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.ContactKeywordsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Version { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.VersionKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? PixelHeight { + get { + return GetNInt (NSMetadataQuery.PixelHeightKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? PixelWidth { + get { + return GetNInt (NSMetadataQuery.PixelWidthKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? PixelCount { + get { + return GetNInt (NSMetadataQuery.PixelCountKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string ColorSpace { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ColorSpaceKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? BitsPerSample { + get { + return GetNInt (NSMetadataQuery.BitsPerSampleKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public bool? FlashOnOff { + get { + return GetNullableBool (NSMetadataQuery.FlashOnOffKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? FocalLength { + get { + return GetNullableDouble (NSMetadataQuery.FocalLengthKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string AcquisitionMake { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.AcquisitionMakeKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string AcquisitionModel { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.AcquisitionModelKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? IsoSpeed { + get { + return GetNullableDouble (NSMetadataQuery.IsoSpeedKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? Orientation { + get { + return GetNInt (NSMetadataQuery.OrientationKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] LayerNames { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.LayerNamesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? WhiteBalance { + get { + return GetNullableDouble (NSMetadataQuery.WhiteBalanceKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? Aperture { + get { + return GetNullableDouble (NSMetadataQuery.ApertureKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string ProfileName { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ProfileNameKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? ResolutionWidthDpi { + get { + return GetNInt (NSMetadataQuery.ResolutionWidthDpiKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? ResolutionHeightDpi { + get { + return GetNInt (NSMetadataQuery.ResolutionHeightDpiKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? ExposureMode { + get { + return GetNInt (NSMetadataQuery.ExposureModeKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? ExposureTimeSeconds { + get { + return GetNullableDouble (NSMetadataQuery.ExposureTimeSecondsKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string ExifVersion { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ExifVersionKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string CameraOwner { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.CameraOwnerKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? FocalLength35mm { + get { + return GetNInt (NSMetadataQuery.FocalLength35mmKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string LensModel { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.LensModelKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string ExifGpsVersion { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ExifGpsVersionKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? Altitude { + get { + return GetNullableDouble (NSMetadataQuery.AltitudeKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? Latitude { + get { + return GetNullableDouble (NSMetadataQuery.LatitudeKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? Longitude { + get { + return GetNullableDouble (NSMetadataQuery.LongitudeKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? Speed { + get { + return GetNullableDouble (NSMetadataQuery.SpeedKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate Timestamp { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.TimestampKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? GpsTrack { + get { + return GetNullableDouble (NSMetadataQuery.GpsTrackKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? ImageDirection { + get { + return GetNullableDouble (NSMetadataQuery.ImageDirectionKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string NamedLocation { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.NamedLocationKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string GpsStatus { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.GpsStatusKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string GpsMeasureMode { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.GpsMeasureModeKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? GpsDop { + get { + return GetNullableDouble (NSMetadataQuery.GpsDopKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string GpsMapDatum { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.GpsMapDatumKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? GpsDestLatitude { + get { + return GetNullableDouble (NSMetadataQuery.GpsDestLatitudeKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? GpsDestLongitude { + get { + return GetNullableDouble (NSMetadataQuery.GpsDestLongitudeKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? GpsDestBearing { + get { + return GetNullableDouble (NSMetadataQuery.GpsDestBearingKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? GpsDestDistance { + get { + return GetNullableDouble (NSMetadataQuery.GpsDestDistanceKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string GpsProcessingMethod { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.GpsProcessingMethodKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string GpsAreaInformation { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.GpsAreaInformationKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate GpsDateStamp { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.GpsDateStampKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? GpsDifferental { + get { + return GetNullableDouble (NSMetadataQuery.GpsDifferentalKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Codecs { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.CodecsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] MediaTypes { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.MediaTypesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public bool? Streamable { + get { + return GetNullableBool (NSMetadataQuery.StreamableKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? TotalBitRate { + get { + return GetNInt (NSMetadataQuery.TotalBitRateKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? VideoBitRate { + get { + return GetNInt (NSMetadataQuery.VideoBitRateKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? AudioBitRate { + get { + return GetNInt (NSMetadataQuery.AudioBitRateKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string DeliveryType { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.DeliveryTypeKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Album { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.AlbumKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public bool? HasAlphaChannel { + get { + return GetNullableBool (NSMetadataQuery.HasAlphaChannelKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public bool? RedEyeOnOff { + get { + return GetNullableBool (NSMetadataQuery.RedEyeOnOffKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string MeteringMode { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.MeteringModeKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? MaxAperture { + get { + return GetNullableDouble (NSMetadataQuery.MaxApertureKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? FNumber { + get { + return GetNInt (NSMetadataQuery.FNumberKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string ExposureProgram { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ExposureProgramKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string ExposureTimeString { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ExposureTimeStringKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Headline { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.HeadlineKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Instructions { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.InstructionsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string City { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.CityKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string StateOrProvince { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.StateOrProvinceKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Country { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.CountryKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string TextContent { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.TextContentKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? AudioSampleRate { + get { + return GetNInt (NSMetadataQuery.AudioSampleRateKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? AudioChannelCount { + get { + return GetNInt (NSMetadataQuery.AudioChannelCountKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? Tempo { + get { + return GetNullableDouble (NSMetadataQuery.TempoKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string KeySignature { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.KeySignatureKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string TimeSignature { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.TimeSignatureKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string AudioEncodingApplication { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.AudioEncodingApplicationKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Composer { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ComposerKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Lyricist { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.LyricistKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? AudioTrackNumber { + get { + return GetNInt (NSMetadataQuery.AudioTrackNumberKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate RecordingDate { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.RecordingDateKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string MusicalGenre { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.MusicalGenreKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public bool? IsGeneralMidiSequence { + get { + return GetNullableBool (NSMetadataQuery.IsGeneralMidiSequenceKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? RecordingYear { + get { + return GetNInt (NSMetadataQuery.RecordingYearKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Organizations { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.OrganizationsKey)); } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Languages { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.LanguagesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Rights { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.RightsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Publishers { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.PublishersKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Contributors { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.ContributorsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Coverage { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.CoverageKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Subject { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.SubjectKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Theme { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.ThemeKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Description { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.DescriptionKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Identifier { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.IdentifierKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Audiences { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.AudiencesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public nint? NumberOfPages { + get { + return GetNInt (NSMetadataQuery.NumberOfPagesKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? PageWidth { + get { + return GetNullableDouble (NSMetadataQuery.PageWidthKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? PageHeight { + get { + return GetNullableDouble (NSMetadataQuery.PageHeightKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string SecurityMethod { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.SecurityMethodKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Creator { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.CreatorKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] EncodingApplications { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.EncodingApplicationsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public NSDate DueDate { + get { + return Runtime.GetNSObject (GetHandle (NSMetadataQuery.DueDateKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public double? StarRating { + get { + return GetNullableDouble (NSMetadataQuery.StarRatingKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] PhoneNumbers { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.PhoneNumbersKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] EmailAddresses { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.EmailAddressesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] InstantMessageAddresses { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.InstantMessageAddressesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Kind { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.KindKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Recipients { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.RecipientsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string FinderComment { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.FinderCommentKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Fonts { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.FontsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string AppleLoopsRoot { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.AppleLoopsRootKeyKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string AppleLoopsKeyFilterType { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.AppleLoopsKeyFilterTypeKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string AppleLoopsLoopMode { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.AppleLoopsLoopModeKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] AppleLoopDescriptors { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.AppleLoopDescriptorsKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string MusicalInstrumentCategory { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.MusicalInstrumentCategoryKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string MusicalInstrumentName { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.MusicalInstrumentNameKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string CFBundleIdentifier { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.CFBundleIdentifierKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Information { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.InformationKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Director { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.DirectorKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Producer { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ProducerKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string Genre { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.GenreKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] Performers { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.PerformersKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string OriginalFormat { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.OriginalFormatKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string OriginalSource { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.OriginalSourceKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] AuthorEmailAddresses { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.AuthorEmailAddressesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] RecipientEmailAddresses { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.RecipientEmailAddressesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] AuthorAddresses { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.AuthorAddressesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] RecipientAddresses { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.RecipientAddressesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public bool? IsLikelyJunk { + get { + return GetNullableBool (NSMetadataQuery.IsLikelyJunkKey); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] ExecutableArchitectures { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.ExecutableArchitecturesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string ExecutablePlatform { + get { + return NSString.FromHandle (GetHandle (NSMetadataQuery.ExecutablePlatformKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public string [] ApplicationCategories { + get { + return NSArray.StringArrayFromHandle (GetHandle (NSMetadataQuery.ApplicationCategoriesKey)); + } + } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + public bool? IsApplicationManaged { + get { + return GetNullableBool (NSMetadataQuery.IsApplicationManagedKey); + } + } +#endif } } diff --git a/src/Foundation/NSMutableDictionary_2.cs b/src/Foundation/NSMutableDictionary_2.cs index a8df846f0e79..a57e755a2a20 100644 --- a/src/Foundation/NSMutableDictionary_2.cs +++ b/src/Foundation/NSMutableDictionary_2.cs @@ -230,7 +230,7 @@ public static NSMutableDictionary FromObjectsAndKeys (TValue [] ob #if XAMCORE_4_0 public static NSMutableDictionary FromObjectsAndKeys (TValue [] objects, TKey [] keys) #else - [Obsolete ("TKey and TValue are inversed and won't work unless both types are identical. Use the generic overload that takes a count parameter instead")] + [Obsolete ("'TKey' and 'TValue' are inversed and won't work unless both types are identical. Use the generic overload that takes a count parameter instead.")] public static NSMutableDictionary FromObjectsAndKeys (TKey [] objects, TValue [] keys) #endif { diff --git a/src/Foundation/NSObject.iOS.cs b/src/Foundation/NSObject.iOS.cs index 8539ee155cef..fdcf859f71f8 100644 --- a/src/Foundation/NSObject.iOS.cs +++ b/src/Foundation/NSObject.iOS.cs @@ -19,7 +19,7 @@ public partial class NSObject : INativeObject #if !COREBUILD #if !XAMCORE_4_0 && !WATCH - [Obsolete ("Use PlatformAssembly for easier code sharing across platforms")] + [Obsolete ("Use 'PlatformAssembly' for easier code sharing across platforms.")] public readonly static Assembly MonoTouchAssembly = typeof (NSObject).Assembly; #endif diff --git a/src/Foundation/NSObject.mac.cs b/src/Foundation/NSObject.mac.cs index 74a4225d1d7c..c548884f31f0 100644 --- a/src/Foundation/NSObject.mac.cs +++ b/src/Foundation/NSObject.mac.cs @@ -97,11 +97,15 @@ public partial class NSObject : INativeObject static IntPtr pl = Dlfcn.dlopen (Constants.PhotosLibrary, 1); static IntPtr mp = Dlfcn.dlopen (Constants.MediaPlayerLibrary, 1); static IntPtr pc = Dlfcn.dlopen (Constants.PrintCoreLibrary, 1); + static IntPtr cml = Dlfcn.dlopen (Constants.CoreMLLibrary, 1); + static IntPtr vn = Dlfcn.dlopen (Constants.VisionLibrary, 1); + static IntPtr ios = Dlfcn.dlopen (Constants.IOSurfaceLibrary, 1); + static IntPtr ex = Dlfcn.dlopen (Constants.ExternalAccessoryLibrary, 1); #endif // ** IF YOU ADD ITEMS HERE PLEASE UPDATE linker/ObjCExtensions.cs and mmp/linker/MonoMac.Tuner/MonoMacNamespaces.cs #if !XAMCORE_4_0 - [Obsolete ("Use PlatformAssembly for easier code sharing across platforms")] + [Obsolete ("Use PlatformAssembly for easier code sharing across platforms.")] public static readonly Assembly MonoMacAssembly = typeof (NSObject).Assembly; #endif diff --git a/src/Foundation/NSPortMessage.cs b/src/Foundation/NSPortMessage.cs index 69915593bc45..8b5f96f7d509 100644 --- a/src/Foundation/NSPortMessage.cs +++ b/src/Foundation/NSPortMessage.cs @@ -9,23 +9,23 @@ public partial class NSPortMessage { // Apple will reject iOS application using those selectors - as they only exists in OSX // However we exposed them in monotouch.dll so we provide stubs for binary compatibility - [Obsolete ("Only available on OSX")] + [Obsolete ("Only available on macOS.")] public virtual uint MsgId { get { throw new NotSupportedException (); } set { throw new NotSupportedException (); } } - [Obsolete ("Only available on OSX")] + [Obsolete ("Only available on macOS.")] public virtual NSPort ReceivePort { get { throw new NotSupportedException (); } } - [Obsolete ("Only available on OSX")] + [Obsolete ("Only available on macOS.")] public virtual NSPort SendPort { get { throw new NotSupportedException (); } } - [Obsolete ("Only available on OSX")] + [Obsolete ("Only available on macOS.")] public virtual bool SendBefore (NSDate date) { throw new NotSupportedException (); diff --git a/src/Foundation/NSProgress.cs b/src/Foundation/NSProgress.cs new file mode 100644 index 000000000000..689e91dc28e3 --- /dev/null +++ b/src/Foundation/NSProgress.cs @@ -0,0 +1,30 @@ +#if !COREBUILD && XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Foundation { + public partial class NSProgress { + //Manual bindings until BindAs support is merged + public nint? EstimatedTimeRemaining { + get { return _EstimatedTimeRemaining?.NIntValue; } + set { _EstimatedTimeRemaining = value != null ? new NSNumber (value.Value) : null; } + } + + public nint? Throughput { + get { return _Throughput?.NIntValue; } + set { _Throughput = value != null ? new NSNumber (value.Value) : null; } + } + + public nint? FileTotalCount { + get { return _FileTotalCount?.NIntValue; } + set { _FileTotalCount = value != null ? new NSNumber (value.Value) : null; } + } + + public nint? FileCompletedCount { + get { return _FileCompletedCount?.NIntValue; } + set { _FileCompletedCount = value != null ? new NSNumber (value.Value) : null; } + } + } +} +#endif diff --git a/src/Foundation/NSProxy.cs b/src/Foundation/NSProxy.cs new file mode 100644 index 000000000000..6763f207387c --- /dev/null +++ b/src/Foundation/NSProxy.cs @@ -0,0 +1,37 @@ +// +// NSProxy.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +// HACK: +// Yep this is just a hack to workaround https://bugzilla.xamarin.com/show_bug.cgi?id=59247 +// we need to have a better solution that removes all what NSProxy does not responds to. +// Right now this works because NSObject implements NSObject protocol just like NSProxy, but +// NSProxy responds to far less selectors hence doing it internal so it is not a breaking change +// when we provide the correct fix. + +using System; +using System.ComponentModel; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Foundation { + [EditorBrowsable (EditorBrowsableState.Never)] + [Register ("NSProxy", true)] + internal abstract class NSProxy : NSObject { + } +} + +namespace XamCore.WebKit { + // We need to keep NSProxy (avoid linking it) if WKNavigationDelegate or IWKNavigationDelegate + // is used. Unfortunately [Preserve] can't help us here because we do not generate partial + // interfaces rigth now, so we know WKWebView will be there and can hold a reference to it. + public partial class WKWebView { + [Preserve (Conditional = true)] + static Type hack = typeof (NSProxy); + } +} diff --git a/src/Foundation/NSUnit.cs b/src/Foundation/NSUnit.cs new file mode 100644 index 000000000000..cf406cc98131 --- /dev/null +++ b/src/Foundation/NSUnit.cs @@ -0,0 +1,121 @@ +// +// NSUnit.cs +// +// Authors: +// Alex Soto (alexsoto@microsoft.com) +// +// Copyright 2017 Xamarin Inc. +// + +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Foundation { +#if !XAMCORE_4_0 + public partial class NSUnit { + [Obsolete ("Use .ctor(string)")] + public NSUnit () { } + } + + public partial class NSUnitAcceleration { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitAcceleration () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitAngle { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitAngle () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitArea { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitArea () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitConcentrationMass { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitConcentrationMass () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitDispersion { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitDispersion () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitDuration { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitDuration () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitElectricCharge { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitElectricCharge () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitElectricCurrent { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitElectricCurrent () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitElectricPotentialDifference { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitElectricPotentialDifference () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitElectricResistance { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitElectricResistance () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitEnergy { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitEnergy () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitFrequency { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitFrequency () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitFuelEfficiency { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitFuelEfficiency () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitLength { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitLength () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitIlluminance { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitIlluminance () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitMass { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitMass () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitPower { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitPower () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitPressure { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitPressure () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitSpeed { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitSpeed () : base (NSObjectFlag.Empty) { } + } + + public partial class NSUnitVolume { + [Obsolete ("Use .ctor(string, NSUnitConverter) or any of the static properties.")] + public NSUnitVolume () : base (NSObjectFlag.Empty) { } + } +#endif +} diff --git a/src/GameKit/GKCompat.cs b/src/GameKit/GKCompat.cs index 7b330a561631..53174e2231b5 100644 --- a/src/GameKit/GKCompat.cs +++ b/src/GameKit/GKCompat.cs @@ -10,7 +10,7 @@ namespace XamCore.GameKit { public partial class GKMatchRequest { [iOS (8,0), Mac (10,10)] - [Obsolete ("Use RecipientResponseHandler property")] + [Obsolete ("Use 'RecipientResponseHandler' property.")] public virtual void SetRecipientResponseHandler (Action handler) { RecipientResponseHandler = handler; @@ -19,7 +19,7 @@ public virtual void SetRecipientResponseHandler (Action (out IntPtr buffer, ref T[] points) where T : struct { - var size = Marshal.SizeOf (typeof (T)); + var type = typeof (T); + // Vector3 is 12 bytes but vector_float3 is 16 + var size = type == typeof (Vector3) ? 16 : Marshal.SizeOf (type); var length = points.Length * size; buffer = Marshal.AllocHGlobal (length); diff --git a/src/HealthKit/Enums.cs b/src/HealthKit/Enums.cs index 036abe3e0f4a..6be1f017125e 100644 --- a/src/HealthKit/Enums.cs +++ b/src/HealthKit/Enums.cs @@ -301,8 +301,8 @@ public enum HKWorkoutActivityType : nuint { Curling, Cycling, Dance, - [Deprecated (PlatformName.WatchOS, 3, 0, message: "Use HKWorkoutActivityType.Dance, HKWorkoutActivityType.Barre, or HKWorkoutActivityType.Pilates")] - [Deprecated (PlatformName.iOS, 10, 0, message: "Use HKWorkoutActivityType.Dance, HKWorkoutActivityType.Barre, or HKWorkoutActivityType.Pilates")] + [Deprecated (PlatformName.WatchOS, 3, 0, message: "Use 'HKWorkoutActivityType.Dance', 'HKWorkoutActivityType.Barre', or 'HKWorkoutActivityType.Pilates'.")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'HKWorkoutActivityType.Dance', 'HKWorkoutActivityType.Barre', or 'HKWorkoutActivityType.Pilates'.")] DanceInspiredTraining, Elliptical, EquestrianSports, diff --git a/src/HealthKit/HKObsolete.cs b/src/HealthKit/HKObsolete.cs index 0fca178689e8..beaf13187f06 100644 --- a/src/HealthKit/HKObsolete.cs +++ b/src/HealthKit/HKObsolete.cs @@ -5,18 +5,18 @@ namespace XamCore.HealthKit { #if !XAMCORE_3_0 public partial class HKStatisticsCollectionQuery { - [Obsolete ("Use InitialResultsHandler")] + [Obsolete ("Use 'InitialResultsHandler'.")] public virtual void SetInitialResultsHandler (HKStatisticsCollectionQueryInitialResultsHandler handler) { InitialResultsHandler = handler; } - [Obsolete ("Use StatisticsUpdated, this handler use an incorrect type and does nothing to avoid a crash")] + [Obsolete ("Use 'StatisticsUpdated', this handler uses an incorrect type and does nothing to avoid a crash.")] public virtual void SetStatisticsUpdateHandler (HKStatisticsCollectionQueryInitialResultsHandler handler) { } - [Obsolete ("Use StatisticsUpdated, this handler use an incorrect type and does nothing to avoid a crash")] + [Obsolete ("Use 'StatisticsUpdated', this handler uses an incorrect type and does nothing to avoid a crash.")] public virtual HKStatisticsCollectionQueryInitialResultsHandler StatisticsUpdateHandler { get; set; } @@ -24,7 +24,7 @@ public virtual HKStatisticsCollectionQueryInitialResultsHandler StatisticsUpdate public partial class HKObjectType { - [Obsolete ("Use GetWorkoutType, it will return a valid HKWorkoutType instance")] + [Obsolete ("Use 'GetWorkoutType', it will return a valid HKWorkoutType instance.")] static public HKWorkout WorkoutType () { // would throw an InvalidCastException since the old selector returned a HKWorkoutType diff --git a/src/HomeKit/HMEnums.cs b/src/HomeKit/HMEnums.cs index 1d7c329f917f..9849944e27c8 100644 --- a/src/HomeKit/HMEnums.cs +++ b/src/HomeKit/HMEnums.cs @@ -101,6 +101,9 @@ public enum HMError : nint { NotAuthorizedForMicrophoneAccess = 89, // iOS 10.2 IncompatibleNetwork = 90, + // iOS 11 + NoHomeHub = 91, + IncompatibleHomeHub = 92, // HMErrorCodeNoCompatibleHomeHub introduced and deprecated on iOS 11. HMErrorCodeIncompatibleHomeHub = HMErrorCodeNoCompatibleHomeHub. } @@ -143,7 +146,7 @@ public enum HMCharacteristicType { [Field ("HMCharacteristicTypeHeatingThreshold")] HeatingThreshold, - [Obsolete ("This value does not exist anymore and will always return null")] + [Obsolete ("This value does not exist anymore and will always return null.")] HeatingCoolingStatus, [Field ("HMCharacteristicTypeCurrentRelativeHumidity")] @@ -164,12 +167,21 @@ public enum HMCharacteristicType { [Field ("HMCharacteristicTypeName")] Name, + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'HMAccessory.Manufacturer' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'HMAccessory.Manufacturer' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'HMAccessory.Manufacturer' instead.")] [Field ("HMCharacteristicTypeManufacturer")] Manufacturer, + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'HMAccessory.Model' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'HMAccessory.Model' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'HMAccessory.Model' instead.")] [Field ("HMCharacteristicTypeModel")] Model, + [Deprecated (PlatformName.TvOS, 11, 0, message: "No longer supported.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "No longer supported.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "No longer supported.")] [Field ("HMCharacteristicTypeSerialNumber")] SerialNumber, @@ -284,6 +296,9 @@ public enum HMCharacteristicType { CurrentVerticalTilt, [iOS (9,0)] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'HMAccessory.FirmwareVersion' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'HMAccessory.FirmwareVersion' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'HMAccessory.FirmwareVersion' instead.")] [Field ("HMCharacteristicTypeFirmwareVersion")] FirmwareVersion, @@ -557,6 +572,10 @@ public enum HMCharacteristicType { [iOS (10,3), Watch (3,2), TV (10,2)] [Field ("HMCharacteristicTypeLabelIndex")] LabelIndex, + + [iOS (11,0), Watch (4,0), TV (11,0)] + [Field ("HMCharacteristicTypeColorTemperature")] + ColorTemperature, } // conveniance enum (ObjC uses NSString) @@ -987,7 +1006,7 @@ public enum HMAccessoryCategoryType { GarageDoorOpener, #if !WATCH && !TVOS - [Obsolete ("Use GarageDoorOpener instead")] + [Obsolete ("Use 'GarageDoorOpener' instead.")] DoorOpener = GarageDoorOpener, #endif @@ -1055,9 +1074,12 @@ public enum HMAccessoryCategoryType { [iOS (9,0)] [TV (10,0)] - // conveniance enum (ObjC uses NSString) public enum HMSignificantEvent { + + [Field ("HMSignificantEventSunrise")] Sunrise, + + [Field ("HMSignificantEventSunset")] Sunset, } @@ -1229,4 +1251,41 @@ public enum HMCharacteristicValueLabelNamespace : nint { Dot = 0, Numeral, } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Native] + public enum HMEventTriggerActivationState : nuint { + Disabled = 0, + DisabledNoHomeHub = 1, + DisabledNoCompatibleHomeHub = 2, + DisabledNoLocationServicesAuthorization = 3, + Enabled = 4, + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Native] + public enum HMHomeHubState : nuint { + NotAvailable = 0, + Connected, + Disconnected, + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Native] + public enum HMPresenceEventType : nuint { + EveryEntry = 1, + EveryExit = 2, + FirstEntry = 3, + LastExit = 4, + AtHome = FirstEntry, + NotAtHome = LastExit, + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Native] + public enum HMPresenceEventUserType : nuint { + CurrentUser = 1, + HomeUsers = 2, + CustomUsers = 3, + } } diff --git a/src/HomeKit/HMEventTrigger.cs b/src/HomeKit/HMEventTrigger.cs index 0a5ce8f0949b..f719d7c609fe 100644 --- a/src/HomeKit/HMEventTrigger.cs +++ b/src/HomeKit/HMEventTrigger.cs @@ -6,26 +6,20 @@ namespace XamCore.HomeKit { partial class HMEventTrigger { - internal static NSString GetEnumConstant (HMSignificantEvent value) - { - switch (value) { - case HMSignificantEvent.Sunrise: - return HMSignificantEventInternal.Sunrise; - case HMSignificantEvent.Sunset: - return HMSignificantEventInternal.Sunset; - default: - return null; - } - } - + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (HMSignificantTimeEvent)' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (HMSignificantTimeEvent)' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (HMSignificantTimeEvent)' instead.")] static public NSPredicate CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (HMSignificantEvent significantEvent, NSDateComponents offset) { - return CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (GetEnumConstant (significantEvent), offset); + return CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (significantEvent.GetConstant (), offset); } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (HMSignificantTimeEvent)' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (HMSignificantTimeEvent)' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (HMSignificantTimeEvent)' instead.")] static public NSPredicate CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (HMSignificantEvent significantEvent, NSDateComponents offset) { - return CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (GetEnumConstant (significantEvent), offset); + return CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (significantEvent.GetConstant (), offset); } } } diff --git a/src/HomeKit/HMMutableSignificantTimeEvent.cs b/src/HomeKit/HMMutableSignificantTimeEvent.cs new file mode 100644 index 000000000000..027d6c120c6d --- /dev/null +++ b/src/HomeKit/HMMutableSignificantTimeEvent.cs @@ -0,0 +1,17 @@ +using System; +using XamCore.ObjCRuntime; + +namespace XamCore.HomeKit { + + partial class HMMutableSignificantTimeEvent { + + public virtual HMSignificantEvent SignificantEvent { + get { + return (HMSignificantEvent) (HMSignificantEventExtensions.GetValue (_SignificantEvent)); + } + set { + _SignificantEvent = HMSignificantEventExtensions.GetConstant (value); + } + } + } +} diff --git a/src/HomeKit/HMSignificantTimeEvent.cs b/src/HomeKit/HMSignificantTimeEvent.cs new file mode 100644 index 000000000000..e99ef3d00670 --- /dev/null +++ b/src/HomeKit/HMSignificantTimeEvent.cs @@ -0,0 +1,17 @@ +using System; +using XamCore.ObjCRuntime; + +namespace XamCore.HomeKit { + + partial class HMSignificantTimeEvent { + + public virtual HMSignificantEvent SignificantEvent { + get { + return (HMSignificantEvent) (HMSignificantEventExtensions.GetValue (_SignificantEvent)); + } + set { + _SignificantEvent = HMSignificantEventExtensions.GetConstant (value); + } + } + } +} diff --git a/src/IOSurface/IODefs.cs b/src/IOSurface/IODefs.cs new file mode 100644 index 000000000000..071e28a4e57a --- /dev/null +++ b/src/IOSurface/IODefs.cs @@ -0,0 +1,38 @@ +// +// IOSurface +// +// Authors: +// Miguel de Icaza (miguel@xamarin.com) +// +// Copyright 2017 Microsoft +// + +using System; +using XamCore.ObjCRuntime; + +namespace XamCore.IOSurface { + + public enum IOSurfaceLockOptions : uint { + ReadOnly = 1, + AvoidSync = 2, + } + + public enum IOSurfacePurgeabilityState : uint { + NonVolatile = 0, + Volatile = 1, + Empty = 2, + KeepCurrent = 3, + } + + // To be used with kIOSurfaceCacheMode or IOSurfacePropertyKeyCacheMode + public enum IOSurfaceMemoryMap { + DefaultCache = 0, + InhibitCache = 1 << 8, + WriteThruCache = 2 << 8, + CopybackCache = 3 << 8, + WriteCombineCache = 4 << 8, + CopybackInnerCache = 5 << 8, + }; + + +} diff --git a/src/IOSurface/IOSurface.cs b/src/IOSurface/IOSurface.cs new file mode 100644 index 000000000000..4db673835618 --- /dev/null +++ b/src/IOSurface/IOSurface.cs @@ -0,0 +1,104 @@ +// +// IOSurface.cs +// +// Copyright 2016 Microsoft +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +#if XAMCORE_2_0 +using System; +using System.Runtime.InteropServices; +using XamCore.CoreFoundation; +using XamCore.ObjCRuntime; + +namespace XamCore.IOSurface { + public partial class IOSurface { + + // kern_return_t + // See bug #59201 [iOS (10,0)] + [iOS (11, 0)] + [Mac (10, 12)] + [TV (11, 0)] + public int Lock (IOSurfaceLockOptions options, ref int seed) + { + unsafe { + fixed (int *p = &seed){ + return _Lock (options, (IntPtr) p); + } + } + } + + // kern_return_t + // See bug #59201 [iOS (10,0)] + [iOS (11, 0)] + [Mac (10, 12)] + [TV (11, 0)] + public int Lock (IOSurfaceLockOptions options) + { + return _Lock (options, IntPtr.Zero); + } + + // kern_return_t + // See bug #59201 [iOS (10,0)] + [iOS (11, 0)] + [Mac (10, 12)] + [TV (11, 0)] + public int Unlock (IOSurfaceLockOptions options, ref int seed) + { + unsafe { + fixed (int *p = &seed){ + return _Unlock (options, (IntPtr) p); + } + } + } + + // kern_return_t + // See bug #59201 [iOS (10,0)] + [iOS (11, 0)] + [Mac (10, 12)] + [TV (11, 0)] + public int Unlock (IOSurfaceLockOptions options) + { + return _Unlock (options, IntPtr.Zero); + } + +#if !MONOMAC + // kern_return_t + [iOS (11, 0)] + [TV (11, 0)] + public int SetPurgeable (IOSurfacePurgeabilityState newState, ref IOSurfacePurgeabilityState oldState) + { + unsafe { + fixed (IOSurfacePurgeabilityState *p = &oldState){ + return _SetPurgeable (newState, (IntPtr) p); + } + } + } + + [iOS (11, 0)] + [TV (11, 0)] + public int SetPurgeable (IOSurfacePurgeabilityState newState) + { + return _SetPurgeable (newState, IntPtr.Zero); + } +#endif + } +} +#endif \ No newline at end of file diff --git a/src/ImageIO/CGImageDestination.cs b/src/ImageIO/CGImageDestination.cs index ee76b3c0bc4c..fe9f456a9ed0 100644 --- a/src/ImageIO/CGImageDestination.cs +++ b/src/ImageIO/CGImageDestination.cs @@ -188,6 +188,18 @@ internal NSMutableDictionary ToDictionary () } #endif + public partial class CGImageAuxiliaryDataInfo { + + public CGImageMetadata Metadata { + get { + return GetNativeValue (CGImageAuxiliaryDataInfoKeys.MetadataKey); + } + set { + SetNativeValue (CGImageAuxiliaryDataInfoKeys.MetadataKey, value); + } + } + } + public class CGImageDestination : INativeObject, IDisposable { internal IntPtr handle; @@ -470,5 +482,17 @@ public bool CopyImageSource (CGImageSource image, CGImageDestinationOptions opti o.Dispose (); } } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [DllImport (Constants.ImageIOLibrary)] + static extern void CGImageDestinationAddAuxiliaryDataInfo (IntPtr /* CGImageDestinationRef* */ idst, IntPtr /* CFStringRef* */ auxiliaryImageDataType, IntPtr /* CFDictionaryRef* */ auxiliaryDataInfoDictionary); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + public void AddAuxiliaryDataInfo (CGImageAuxiliaryDataType auxiliaryImageDataType, CGImageAuxiliaryDataInfo auxiliaryDataInfo) + { + using (var dict = auxiliaryDataInfo?.Dictionary) { + CGImageDestinationAddAuxiliaryDataInfo (Handle, auxiliaryImageDataType.GetConstant ().GetHandle (), dict.GetHandle ()); + } + } } -} +} \ No newline at end of file diff --git a/src/ImageIO/CGImageMetadata.cs b/src/ImageIO/CGImageMetadata.cs index 3e805a307e08..d1985d463434 100644 --- a/src/ImageIO/CGImageMetadata.cs +++ b/src/ImageIO/CGImageMetadata.cs @@ -43,6 +43,14 @@ public CGImageMetadata (IntPtr handle) Handle = handle; } + [Preserve (Conditional = true)] + internal CGImageMetadata (IntPtr handle, bool owns) + { + Handle = handle; + if (!owns) + CFObject.CFRetain (Handle); + } + [DllImport (Constants.ImageIOLibrary)] static extern /* CGImageMetadataRef __nullable */ IntPtr CGImageMetadataCreateFromXMPData ( /* CFDataRef __nonnull */ IntPtr data); diff --git a/src/ImageIO/CGImageSource.cs b/src/ImageIO/CGImageSource.cs index 48ec2e38cc9f..51de887d3d2c 100644 --- a/src/ImageIO/CGImageSource.cs +++ b/src/ImageIO/CGImageSource.cs @@ -249,14 +249,14 @@ public nint ImageCount { extern static /* CFDictionaryRef __nullable */ IntPtr CGImageSourceCopyProperties ( /* CGImageSourceRef __nonnull */ IntPtr isrc, /* CFDictionaryRef __nullable */ IntPtr options); - [Advice ("Use GetProperties")] + [Advice ("Use 'GetProperties'.")] public NSDictionary CopyProperties (NSDictionary dict) { var result = CGImageSourceCopyProperties (handle, dict == null ? IntPtr.Zero : dict.Handle); return result == IntPtr.Zero ? null : Runtime.GetNSObject (result); } - [Advice ("Use GetProperties")] + [Advice ("Use 'GetProperties'.")] public NSDictionary CopyProperties (CGImageOptions options) { if (options == null) @@ -269,14 +269,14 @@ public NSDictionary CopyProperties (CGImageOptions options) /* CGImageSourceRef __nonnull */ IntPtr isrc, /* size_t */ nint index, /* CFDictionaryRef __nullable */ IntPtr options); - [Advice ("Use GetProperties")] + [Advice ("Use 'GetProperties'.")] public NSDictionary CopyProperties (NSDictionary dict, int imageIndex) { var result = CGImageSourceCopyPropertiesAtIndex (handle, imageIndex, dict == null ? IntPtr.Zero : dict.Handle); return result == IntPtr.Zero ? null : Runtime.GetNSObject (result); } - [Advice ("Use GetProperties")] + [Advice ("Use 'GetProperties'.")] public NSDictionary CopyProperties (CGImageOptions options, int imageIndex) { if (options == null) @@ -376,5 +376,22 @@ public CGImageSourceStatus GetStatus (int index) { return CGImageSourceGetStatusAtIndex (handle, index); } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [DllImport (Constants.ImageIOLibrary)] + static extern IntPtr /* CFDictionaryRef* */ CGImageSourceCopyAuxiliaryDataInfoAtIndex (IntPtr /* CGImageSourceRef* */ isrc, nuint index, IntPtr /* CFStringRef* */ auxiliaryImageDataType); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + public CGImageAuxiliaryDataInfo CopyAuxiliaryDataInfo (nuint index, CGImageAuxiliaryDataType auxiliaryImageDataType) + { + var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (Handle, index, auxiliaryImageDataType.GetConstant ().GetHandle ()); + if (ptr == IntPtr.Zero) + return null; + + var dictionary = Runtime.GetNSObject (ptr); + var info = new CGImageAuxiliaryDataInfo (dictionary); + + return info; + } } } diff --git a/src/Intents/INBillTypeResolutionResult.cs b/src/Intents/INBillTypeResolutionResult.cs new file mode 100644 index 000000000000..a0dd2b65da62 --- /dev/null +++ b/src/Intents/INBillTypeResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INBillTypeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INBillTypeResolutionResult { + + public static INBillTypeResolutionResult GetSuccess (INBillType resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedBillType (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INBillTypeResolutionResult GetConfirmationRequired (INBillType valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithBillTypeToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INCallRecord.cs b/src/Intents/INCallRecord.cs new file mode 100644 index 000000000000..7f61356e8725 --- /dev/null +++ b/src/Intents/INCallRecord.cs @@ -0,0 +1,27 @@ +// +// INCallRecord.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INCallRecord { + + public double? CallDuration { + get { return WeakCallDuration?.DoubleValue; } + } + + public bool? Unseen { + get { return WeakUnseen?.BoolValue; } + } + } +} +#endif diff --git a/src/Intents/INCallRecordTypeResolutionResult.cs b/src/Intents/INCallRecordTypeResolutionResult.cs new file mode 100644 index 000000000000..f2fd7e4b38e9 --- /dev/null +++ b/src/Intents/INCallRecordTypeResolutionResult.cs @@ -0,0 +1,47 @@ +// +// INCallRecordTypeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INCallRecordTypeResolutionResult { + + public static INCallRecordTypeResolutionResult GetSuccess (INCallRecordType resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#elif MONOMAC + if (PlatformHelper.CheckSystemVersion (10, 13)) +#endif + return SuccessWithResolvedCallRecordType (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INCallRecordTypeResolutionResult GetConfirmationRequired (INCallRecordType valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#elif MONOMAC + if (PlatformHelper.CheckSystemVersion (10, 13)) +#endif + return ConfirmationRequiredWithCallRecordTypeToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INCarAirCirculationModeResolutionResult.cs b/src/Intents/INCarAirCirculationModeResolutionResult.cs new file mode 100644 index 000000000000..298fb3959fcf --- /dev/null +++ b/src/Intents/INCarAirCirculationModeResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INCarAirCirculationModeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INCarAirCirculationModeResolutionResult { + + public static INCarAirCirculationModeResolutionResult GetSuccess (INCarAirCirculationMode resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedCarAirCirculationMode (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INCarAirCirculationModeResolutionResult GetConfirmationRequired (INCarAirCirculationMode valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithCarAirCirculationModeToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INCarAudioSourceResolutionResult.cs b/src/Intents/INCarAudioSourceResolutionResult.cs new file mode 100644 index 000000000000..3466267f8dfb --- /dev/null +++ b/src/Intents/INCarAudioSourceResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INCarAudioSourceResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INCarAudioSourceResolutionResult { + + public static INCarAudioSourceResolutionResult GetSuccess (INCarAudioSource resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedCarAudioSource (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INCarAudioSourceResolutionResult GetConfirmationRequired (INCarAudioSource valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithCarAudioSourceToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INCarDefrosterResolutionResult.cs b/src/Intents/INCarDefrosterResolutionResult.cs new file mode 100644 index 000000000000..89e80df50ebc --- /dev/null +++ b/src/Intents/INCarDefrosterResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INCarDefrosterResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INCarDefrosterResolutionResult { + + public static INCarDefrosterResolutionResult GetSuccess (INCarDefroster resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedCarDefroster (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INCarDefrosterResolutionResult GetConfirmationRequired (INCarDefroster valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithCarDefrosterToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INCarSeatResolutionResult.cs b/src/Intents/INCarSeatResolutionResult.cs new file mode 100644 index 000000000000..581d3d411e6f --- /dev/null +++ b/src/Intents/INCarSeatResolutionResult.cs @@ -0,0 +1,42 @@ +// +// INCarSeatResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INCarSeatResolutionResult { + public static INCarSeatResolutionResult GetSuccess (INCarSeat resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedCarSeat (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INCarSeatResolutionResult GetConfirmationRequired (INCarSeat valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithCarSeatToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif \ No newline at end of file diff --git a/src/Intents/INCarSignalOptionsResolutionResult.cs b/src/Intents/INCarSignalOptionsResolutionResult.cs new file mode 100644 index 000000000000..4f0450546c23 --- /dev/null +++ b/src/Intents/INCarSignalOptionsResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INCarAirCirculationModeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INCarSignalOptionsResolutionResult { + + public static INCarSignalOptionsResolutionResult GetSuccess (INCarSignalOptions resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedCarSignalOptions (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INCarSignalOptionsResolutionResult GetConfirmationRequired (INCarSignalOptions valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithCarSignalOptionsToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INCompat.cs b/src/Intents/INCompat.cs index f025cf4438fe..de334370f1ee 100644 --- a/src/Intents/INCompat.cs +++ b/src/Intents/INCompat.cs @@ -24,6 +24,14 @@ public INRideStatus () { } } + + public partial class INRestaurantGuest { + [Obsolete ("This constructor does not create a valid instance of the type")] + public INRestaurantGuest () + : base (IntPtr.Zero) // base class doesn't have a default ctor. + { + } + } #endif } #endif \ No newline at end of file diff --git a/src/Intents/INInteraction.cs b/src/Intents/INInteraction.cs new file mode 100644 index 000000000000..5cbf62d41188 --- /dev/null +++ b/src/Intents/INInteraction.cs @@ -0,0 +1,24 @@ +// +// INInteraction.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INInteraction { + + public T GetParameterValue (INParameter parameter) where T : NSObject + { + return Runtime.GetNSObject (_GetParameterValue (parameter)); + } + } +} +#endif diff --git a/src/Intents/INMessageAttributeOptionsResolutionResult.cs b/src/Intents/INMessageAttributeOptionsResolutionResult.cs new file mode 100644 index 000000000000..a550e690a6d5 --- /dev/null +++ b/src/Intents/INMessageAttributeOptionsResolutionResult.cs @@ -0,0 +1,47 @@ +// +// INMessageAttributeOptionsResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INMessageAttributeOptionsResolutionResult { + + public static INMessageAttributeOptionsResolutionResult GetSuccess (INMessageAttributeOptions resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#elif MONOMAC + if (PlatformHelper.CheckSystemVersion (10, 13)) +#endif + return SuccessWithResolvedMessageAttributeOptions (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INMessageAttributeOptionsResolutionResult GetConfirmationRequired (INMessageAttributeOptions valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#elif MONOMAC + if (PlatformHelper.CheckSystemVersion (10, 13)) +#endif + return ConfirmationRequiredWithMessageAttributeOptionsToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INMessageAttributeResolutionResult.cs b/src/Intents/INMessageAttributeResolutionResult.cs new file mode 100644 index 000000000000..dd9d3f0ffe2d --- /dev/null +++ b/src/Intents/INMessageAttributeResolutionResult.cs @@ -0,0 +1,47 @@ +// +// INMessageAttributeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INMessageAttributeResolutionResult { + + public static INMessageAttributeResolutionResult GetSuccess (INMessageAttribute resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#elif MONOMAC + if (PlatformHelper.CheckSystemVersion (10, 13)) +#endif + return SuccessWithResolvedMessageAttribute (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INMessageAttributeResolutionResult GetConfirmationRequired (INMessageAttribute valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#elif MONOMAC + if (PlatformHelper.CheckSystemVersion (10, 13)) +#endif + return ConfirmationRequiredWithMessageAttributeToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INPaymentStatusResolutionResult.cs b/src/Intents/INPaymentStatusResolutionResult.cs new file mode 100644 index 000000000000..50f43cd96dc4 --- /dev/null +++ b/src/Intents/INPaymentStatusResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INPaymentStatusResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INPaymentStatusResolutionResult { + + public static INPaymentStatusResolutionResult GetSuccess (INPaymentStatus resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedPaymentStatus (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INPaymentStatusResolutionResult GetConfirmationRequired (INPaymentStatus valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithPaymentStatusToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INRadioTypeResolutionResult.cs b/src/Intents/INRadioTypeResolutionResult.cs new file mode 100644 index 000000000000..c018f196c448 --- /dev/null +++ b/src/Intents/INRadioTypeResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INRadioTypeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INRadioTypeResolutionResult { + + public static INRadioTypeResolutionResult GetSuccess (INRadioType resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedRadioType (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INRadioTypeResolutionResult GetConfirmationRequired (INRadioType valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithRadioTypeToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INRelativeReferenceResolutionResult.cs b/src/Intents/INRelativeReferenceResolutionResult.cs new file mode 100644 index 000000000000..ea8129300b30 --- /dev/null +++ b/src/Intents/INRelativeReferenceResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INRelativeReferenceResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INRelativeReferenceResolutionResult { + + public static INRelativeReferenceResolutionResult GetSuccess (INRelativeReference resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedRelativeReference (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INRelativeReferenceResolutionResult GetConfirmationRequired (INRelativeReference valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithRelativeReferenceToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INRelativeSettingResolutionResult.cs b/src/Intents/INRelativeSettingResolutionResult.cs new file mode 100644 index 000000000000..e6dd58686452 --- /dev/null +++ b/src/Intents/INRelativeSettingResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INRelativeSettingResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INRelativeSettingResolutionResult { + + public static INRelativeSettingResolutionResult GetSuccess (INRelativeSetting resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedRelativeSetting (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INRelativeSettingResolutionResult GetConfirmationRequired (INRelativeSetting valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithRelativeSettingToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INSearchCallHistoryIntent.cs b/src/Intents/INSearchCallHistoryIntent.cs new file mode 100644 index 000000000000..b0ee38f8ef6f --- /dev/null +++ b/src/Intents/INSearchCallHistoryIntent.cs @@ -0,0 +1,23 @@ +// +// INSearchCallHistoryIntent.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INSearchCallHistoryIntent { + + public bool? Unseen { + get { return WeakUnseen?.BoolValue; } + } + } +} +#endif diff --git a/src/Intents/INSpeakableString.cs b/src/Intents/INSpeakableString.cs new file mode 100644 index 000000000000..d3ab88bccde1 --- /dev/null +++ b/src/Intents/INSpeakableString.cs @@ -0,0 +1,33 @@ +// +// INSpeakableString.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INSpeakableString { + public INSpeakableString (string identifier, string spokenPhrase, string pronunciationHint) + : base (NSObjectFlag.Empty) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#elif MONOMAC + if (PlatformHelper.CheckSystemVersion (10, 13)) +#endif + InitializeHandle (InitWithVocabularyIdentifier (identifier, spokenPhrase, pronunciationHint)); + else + InitializeHandle (InitWithIdentifier (identifier, spokenPhrase, pronunciationHint)); + } + } +} +#endif diff --git a/src/Intents/INWorkoutGoalUnitTypeResolutionResult.cs b/src/Intents/INWorkoutGoalUnitTypeResolutionResult.cs new file mode 100644 index 000000000000..294f343d745c --- /dev/null +++ b/src/Intents/INWorkoutGoalUnitTypeResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INWorkoutGoalUnitTypeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INWorkoutGoalUnitTypeResolutionResult { + + public static INWorkoutGoalUnitTypeResolutionResult GetSuccess (INWorkoutGoalUnitType resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedWorkoutGoalUnitType (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INWorkoutGoalUnitTypeResolutionResult GetConfirmationRequired (INWorkoutGoalUnitType valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithWorkoutGoalUnitTypeToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/Intents/INWorkoutLocationTypeResolutionResult.cs b/src/Intents/INWorkoutLocationTypeResolutionResult.cs new file mode 100644 index 000000000000..69c7feb77f0c --- /dev/null +++ b/src/Intents/INWorkoutLocationTypeResolutionResult.cs @@ -0,0 +1,43 @@ +// +// INWorkoutLocationTypeResolutionResult.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !MONOMAC +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Intents { + public partial class INWorkoutLocationTypeResolutionResult { + + public static INWorkoutLocationTypeResolutionResult GetSuccess (INWorkoutLocationType resolvedValue) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return SuccessWithResolvedWorkoutLocationType (resolvedValue); + else + return SuccessWithResolvedValue (resolvedValue); + } + + public static INWorkoutLocationTypeResolutionResult GetConfirmationRequired (INWorkoutLocationType valueToConfirm) + { +#if IOS + if (XamCore.UIKit.UIDevice.CurrentDevice.CheckSystemVersion (11, 0)) +#elif WATCH + if (XamCore.WatchKit.WKInterfaceDevice.CurrentDevice.CheckSystemVersion (4, 0)) +#endif + return ConfirmationRequiredWithWorkoutLocationTypeToConfirm (valueToConfirm); + else + return ConfirmationRequiredWithValueToConfirm (valueToConfirm); + } + } +} +#endif diff --git a/src/LocalAuthentication/LAEnums.cs b/src/LocalAuthentication/LAEnums.cs index 69469a0d8fd4..46bb84ffc3e0 100644 --- a/src/LocalAuthentication/LAEnums.cs +++ b/src/LocalAuthentication/LAEnums.cs @@ -30,17 +30,29 @@ public enum LAStatus : nint { /// Authentication could not start, because passcode is not set on the device. PasscodeNotSet = -5, /// Authentication could not start, because Touch ID is not available on the device. + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'BiometryNotAvailable' instead.")] + [Deprecated (PlatformName.MacOSX, 10,13, message: "Use 'BiometryNotAvailable' instead.")] TouchIDNotAvailable = -6, + /// Authentication could not start, because Touch ID has no enrolled fingers. + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'BiometryNotEnrolled' instead.")] + [Deprecated (PlatformName.MacOSX, 10,13, message: "Use 'BiometryNotEnrolled' instead.")] TouchIDNotEnrolled = -7, + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'BiometryLockout' instead.")] + [Deprecated (PlatformName.MacOSX, 10,13, message: "Use 'BiometryLockout' instead.")] TouchIDLockout = -8, AppCancel = -9, - InvalidContext = -10 + InvalidContext = -10, + + BiometryNotAvailable = TouchIDNotAvailable, + BiometryNotEnrolled = TouchIDNotEnrolled, + BiometryLockout = TouchIDLockout, + + NotInteractive = -1004, } - [iOS (9,0)] - [Mac (10,11)] + [iOS (9,0), Mac (10,11), Watch (3,0), TV (11,0)] [Native] public enum LACredentialType : nint { ApplicationPassword = 0 diff --git a/src/Makefile b/src/Makefile index bd9d2eb1ee65..7c2b213e3f45 100644 --- a/src/Makefile +++ b/src/Makefile @@ -767,7 +767,7 @@ WATCHOS_EXTRA_CORE_SOURCES = \ $(WATCH_BUILD_DIR)/Constants.cs \ $(WATCH_BUILD_DIR)/AssemblyInfo.cs \ $(IOS_OPENTK_1_0_CORE_SOURCES) \ - CoreVideo/CVPixelFormatType.cs \ + AudioToolbox/AudioBuffers.cs \ AudioToolbox/AudioType.cs \ $(SHARED_SYSTEM_DRAWING_SOURCES) \ $(MONO_PATH)/mcs/class/System.Drawing/System.Drawing/Color.cs \ diff --git a/src/MapKit/MKEnums.cs b/src/MapKit/MKEnums.cs index 37e25f1ec421..ade73139616b 100644 --- a/src/MapKit/MKEnums.cs +++ b/src/MapKit/MKEnums.cs @@ -38,7 +38,9 @@ public enum MKMapType : nuint_compat_int { Satellite, Hybrid, SatelliteFlyover, - HybridFlyover + HybridFlyover, + [iOS (11,0)][TV (11,0)][Mac (10,13, onlyOn64: true)] + MutedStandard, } // NSUInteger -> MKDistanceFormatter.h @@ -97,7 +99,7 @@ public enum MKAnnotationViewDragState : nuint_compat_int { [NoTV] [NoWatch] [Native] - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the MKPinAnnotationView's PinTintColor instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'MKPinAnnotationView.PinTintColor' instead.")] public enum MKPinAnnotationColor : nuint_compat_int { Red, Green, Purple } @@ -116,6 +118,28 @@ public enum MKSearchCompletionFilterType : nint { AndQueries = 0, Only } + + [TV (11,0)][NoWatch][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Native] + public enum MKAnnotationViewCollisionMode : nint { + Rectangle, + Circle, + } + + [TV (11,0)][NoWatch][iOS (11,0)][NoMac] + [Native] + public enum MKScaleViewAlignment : nint { + Leading, + Trailing, + } + + [TV (11,0)][NoWatch][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Native] + public enum MKFeatureVisibility : nint { + Adaptive, + Hidden, + Visible, + } } #endif diff --git a/src/MapKit/MKFeatureDisplayPriority.cs b/src/MapKit/MKFeatureDisplayPriority.cs new file mode 100644 index 000000000000..1b34010970d7 --- /dev/null +++ b/src/MapKit/MKFeatureDisplayPriority.cs @@ -0,0 +1,16 @@ +#if XAMCORE_2_0 || !MONOMAC +using System; +using XamCore.ObjCRuntime; + +namespace XamCore.MapKit { + + // .net does not allow float-based enumerations + [TV (11,0)][NoWatch][iOS (11,0)][Mac (10,13, onlyOn64: true)] + public static class MKFeatureDisplayPriority { + public const float Required = 1000f; + public const float DefaultHigh = 750f; + public const float DefaultLow = 250f; + } +} + +#endif \ No newline at end of file diff --git a/src/MediaAccessibility/MediaAccessibility.cs b/src/MediaAccessibility/MediaAccessibility.cs index e6a10fa339ee..9763e8deee81 100644 --- a/src/MediaAccessibility/MediaAccessibility.cs +++ b/src/MediaAccessibility/MediaAccessibility.cs @@ -70,10 +70,10 @@ public static partial class MACaptionAppearance { // FIXME: make this a real notification public static readonly NSString SettingsChangedNotification; - [Advice ("Use MediaCharacteristic.DescribesMusicAndSoundForAccessibility getter")] + [Advice ("Use 'MediaCharacteristic.DescribesMusicAndSoundForAccessibility' getter.")] public static readonly NSString MediaCharacteristicDescribesMusicAndSoundForAccessibility; - [Advice ("Use MediaCharacteristic.TranscribesSpokenDialogForAccessibility getter")] + [Advice ("Use 'MediaCharacteristic.TranscribesSpokenDialogForAccessibility' getter.")] public static readonly NSString MediaCharacteristicTranscribesSpokenDialogForAccessibility; static MACaptionAppearance () diff --git a/src/MediaPlayer/MPNowPlayingInfoCenter.cs b/src/MediaPlayer/MPNowPlayingInfoCenter.cs index 3e69e8142ec0..be0c2a59222f 100644 --- a/src/MediaPlayer/MPNowPlayingInfoCenter.cs +++ b/src/MediaPlayer/MPNowPlayingInfoCenter.cs @@ -7,13 +7,14 @@ // Copyright 2011, Xamarin Inc // +#if XAMCORE_2_0 || !MONOMAC -#if XAMCORE_2_0 using XamCore.Foundation; using XamCore.ObjCRuntime; namespace XamCore.MediaPlayer { + [Mac (10,12,2, onlyOn64: true)] public class MPNowPlayingInfo { public MPNowPlayingInfo () { @@ -220,13 +221,10 @@ public MPNowPlayingInfo NowPlaying { return new MPNowPlayingInfo (_NowPlayingInfo); } set { - if (value == null) - _NowPlayingInfo = null; - else - _NowPlayingInfo = value.ToDictionary (); + _NowPlayingInfo = value?.ToDictionary (); } } } } -#endif \ No newline at end of file +#endif diff --git a/src/MediaPlayer/MPPlayableContentDelegate.cs b/src/MediaPlayer/MPPlayableContentDelegate.cs index fcf60518ee7d..a352ec774669 100644 --- a/src/MediaPlayer/MPPlayableContentDelegate.cs +++ b/src/MediaPlayer/MPPlayableContentDelegate.cs @@ -7,7 +7,7 @@ namespace XamCore.MediaPlayer { public partial class MPPlayableContentDelegate { - [Obsolete ("Use InitiatePlaybackOfContentItem instead")] + [Obsolete ("Use 'InitiatePlaybackOfContentItem' instead.")] public virtual void PlayableContentManager (MPPlayableContentManager contentManager, NSIndexPath indexPath, Action completionHandler) { InitiatePlaybackOfContentItem (contentManager, indexPath, completionHandler); @@ -16,7 +16,7 @@ public virtual void PlayableContentManager (MPPlayableContentManager contentMana } public static partial class MPPlayableContentDelegate_Extensions { - [Obsolete ("Use InitiatePlaybackOfContentItem instead")] + [Obsolete ("Use 'InitiatePlaybackOfContentItem' instead.")] public static void PlayableContentManager (this IMPPlayableContentDelegate This, MPPlayableContentManager contentManager, NSIndexPath indexPath, Action completionHandler) { This.InitiatePlaybackOfContentItem (contentManager, indexPath, completionHandler); @@ -28,7 +28,7 @@ public static void PlayableContentManager (this IMPPlayableContentDelegate This, public partial class MPPlayableContentDataSource : NSObject { [Unavailable (PlatformName.MacOSX, PlatformArchitecture.All)] [Introduced (PlatformName.iOS, 10, 0)] - [Obsolete ("Use 'MPPlayableContentDataSource_Extensions.GetContentItemAsync' instead")] + [Obsolete ("Use 'MPPlayableContentDataSource_Extensions.GetContentItemAsync' instead.")] public unsafe virtual Task GetContentItemAsync (string identifier) { return MPPlayableContentDataSource_Extensions.GetContentItemAsync (this, identifier); diff --git a/src/MediaPlayer/MediaPlayer.cs b/src/MediaPlayer/MediaPlayer.cs index 8fe8f54ccb29..c878d08cef4c 100644 --- a/src/MediaPlayer/MediaPlayer.cs +++ b/src/MediaPlayer/MediaPlayer.cs @@ -18,6 +18,7 @@ namespace XamCore.MediaPlayer { [Native] [NoMac] [NoTV] + [Availability (Deprecated = Platform.iOS_9_0)] public enum MPMoviePlaybackState : nint { Stopped, Playing, @@ -31,6 +32,7 @@ public enum MPMoviePlaybackState : nint { [Native] [NoMac] [NoTV] + [Availability (Deprecated = Platform.iOS_9_0)] public enum MPMovieLoadState : nint { Unknown = 0, Playable = 1 << 0, @@ -275,6 +277,8 @@ public enum MPRemoteCommandHandlerStatus : nint { NoSuchContent = 100, [iOS (9,1)] NoActionableNowPlayingItem = 110, + [iOS (11,0)][TV (11,0)][Mac (10,13)] + DeviceNotFound = 120, CommandFailed = 200 } diff --git a/src/Metal/Defs.cs b/src/Metal/Defs.cs index 955ee40b1237..ad007fdaec51 100644 --- a/src/Metal/Defs.cs +++ b/src/Metal/Defs.cs @@ -92,6 +92,21 @@ public override string ToString () } } + [StructLayout (LayoutKind.Sequential)] + public struct MTLSamplePosition + { + public float X; + + public float Y; + + public MTLSamplePosition (float x, float y) + { + this.X = x; + this.Y = y; + } + } + + public struct MTLClearColor { public double Red, Green, Blue, Alpha; diff --git a/src/Metal/MTLArgumentEncoder.cs b/src/Metal/MTLArgumentEncoder.cs new file mode 100644 index 000000000000..a4d1f1e7f187 --- /dev/null +++ b/src/Metal/MTLArgumentEncoder.cs @@ -0,0 +1,13 @@ +#if XAMCORE_2_0 +using System; + +namespace XamCore.Metal { + public static partial class MTLArgumentEncoder_Extensions { + public unsafe static void SetBuffers (this IMTLArgumentEncoder This, IMTLBuffer [] buffers, nint [] offsets, Foundation.NSRange range) + { + fixed (void* handle = offsets) + This.SetBuffers (buffers, (IntPtr)handle, range); + } + } +} +#endif \ No newline at end of file diff --git a/src/Metal/MTLArrays.cs b/src/Metal/MTLArrays.cs index 3d60902a249c..6c2a43444548 100644 --- a/src/Metal/MTLArrays.cs +++ b/src/Metal/MTLArrays.cs @@ -79,5 +79,31 @@ public MTLAttributeDescriptor this [nuint idx] { } } } + + public partial class MTLPipelineBufferDescriptorArray { + public MTLPipelineBufferDescriptor this [nuint index] + { + get { + return GetObject (index); + } + set { + SetObject (value, index); + } + } + } + +#if IOS + public partial class MTLTileRenderPipelineColorAttachmentDescriptorArray { + public MTLTileRenderPipelineColorAttachmentDescriptor this [nuint index] + { + get { + return GetObject (index); + } + set { + SetObject (value, index); + } + } + } +#endif } #endif diff --git a/src/Metal/MTLCompat.cs b/src/Metal/MTLCompat.cs index 1273027e501e..3d14882e433b 100644 --- a/src/Metal/MTLCompat.cs +++ b/src/Metal/MTLCompat.cs @@ -4,19 +4,6 @@ namespace XamCore.Metal { -#if IOS || TVOS - public static partial class MTLRenderCommandEncoder_Extensions { - - // Apple removed this in Xcode 8 - [Introduced (PlatformName.iOS, 9,0)] - [Deprecated (PlatformName.iOS, 10,0, message: "Removed in iOS 10")] - [Introduced (PlatformName.TvOS, 9,1)] - [Deprecated (PlatformName.TvOS, 10,0, message: "Removed in tvOS 10")] - public static void SetDepthClipMode (IMTLRenderCommandEncoder This, MTLDepthClipMode depthClipMode) - { - } - } -#endif } #endif diff --git a/src/Metal/MTLDevice.cs b/src/Metal/MTLDevice.cs index d28c7297bd7c..bdebca9564dc 100644 --- a/src/Metal/MTLDevice.cs +++ b/src/Metal/MTLDevice.cs @@ -16,6 +16,10 @@ using XamCore.ObjCRuntime; namespace XamCore.Metal { +#if MONOMAC + [Advice ("The 'NSString' argument will match a property of 'MTLDeviceNotificationHandler'.")] + public delegate void MTLDeviceNotificationHandler (IMTLDevice device, NSString notifyName); +#endif [iOS (8,0)][Mac (10,11)] public static partial class MTLDevice { @@ -42,6 +46,73 @@ public static IMTLDevice SystemDefault { return system_default; } } + +#if MONOMAC + [Mac (10,11, onlyOn64: true), NoiOS, NoWatch, NoTV] + [DllImport (Constants.MetalLibrary)] + unsafe static extern IntPtr MTLCopyAllDevices (); + + [Mac (10,11, onlyOn64: true), NoiOS, NoWatch, NoTV] + public static IMTLDevice [] GetAllDevices () + { + var rv = MTLCopyAllDevices (); + return NSArray.ArrayFromHandle (rv); + } + + [Mac (10, 13, onlyOn64: true), NoiOS, NoWatch, NoTV] + [DllImport (Constants.MetalLibrary)] + unsafe static extern IntPtr MTLCopyAllDevicesWithObserver (ref IntPtr observer, void* handler); + + [Mac (10, 13, onlyOn64: true), NoiOS, NoWatch, NoTV] + public static IMTLDevice [] GetAllDevices (ref NSObject observer, MTLDeviceNotificationHandler handler) + { + if (observer == null) + throw new ArgumentNullException ("observer"); + + IntPtr handle = observer.Handle; + + unsafe + { + BlockLiteral* block_ptr_handler; + BlockLiteral block_handler; + block_handler = new BlockLiteral (); + block_ptr_handler = &block_handler; + block_handler.SetupBlock (static_notificationHandler, handler); + + var rv = MTLCopyAllDevicesWithObserver (ref handle, (void*) block_ptr_handler); + var obj = NSArray.ArrayFromHandle (rv); + + if (handle != observer.Handle) + observer = Runtime.GetNSObject (handle); + + return obj; + } + } + + internal delegate void InnerNotification (IntPtr block, IntPtr device, IntPtr notifyName); + static readonly InnerNotification static_notificationHandler = TrampolineNotificationHandler; + [MonoPInvokeCallback (typeof (InnerNotification))] + public static unsafe void TrampolineNotificationHandler (IntPtr block, IntPtr device, IntPtr notifyName) + { + var descriptor = (BlockLiteral*) block; + var del = (MTLDeviceNotificationHandler) (descriptor->Target); + if (del != null) + del ((IMTLDevice) Runtime.GetNSObject (device), (XamCore.Foundation.NSString) Runtime.GetNSObject (notifyName)); + } + + [Mac (10, 13, onlyOn64: true), NoiOS, NoWatch, NoTV] + [DllImport (Constants.MetalLibrary)] + static extern void MTLRemoveDeviceObserver (IntPtr observer); + + [Mac (10, 13, onlyOn64: true), NoiOS, NoWatch, NoTV] + public static void RemoveObserver (NSObject observer) + { + if (observer == null) + throw new ArgumentNullException ("observer"); + + MTLRemoveDeviceObserver (observer.Handle); + } +#endif } public static partial class MTLDevice_Extensions { @@ -61,11 +132,19 @@ public static IMTLBuffer CreateBufferNoCopy (this IMTLDevice This, T [] data, var handle = GCHandle.Alloc (data, GCHandleType.Pinned); // This requires a pinned GCHandle, since it's not possible to use unsafe code to get the address of a generic object. try { IntPtr ptr = handle.AddrOfPinnedObject (); - return This.CreateBufferNoCopy (ptr, (nuint)(data.Length * Marshal.SizeOf (typeof (T))) , options, deallocator); + return This.CreateBufferNoCopy (ptr, (nuint)(data.Length * Marshal.SizeOf (typeof (T))), options, deallocator); } finally { handle.Free (); } } + + public unsafe static void GetDefaultSamplePositions (this IMTLDevice This, MTLSamplePosition [] positions, nuint count) + { + if (positions.Length < (nint)count) + throw new ArgumentException ("Length of 'positions' cannot be less than 'count'."); + fixed (void * handle = positions) + GetDefaultSamplePositions (This, (IntPtr)handle, count); + } } } #endif \ No newline at end of file diff --git a/src/Metal/MTLEnums.cs b/src/Metal/MTLEnums.cs index 21fb0f6e7f78..dd2129513d26 100644 --- a/src/Metal/MTLEnums.cs +++ b/src/Metal/MTLEnums.cs @@ -79,6 +79,8 @@ public enum MTLCommandBufferError : nuint { InvalidResource = 9, [iOS (10,0), TV (10,0), NoWatch, NoMac] Memoryless = 10, + [Mac (10,13), NoiOS, NoTV, NoWatch] + DeviceRemoved = 11, } [Native] @@ -93,6 +95,8 @@ public enum MTLStoreAction : nuint { StoreAndMultisampleResolve, [iOS (10,0), TV (10,0), NoWatch, Mac (10,12)] Unknown, + [iOS (11,0), TV (11,0), NoWatch, Mac (10,13)] + CustomSampleDepthStore, } [Native] @@ -191,6 +195,29 @@ public enum MTLVertexFormat : nuint { Int1010102Normalized = 40, UInt1010102Normalized = 41, + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UChar4NormalizedBgra = 42, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UChar = 45, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + Char = 46, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UCharNormalized = 47, + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + CharNormalized = 48, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UShort = 49, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + Short = 50, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UShortNormalized = 51, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + ShortNormalized = 52, + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + Half = 53, } [Mac (10,11)] @@ -203,7 +230,7 @@ public enum MTLPixelFormat : nuint { #if MONOMAC R8Unorm_sRGB = 11, #elif !XAMCORE_3_0 - [Obsolete ("Only available on OSX")] + [Obsolete ("Only available on macOS.")] R8Unorm_sRGB = 11, #endif R8Snorm = 12, @@ -246,6 +273,8 @@ public enum MTLPixelFormat : nuint { RGB10A2Uint = 91, RG11B10Float = 92, RGB9E5Float = 93, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + BGR10A2Unorm = 94, RG32Uint = 103, RG32Sint = 104, RG32Float = 105, @@ -474,7 +503,7 @@ public enum MTLResourceOptions : nuint { [iOS (10,0), TV (10,0), NoWatch, NoMac] StorageModeMemoryless = MTLStorageMode.Memoryless << 4, - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13)] HazardTrackingModeUntracked = 1 << 8, } @@ -563,7 +592,28 @@ public enum MTLDataType : nuint { Bool = 53, Bool2 = 54, Bool3 = 55, - Bool4 = 56 + Bool4 = 56, + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] Texture = 58, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] Sampler = 59, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] Pointer = 60, + + [NoMac, iOS (11,0), NoTV, NoWatch] R8Unorm = 62, + [NoMac, iOS (11,0), NoTV, NoWatch] R8Snorm = 63, + [NoMac, iOS (11,0), NoTV, NoWatch] R16Unorm = 64, + [NoMac, iOS (11,0), NoTV, NoWatch] R16Snorm = 65, + [NoMac, iOS (11,0), NoTV, NoWatch] Rg8Unorm = 66, + [NoMac, iOS (11,0), NoTV, NoWatch] Rg8Snorm = 67, + [NoMac, iOS (11,0), NoTV, NoWatch] Rg16Unorm = 68, + [NoMac, iOS (11,0), NoTV, NoWatch] Rg16Snorm = 69, + [NoMac, iOS (11,0), NoTV, NoWatch] Rgba8Unorm = 70, + [NoMac, iOS (11,0), NoTV, NoWatch] Rgba8Unorm_sRgb = 71, + [NoMac, iOS (11,0), NoTV, NoWatch] Rgba8Snorm = 72, + [NoMac, iOS (11,0), NoTV, NoWatch] Rgba16Unorm = 73, + [NoMac, iOS (11,0), NoTV, NoWatch] Rgba16Snorm = 74, + [NoMac, iOS (11,0), NoTV, NoWatch] Rgb10A2Unorm = 75, + [NoMac, iOS (11,0), NoTV, NoWatch] Rg11B10Float = 76, + [NoMac, iOS (11,0), NoTV, NoWatch] Rgb9E5Float = 77, } [Native] @@ -572,6 +622,9 @@ public enum MTLArgumentType : nuint { ThreadgroupMemory= 1, Texture = 2, Sampler = 3, + + [NoMac, iOS (11,0), NoTV, NoWatch] ImageblockData = 16, + [NoMac, iOS (11,0), NoTV, NoWatch] Imageblock = 17, } [Native] @@ -598,21 +651,42 @@ public enum MTLFeatureSet : nuint { iOS_GPUFamily2_v3 = 6, [iOS (10,0), NoTV, NoWatch, NoMac] iOS_GPUFamily3_v2 = 7, - - [Mac (10,11)] - OSX_GPUFamily1_v1 = 10000, - - [NoiOS, NoTV, NoWatch, Mac (10,12)] - OSX_GPUFamily1_v2 = 10001, - - [NoiOS, NoTV, NoWatch, Mac (10,12)] - OSX_ReadWriteTextureTier2 = 10002, + [iOS (11,0), NoTV, NoWatch, NoMac] + iOS_GPUFamily1_v4 = 8, + [iOS (11,0), NoTV, NoWatch, NoMac] + iOS_GPUFamily2_v4 = 9, + [iOS (11,0), NoTV, NoWatch, NoMac] + iOS_GPUFamily3_v3 = 10, + [iOS (11,0), NoTV, NoWatch, NoMac] + iOS_GPUFamily4_v1 = 11, + + [Mac (10,11), NoiOS, NoTV, NoWatch] + macOS_GPUFamily1_v1 = 10000, + + [Availability (Introduced = Platform.Mac_10_11, Deprecated = Platform.Mac_10_13, Message="Use 'macOS_GPUFamily1_v1' instead.")] + OSX_GPUFamily1_v1 = macOS_GPUFamily1_v1, + + [Mac (10,13), NoiOS, NoTV, NoWatch] + macOS_GPUFamily1_v2 = 10001, + [Availability (Introduced = Platform.Mac_10_12, Deprecated = Platform.Mac_10_13, Message="Use 'macOS_GPUFamily1_v2' instead.")] + OSX_GPUFamily1_v2 = macOS_GPUFamily1_v2, + + [Mac (10,13), NoiOS, NoTV, NoWatch] + macOS_ReadWriteTextureTier2 = 10002, + [Availability (Introduced = Platform.Mac_10_12, Deprecated = Platform.Mac_10_13, Message="Use 'macOS_ReadWriteTextureTier2' instead.")] + OSX_ReadWriteTextureTier2 = macOS_ReadWriteTextureTier2, + + [Mac (10,13), NoiOS, NoTV, NoWatch] + macOS_GPUFamily1_v3 = 10003, [TV (9,0)] TVOS_GPUFamily1_v1 = 30000, [NoiOS, TV (10,0), NoWatch, NoMac] - tvOS_GPUFamily1_v2 = 30001 + tvOS_GPUFamily1_v2 = 30001, + + [NoiOS, TV (11,0), NoWatch, NoMac] + tvOS_GPUFamily2_v1 = 30003, } [iOS (9,0)][Mac (10,11)] @@ -624,6 +698,8 @@ public enum MTLLanguageVersion : nuint { v1_1 = (1 << 16) + 1, [iOS (10,0), TV (10,0), NoWatch, Mac (10,12)] v1_2 = (1 << 16) + 2, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + v2_0 = (2 << 16), } [iOS (9,0)][Mac (10,11)] @@ -662,6 +738,9 @@ public enum MTLMultisampleDepthResolveFilter : nuint{ Sample0, Min, Max } +#if XAMCORE_4_0 + [NoiOS][NoTV] +#endif [Mac (10,12)] [Native] public enum MTLSamplerBorderColor : nuint { @@ -764,7 +843,27 @@ public enum MTLAttributeFormat : nuint { UInt3 = 38, UInt4 = 39, Int1010102Normalized = 40, - UInt1010102Normalized = 41 + UInt1010102Normalized = 41, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UChar4Normalized_Bgra = 42, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UChar = 45, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + Char = 46, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UCharNormalized = 47, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + CharNormalized = 48, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UShort = 49, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + Short = 50, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + UShortNormalized = 51, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + ShortNormalized = 52, + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + Half = 53, } [iOS (10,0), TV (10,0), NoWatch, Mac (10,12)] @@ -787,5 +886,48 @@ public enum MTLRenderStages : nuint { Vertex = (1 << 0), Fragment = (1 << 1) } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Native, Flags] + public enum MTLResourceUsage : nuint + { + Read = 1 << 0, + Write = 1 << 1, + Sample = 1 << 2, + } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Native] + public enum MTLMutability : nuint + { + Default = 0, + Mutable = 1, + Immutable = 2, + } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Native] + public enum MTLReadWriteTextureTier : nuint + { + None = 0, + One = 1, + Two = 2, + } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Native] + public enum MTLArgumentBuffersTier : nuint + { + One = 0, + Two = 1, + } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Native, Flags] + public enum MTLStoreActionOptions : nuint + { + None = 0, + CustomSamplePositions = 1 << 0, + } } #endif diff --git a/src/Metal/MTLRenderCommandEncoder.cs b/src/Metal/MTLRenderCommandEncoder.cs new file mode 100644 index 000000000000..0cc9c36b1dbb --- /dev/null +++ b/src/Metal/MTLRenderCommandEncoder.cs @@ -0,0 +1,45 @@ +#if XAMCORE_2_0 && MONOMAC +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; + +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Metal { + public static class IMTLRenderCommandEncoder_Extensions { + [Mac (10,13, onlyOn64: true), NoiOS, NoTV, NoWatch] + public unsafe static void SetViewports (this IMTLRenderCommandEncoder This, MTLViewport [] viewports) + { + fixed (void* handle = viewports) + This.SetViewports ((IntPtr)handle, (nuint)(viewports?.Length ?? 0)); + } + + [Mac (10,13, onlyOn64: true), NoiOS, NoTV, NoWatch] + public unsafe static void SetScissorRects (this IMTLRenderCommandEncoder This, MTLScissorRect [] scissorRects) + { + fixed (void* handle = scissorRects) + This.SetScissorRects ((IntPtr)handle, (nuint)(scissorRects?.Length ?? 0)); + } + +#if IOS + [iOS (11,0), NoTV, NoMac, NoWatch] + public unsafe static void SetTileBuffers (this IMTLRenderCommandEncoder This, IMTLBuffer[] buffers, nuint[] offsets, NSRange range) + { + fixed (void* handle = offsets) + This.SetTileBuffers (buffers, (IntPtr)handle, range); + } + + [iOS (11,0), NoTV, NoMac, NoWatch] + public unsafe static void SetTileSamplerStates (this IMTLRenderCommandEncoder This, IMTLSamplerState[] samplers, float[] lodMinClamps, float[] lodMaxClamps, NSRange range) + { + fixed (void* minHandle = lodMinClamps) { + fixed (void* maxHandle = lodMaxClamps) { + This.SetTileSamplerStates (samplers, (IntPtr)minHandle, (IntPtr)maxHandle, range); + } + } + } +#endif + } +} +#endif diff --git a/src/Metal/MTLRenderPassDescriptor.cs b/src/Metal/MTLRenderPassDescriptor.cs new file mode 100644 index 000000000000..1bff58de838a --- /dev/null +++ b/src/Metal/MTLRenderPassDescriptor.cs @@ -0,0 +1,21 @@ +#if XAMCORE_2_0 && !COREBUILD +using System; + +namespace XamCore.Metal { + public partial class MTLRenderPassDescriptor { + public unsafe void SetSamplePositions (MTLSamplePosition [] positions) + { + fixed (void* handle = positions) + SetSamplePositions ((IntPtr)handle, (nuint)(positions?.Length ?? 0)); + } + + public unsafe nuint GetSamplePositions (MTLSamplePosition [] positions) + { + fixed (void* handle = positions) { + nuint count = GetSamplePositions ((IntPtr)handle, (nuint)(positions?.Length ?? 0)); + return count; + } + } + } +} +#endif \ No newline at end of file diff --git a/src/ModelIO/MDLTransform.cs b/src/ModelIO/MDLTransform.cs new file mode 100644 index 000000000000..c8259bd27bb9 --- /dev/null +++ b/src/ModelIO/MDLTransform.cs @@ -0,0 +1,16 @@ +#if XAMCORE_2_0 || !MONOMAC +using System; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; + +namespace XamCore.ModelIO { + public partial class MDLTransform { +#if !XAMCORE_4_0 + // Inlined from the MDLTransformComponent protocol. + public static MatrixFloat4x4 CreateGlobalTransform4x4 (MDLObject obj, double atTime) + { + return MatrixFloat4x4.Transpose ((MatrixFloat4x4) CreateGlobalTransform (obj, atTime)); + } +#endif + } +} +#endif \ No newline at end of file diff --git a/src/ModelIO/MDLTransformComponent.cs b/src/ModelIO/MDLTransformComponent.cs new file mode 100644 index 000000000000..fa59063cac47 --- /dev/null +++ b/src/ModelIO/MDLTransformComponent.cs @@ -0,0 +1,33 @@ +#if XAMCORE_2_0 && !XAMCORE_4_0 +using OpenTK; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; + +namespace XamCore.ModelIO { + public partial class MDLTransformComponent_Extensions { + public static MatrixFloat4x4 GetMatrix4x4 (this IMDLTransformComponent self) + { + return MatrixFloat4x4.Transpose ((MatrixFloat4x4) self.Matrix); + } + + public static void SetMatrix4x4 (this IMDLTransformComponent self, MatrixFloat4x4 value) + { + self.Matrix = (Matrix4) MatrixFloat4x4.Transpose (value); + } + + public static MatrixFloat4x4 GetLocalTransform4x4(this IMDLTransformComponent This, double time) + { + return MatrixFloat4x4.Transpose ((MatrixFloat4x4) GetLocalTransform (This, time)); + } + + public static void SetLocalTransform4x4 (this IMDLTransformComponent This, MatrixFloat4x4 transform, double time) + { + SetLocalTransform (This, (Matrix4) MatrixFloat4x4.Transpose (transform), time); + } + + public static void SetLocalTransform4x4 (this IMDLTransformComponent This, MatrixFloat4x4 transform) + { + SetLocalTransform (This, (Matrix4) MatrixFloat4x4.Transpose (transform)); + } + } +} +#endif \ No newline at end of file diff --git a/src/ModelIO/MIEnums.cs b/src/ModelIO/MIEnums.cs index 3f1bec93727f..586f73b1fe3e 100644 --- a/src/ModelIO/MIEnums.cs +++ b/src/ModelIO/MIEnums.cs @@ -18,6 +18,8 @@ using Vector2 = global::OpenTK.Vector2; using Vector3 = global::OpenTK.Vector3; using Vector4 = global::OpenTK.Vector4; +using Vector4i = global::OpenTK.Vector4i; +using VectorInt4 = global::OpenTK.Vector4i; using Matrix2 = global::OpenTK.Matrix2; using Matrix3 = global::OpenTK.Matrix3; using Matrix4 = global::OpenTK.Matrix4; @@ -250,6 +252,8 @@ public enum MDLLightType : nuint Environment } +#if !XAMCORE_4_0 + [Obsolete ("Use 'MDLVoxelIndexExtent2' instead.")] [StructLayout(LayoutKind.Sequential)] public struct MDLVoxelIndexExtent { public MDLVoxelIndexExtent (Vector4 minimumExtent, Vector4 maximumExtent) @@ -259,6 +263,27 @@ public MDLVoxelIndexExtent (Vector4 minimumExtent, Vector4 maximumExtent) } public Vector4 MinimumExtent, MaximumExtent; } +#endif + + [StructLayout(LayoutKind.Sequential)] +#if XAMCORE_4_0 + public struct MDLVoxelIndexExtent { +#else + public struct MDLVoxelIndexExtent2 { +#endif + public VectorInt4 MinimumExtent { get; private set; } + public VectorInt4 MaximumExtent { get; private set; } + +#if XAMCORE_4_0 + public MDLVoxelIndexExtent (VectorInt4 minimumExtent, VectorInt4 maximumExtent) +#else + public MDLVoxelIndexExtent2 (VectorInt4 minimumExtent, VectorInt4 maximumExtent) +#endif + { + this.MinimumExtent = minimumExtent; + this.MaximumExtent = maximumExtent; + } + } [Native] public enum MDLCameraProjection : nuint diff --git a/src/NativeTypes/Drawing.tt b/src/NativeTypes/Drawing.tt index a4313674e4b7..b0b51f5a23f1 100644 --- a/src/NativeTypes/Drawing.tt +++ b/src/NativeTypes/Drawing.tt @@ -224,13 +224,13 @@ namespace XamCore.CoreGraphics } #if !XAMCORE_3_0 - [Obsolete ("Use ToRoundedCGSize instead")] + [Obsolete ("Use 'ToRoundedCGSize' instead.")] public CGSize ToSize () { return ToRoundedCGSize (); } - [Obsolete ("Use ToCGPoint instead")] + [Obsolete ("Use 'ToCGPoint' instead.")] public CGPoint ToPointF () { return (CGPoint)this; diff --git a/src/NetworkExtension/NECompat.cs b/src/NetworkExtension/NECompat.cs index 913895ed4988..688cede9a80a 100644 --- a/src/NetworkExtension/NECompat.cs +++ b/src/NetworkExtension/NECompat.cs @@ -9,7 +9,7 @@ namespace XamCore.NetworkExtension { #if !XAMCORE_4_0 public partial class NEPacketTunnelNetworkSettings { - [Obsolete ("This constructor does not create a valid instance of the type")] + [Obsolete ("This constructor does not create a valid instance of the type.")] public NEPacketTunnelNetworkSettings () : base (NSObjectFlag.Empty) { } @@ -17,7 +17,7 @@ public NEPacketTunnelNetworkSettings () : base (NSObjectFlag.Empty) public partial class NEPacketTunnelProvider { - [Obsolete ("Use the overload accepting a INWTcpConnectionAuthenticationDelegate argument")] + [Obsolete ("Use the overload accepting a 'INWTcpConnectionAuthenticationDelegate' argument.")] public virtual NWTcpConnection CreateTcpConnection (NWEndpoint remoteEndpoint, bool enableTls, NWTlsParameters tlsParameters, NWTcpConnectionAuthenticationDelegate @delegate) { return CreateTcpConnection (remoteEndpoint, enableTls, tlsParameters, (INWTcpConnectionAuthenticationDelegate) @delegate); @@ -26,7 +26,7 @@ public virtual NWTcpConnection CreateTcpConnection (NWEndpoint remoteEndpoint, b public partial class NWTcpConnectionAuthenticationDelegate : NSObject { - [Obsolete ("Use 'NWTcpConnectionAuthenticationDelegate_Extensions.EvaluateTrustAsync' instead")] + [Obsolete ("Use 'NWTcpConnectionAuthenticationDelegate_Extensions.EvaluateTrustAsync' instead.")] public unsafe virtual Task EvaluateTrustAsync (NWTcpConnection connection, NSArray peerCertificateChain) { return NWTcpConnectionAuthenticationDelegate_Extensions.EvaluateTrustAsync (this, connection, peerCertificateChain); diff --git a/src/ObjCRuntime/Dlfcn.cs b/src/ObjCRuntime/Dlfcn.cs index 7d85761898f8..764c2e832770 100644 --- a/src/ObjCRuntime/Dlfcn.cs +++ b/src/ObjCRuntime/Dlfcn.cs @@ -169,6 +169,22 @@ public static void SetInt32 (IntPtr handle, string symbol, int value) return; Marshal.WriteInt32 (indirect, value); } + + public static uint GetUInt32 (IntPtr handle, string symbol) + { + var indirect = dlsym (handle, symbol); + if (indirect == IntPtr.Zero) + return 0; + return (uint) Marshal.ReadInt32 (indirect); + } + + public static void SetUInt32 (IntPtr handle, string symbol, uint value) + { + var indirect = dlsym (handle, symbol); + if (indirect == IntPtr.Zero) + return; + Marshal.WriteInt32 (indirect, (int) value); + } public static long GetInt64 (IntPtr handle, string symbol) { @@ -186,6 +202,24 @@ public static void SetInt64 (IntPtr handle, string symbol, long value) Marshal.WriteInt64 (indirect, value); } + public static ulong GetUInt64 (IntPtr handle, string symbol) + { + var indirect = dlsym (handle, symbol); + if (indirect == IntPtr.Zero) + return 0; + + return (ulong) Marshal.ReadInt64 (indirect); + } + + public static void SetUInt64 (IntPtr handle, string symbol, long value) + { + var indirect = dlsym (handle, symbol); + if (indirect == IntPtr.Zero) + return; + + Marshal.WriteInt64 (indirect, (long) value); + } + public static void SetString (IntPtr handle, string symbol, string value) { var indirect = dlsym (handle, symbol); @@ -222,11 +256,21 @@ public static nint GetNInt (IntPtr handle, string symbol) return (nint)GetIntPtr (handle, symbol); } + public static void SetNInt (IntPtr handle, string symbol, nint value) + { + SetIntPtr (handle, symbol, (IntPtr) value); + } + public static nuint GetNUInt (IntPtr handle, string symbol) { return (nuint)GetIntPtr (handle, symbol); } + public static void SetNUInt (IntPtr handle, string symbol, nuint value) + { + SetIntPtr (handle, symbol, (IntPtr) value); + } + public static nfloat GetNFloat (IntPtr handle, string symbol) { var indirect = dlsym (handle, symbol); @@ -240,6 +284,18 @@ public static nfloat GetNFloat (IntPtr handle, string symbol) return (nfloat) (*(double *) indirect); } } + + public static void SetNFloat (IntPtr handle, string symbol, nfloat value) + { + var indirect = dlsym (handle, symbol); + if (indirect == IntPtr.Zero) + return; + + unsafe { + nfloat* ptr = (nfloat*) indirect; + *ptr = value; + } + } #endif public static IntPtr GetIntPtr (IntPtr handle, string symbol) diff --git a/src/ObjCRuntime/DynamicRegistrar.cs b/src/ObjCRuntime/DynamicRegistrar.cs index cbba70861e37..b10d69020e8d 100644 --- a/src/ObjCRuntime/DynamicRegistrar.cs +++ b/src/ObjCRuntime/DynamicRegistrar.cs @@ -809,10 +809,10 @@ public void AddCustomType (Type type) custom_type_map [type] = null; } - public UnmanagedMethodDescription GetMethodDescriptionAndObject (Type type, IntPtr selector, IntPtr obj, ref IntPtr mthis) + public UnmanagedMethodDescription GetMethodDescriptionAndObject (Type type, IntPtr selector, bool is_static, IntPtr obj, ref IntPtr mthis) { var sel = new Selector (selector); - var res = GetMethodNoThrow (type, type, sel.Name); + var res = GetMethodNoThrow (type, type, sel.Name, is_static); if (res == null) throw ErrorHelper.CreateError (8006, "Failed to find the selector '{0}' on the type '{1}'", sel.Name, type.FullName); @@ -856,10 +856,10 @@ internal static MethodInfo FindClosedMethod (Type closed_type, MethodBase open_m throw ErrorHelper.CreateError (8003, "Failed to find the closed generic method '{0}' on the type '{1}'.", open_method.Name, closed_type.FullName); } - public UnmanagedMethodDescription GetMethodDescription (Type type, IntPtr selector) + public UnmanagedMethodDescription GetMethodDescription (Type type, IntPtr selector, bool is_static) { var sel = new Selector (selector); - var res = GetMethodNoThrow (type, type, sel.Name); + var res = GetMethodNoThrow (type, type, sel.Name, is_static); if (res == null) throw ErrorHelper.CreateError (8006, "Failed to find the selector '{0}' on the type '{1}'", sel.Name, type.FullName); if (type.IsGenericType && res.Method is ConstructorInfo) @@ -868,7 +868,7 @@ public UnmanagedMethodDescription GetMethodDescription (Type type, IntPtr select return res.MethodDescription.GetUnmanagedDescription (); } - ObjCMethod GetMethodNoThrow (Type original_type, Type type, string selector) + ObjCMethod GetMethodNoThrow (Type original_type, Type type, string selector, bool is_static) { var objcType = RegisterType (type); @@ -877,8 +877,8 @@ ObjCMethod GetMethodNoThrow (Type original_type, Type type, string selector) ObjCMember member = null; - if (type.BaseType != typeof (object) && !objcType.Map.TryGetValue (selector, out member)) - return GetMethodNoThrow (original_type, type.BaseType, selector); + if (type.BaseType != typeof (object) && !objcType.TryGetMember (selector, is_static, out member)) + return GetMethodNoThrow (original_type, type.BaseType, selector, is_static); var method = member as ObjCMethod; diff --git a/src/ObjCRuntime/PlatformAvailability.cs b/src/ObjCRuntime/PlatformAvailability.cs index 8b2e905829a3..46c9643b7c8c 100644 --- a/src/ObjCRuntime/PlatformAvailability.cs +++ b/src/ObjCRuntime/PlatformAvailability.cs @@ -39,7 +39,7 @@ namespace XamCore.ObjCRuntime // Only iOS and Mac versions and architectures can be ORed together. // [Flags] - [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName")] + [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName.")] public enum Platform : ulong { None = 0, @@ -106,7 +106,7 @@ public enum Platform : ulong iOS_Arch = 0x00000000ff000000 } - [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName")] + [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName.")] public static class PlatformHelper { public static bool IsValid (this Platform platform) @@ -348,7 +348,7 @@ public static bool CheckSystemVersion (int major, int minor) } [AttributeUsage (AttributeTargets.All, AllowMultiple = true)] - [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName")] + [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName.")] public class AvailabilityAttribute : Attribute { public static AvailabilityAttribute Merge (IEnumerable attrs) @@ -548,7 +548,7 @@ public override string ToString () } } - [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName")] + [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName.")] public sealed class iOSAttribute : AvailabilityAttribute { public iOSAttribute (byte major, byte minor) @@ -562,7 +562,7 @@ public iOSAttribute (byte major, byte minor, byte subminor) } } - [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName")] + [Obsolete ("Use [Introduced|Deprecated|Obsoleted|Unavailable] attributes with PlatformName.")] public sealed class MacAttribute : AvailabilityAttribute { public MacAttribute (byte major, byte minor) diff --git a/src/ObjCRuntime/Registrar.cs b/src/ObjCRuntime/Registrar.cs index 274b121ca7a1..6c02135f643e 100644 --- a/src/ObjCRuntime/Registrar.cs +++ b/src/ObjCRuntime/Registrar.cs @@ -148,7 +148,7 @@ internal class ObjCType { public List Methods; public List Properties; - public Dictionary Map = new Dictionary (); + Dictionary Map = new Dictionary (); ObjCType superType; @@ -235,8 +235,9 @@ public void Add (ObjCField field, ref List exceptions) { // Check if there are any base types with the same property. var base_type = BaseType; + var fieldNameInDictionary = (field.IsStatic ? "+" : "-") + field.Name; while (base_type != null) { - if (base_type.Fields != null && base_type.Fields.ContainsKey (field.Name)) { + if (base_type.Fields != null && base_type.Fields.ContainsKey (fieldNameInDictionary)) { // Maybe we should warn here? Not sure if this is something bad or not. return; } @@ -248,7 +249,7 @@ public void Add (ObjCField field, ref List exceptions) if (Fields == null) Fields = new Dictionary (); // Do fields and methods live in the same objc namespace? // AddToMap (field, errorIfExists); - Fields.Add (field.Name, field); + Fields.Add (fieldNameInDictionary, field); } public bool Add (ObjCMethod method, ref List exceptions) @@ -332,11 +333,20 @@ void VerifyIsNotKeyword (ref List exceptions, ObjCProperty property) AddException (ref exceptions, CreateException (4164, property, "Cannot export the property '{0}' because its selector '{1}' is an Objective-C keyword. Please use a different name.", property.Name, property.Selector)); } + public bool TryGetMember (string selector, bool is_static, out ObjCMember member) + { + if (is_static) + selector = "+" + selector; + else + selector = "-" + selector; + return Map.TryGetValue (selector, out member); + } + bool AddToMap (ObjCMember member, ref List exceptions) { ObjCMember existing; bool rv = true; - if (Map.TryGetValue (member.Selector, out existing)) { + if (TryGetMember (member.Selector, member.IsNativeStatic, out existing)) { if (existing.IsImplicit) { AddException (ref exceptions, CreateException (4141, member, "Cannot register the selector '{0}' on the member '{1}.{2}' because Xamarin.iOS implicitly registers this selector.", member.Selector, Registrar.GetTypeFullName (Type), Registrar.GetMemberName (member))); } else { @@ -345,7 +355,7 @@ bool AddToMap (ObjCMember member, ref List exceptions) rv = false; } - Map [member.Selector] = member; + Map [(member.IsNativeStatic ? "+" : "-") + member.Selector] = member; return rv; } @@ -458,6 +468,7 @@ public string Selector { } public abstract string FullName { get; } + public abstract bool IsNativeStatic { get; } public virtual bool IsImplicit { get { return false; } } protected string ToSignature (TType type, ref bool success) @@ -571,6 +582,12 @@ public bool IsStatic { set { is_static = value; } } + public override bool IsNativeStatic { + get { + return IsStatic && !IsCategoryInstance; + } + } + public bool IsCategoryInstance { get { return IsCategory && Registrar.HasThisAttribute (Method); @@ -751,6 +768,10 @@ public bool IsStatic { set { is_static = value; } } + public override bool IsNativeStatic { + get { return IsStatic; } + } + public ObjCProperty () : base () { } @@ -771,12 +792,22 @@ internal class ObjCField : ObjCMember { #endif public string FieldType; public bool IsProperty; + bool is_static; public override string FullName { get { return Registrar.GetTypeFullName (DeclaringType.Type) + "." + Name; } } + + public bool IsStatic { + get { return is_static; } + set { is_static = value; } + } + + public override bool IsNativeStatic { + get { return IsStatic; } + } } protected virtual void OnRegisterType (ObjCType type) {} @@ -1618,6 +1649,7 @@ ObjCType RegisterTypeUnsafe (TType type, ref List exceptions) FieldType = "XamarinObject",// "^v", // void* Name = "__monoObjectGCHandle", IsPrivate = SupportsModernObjectiveC, + IsStatic = false, }, ref exceptions); } #endif @@ -1727,6 +1759,7 @@ ObjCType RegisterTypeUnsafe (TType type, ref List exceptions) #endif FieldType = "@", IsProperty = true, + IsStatic = IsStatic (property), }, ref exceptions); } } diff --git a/src/ObjCRuntime/Runtime.cs b/src/ObjCRuntime/Runtime.cs index 504827c8f664..0cccffad8d86 100644 --- a/src/ObjCRuntime/Runtime.cs +++ b/src/ObjCRuntime/Runtime.cs @@ -556,10 +556,10 @@ static IntPtr GetSelectorHandle (IntPtr sel) return ((Selector) ObjectWrapper.Convert (sel)).Handle; } - static UnmanagedMethodDescription GetMethodForSelector (IntPtr cls, IntPtr sel) + static UnmanagedMethodDescription GetMethodForSelector (IntPtr cls, IntPtr sel, bool is_static) { // This is called by the old registrar code. - return Registrar.GetMethodDescription (Class.Lookup (cls), sel); + return Registrar.GetMethodDescription (Class.Lookup (cls), sel, is_static); } static IntPtr GetNSObjectWrapped (IntPtr ptr) @@ -675,9 +675,9 @@ static bool IsParameterOut (IntPtr info, int parameter) return parameters [parameter].IsOut; } - static UnmanagedMethodDescription GetMethodAndObjectForSelector (IntPtr klass, IntPtr sel, IntPtr obj, ref IntPtr mthis) + static UnmanagedMethodDescription GetMethodAndObjectForSelector (IntPtr klass, IntPtr sel, bool is_static, IntPtr obj, ref IntPtr mthis) { - return Registrar.GetMethodDescriptionAndObject (Class.Lookup (klass), sel, obj, ref mthis); + return Registrar.GetMethodDescriptionAndObject (Class.Lookup (klass), sel, is_static, obj, ref mthis); } static int CreateProductException (int code, string msg) @@ -954,6 +954,11 @@ static NSObject ConstructNSObject (IntPtr ptr, IntPtr klass, MissingCtorResoluti } } + internal static T ConstructNSObject (IntPtr ptr) where T: NSObject + { + return ConstructNSObject (ptr, typeof (T), MissingCtorResolution.ThrowConstructor1NotFound); + } + // The generic argument T is only used to cast the return value. static T ConstructNSObject (IntPtr ptr, Type type, MissingCtorResolution missingCtorResolution) where T: class, INativeObject { diff --git a/src/ObjCRuntime/Runtime.iOS.cs b/src/ObjCRuntime/Runtime.iOS.cs index 8244b259b783..808b1daccd45 100644 --- a/src/ObjCRuntime/Runtime.iOS.cs +++ b/src/ObjCRuntime/Runtime.iOS.cs @@ -69,13 +69,13 @@ static public List GetSurfacedObjects () } #if TVOS || WATCH - [Advice ("This method is present only to help porting code")] + [Advice ("This method is present only to help porting code.")] public static void StartWWAN (Uri uri, Action callback) { NSRunLoop.Main.BeginInvokeOnMainThread (() => callback (null)); } - [Advice ("This method is present only to help porting code")] + [Advice ("This method is present only to help porting code.")] public static void StartWWAN (Uri uri) { } diff --git a/src/PassKit/PKEnums.cs b/src/PassKit/PKEnums.cs index 6fb91b81d305..af88f43e0c25 100644 --- a/src/PassKit/PKEnums.cs +++ b/src/PassKit/PKEnums.cs @@ -19,6 +19,7 @@ public enum PKErrorCode { // NSInteger -> PKPass.h [iOS (6,0)] + [ErrorDomain ("PKPassKitErrorDomain")] [Native] public enum PKPassKitErrorCode : nint { Unknown = -1, @@ -54,9 +55,19 @@ public enum PKPassType : nuint { public enum PKPaymentAuthorizationStatus : nint { Success, Failure, + + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'Failure' and 'PKPaymentRequest.CreatePaymentBillingAddressInvalidError'.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'Failure' and 'PKPaymentRequest.CreatePaymentBillingAddressInvalidError'.")] InvalidBillingPostalAddress, + + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'Failure' and 'PKPaymentRequest.CreatePaymentShippingAddressInvalidError'.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'Failure' and 'PKPaymentRequest.CreatePaymentShippingAddressInvalidError'.")] InvalidShippingPostalAddress, + + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'Failure' and 'PKPaymentRequest.CreatePaymentContactInvalidError'.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'Failure' and 'PKPaymentRequest.CreatePaymentContactInvalidError'.")] InvalidShippingContact, + [iOS (9,2)] PinRequired, [iOS (9,2)] @@ -80,6 +91,8 @@ public enum PKMerchantCapability : nuint { } [Watch (3,0)] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'PKContactField' instead.")] + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'PKContactField' instead.")] [Native] [Flags] public enum PKAddressField : nuint { @@ -175,4 +188,14 @@ public enum PKAddPassButtonStyle : nint { Black = 0, Outline } + + [Watch (4,0)][iOS (11,0)] + [ErrorDomain ("PKPaymentErrorDomain")] + [Native] + public enum PKPaymentErrorCode : nint { + Unknown = -1, + ShippingContactInvalid = 1, + BillingContactInvalid, + ShippingAddressUnserviceable, + } } diff --git a/src/PassKit/PKPaymentRequest.cs b/src/PassKit/PKPaymentRequest.cs new file mode 100644 index 000000000000..311d6aa3747a --- /dev/null +++ b/src/PassKit/PKPaymentRequest.cs @@ -0,0 +1,56 @@ +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.PassKit { + + public partial class PKContactFieldsExtensions { + + static public PKContactFields GetValue (NSSet set) + { + var fields = PKContactFields.None; + if (set == null) + return fields; + + foreach (PKContactFields value in Enum.GetValues (typeof (PKContactFields))) { + var constant = value.GetConstant (); + // None does not have an associated native value and Contains would throw an ANE + if ((constant != null) && set.Contains (constant)) + fields |= value; + } + return fields; + } + + static public NSSet GetSet (PKContactFields values) + { + var set = new NSMutableSet (); + if (values == PKContactFields.None) + return set; + + foreach (PKContactFields value in Enum.GetValues (typeof (PKContactFields))) { + if (values.HasFlag (value)) { + var constant = value.GetConstant (); + // None does not have an associated native value and Contains would throw an ANE + if (constant != null) + set.Add (constant); + } + } + return set; + } + } + + public partial class PKPaymentRequest { + + [Watch (4,0)][iOS (11,0)] + public PKContactFields RequiredBillingContactFields { + get { return PKContactFieldsExtensions.GetValue (WeakRequiredBillingContactFields); } + set { WeakRequiredBillingContactFields = PKContactFieldsExtensions.GetSet (value); } + } + + [Watch (4,0)][iOS (11,0)] + public PKContactFields RequiredShippingContactFields { + get { return PKContactFieldsExtensions.GetValue (WeakRequiredShippingContactFields); } + set { WeakRequiredShippingContactFields = PKContactFieldsExtensions.GetSet (value); } + } + } +} diff --git a/src/PdfKit/Enums.cs b/src/PdfKit/Enums.cs index 28342d6bd75f..1763f9e198ba 100644 --- a/src/PdfKit/Enums.cs +++ b/src/PdfKit/Enums.cs @@ -29,9 +29,11 @@ using System; using XamCore.ObjCRuntime; +#if MONOMAC || (IOS && XAMCORE_2_0) namespace XamCore.PdfKit { + [iOS (11,0)] [Native] public enum PdfActionNamedName : nint { None = 0, @@ -48,6 +50,7 @@ public enum PdfActionNamedName : nint { ZoomOut = 11 } + [iOS (11,0)] [Native] public enum PdfWidgetControlType : nint { Unknown = -1, @@ -56,6 +59,7 @@ public enum PdfWidgetControlType : nint { CheckBox = 2 } + [iOS (11,0)] [Native] public enum PdfLineStyle : nint { None = 0, @@ -66,6 +70,7 @@ public enum PdfLineStyle : nint { ClosedArrow = 5 } + [iOS (11,0)] [Native] public enum PdfMarkupType : nint { Highlight = 0, @@ -73,6 +78,7 @@ public enum PdfMarkupType : nint { Underline = 2 } + [iOS (11,0)] [Native] public enum PdfTextAnnotationIconType : nint { Comment = 0, @@ -84,6 +90,7 @@ public enum PdfTextAnnotationIconType : nint { Insert = 6 } + [iOS (11,0)] [Native] public enum PdfBorderStyle : nint { Solid = 0, @@ -93,6 +100,7 @@ public enum PdfBorderStyle : nint { Underline = 4 } + [iOS (11,0)] [Native] public enum PdfPrintScalingMode : nint { None = 0, @@ -100,6 +108,7 @@ public enum PdfPrintScalingMode : nint { DownToFit = 2 } + [iOS (11,0)] [Native] public enum PdfDocumentPermissions : nint { None = 0, @@ -107,6 +116,7 @@ public enum PdfDocumentPermissions : nint { Owner = 2 } + [iOS (11,0)] [Native] public enum PdfDisplayBox : nint { Media = 0, @@ -116,6 +126,7 @@ public enum PdfDisplayBox : nint { Art = 4 } + [iOS (11,0)] [Native] public enum PdfDisplayMode : nint { SinglePage = 0, @@ -124,6 +135,7 @@ public enum PdfDisplayMode : nint { TwoUpContinuous = 3 } + [iOS (11,0)] [Flags] [Native] public enum PdfAreaOfInterest : nint { @@ -138,4 +150,37 @@ public enum PdfAreaOfInterest : nint { PopupArea = 1 << 7, ImageArea = 1 << 8 } + + [Mac (10,13)] + [iOS (11,0)] + [Native] + public enum PdfDisplayDirection : nint { + Vertical = 0, + Horizontal = 1, + } + + [iOS (11,0), Mac (10,7)] + [Native] + public enum PdfInterpolationQuality : nint { + None = 0, + Low = 1, + High = 2, + } + + [NoMac] + [iOS (11,0)] + [Native] + public enum PdfThumbnailLayoutMode : nint { + Vertical = 0, + Horizontal = 1, + } + + [iOS (11,0), Mac (10,12)] + [Native] + public enum PdfWidgetCellState : nint { + Mixed = -1, + Off = 0, + On = 1, + } } +#endif diff --git a/src/PdfKit/PdfAnnotation.cs b/src/PdfKit/PdfAnnotation.cs new file mode 100644 index 000000000000..8c4124062e7c --- /dev/null +++ b/src/PdfKit/PdfAnnotation.cs @@ -0,0 +1,73 @@ +// +// PdfAnnotation.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +using System; +using XamCore.CoreGraphics; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +#if XAMCORE_2_0 +namespace XamCore.PdfKit { + public partial class PdfAnnotation { + + [Mac (10,12)] + public bool SetValue (T value, PdfAnnotationKey key) where T : class, INativeObject + { + if (value == null) + throw new ArgumentNullException (nameof (value)); + + return _SetValue (value.Handle, key.GetConstant ()); + } + + [Mac (10,12)] + public bool SetValue (string str, PdfAnnotationKey key) + { + var nstr = NSString.CreateNative (str); + try { + return _SetValue (nstr, key.GetConstant ()); + } finally { + NSString.ReleaseNative (nstr); + } + } + + [Mac (10,12)] + public T GetValue (PdfAnnotationKey key) where T : class, INativeObject + { + return Runtime.GetINativeObject (_GetValue (key.GetConstant ()), true); + } + + public PdfAnnotationKey AnnotationType { + get { return PdfAnnotationKeyExtensions.GetValue ((NSString) Type); } + set { Type = value.GetConstant (); } + } + + [Mac (10,13)] + public CGPoint[] QuadrilateralPoints { + get { + return NSArray.ArrayFromHandleFunc (_QuadrilateralPoints, (v) => + { + using (var value = new NSValue (v)) + return value.CGPointValue; + }); + } + set { + if (value == null) { + _QuadrilateralPoints = IntPtr.Zero; + } else { + using (var arr = new NSMutableArray ()) { + for (int i = 0; i < value.Length; i++) + arr.Add (NSValue.FromCGPoint (value [i])); + _QuadrilateralPoints = arr.Handle; + } + } + } + } + } +} +#endif // XAMCORE_2_0 diff --git a/src/PdfKit/PdfKit.cs b/src/PdfKit/PdfKit.cs index c2b80f483907..bd56bab0110a 100644 --- a/src/PdfKit/PdfKit.cs +++ b/src/PdfKit/PdfKit.cs @@ -29,6 +29,7 @@ nfloat [] DashPattern { } } +#if !IOS partial class PdfAnnotationMarkup { CGPoint [] QuadrilateralPoints { get { @@ -52,5 +53,6 @@ CGPoint [] QuadrilateralPoints { } } } +#endif // !IOS } #endif diff --git a/src/Photos/Enums.cs b/src/Photos/Enums.cs index c70d70e03543..304ff20f42c6 100644 --- a/src/Photos/Enums.cs +++ b/src/Photos/Enums.cs @@ -18,7 +18,7 @@ public enum PHImageContentMode : nint { // NSInteger -> PHImageManager.h [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [Native] public enum PHImageRequestOptionsVersion : nint { Current = 0, @@ -29,7 +29,7 @@ public enum PHImageRequestOptionsVersion : nint { // NSInteger -> PHImageManager.h [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [Native] public enum PHImageRequestOptionsDeliveryMode : nint { Opportunistic = 0, @@ -40,7 +40,7 @@ public enum PHImageRequestOptionsDeliveryMode : nint { // NSInteger -> PHImageManager.h [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [Native] public enum PHImageRequestOptionsResizeMode : nint { None = 0, @@ -96,9 +96,9 @@ public enum PHCollectionListSubtype : nint { #if !XAMCORE_3_0 // this was added in the wrong enum type (ref bug #40019) - [Obsolete ("Incorrect value (exists in PHAssetCollectionSubtype)")] + [Obsolete ("Incorrect value (exists in 'PHAssetCollectionSubtype').")] SmartAlbumSelfPortraits = 210, - [Obsolete ("Incorrect value (exists in PHAssetCollectionSubtype)")] + [Obsolete ("Incorrect value (exists in 'PHAssetCollectionSubtype').")] SmartAlbumScreenshots = 211, #endif #if XAMCORE_2_0 @@ -162,10 +162,15 @@ public enum PHAssetCollectionSubtype : nint { SmartAlbumSelfPortraits = 210, [iOS (9,0)] SmartAlbumScreenshots = 211, - [iOS (10,2), TV (10,1)] + [iOS (10,2), TV (10,1)][Mac (10,13, onlyOn64 : true)] SmartAlbumDepthEffect = 212, - [iOS (10,3), TV (10,2)] + [iOS (10,3), TV (10,2)][Mac (10,13, onlyOn64 : true)] SmartAlbumLivePhotos = 213, + [iOS (11,0)][TV(11,0)][NoMac] + SmartAlbumAnimated = 214, + [iOS (11,0)][TV(11,0)][NoMac] + SmartAlbumLongExposures = 215, + #if XAMCORE_2_0 Any = Int64.MaxValue #else @@ -231,7 +236,7 @@ public enum PHAssetBurstSelectionType : nuint { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [Native] public enum PHAuthorizationStatus : nint { NotDetermined, Restricted, Denied, Authorized @@ -274,4 +279,53 @@ public enum PHLivePhotoFrameType : nint { Photo, Video } + + [TV (11,0), iOS (11,0)] + [Mac (10,13, onlyOn64 : true)] + [Native] + public enum PHAssetPlaybackStyle : nint { + Unsupported = 0, + Image = 1, + ImageAnimated = 2, + LivePhoto = 3, + Video = 4, + VideoLooping = 5, + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [Native] + public enum PHProjectTextElementType : nint { + Body = 0, + Title, + Subtitle, + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [Native] + public enum PHProjectCreationSource : nint { + Undefined = 0, + UserSelection = 1, + Album = 2, + Memory = 3, + Moment = 4, + Project = 20, + ProjectBook = 21, + ProjectCalendar = 22, + ProjectCard = 23, + ProjectPrintOrder = 24, + ProjectSlideshow = 25, + ProjectExtension = 26, + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [Native] + public enum PHProjectSectionType : nint { + Undefined = 0, + Cover = 1, + Content = 2, + Auxiliary = 3, + } } diff --git a/src/Photos/PHCompat.cs b/src/Photos/PHCompat.cs index 545e41fe2789..29f0e9537390 100644 --- a/src/Photos/PHCompat.cs +++ b/src/Photos/PHCompat.cs @@ -8,13 +8,13 @@ namespace XamCore.Photos { public partial class PHContentEditingInputRequestOptions { - [Obsolete ("Use CanHandleAdjustmentData property")] + [Obsolete ("Use 'CanHandleAdjustmentData' property.")] public virtual void SetCanHandleAdjustmentDataHandler (Func canHandleAdjustmentDataPredicate) { CanHandleAdjustmentData = canHandleAdjustmentDataPredicate; } - [Obsolete ("Use ProgressHandler property")] + [Obsolete ("Use 'ProgressHandler' property.")] public virtual void SetProgressHandler (PHProgressHandler progressHandler) { ProgressHandler = progressHandler; diff --git a/src/PhotosUI/PHEnums.cs b/src/PhotosUI/PHEnums.cs index a9fbb023cd06..d5fdf07ec588 100644 --- a/src/PhotosUI/PHEnums.cs +++ b/src/PhotosUI/PHEnums.cs @@ -2,7 +2,7 @@ using XamCore.ObjCRuntime; namespace XamCore.PhotosUI { - +#if !MONOMAC [TV (10,0)] [iOS (9,1)] [Native] @@ -22,4 +22,5 @@ public enum PHLivePhotoBadgeOptions : nuint { OverContent = 1 << 0, LiveOff = 1 << 1, } +#endif } diff --git a/src/ReplayKit/RPEnums.cs b/src/ReplayKit/RPEnums.cs index 76ee02f715c5..2689b9d664d4 100644 --- a/src/ReplayKit/RPEnums.cs +++ b/src/ReplayKit/RPEnums.cs @@ -27,6 +27,10 @@ public enum RPRecordingError : nint { ContentResize = -5807, BroadcastInvalidSession = -5808, SystemDormancy = -5809, + Entitlements = -5810, + ActivePhoneCall = -5811, + FailedToSave = -5812, + CarPlay = -5813, } [NoiOS] @@ -45,4 +49,12 @@ public enum RPSampleBufferType : nint { AudioApp, AudioMic } + + [Native] + [iOS (11,0)] + [NoTV] + public enum RPCameraPosition : nint { + Front = 1, + Back, + } } \ No newline at end of file diff --git a/src/SafariServices/SSEnums.cs b/src/SafariServices/SSEnums.cs index 0519b95789fe..5230e8d5e8dd 100644 --- a/src/SafariServices/SSEnums.cs +++ b/src/SafariServices/SSEnums.cs @@ -12,15 +12,16 @@ namespace XamCore.SafariServices { // NSInteger -> SSReadingList.h - [NoMac] + [NoMac][iOS (7,0)] [Native] + [ErrorDomain ("SSReadingListErrorDomain")] public enum SSReadingListError : nint { UrlSchemeNotAllowed = 1 } [NoMac] [iOS (9,0)] - [Deprecated (PlatformName.iOS, 10,0, message: "Use SFErrorCode enum")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'SFErrorCode' enum.")] [Native] [ErrorDomain ("SFContentBlockerErrorDomain")] public enum SFContentBlockerErrorCode : nint { @@ -40,4 +41,31 @@ public enum SFErrorCode : nint NoAttachmentFound = 2, LoadingInterrupted = 3 } + + [NoMac] + [iOS (11,0)] + [Native] + public enum SFSafariViewControllerDismissButtonStyle : nint { + Done, + Close, + Cancel, + } + + [NoMac] + [iOS (11,0)] + [Native] + [ErrorDomain ("SFAuthenticationErrorDomain")] + public enum SFAuthenticationError : nint { + CanceledLogin = 1, + } + + [NoiOS] + [Mac (10,12,4, only64: true)] + [Native] + public enum SFSafariServicesVersion : nint { + V10_0, + V10_1, + [Mac (10,13, only64: true)] + V11_0, + } } diff --git a/src/SceneKit/Defs.cs b/src/SceneKit/Defs.cs index b84ab9c22436..e19a1d7fbcea 100644 --- a/src/SceneKit/Defs.cs +++ b/src/SceneKit/Defs.cs @@ -42,7 +42,10 @@ public enum SCNGeometryPrimitiveType : nint { [Native] public enum SCNTransparencyMode : nint { AOne, - RgbZero + RgbZero, + SingleLayer = 2, + DualLayer = 3, + Default = AOne, } [Watch (3,0)] @@ -306,7 +309,8 @@ public enum SCNBlendMode : nint Subtract = 2, Multiply = 3, Screen = 4, - Replace = 5 + Replace = 5, + Max = 6, } [Watch (3,0)] @@ -321,7 +325,12 @@ public enum SCNDebugOptions : nuint ShowLightInfluences = 1 << 2, ShowLightExtents = 1 << 3, ShowPhysicsFields = 1 << 4, - ShowWireframe = 1 << 5 + ShowWireframe = 1 << 5, + RenderAsWireframe = 1 << 6, + ShowSkeletons = 1 << 7, + ShowCreases = 1 << 8, + ShowConstraints = 1 << 9, + ShowCameras = 1 << 10, } [Watch (3,0)] @@ -356,4 +365,71 @@ public enum SCNMovabilityHint : nint { Fixed, Movable } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum SCNColorMask : nint + { + None = 0, + Red = 1 << 3, + Green = 1 << 2, + Blue = 1 << 1, + Alpha = 1 << 0, + All = 15, + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum SCNInteractionMode : nint + { + Fly, + OrbitTurntable, + OrbitAngleMapping, + OrbitCenteredArcball, + OrbitArcball, + Pan, + Truck, + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum SCNFillMode : nuint + { + Fill = 0, + Lines = 1, + } + + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [Native] + public enum SCNTessellationSmoothingMode : nint + { + None = 0, + PNTriangles, + Phong, + } + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum SCNHitTestSearchMode : nint + { + Closest = 0, + All = 1, + Any = 2, + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum SCNCameraProjectionDirection : nint + { + Vertical = 0, + Horizontal = 1, + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Native] + public enum SCNNodeFocusBehavior : nint + { + None = 0, + Occluding, + Focusable, + } } diff --git a/src/SceneKit/SCNCompat.cs b/src/SceneKit/SCNCompat.cs index e29abb0c53fe..eb85fed4ad08 100644 --- a/src/SceneKit/SCNCompat.cs +++ b/src/SceneKit/SCNCompat.cs @@ -10,7 +10,7 @@ namespace XamCore.SceneKit { #if !XAMCORE_3_0 partial class SCNAction { - [Obsolete ("Use TimingFunction property")] + [Obsolete ("Use 'TimingFunction' property.")] public virtual void SetTimingFunction (Action timingFunction) { TimingFunction = timingFunction; @@ -19,15 +19,15 @@ public virtual void SetTimingFunction (Action timingFunction) #elif TVOS && !XAMCORE_4_0 partial class SCNMaterialProperty { [Introduced (PlatformName.iOS, 8, 0)] - [Deprecated (PlatformName.iOS, 10, 0, message: "Deprecated")] - [Deprecated (PlatformName.TvOS, 10, 0, message: "Deprecated in iOS 10 but removed from tvOS 10")] + [Deprecated (PlatformName.iOS, 10, 0)] + [Deprecated (PlatformName.TvOS, 10, 0, message: "This API has been totally removed on tvOS.")] public virtual NSObject BorderColor { get; set; } } partial class SCNRenderer { [Introduced (PlatformName.iOS, 8, 0)] - [Deprecated (PlatformName.iOS, 9, 0, message: "Deprecated")] - [Deprecated (PlatformName.TvOS, 10, 0, message: "Deprecated in iOS 9 but removed from tvOS 10")] + [Deprecated (PlatformName.iOS, 9, 0)] + [Deprecated (PlatformName.TvOS, 10, 0, message: "This API has been totally removed on tvOS.")] public virtual void Render () { } @@ -36,14 +36,14 @@ public virtual void Render () #if MONOMAC && !XAMCORE_4_0 partial class SCNScene { - [Obsolete ("Use the ISCNSceneExportDelegate overload instead")] + [Obsolete ("Use the 'ISCNSceneExportDelegate' overload instead.")] [Mac (10, 9)] public virtual bool WriteToUrl (NSUrl url, SCNSceneLoadingOptions options, SCNSceneExportDelegate handler, SCNSceneExportProgressHandler exportProgressHandler) { return WriteToUrl (url: url, options: options == null ? null : options.Dictionary, aDelegate: handler, exportProgressHandler: exportProgressHandler); } - [Obsolete ("Use the ISCNSceneExportDelegate overload instead")] + [Obsolete ("Use the 'ISCNSceneExportDelegate' overload instead.")] [Mac (10, 9)] public virtual bool WriteToUrl (NSUrl url, NSDictionary options, SCNSceneExportDelegate handler, SCNSceneExportProgressHandler exportProgressHandler) { @@ -56,7 +56,7 @@ public virtual bool WriteToUrl (NSUrl url, NSDictionary options, SCNSceneExportD #if XAMCORE_2_0 || !MONOMAC public abstract partial class SCNSceneRenderer : NSObject { [Introduced (PlatformName.MacOSX, 10, 10)] - [Obsolete ("Use 'SCNSceneRenderer_Extensions.PrepareAsync' instead")] + [Obsolete ("Use 'SCNSceneRenderer_Extensions.PrepareAsync' instead.")] public unsafe virtual Task PrepareAsync (NSObject[] objects) { return SCNSceneRenderer_Extensions.PrepareAsync (this, objects); @@ -64,7 +64,7 @@ public unsafe virtual Task PrepareAsync (NSObject[] objects) [Introduced (PlatformName.iOS, 9, 0)] [Introduced (PlatformName.MacOSX, 10, 11, PlatformArchitecture.Arch64)] - [Obsolete ("Use 'SCNSceneRenderer_Extensions.PresentSceneAsync' instead")] + [Obsolete ("Use 'SCNSceneRenderer_Extensions.PresentSceneAsync' instead.")] public unsafe virtual Task PresentSceneAsync (SCNScene scene, global::XamCore.SpriteKit.SKTransition transition, SCNNode pointOfView) { return SCNSceneRenderer_Extensions.PresentSceneAsync (this, scene, transition, pointOfView); diff --git a/src/SceneKit/SCNGeometry.cs b/src/SceneKit/SCNGeometry.cs index f4b76d167030..21326fac11a1 100644 --- a/src/SceneKit/SCNGeometry.cs +++ b/src/SceneKit/SCNGeometry.cs @@ -14,7 +14,7 @@ namespace XamCore.SceneKit { public partial class SCNGeometry { #if !XAMCORE_3_0 - [Obsolete ("Use the Create(SCNGeometrySource[], SCNGeometryElement[]) method instead, as it has a strongly typed return")] + [Obsolete ("Use the 'Create (SCNGeometrySource[], SCNGeometryElement[])' method instead, as it has a strongly typed return.")] public static NSObject FromSources (SCNGeometrySource [] sources, SCNGeometryElement [] elements) { return Create (sources, elements); diff --git a/src/SceneKit/SCNNode.cs b/src/SceneKit/SCNNode.cs index 58fbf2d73260..8feb48ce53e4 100644 --- a/src/SceneKit/SCNNode.cs +++ b/src/SceneKit/SCNNode.cs @@ -122,7 +122,7 @@ public bool IsAnimationPaused (string key) // but the actual objective-c definition of the block is // void (^)(SCNNode *child, BOOL *stop) // - [Obsolete ("Use the overload that takes a SCNNodeHandler instead")] + [Obsolete ("Use the overload that takes a 'SCNNodeHandler' instead.")] public virtual void EnumerateChildNodes (SCNNodePredicate predicate) { SCNNodeHandler predHandler = (SCNNode node, out bool stop) => { diff --git a/src/SceneKit/SCNQuaternion.cs b/src/SceneKit/SCNQuaternion.cs index 1bcff108fe20..35d8158e4b42 100644 --- a/src/SceneKit/SCNQuaternion.cs +++ b/src/SceneKit/SCNQuaternion.cs @@ -399,7 +399,7 @@ public static void Multiply(ref SCNQuaternion quaternion, float scale, out SCNQu } #if !XAMCORE_2_0 - [Obsolete ("Use the overload without the ref float scale")] + [Obsolete ("Use the overload without the 'ref float scale'.")] public static void Multiply(ref SCNQuaternion quaternion, ref float scale, out SCNQuaternion result) { result = new SCNQuaternion(quaternion.X * scale, quaternion.Y * scale, quaternion.Z * scale, quaternion.W * scale); diff --git a/src/Security/Enums.cs b/src/Security/Enums.cs index a728c8f8688c..400a06004dfc 100644 --- a/src/Security/Enums.cs +++ b/src/Security/Enums.cs @@ -312,7 +312,7 @@ public enum SecStatusCode { InvalidCertAuthority = -67826, /* The certificate authority was not valid. */ InvalidCRLAuthority = -67827, /* The CRL authority was not valid. */ #if MONOMAC - [Obsolete ("Use InvalidCRLAuthority")] + [Obsolete ("Use InvalidCRLAuthority.")] InvaldCRLAuthority = InvalidCRLAuthority, #endif InvalidCRLEncoding = -67828, /* The CRL encoding was not valid. */ @@ -341,7 +341,7 @@ public enum SecStatusCode { InvalidBaseACLs = -67851, /* The base ACLs are not valid. */ InvalidTupleCredentials = -67852, /* The tuple credentials are not valid. */ #if MONOMAC - [Obsolete ("Use InvalidTupleCredentials")] + [Obsolete ("Use InvalidTupleCredentials.")] InvalidTupleCredendtials = InvalidTupleCredentials, #endif InvalidEncoding = -67853, /* The encoding was not valid. */ @@ -404,10 +404,10 @@ public enum SecPadding { [iOS (8,3)] Raw = 0x4000, - [Obsolete ("Hash algorithm is deprecated")][NoTV][NoWatch] + [Obsolete ("Don't use hash algorithm.")][NoTV][NoWatch] PKCS1MD2 = 0x8000, - [Obsolete ("Hash algorithm is deprecated")][NoTV][NoWatch] + [Obsolete ("Don't use hash algorithm.")][NoTV][NoWatch] PKCS1MD5 = 0x8001, PKCS1SHA1 = 0x8002, diff --git a/src/Security/SecureTransport.cs b/src/Security/SecureTransport.cs index 9e575f1e8737..b73d72fe7aa3 100644 --- a/src/Security/SecureTransport.cs +++ b/src/Security/SecureTransport.cs @@ -266,5 +266,11 @@ public enum SslCipherSuite : ushort { TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030, // iOS 9+ TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 = 0xC031, // iOS 9+ TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 = 0xC032, // iOS 9+ + + TLS_AES_128_GCM_SHA256 = 0x1301, // iOS 11+ + TLS_AES_256_GCM_SHA384 = 0x1302, // iOS 11+ + TLS_CHACHA20_POLY1305_SHA256 = 0x1303, // iOS 11+ + TLS_AES_128_CCM_SHA256 = 0x1304, // iOS 11+ + TLS_AES_128_CCM_8_SHA256 = 0x1305, // iOS 11+ } } diff --git a/src/Security/SslContext.cs b/src/Security/SslContext.cs index cd4fb96e86ca..b37eea568851 100644 --- a/src/Security/SslContext.cs +++ b/src/Security/SslContext.cs @@ -507,7 +507,7 @@ public SslClientCertificateState ClientCertificateState { [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11)] extern unsafe static /* OSStatus */ SslStatus SSLSetEncryptionCertificate (/* SSLContextRef */ IntPtr context, /* CFArrayRef */ IntPtr certRefs); - [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Export ciphers are not available anymore")] + [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Export ciphers are not available anymore.")] public SslStatus SetEncryptionCertificate (SecIdentity identify, IEnumerable certificates) { using (var array = Bundle (identify, certificates)) { @@ -542,8 +542,8 @@ public static IntPtr GetTypeId () // TODO: Headers say /* Deprecated, does nothing */ but we are not completly sure about it since there is no deprecation macro // Plus they added new members to SslSessionStrengthPolicy enum opened radar://23379052 https://trello.com/c/NbdTLVD3 // Xcode 8 beta 1: the P/Invoke was removed completely. - [Availability (Deprecated = Platform.iOS_9_2 | Platform.Mac_10_11, Unavailable = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "SetSessionStrengthPolicy is not available anymore")] - [Obsolete ("SetSessionStrengthPolicy is not available anymore.")] + [Availability (Deprecated = Platform.iOS_9_2 | Platform.Mac_10_11, Unavailable = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "'SetSessionStrengthPolicy' is not available anymore.")] + [Obsolete ("'SetSessionStrengthPolicy' is not available anymore.")] public SslStatus SetSessionStrengthPolicy (SslSessionStrengthPolicy policyStrength) { Console.WriteLine ("SetSessionStrengthPolicy is not available anymore."); diff --git a/src/Simd/MatrixDouble4x4.cs b/src/Simd/MatrixDouble4x4.cs new file mode 100644 index 000000000000..969c5b03e967 --- /dev/null +++ b/src/Simd/MatrixDouble4x4.cs @@ -0,0 +1,335 @@ +// +// MatrixDouble4x4.cs: +// This represents the native matrix_double4x4 type, which has a column-major layout +// (as opposed to OpenTK.Matrix4d, which has a row-major layout). +// +// Authors: +// Rolf Bjarne Kvinge +// Alex Soto +// +// Copyright (c) 2017 Microsoft Inc +// + + +using System; +using System.Runtime.InteropServices; + +namespace OpenTK +{ + [StructLayout (LayoutKind.Sequential)] + public struct NMatrix4d : IEquatable + { + public double M11; + public double M21; + public double M31; + public double M41; + + public double M12; + public double M22; + public double M32; + public double M42; + + public double M13; + public double M23; + public double M33; + public double M43; + + public double M14; + public double M24; + public double M34; + public double M44; + + public readonly static NMatrix4d Identity = new NMatrix4d { + M11 = 1, + M22 = 1, + M33 = 1, + M44 = 1, + }; + + public NMatrix4d (global::OpenTK.Vector4d row0, global::OpenTK.Vector4d row1, global::OpenTK.Vector4d row2, global::OpenTK.Vector4d row3) + { + M11 = row0.X; + M21 = row1.X; + M31 = row2.X; + M41 = row3.X; + M12 = row0.Y; + M22 = row1.Y; + M32 = row2.Y; + M42 = row3.Y; + M13 = row0.Z; + M23 = row1.Z; + M33 = row2.Z; + M43 = row3.Z; + M14 = row0.W; + M24 = row1.W; + M34 = row2.W; + M44 = row3.W; + } + + public NMatrix4d ( + double m11, double m12, double m13, double m14, + double m21, double m22, double m23, double m24, + double m31, double m32, double m33, double m34, + double m41, double m42, double m43, double m44) + { + M11 = m11; + M21 = m21; + M31 = m31; + M41 = m41; + M12 = m12; + M22 = m22; + M32 = m32; + M42 = m42; + M13 = m13; + M23 = m23; + M33 = m33; + M43 = m43; + M14 = m14; + M24 = m24; + M34 = m34; + M44 = m44; + } + + public Vector4d Column0 { + get { + return new Vector4d (M11, M21, M31, M41); + } + set { + M11 = value.X; + M21 = value.Y; + M31 = value.Z; + M41 = value.W; + } + } + + public Vector4d Column1 { + get { + return new Vector4d (M12, M22, M32, M42); + } + set { + M12 = value.X; + M22 = value.Y; + M32 = value.Z; + M42 = value.W; + } + } + + public Vector4d Column2 { + get { + return new Vector4d (M13, M23, M33, M43); + } + set { + M13 = value.X; + M23 = value.Y; + M33 = value.Z; + M43 = value.W; + } + } + + public Vector4d Column3 { + get { + return new Vector4d (M14, M24, M34, M44); + } + set { + M14 = value.X; + M24 = value.Y; + M34 = value.Z; + M44 = value.W; + } + } + + public Vector4d Row0 { + get { + return new Vector4d (M11, M12, M13, M14); + } + set { + M11 = value.X; + M12 = value.Y; + M13 = value.Z; + M14 = value.W; + } + } + + public Vector4d Row1 { + get { + return new Vector4d (M21, M22, M23, M24); + } + set { + M21 = value.X; + M22 = value.Y; + M23 = value.Z; + M24 = value.W; + } + } + + public Vector4d Row2 { + get { + return new Vector4d (M31, M32, M33, M34); + } + set { + M31 = value.X; + M32 = value.Y; + M33 = value.Z; + M34 = value.W; + } + } + + public Vector4d Row3 { + get { + return new Vector4d (M41, M42, M43, M44); + } + set { + M41 = value.X; + M42 = value.Y; + M43 = value.Z; + M44 = value.W; + } + } + + public double Determinant { + get { + double a = M33 * M44 - M34 * M43; + double b = M32 * M44 - M34 * M42; + double c = M32 * M43 - M33 * M42; + double d = M31 * M44 - M34 * M41; + double e = M31 * M43 - M33 * M41; + double f = M31 * M42 - M32 * M41; + + return + M11 * (M22 * a - M23 * b + M24 * c) - + M12 * (M21 * a - M23 * d + M24 * e) + + M13 * (M21 * b - M22 * d + M24 * f) - + M14 * (M21 * c - M22 * e + M23 * f); + } + } + + public void Transpose () + { + this = Transpose (this); + } + + public static NMatrix4d Transpose (NMatrix4d mat) + { + NMatrix4d result; + Transpose (ref mat, out result); + return result; + } + + public static void Transpose (ref NMatrix4d mat, out NMatrix4d result) + { + result.M11 = mat.M11; + result.M21 = mat.M12; + result.M31 = mat.M13; + result.M41 = mat.M14; + + result.M12 = mat.M21; + result.M22 = mat.M22; + result.M32 = mat.M23; + result.M42 = mat.M24; + + result.M13 = mat.M31; + result.M23 = mat.M32; + result.M33 = mat.M33; + result.M43 = mat.M34; + + result.M14 = mat.M41; + result.M24 = mat.M42; + result.M34 = mat.M43; + result.M44 = mat.M44; + } + + public static NMatrix4d Multiply (NMatrix4d left, NMatrix4d right) + { + NMatrix4d result; + Multiply (ref left, ref right, out result); + return result; + } + + public static void Multiply (ref NMatrix4d left, ref NMatrix4d right, out NMatrix4d result) + { + result.M11 = left.M11 * right.M11 + left.M12 * right.M21 + left.M13 * right.M31 + left.M14 * right.M41; + result.M12 = left.M11 * right.M12 + left.M12 * right.M22 + left.M13 * right.M32 + left.M14 * right.M42; + result.M13 = left.M11 * right.M13 + left.M12 * right.M23 + left.M13 * right.M33 + left.M14 * right.M43; + result.M14 = left.M11 * right.M14 + left.M12 * right.M24 + left.M13 * right.M34 + left.M14 * right.M44; + + result.M21 = left.M21 * right.M11 + left.M22 * right.M21 + left.M23 * right.M31 + left.M24 * right.M41; + result.M22 = left.M21 * right.M12 + left.M22 * right.M22 + left.M23 * right.M32 + left.M24 * right.M42; + result.M23 = left.M21 * right.M13 + left.M22 * right.M23 + left.M23 * right.M33 + left.M24 * right.M43; + result.M24 = left.M21 * right.M14 + left.M22 * right.M24 + left.M23 * right.M34 + left.M24 * right.M44; + + result.M31 = left.M31 * right.M11 + left.M32 * right.M21 + left.M33 * right.M31 + left.M34 * right.M41; + result.M32 = left.M31 * right.M12 + left.M32 * right.M22 + left.M33 * right.M32 + left.M34 * right.M42; + result.M33 = left.M31 * right.M13 + left.M32 * right.M23 + left.M33 * right.M33 + left.M34 * right.M43; + result.M34 = left.M31 * right.M14 + left.M32 * right.M24 + left.M33 * right.M34 + left.M34 * right.M44; + + result.M41 = left.M41 * right.M11 + left.M42 * right.M21 + left.M43 * right.M31 + left.M44 * right.M41; + result.M42 = left.M41 * right.M12 + left.M42 * right.M22 + left.M43 * right.M32 + left.M44 * right.M42; + result.M43 = left.M41 * right.M13 + left.M42 * right.M23 + left.M43 * right.M33 + left.M44 * right.M43; + result.M44 = left.M41 * right.M14 + left.M42 * right.M24 + left.M43 * right.M34 + left.M44 * right.M44; + } + + public static NMatrix4d operator * (NMatrix4d left, NMatrix4d right) + { + return Multiply (left, right); + } + + public static bool operator == (NMatrix4d left, NMatrix4d right) + { + return left.Equals (right); + } + + public static bool operator != (NMatrix4d left, NMatrix4d right) + { + return !left.Equals (right); + } + + public static explicit operator global::OpenTK.Matrix4d (NMatrix4d value) + { + return new global::OpenTK.Matrix4d ( + value.M11, value.M12, value.M13, value.M14, + value.M21, value.M22, value.M23, value.M24, + value.M31, value.M32, value.M33, value.M34, + value.M41, value.M42, value.M43, value.M44); + } + + public static explicit operator NMatrix4d (global::OpenTK.Matrix4d value) + { + return new NMatrix4d (value.Row0, value.Row1, value.Row2, value.Row3); + } + + public override string ToString () + { + return + $"({M11}, {M12}, {M13}, {M14})\n" + + $"({M21}, {M22}, {M23}, {M24})\n" + + $"({M31}, {M32}, {M33}, {M34})\n" + + $"({M41}, {M42}, {M43}, {M44})"; + } + + public override int GetHashCode () + { + return + M11.GetHashCode () ^ M12.GetHashCode () ^ M13.GetHashCode () ^ M14.GetHashCode () ^ + M21.GetHashCode () ^ M22.GetHashCode () ^ M23.GetHashCode () ^ M24.GetHashCode () ^ + M31.GetHashCode () ^ M32.GetHashCode () ^ M33.GetHashCode () ^ M34.GetHashCode () ^ + M41.GetHashCode () ^ M42.GetHashCode () ^ M43.GetHashCode () ^ M44.GetHashCode (); + } + + public override bool Equals (object obj) + { + if (!(obj is NMatrix4d)) + return false; + + return Equals ((NMatrix4d) obj); + } + + public bool Equals (NMatrix4d other) + { + return + M11 == other.M11 && M12 == other.M12 && M13 == other.M13 && M14 == other.M14 && + M21 == other.M21 && M22 == other.M22 && M23 == other.M23 && M24 == other.M24 && + M31 == other.M31 && M32 == other.M32 && M33 == other.M33 && M34 == other.M34 && + M41 == other.M41 && M42 == other.M42 && M43 == other.M43 && M44 == other.M44; + } + } +} diff --git a/src/Simd/MatrixFloat2x2.cs b/src/Simd/MatrixFloat2x2.cs new file mode 100644 index 000000000000..bf69612c33b0 --- /dev/null +++ b/src/Simd/MatrixFloat2x2.cs @@ -0,0 +1,136 @@ +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright (c) 2017 Microsoft Inc +// + +// +// This represents the native matrix_float2x2 type, which has a column-major layout +// (as opposed to OpenTK.Matrix2, which has a row-major layout). +// + +using System; +using System.Runtime.InteropServices; + +namespace OpenTK +{ + [StructLayout (LayoutKind.Sequential)] + public struct NMatrix2 : IEquatable + { + public float R0C0; + public float R1C0; + public float R0C1; + public float R1C1; + + public readonly static NMatrix2 Identity = new NMatrix2 ( + 1, 0, + 0, 1); + + public NMatrix2 ( + float r0c0, float r0c1, + float r1c0, float r1c1) + { + R0C0 = r0c0; + R1C0 = r1c0; + R0C1 = r0c1; + R1C1 = r1c1; + } + + public float Determinant { + get { + return R0C0 * R1C1 - R1C0 * R0C1; + } + } + + public void Transpose () + { + this = Transpose (this); + } + + public static NMatrix2 Transpose (NMatrix2 mat) + { + return new NMatrix2 (mat.R0C0, mat.R1C0, mat.R0C1, mat.R1C1); + } + + public static void Transpose (ref NMatrix2 mat, out NMatrix2 result) + { + result.R0C0 = mat.R0C0; + result.R0C1 = mat.R1C0; + result.R1C0 = mat.R0C1; + result.R1C1 = mat.R1C1; + } + + public static NMatrix2 Multiply (NMatrix2 left, NMatrix2 right) + { + NMatrix2 result; + Multiply (ref left, ref right, out result); + return result; + } + + public static void Multiply (ref NMatrix2 left, ref NMatrix2 right, out NMatrix2 result) + { + result.R0C0 = left.R0C0 * right.R0C0 + left.R0C1 * right.R1C0; + result.R0C1 = left.R0C0 * right.R0C1 + left.R0C1 * right.R1C1; + + result.R1C0 = left.R1C0 * right.R0C0 + left.R1C1 * right.R1C0; + result.R1C1 = left.R1C0 * right.R0C1 + left.R1C1 * right.R1C1; + } + + public static NMatrix2 operator * (NMatrix2 left, NMatrix2 right) + { + return Multiply (left, right); + } + + public static bool operator == (NMatrix2 left, NMatrix2 right) + { + return left.Equals (right); + } + + public static bool operator != (NMatrix2 left, NMatrix2 right) + { + return !left.Equals (right); + } + + public static explicit operator global::OpenTK.Matrix2 (NMatrix2 value) + { + return new global::OpenTK.Matrix2 ( + value.R0C0, value.R0C1, + value.R1C0, value.R1C1); + } + + public static explicit operator NMatrix2 (global::OpenTK.Matrix2 value) + { + return new NMatrix2 ( + value.R0C0, value.R0C1, + value.R1C0, value.R1C1); + } + + public override string ToString () + { + return $"({R0C0}, {R0C1})\n({R1C0}, {R1C1})"; + } + + public override int GetHashCode () + { + return R0C0.GetHashCode () ^ R0C1.GetHashCode () ^ R1C0.GetHashCode () ^ R1C1.GetHashCode (); + } + + public override bool Equals (object obj) + { + if (!(obj is NMatrix2)) + return false; + + return Equals ((NMatrix2) obj); + } + + public bool Equals (NMatrix2 other) + { + return + R0C0 == other.R0C0 && + R0C1 == other.R0C1 && + R1C0 == other.R1C0 && + R1C1 == other.R1C1; + } + } +} diff --git a/src/Simd/MatrixFloat3x3.cs b/src/Simd/MatrixFloat3x3.cs new file mode 100644 index 000000000000..97554562b595 --- /dev/null +++ b/src/Simd/MatrixFloat3x3.cs @@ -0,0 +1,191 @@ +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright (c) 2017 Microsoft Inc +// + +// +// This represents the native matrix_float3x3 type, which has a column-major layout +// (as opposed to OpenTK.Matrix3, which has a row-major layout). +// + +using System; +using System.Runtime.InteropServices; + +using VectorFloat3 = global::OpenTK.NVector3; + +namespace OpenTK +{ + [StructLayout (LayoutKind.Sequential)] + public struct NMatrix3 : IEquatable + { + /* Due to memory alignment, vectors of length 3 are + * represented as vectors of length 4, so we pad here + * with dummy fields. + * See top of /usr/include/simd/matrix_types.h for more information. */ + public float R0C0; + public float R1C0; + public float R2C0; + float dummy0; + public float R0C1; + public float R1C1; + public float R2C1; + float dummy1; + public float R0C2; + public float R1C2; + public float R2C2; + float dummy2; + + public readonly static NMatrix3 Identity = new NMatrix3 + { + R0C0 = 1f, + R1C1 = 1f, + R2C2 = 1f, + }; + + public NMatrix3 ( + float r0c0, float r0c1, float r0c2, + float r1c0, float r1c1, float r1c2, + float r2c0, float r2c1, float r2c2) + { + R0C0 = r0c0; + R1C0 = r1c0; + R2C0 = r2c0; + R0C1 = r0c1; + R1C1 = r1c1; + R2C1 = r2c1; + R0C2 = r0c2; + R1C2 = r1c2; + R2C2 = r2c2; + dummy0 = 0; + dummy1 = 0; + dummy2 = 0; + } + + public float Determinant { + get { + return + R0C0 * (R1C1 * R2C2 - R1C2 * R2C1) - + R0C1 * (R1C0 * R2C2 - R1C2 * R2C0) + + R0C2 * (R1C0 * R2C1 - R1C1 * R2C0); + } + } + + public void Transpose () + { + this = Transpose (this); + } + + public static NMatrix3 Transpose (NMatrix3 mat) + { + NMatrix3 result = new NMatrix3 (); + Transpose (ref mat, out result); + return result; + } + + public static void Transpose (ref NMatrix3 mat, out NMatrix3 result) + { + result.R0C0 = mat.R0C0; + result.R1C0 = mat.R0C1; + result.R2C0 = mat.R0C2; + result.R0C1 = mat.R1C0; + result.R1C1 = mat.R1C1; + result.R2C1 = mat.R1C2; + result.R0C2 = mat.R2C0; + result.R1C2 = mat.R2C1; + result.R2C2 = mat.R2C2; + result.dummy0 = 0; + result.dummy1 = 0; + result.dummy2 = 0; + } + + public static NMatrix3 Multiply (NMatrix3 left, NMatrix3 right) + { + NMatrix3 result; + Multiply (ref left, ref right, out result); + return result; + } + + public static void Multiply (ref NMatrix3 left, ref NMatrix3 right, out NMatrix3 result) + { + result.R0C0 = left.R0C0 * right.R0C0 + left.R0C1 * right.R1C0 + left.R0C2 * right.R2C0; + result.R0C1 = left.R0C0 * right.R0C1 + left.R0C1 * right.R1C1 + left.R0C2 * right.R2C1; + result.R0C2 = left.R0C0 * right.R0C2 + left.R0C1 * right.R1C2 + left.R0C2 * right.R2C2; + result.dummy0 = 0; + + result.R1C0 = left.R1C0 * right.R0C0 + left.R1C1 * right.R1C0 + left.R1C2 * right.R2C0; + result.R1C1 = left.R1C0 * right.R0C1 + left.R1C1 * right.R1C1 + left.R1C2 * right.R2C1; + result.R1C2 = left.R1C0 * right.R0C2 + left.R1C1 * right.R1C2 + left.R1C2 * right.R2C2; + result.dummy1 = 0; + + result.R2C0 = left.R2C0 * right.R0C0 + left.R2C1 * right.R1C0 + left.R2C2 * right.R2C0; + result.R2C1 = left.R2C0 * right.R0C1 + left.R2C1 * right.R1C1 + left.R2C2 * right.R2C1; + result.R2C2 = left.R2C0 * right.R0C2 + left.R2C1 * right.R1C2 + left.R2C2 * right.R2C2; + result.dummy2 = 0; + } + + public static NMatrix3 operator * (NMatrix3 left, NMatrix3 right) + { + return Multiply (left, right); + } + + public static bool operator == (NMatrix3 left, NMatrix3 right) + { + return left.Equals (right); + } + + public static bool operator != (NMatrix3 left, NMatrix3 right) + { + return !left.Equals (right); + } + + public static explicit operator global::OpenTK.Matrix3 (NMatrix3 value) + { + return new global::OpenTK.Matrix3 ( + value.R0C0, value.R0C1, value.R0C2, + value.R1C0, value.R1C1, value.R1C2, + value.R2C0, value.R2C1, value.R2C2); + } + + public static explicit operator NMatrix3 (global::OpenTK.Matrix3 value) + { + return new NMatrix3 ( + value.R0C0, value.R0C1, value.R0C2, + value.R1C0, value.R1C1, value.R1C2, + value.R2C0, value.R2C1, value.R2C2); + } + + public override string ToString () + { + return + $"({R0C0}, {R0C1}, {R0C2})\n" + + $"({R1C0}, {R1C1}, {R1C2})\n" + + $"({R2C0}, {R2C1}, {R2C2})"; + } + + public override int GetHashCode () + { + return + R0C0.GetHashCode () ^ R0C1.GetHashCode () ^ R0C2.GetHashCode () ^ + R1C0.GetHashCode () ^ R1C1.GetHashCode () ^ R1C2.GetHashCode () ^ + R2C0.GetHashCode () ^ R2C1.GetHashCode () ^ R2C2.GetHashCode (); + } + + public override bool Equals (object obj) + { + if (!(obj is NMatrix3)) + return false; + + return Equals ((NMatrix3) obj); + } + + public bool Equals (NMatrix3 other) + { + return + R0C0 == other.R0C0 && R0C1 == other.R0C1 && R0C2 == other.R0C2 && + R1C0 == other.R1C0 && R1C1 == other.R1C1 && R1C2 == other.R1C2 && + R2C0 == other.R2C0 && R2C1 == other.R2C1 && R2C2 == other.R2C2; + } + } +} diff --git a/src/Simd/MatrixFloat4x3.cs b/src/Simd/MatrixFloat4x3.cs new file mode 100644 index 000000000000..4439e8525a09 --- /dev/null +++ b/src/Simd/MatrixFloat4x3.cs @@ -0,0 +1,187 @@ +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright (c) 2017 Microsoft Inc +// + +// +// This represents the native matrix_float4x3 type (3 rows and 4 columns) +// + +using System; +using System.Runtime.InteropServices; + +using VectorFloat4=global::OpenTK.Vector4; + +namespace OpenTK +{ + [StructLayout (LayoutKind.Sequential)] + public struct NMatrix4x3 : IEquatable + { + public float M11; + public float M21; + public float M31; + float dummy1; + + public float M12; + public float M22; + public float M32; + float dummy2; + + public float M13; + public float M23; + public float M33; + float dummy3; + + public float M14; + public float M24; + public float M34; + float dummy4; + + public NMatrix4x3 ( + float m11, float m12, float m13, float m14, + float m21, float m22, float m23, float m24, + float m31, float m32, float m33, float m34) + { + M11 = m11; + M21 = m21; + M31 = m31; + M12 = m12; + M22 = m22; + M32 = m32; + M13 = m13; + M23 = m23; + M33 = m33; + M14 = m14; + M24 = m24; + M34 = m34; + dummy1 = 0; + dummy2 = 0; + dummy3 = 0; + dummy4 = 0; + } + + public NVector3 Column0 { + get { + return new NVector3 (M11, M21, M31); + } + set { + M11 = value.X; + M21 = value.Y; + M31 = value.Z; + } + } + + public NVector3 Column1 { + get { + return new NVector3 (M12, M22, M32); + } + set { + M12 = value.X; + M22 = value.Y; + M32 = value.Z; + } + } + + public NVector3 Column2 { + get { + return new NVector3 (M13, M23, M33); + } + set { + M13 = value.X; + M23 = value.Y; + M33 = value.Z; + } + } + + public NVector3 Column3 { + get { + return new NVector3 (M14, M24, M34); + } + set { + M14 = value.X; + M24 = value.Y; + M34 = value.Z; + } + } + + public Vector4 Row0 { + get { + return new Vector4 (M11, M12, M13, M14); + } + set { + M11 = value.X; + M12 = value.Y; + M13 = value.Z; + M14 = value.W; + } + } + + public Vector4 Row1 { + get { + return new Vector4 (M21, M22, M23, M24); + } + set { + M21 = value.X; + M22 = value.Y; + M23 = value.Z; + M24 = value.W; + } + } + + public Vector4 Row2 { + get { + return new Vector4 (M31, M32, M33, M34); + } + set { + M31 = value.X; + M32 = value.Y; + M33 = value.Z; + M34 = value.W; + } + } + + public static bool operator == (NMatrix4x3 left, NMatrix4x3 right) + { + return left.Equals (right); + } + + public static bool operator != (NMatrix4x3 left, NMatrix4x3 right) + { + return !left.Equals (right); + } + + public override string ToString () + { + return + $"({M11}, {M12}, {M13}, {M14})\n" + + $"({M21}, {M22}, {M23}, {M24})\n" + + $"({M31}, {M32}, {M33}, {M34})"; + } + + public override int GetHashCode () + { + return + M11.GetHashCode () ^ M12.GetHashCode () ^ M13.GetHashCode () ^ M14.GetHashCode () ^ + M21.GetHashCode () ^ M22.GetHashCode () ^ M23.GetHashCode () ^ M24.GetHashCode () ^ + M31.GetHashCode () ^ M32.GetHashCode () ^ M33.GetHashCode () ^ M34.GetHashCode (); + } + + public override bool Equals (object obj) + { + if (!(obj is NMatrix4x3)) + return false; + + return Equals ((NMatrix4x3) obj); + } + + public bool Equals (NMatrix4x3 other) + { + return + M11 == other.M11 && M12 == other.M12 && M13 == other.M13 && M14 == other.M14 && + M21 == other.M21 && M22 == other.M22 && M23 == other.M23 && M24 == other.M24 && + M31 == other.M31 && M32 == other.M32 && M33 == other.M33 && M34 == other.M34; + } + } +} diff --git a/src/Simd/MatrixFloat4x4.cs b/src/Simd/MatrixFloat4x4.cs new file mode 100644 index 000000000000..551490cbe346 --- /dev/null +++ b/src/Simd/MatrixFloat4x4.cs @@ -0,0 +1,334 @@ +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright (c) 2017 Microsoft Inc +// + +// +// This represents the native matrix_float4x4 type, which has a column-major layout +// (as opposed to OpenTK.Matrix4, which has a row-major layout). +// + +using System; +using System.Runtime.InteropServices; + +namespace OpenTK +{ + [StructLayout (LayoutKind.Sequential)] + public struct NMatrix4 : IEquatable + { + public float M11; + public float M21; + public float M31; + public float M41; + + public float M12; + public float M22; + public float M32; + public float M42; + + public float M13; + public float M23; + public float M33; + public float M43; + + public float M14; + public float M24; + public float M34; + public float M44; + + public readonly static NMatrix4 Identity = new NMatrix4 { + M11 = 1f, + M22 = 1f, + M33 = 1f, + M44 = 1f, + }; + + public NMatrix4 (global::OpenTK.Vector4 row0, global::OpenTK.Vector4 row1, global::OpenTK.Vector4 row2, global::OpenTK.Vector4 row3) + { + M11 = row0.X; + M21 = row1.X; + M31 = row2.X; + M41 = row3.X; + M12 = row0.Y; + M22 = row1.Y; + M32 = row2.Y; + M42 = row3.Y; + M13 = row0.Z; + M23 = row1.Z; + M33 = row2.Z; + M43 = row3.Z; + M14 = row0.W; + M24 = row1.W; + M34 = row2.W; + M44 = row3.W; + } + + public NMatrix4 ( + float m11, float m12, float m13, float m14, + float m21, float m22, float m23, float m24, + float m31, float m32, float m33, float m34, + float m41, float m42, float m43, float m44) + { + M11 = m11; + M21 = m21; + M31 = m31; + M41 = m41; + M12 = m12; + M22 = m22; + M32 = m32; + M42 = m42; + M13 = m13; + M23 = m23; + M33 = m33; + M43 = m43; + M14 = m14; + M24 = m24; + M34 = m34; + M44 = m44; + } + + public Vector4 Column0 { + get { + return new Vector4 (M11, M21, M31, M41); + } + set { + M11 = value.X; + M21 = value.Y; + M31 = value.Z; + M41 = value.W; + } + } + + public Vector4 Column1 { + get { + return new Vector4 (M12, M22, M32, M42); + } + set { + M12 = value.X; + M22 = value.Y; + M32 = value.Z; + M42 = value.W; + } + } + + public Vector4 Column2 { + get { + return new Vector4 (M13, M23, M33, M43); + } + set { + M13 = value.X; + M23 = value.Y; + M33 = value.Z; + M43 = value.W; + } + } + + public Vector4 Column3 { + get { + return new Vector4 (M14, M24, M34, M44); + } + set { + M14 = value.X; + M24 = value.Y; + M34 = value.Z; + M44 = value.W; + } + } + + public Vector4 Row0 { + get { + return new Vector4 (M11, M12, M13, M14); + } + set { + M11 = value.X; + M12 = value.Y; + M13 = value.Z; + M14 = value.W; + } + } + + public Vector4 Row1 { + get { + return new Vector4 (M21, M22, M23, M24); + } + set { + M21 = value.X; + M22 = value.Y; + M23 = value.Z; + M24 = value.W; + } + } + + public Vector4 Row2 { + get { + return new Vector4 (M31, M32, M33, M34); + } + set { + M31 = value.X; + M32 = value.Y; + M33 = value.Z; + M34 = value.W; + } + } + + public Vector4 Row3 { + get { + return new Vector4 (M41, M42, M43, M44); + } + set { + M41 = value.X; + M42 = value.Y; + M43 = value.Z; + M44 = value.W; + } + } + + public float Determinant { + get { + float a = M33 * M44 - M34 * M43; + float b = M32 * M44 - M34 * M42; + float c = M32 * M43 - M33 * M42; + float d = M31 * M44 - M34 * M41; + float e = M31 * M43 - M33 * M41; + float f = M31 * M42 - M32 * M41; + + return + M11 * (M22 * a - M23 * b + M24 * c) - + M12 * (M21 * a - M23 * d + M24 * e) + + M13 * (M21 * b - M22 * d + M24 * f) - + M14 * (M21 * c - M22 * e + M23 * f); + } + } + + public void Transpose () + { + this = Transpose (this); + } + + public static NMatrix4 Transpose (NMatrix4 mat) + { + NMatrix4 result; + Transpose (ref mat, out result); + return result; + } + + public static void Transpose (ref NMatrix4 mat, out NMatrix4 result) + { + result.M11 = mat.M11; + result.M21 = mat.M12; + result.M31 = mat.M13; + result.M41 = mat.M14; + + result.M12 = mat.M21; + result.M22 = mat.M22; + result.M32 = mat.M23; + result.M42 = mat.M24; + + result.M13 = mat.M31; + result.M23 = mat.M32; + result.M33 = mat.M33; + result.M43 = mat.M34; + + result.M14 = mat.M41; + result.M24 = mat.M42; + result.M34 = mat.M43; + result.M44 = mat.M44; + } + + public static NMatrix4 Multiply (NMatrix4 left, NMatrix4 right) + { + NMatrix4 result; + Multiply (ref left, ref right, out result); + return result; + } + + public static void Multiply (ref NMatrix4 left, ref NMatrix4 right, out NMatrix4 result) + { + result.M11 = left.M11 * right.M11 + left.M12 * right.M21 + left.M13 * right.M31 + left.M14 * right.M41; + result.M12 = left.M11 * right.M12 + left.M12 * right.M22 + left.M13 * right.M32 + left.M14 * right.M42; + result.M13 = left.M11 * right.M13 + left.M12 * right.M23 + left.M13 * right.M33 + left.M14 * right.M43; + result.M14 = left.M11 * right.M14 + left.M12 * right.M24 + left.M13 * right.M34 + left.M14 * right.M44; + + result.M21 = left.M21 * right.M11 + left.M22 * right.M21 + left.M23 * right.M31 + left.M24 * right.M41; + result.M22 = left.M21 * right.M12 + left.M22 * right.M22 + left.M23 * right.M32 + left.M24 * right.M42; + result.M23 = left.M21 * right.M13 + left.M22 * right.M23 + left.M23 * right.M33 + left.M24 * right.M43; + result.M24 = left.M21 * right.M14 + left.M22 * right.M24 + left.M23 * right.M34 + left.M24 * right.M44; + + result.M31 = left.M31 * right.M11 + left.M32 * right.M21 + left.M33 * right.M31 + left.M34 * right.M41; + result.M32 = left.M31 * right.M12 + left.M32 * right.M22 + left.M33 * right.M32 + left.M34 * right.M42; + result.M33 = left.M31 * right.M13 + left.M32 * right.M23 + left.M33 * right.M33 + left.M34 * right.M43; + result.M34 = left.M31 * right.M14 + left.M32 * right.M24 + left.M33 * right.M34 + left.M34 * right.M44; + + result.M41 = left.M41 * right.M11 + left.M42 * right.M21 + left.M43 * right.M31 + left.M44 * right.M41; + result.M42 = left.M41 * right.M12 + left.M42 * right.M22 + left.M43 * right.M32 + left.M44 * right.M42; + result.M43 = left.M41 * right.M13 + left.M42 * right.M23 + left.M43 * right.M33 + left.M44 * right.M43; + result.M44 = left.M41 * right.M14 + left.M42 * right.M24 + left.M43 * right.M34 + left.M44 * right.M44; + } + + public static NMatrix4 operator * (NMatrix4 left, NMatrix4 right) + { + return Multiply (left, right); + } + + public static bool operator == (NMatrix4 left, NMatrix4 right) + { + return left.Equals (right); + } + + public static bool operator != (NMatrix4 left, NMatrix4 right) + { + return !left.Equals (right); + } + + public static explicit operator global::OpenTK.Matrix4 (NMatrix4 value) + { + return new global::OpenTK.Matrix4 ( + value.M11, value.M12, value.M13, value.M14, + value.M21, value.M22, value.M23, value.M24, + value.M31, value.M32, value.M33, value.M34, + value.M41, value.M42, value.M43, value.M44); + } + + public static explicit operator NMatrix4 (global::OpenTK.Matrix4 value) + { + return new NMatrix4 (value.Row0, value.Row1, value.Row2, value.Row3); + } + + public override string ToString () + { + return + $"({M11}, {M12}, {M13}, {M14})\n" + + $"({M21}, {M22}, {M23}, {M24})\n" + + $"({M31}, {M32}, {M33}, {M34})\n" + + $"({M41}, {M42}, {M43}, {M44})"; + } + + public override int GetHashCode () + { + return + M11.GetHashCode () ^ M12.GetHashCode () ^ M13.GetHashCode () ^ M14.GetHashCode () ^ + M21.GetHashCode () ^ M22.GetHashCode () ^ M23.GetHashCode () ^ M24.GetHashCode () ^ + M31.GetHashCode () ^ M32.GetHashCode () ^ M33.GetHashCode () ^ M34.GetHashCode () ^ + M41.GetHashCode () ^ M42.GetHashCode () ^ M43.GetHashCode () ^ M44.GetHashCode (); + } + + public override bool Equals (object obj) + { + if (!(obj is NMatrix4)) + return false; + + return Equals ((NMatrix4) obj); + } + + public bool Equals (NMatrix4 other) + { + return + M11 == other.M11 && M12 == other.M12 && M13 == other.M13 && M14 == other.M14 && + M21 == other.M21 && M22 == other.M22 && M23 == other.M23 && M24 == other.M24 && + M31 == other.M31 && M32 == other.M32 && M33 == other.M33 && M34 == other.M34 && + M41 == other.M41 && M42 == other.M42 && M43 == other.M43 && M44 == other.M44; + } + } +} diff --git a/src/Simd/VectorDouble3.cs b/src/Simd/VectorDouble3.cs new file mode 100644 index 000000000000..db1aed4770aa --- /dev/null +++ b/src/Simd/VectorDouble3.cs @@ -0,0 +1,77 @@ +// +// VectorDouble3.cs: +// This represents the native vector_double3 type, which is 32 bytes. +// +// +// Authors: +// Rolf Bjarne Kvinge +// Alex Soto +// +// Copyright (c) 2017 Microsoft Inc +// + +using System; +using System.Runtime.InteropServices; + +namespace OpenTK +{ + [StructLayout (LayoutKind.Sequential)] + public struct NVector3d : IEquatable + { + public double X; + public double Y; + public double Z; + double dummy; + + public NVector3d (double x, double y, double z) + { + X = x; + Y = y; + Z = z; + dummy = 0; + } + + public static bool operator == (NVector3d left, NVector3d right) + { + return left.Equals (right); + } + + public static bool operator != (NVector3d left, NVector3d right) + { + return !left.Equals (right); + } + + public static explicit operator global::OpenTK.Vector3d (NVector3d value) + { + return new global::OpenTK.Vector3d (value.X, value.Y, value.Z); + } + + public static explicit operator NVector3d (global::OpenTK.Vector3d value) + { + return new NVector3d (value.X, value.Y, value.Z); + } + + public override string ToString () + { + return $"({X}, {Y}, {Z})"; + } + + public override int GetHashCode () + { + return X.GetHashCode () ^ Y.GetHashCode () ^ Z.GetHashCode (); + } + + public override bool Equals (object obj) + { + if (!(obj is NVector3d)) + return false; + + return Equals ((NVector3d) obj); + } + + public bool Equals (NVector3d other) + { + return X == other.X && Y == other.Y && Z == other.Z; + } + } +} diff --git a/src/Simd/VectorFloat3.cs b/src/Simd/VectorFloat3.cs new file mode 100644 index 000000000000..abf8a177761f --- /dev/null +++ b/src/Simd/VectorFloat3.cs @@ -0,0 +1,76 @@ +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright (c) 2017 Microsoft Inc +// + +// +// This represents the native vector_float3 type, which is 16 bytes. +// + +using System; +using System.Runtime.InteropServices; + +namespace OpenTK +{ + [StructLayout (LayoutKind.Sequential)] + public struct NVector3 : IEquatable + { + public float X; + public float Y; + public float Z; + float dummy; + + public NVector3 (float x, float y, float z) + { + X = x; + Y = y; + Z = z; + dummy = 0; + } + + public static bool operator == (NVector3 left, NVector3 right) + { + return left.Equals (right); + } + + public static bool operator != (NVector3 left, NVector3 right) + { + return !left.Equals (right); + } + + public static explicit operator global::OpenTK.Vector3 (NVector3 value) + { + return new global::OpenTK.Vector3 (value.X, value.Y, value.Z); + } + + public static explicit operator NVector3 (global::OpenTK.Vector3 value) + { + return new NVector3 (value.X, value.Y, value.Z); + } + + public override string ToString () + { + return $"({X}, {Y}, {Z})"; + } + + public override int GetHashCode () + { + return X.GetHashCode () ^ Y.GetHashCode () ^ Z.GetHashCode (); + } + + public override bool Equals (object obj) + { + if (!(obj is NVector3)) + return false; + + return Equals ((NVector3) obj); + } + + public bool Equals (NVector3 other) + { + return X == other.X && Y == other.Y && Z == other.Z; + } + } +} diff --git a/src/Social/SLCompat.cs b/src/Social/SLCompat.cs index 9b8d73fd888a..c0823a73a4c5 100644 --- a/src/Social/SLCompat.cs +++ b/src/Social/SLCompat.cs @@ -8,7 +8,7 @@ namespace XamCore.Social { partial class SLComposeSheetConfigurationItem { - [Obsolete ("Use the TapHandler property")] + [Obsolete ("Use the 'TapHandler' property.")] public virtual void SetTapHandler (Action tapHandler) { TapHandler = tapHandler; diff --git a/src/SpriteKit/Enums.cs b/src/SpriteKit/Enums.cs index 3ca62af8ec74..4bdef22eba97 100644 --- a/src/SpriteKit/Enums.cs +++ b/src/SpriteKit/Enums.cs @@ -183,4 +183,14 @@ public enum SKTileAdjacencyMask : nuint LowerLeftCorner = Up | Right | LowerRight | Down | LowerLeft | Left | UpperLeft, UpperLeftCorner = Up | UpperRight | Right | Down | LowerLeft | Left | UpperLeft, } + + [NoWatch] + [NoMac] + [TV (11,0), iOS (11,0)] + [Native] + public enum SKNodeFocusBehavior : nint { + None = 0, + Occluding, + Focusable, + } } diff --git a/src/SpriteKit/ObsoleteCompat.cs b/src/SpriteKit/ObsoleteCompat.cs index 19c9a3aa0a0b..f4d561de1a83 100644 --- a/src/SpriteKit/ObsoleteCompat.cs +++ b/src/SpriteKit/ObsoleteCompat.cs @@ -15,13 +15,13 @@ namespace XamCore.SpriteKit { #if !XAMCORE_3_0 && !MONOMAC public partial class SKAction { - [Obsolete ("Use FalloffBy method")] + [Obsolete ("Use the 'FalloffBy' method.")] public static SKAction Falloff (float /* float, not CGFloat */ to, double duration) { return FalloffBy (to, duration); } - [Obsolete ("Use TimingFunction property")] + [Obsolete ("Use the 'TimingFunction' property.")] public virtual void SetTimingFunction (SKActionTimingFunction timingFunction) { TimingFunction = timingFunction; @@ -32,61 +32,61 @@ public virtual void SetTimingFunction (SKActionTimingFunction timingFunction) #if !XAMCORE_2_0 && !MONOMAC public partial class SKPhysicsBody { - [Obsolete ("Use the method FromBodies instead")] + [Obsolete ("Use the 'FromBodies' method instead.")] public static SKPhysicsBody BodyWithBodies (SKPhysicsBody [] bodies) { return FromBodies (bodies); } - [Obsolete ("Use the CreateCircularBody method instead")] + [Obsolete ("Use the 'CreateCircularBody' method instead.")] public static SKPhysicsBody BodyWithCircleOfRadius (nfloat radius) { return CreateCircularBody (radius); } - [Obsolete ("Use the CreateCircularBody method instead")] + [Obsolete ("Use the 'CreateCircularBody' method instead.")] public static SKPhysicsBody BodyWithCircleOfRadius (nfloat radius, CGPoint center) { return CreateCircularBody (radius, center); } - [Obsolete ("Use the CreateRectangularBody method instead")] + [Obsolete ("Use the 'CreateRectangularBody' method instead.")] public static SKPhysicsBody BodyWithRectangleOfSize (CGSize size) { return CreateRectangularBody (size); } - [Obsolete ("Use the CreateRectangularBody method instead")] + [Obsolete ("Use the 'CreateRectangularBody' method instead.")] public static SKPhysicsBody BodyWithRectangleOfSize (CGSize size, CGPoint center) { return CreateRectangularBody (size, center); } - [Obsolete ("Use the CreateBodyFromPath method instead")] + [Obsolete ("Use the 'CreateBodyFromPath' method instead.")] public static SKPhysicsBody BodyWithPolygonFromPath (CGPath path) { return CreateBodyFromPath (path); } - [Obsolete ("Use the CreateEdge method instead")] + [Obsolete ("Use the 'CreateEdge' method instead.")] public static SKPhysicsBody BodyWithEdgeFromPoint (CGPoint fromPoint, CGPoint toPoint) { return CreateEdge (fromPoint, toPoint); } - [Obsolete ("Use the CreateEdgeChain method instead")] + [Obsolete ("Use the 'CreateEdgeChain' method instead.")] public static SKPhysicsBody BodyWithEdgeChainFromPath (CGPath path) { return CreateEdgeChain (path); } - [Obsolete ("Use the CreateEdgeLoop method instead")] + [Obsolete ("Use the 'CreateEdgeLoop' method instead.")] public static SKPhysicsBody BodyWithEdgeLoopFromPath (CGPath path) { return CreateEdgeLoop (path); } - [Obsolete ("Use the CreateEdgeLoop method instead")] + [Obsolete ("Use the 'CreateEdgeLoop' method instead.")] public static SKPhysicsBody BodyWithEdgeLoopFromRect (CGRect rect) { return CreateEdgeLoop (rect); diff --git a/src/SpriteKit/SKFieldNode.cs b/src/SpriteKit/SKFieldNode.cs index c0b883dbd11d..355a95d6a1e1 100644 --- a/src/SpriteKit/SKFieldNode.cs +++ b/src/SpriteKit/SKFieldNode.cs @@ -15,7 +15,7 @@ namespace XamCore.SpriteKit { #if !XAMCORE_3_0 && !MONOMAC public partial class SKFieldNode { - [Obsolete ("Use the method CreateVortexField instead")] + [Obsolete ("Use the method 'CreateVortexField' instead.")] public static SKFieldNode CraeteVortexField () { return CreateVortexField (); diff --git a/src/SpriteKit/SKUniform.cs b/src/SpriteKit/SKUniform.cs index b05c8ab4f06e..c8fedefa7b03 100644 --- a/src/SpriteKit/SKUniform.cs +++ b/src/SpriteKit/SKUniform.cs @@ -17,6 +17,9 @@ using Matrix2 = global::OpenTK.Matrix2; using Matrix3 = global::OpenTK.Matrix3; using Matrix4 = global::OpenTK.Matrix4; +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; #if (XAMCORE_2_0 || !MONOMAC) && !WATCH namespace XamCore.SpriteKit { @@ -71,9 +74,18 @@ public SKUniform (string name, Vector4 value) InitializeHandle (InitWithNameFloatVector4 (name, value), "initWithName:floatVector4:"); } +#if !XAMCORE_4_0 // Apple deprecated initWithName:floatMatrix2: in macOS10.12/iOS10.0 // and made available initWithName:matrixFloat2x2: so we invoke // the right one at runtime depending on which OS version we are running + // + // Unfortunately our 'initWithName:matrixFloat2x2:' implementation is + // incorrect (the matrix is transposed), but changing it would be a + // breaking change, so we obsolete this constructor and provide a new + // one which implements (only) 'initWithName:matrixFloat2x2:' + // correctly. However, this constructor still does the right thing for + // < macOS 10.12 / iOS 10.0 + [Obsolete ("Use the '(string, MatrixFloat2x2)' overload instead.")] public SKUniform (string name, Matrix2 value) { if (CheckSystemVersion ()) @@ -85,6 +97,14 @@ public SKUniform (string name, Matrix2 value) // Apple deprecated initWithName:floatMatrix3: in macOS10.12/iOS10.0 // and made available initWithName:matrixFloat3x3: so we invoke // the right one at runtime depending on which OS version we are running + // + // Unfortunately our 'initWithName:matrixFloat3x3:' implementation is + // incorrect (the matrix is transposed), but changing it would be a + // breaking change, so we obsolete this constructor and provide a new + // one which implements (only) 'initWithName:matrixFloat3x3:' + // correctly. However, this constructor still does the right thing for + // < macOS 10.12 / iOS 10.0 + [Obsolete ("Use the '(string, MatrixFloat3x3)' overload instead.")] public SKUniform (string name, Matrix3 value) { if (CheckSystemVersion ()) @@ -96,6 +116,14 @@ public SKUniform (string name, Matrix3 value) // Apple deprecated initWithName:floatMatrix4: in macOS10.12/iOS10.0 // and made available initWithName:matrixFloat4x4: so we invoke // the right one at runtime depending on which OS version we are running + // + // Unfortunately our 'initWithName:matrixFloat4x4:' implementation is + // incorrect (the matrix is transposed), but changing it would be a + // breaking change, so we obsolete this constructor and provide a new + // one which implements (only) 'initWithName:matrixFloat4x4:' + // correctly. However, this constructor still does the right thing for + // < macOS 10.12 / iOS 10.0 + [Obsolete ("Use the '(string, MatrixFloat4x4)' overload instead.")] public SKUniform (string name, Matrix4 value) { if (CheckSystemVersion ()) @@ -103,6 +131,7 @@ public SKUniform (string name, Matrix4 value) else InitializeHandle (InitWithNameFloatMatrix4 (name, value), "initWithName:floatMatrix4:"); } +#endif // !XAMCORE_4_0 // Apple deprecated floatVector2Value in macOS10.12/iOS10.0 // and made available vectorFloat2Value so we invoke @@ -161,20 +190,29 @@ public virtual Vector4 FloatVector4Value } } +#if !XAMCORE_4_0 // Apple deprecated floatMatrix2Value in macOS10.12/iOS10.0 // and made available matrixFloat2x2Value so we invoke // the right one at runtime depending on which OS version we are running + // + // Unfortunately our 'matrixFloat2x2Value' implementation is incorrect + // (we return a transposed matrix), but changing it would be a + // breaking change, so we obsolete this property and provide a new one + // which implements (only) 'matrixFloat4x4Value' correctly. However, + // this property still returns the correct matrix for < macOS 10.12 / + // iOS 10.0 + [Obsolete ("Use 'MatrixFloat2x2Value' instead.")] public virtual Matrix2 FloatMatrix2Value { get { if (CheckSystemVersion ()) - return _MatrixFloat2x2Value; + return (Matrix2) MatrixFloat2x2.Transpose (MatrixFloat2x2Value); else return _FloatMatrix2Value; } set { if (CheckSystemVersion ()) - _MatrixFloat2x2Value = value; + MatrixFloat2x2Value = MatrixFloat2x2.Transpose ((MatrixFloat2x2) value); else _FloatMatrix2Value = value; } @@ -183,17 +221,25 @@ public virtual Matrix2 FloatMatrix2Value // Apple deprecated floatMatrix3Value in macOS10.12/iOS10.0 // and made available matrixFloat3x3Value so we invoke // the right one at runtime depending on which OS version we are running + // + // Unfortunately our 'matrixFloat3x3Value' implementation is incorrect + // (we return a transposed matrix), but changing it would be a + // breaking change, so we obsolete this property and provide a new one + // which implements (only) 'matrixFloat3x3Value' correctly. However, + // this property still returns the correct matrix for < macOS 10.12 / + // iOS 10.0 + [Obsolete ("Use 'MatrixFloat3x3Value' instead.")] public virtual Matrix3 FloatMatrix3Value { get { if (CheckSystemVersion ()) - return _MatrixFloat3x3Value; + return (Matrix3) MatrixFloat3x3.Transpose (MatrixFloat3x3Value); else return _FloatMatrix3Value; } set { if (CheckSystemVersion ()) - _MatrixFloat3x3Value = value; + MatrixFloat3x3Value = MatrixFloat3x3.Transpose ((MatrixFloat3x3) value); else _FloatMatrix3Value = value; } @@ -202,21 +248,30 @@ public virtual Matrix3 FloatMatrix3Value // Apple deprecated floatMatrix4Value in macOS10.12/iOS10.0 // and made available matrixFloat4x4Value so we invoke // the right one at runtime depending on which OS version we are running + // + // Unfortunately our 'matrixFloat4x4Value' implementation is incorrect + // (we return a transposed matrix), but changing it would be a + // breaking change, so we obsolete this property and provide a new one + // which implements (only) 'matrixFloat4x4Value' correctly. However, + // this property still returns the correct matrix for < macOS 10.12 / + // iOS 10.0 + [Obsolete ("Use 'MatrixFloat4x4Value' instead.")] public virtual Matrix4 FloatMatrix4Value { get { if (CheckSystemVersion ()) - return _MatrixFloat4x4Value; + return (Matrix4) MatrixFloat4x4.Transpose (MatrixFloat4x4Value); else return _FloatMatrix4Value; } set { if (CheckSystemVersion ()) - _MatrixFloat4x4Value = value; + MatrixFloat4x4Value = MatrixFloat4x4.Transpose ((MatrixFloat4x4) value); else _FloatMatrix4Value = value; } } +#endif // !XAMCORE_4_0 } } #endif // XAMCORE_2_0 diff --git a/src/StoreKit/Enums.cs b/src/StoreKit/Enums.cs index 0ab633b6ed13..d63babdb804b 100644 --- a/src/StoreKit/Enums.cs +++ b/src/StoreKit/Enums.cs @@ -58,5 +58,13 @@ public enum SKCloudServiceCapability : nuint { MusicCatalogSubscriptionEligible = 1 << 1, AddToCloudMusicLibrary = 1 << 8 } + + [iOS (11,0)][TV (11,0)][NoMac] + [Native] + public enum SKProductStorePromotionVisibility : nint { + Default, + Show, + Hide, + } #endif } diff --git a/src/TVServices/TVEnums.cs b/src/TVServices/TVEnums.cs index 20c6cc1e3588..01291dca0875 100644 --- a/src/TVServices/TVEnums.cs +++ b/src/TVServices/TVEnums.cs @@ -27,6 +27,16 @@ public enum TVTopShelfContentStyle : nint { Sectioned = 2 } + [TV (11,0)] + [Native] + [Flags] + public enum TVContentItemImageTrait : nuint { + UserInterfaceStyleLight = (1 << 8), + UserInterfaceStyleDark = (2 << 8), + ScreenScale1x = (1 << 12), + ScreenScale2x = (2 << 12), + } + static public class TVContentItemImageShapeExtensions { [DllImport (Constants.TVServicesLibrary)] diff --git a/src/Twitter/TWCompat.cs b/src/Twitter/TWCompat.cs index 779782b9c67a..a0dcbd8e76ba 100644 --- a/src/Twitter/TWCompat.cs +++ b/src/Twitter/TWCompat.cs @@ -8,7 +8,7 @@ namespace XamCore.Twitter { public partial class TWTweetComposeViewController { - [Obsolete ("Use the CompletionHandler property")] + [Obsolete ("Use the 'CompletionHandler' property.")] public virtual void SetCompletionHandler (Action handler) { CompletionHandler = handler; diff --git a/src/UIKit/Compat.cs b/src/UIKit/Compat.cs index 5d12fd35a81a..86587eae1a85 100644 --- a/src/UIKit/Compat.cs +++ b/src/UIKit/Compat.cs @@ -62,7 +62,7 @@ public static UIViewController GetAdaptivePresentationStyle (IUIAdaptivePresenta public static partial class NSIdentifier { - [Obsolete ("Use GetIdentifier method")] + [Obsolete ("Use 'GetIdentifier' method.")] public static string Identifier (this NSLayoutConstraint This) { return This.GetIdentifier (); @@ -73,7 +73,7 @@ public static string Identifier (this NSLayoutConstraint This) #if !XAMCORE_4_0 && !WATCH public partial class UIPresentationController { - [Obsolete ("Removed in iOS10. Use .ctor(UIViewController,UIViewController)")] + [Obsolete ("Removed in iOS10. Use '.ctor (UIViewController,UIViewController)'.")] public UIPresentationController () { } @@ -81,7 +81,7 @@ public UIPresentationController () #if !TVOS public partial class UIPreviewInteraction { - [Obsolete ("Use overload accepting a IUICoordinateSpace")] + [Obsolete ("Use overload accepting a 'IUICoordinateSpace'.")] public virtual CGPoint GetLocationInCoordinateSpace (UICoordinateSpace coordinateSpace) { return GetLocationInCoordinateSpace ((IUICoordinateSpace) coordinateSpace); @@ -90,4 +90,16 @@ public virtual CGPoint GetLocationInCoordinateSpace (UICoordinateSpace coordinat #endif #endif + +#if !XAMCORE_4_0 && !WATCH + public partial class UICollectionViewFocusUpdateContext { + [Obsolete ("This cannot be directly created.")] + public UICollectionViewFocusUpdateContext () { } + } + + public partial class UIFocusUpdateContext { + [Obsolete ("This cannot be directly created.")] + public UIFocusUpdateContext () { } + } +#endif } diff --git a/src/UIKit/UIActivityViewController.cs b/src/UIKit/UIActivityViewController.cs index 4a3fb5aff3ad..c36d112004a3 100644 --- a/src/UIKit/UIActivityViewController.cs +++ b/src/UIKit/UIActivityViewController.cs @@ -5,12 +5,12 @@ namespace XamCore.UIKit { public partial class UIActivityViewController { - [Obsolete ("iOS9 does not allow creating an empty instance")] + [Obsolete ("iOS 9 does not allow creating an empty instance.")] public UIActivityViewController () { } - [Obsolete ("Use CompletionWithItemsHandler property")] + [Obsolete ("Use 'CompletionWithItemsHandler' property.")] public virtual void SetCompletionHandler (UIActivityViewControllerCompletion completionHandler) { CompletionWithItemsHandler = completionHandler; diff --git a/src/UIKit/UIDragDropSessionExtensions.cs b/src/UIKit/UIDragDropSessionExtensions.cs new file mode 100644 index 000000000000..9ec824a7a58d --- /dev/null +++ b/src/UIKit/UIDragDropSessionExtensions.cs @@ -0,0 +1,44 @@ +// +// UIDragDropSessionExtensions.cs +// +// Authors: +// Vincent Dondain +// +// Copyright 2017 Microsoft +// + +#if !TVOS && !WATCH + +using System; +using XamCore.ObjCRuntime; +using XamCore.Foundation; + +namespace XamCore.UIKit { + + public static class UIDragDropSessionExtensions { + + public static NSProgress LoadObjects (this IUIDropSession session, Action completion) where T: NSObject, INSItemProviderReading + { + return session.LoadObjects (new Class (typeof (T)), (v) => + { + var arr = v as T[]; + if (arr == null && v != null) { + arr = new T [v.Length]; + for (int i = 0; i < arr.Length; i++) { + if (v [i] != null) + arr [i] = Runtime.ConstructNSObject (v [i].Handle); + } + } + + completion (arr); + }); + } + + public static bool CanLoadObjects (this IUIDragDropSession session, Type type) + { + return session.CanLoadObjects (new Class (type)); + } + } +} + +#endif \ No newline at end of file diff --git a/src/UIKit/UIEnums.cs b/src/UIKit/UIEnums.cs index 424c2c33a0c3..e76daeefbe64 100644 --- a/src/UIKit/UIEnums.cs +++ b/src/UIKit/UIEnums.cs @@ -57,7 +57,7 @@ public enum UIAlertViewStyle : nint { public enum UIBarButtonItemStyle : nint { Plain, - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use UIBarButtonItemStyle.Plain when the minimum deployment target is iOS 7")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'UIBarButtonItemStyle.Plain' instead.")] Bordered, Done, @@ -92,6 +92,7 @@ public enum UIBarButtonSystemItem : nint { Redo, [iOS (4,0)] + [Deprecated (PlatformName.iOS, 11, 0)] PageCurl } @@ -183,6 +184,8 @@ public enum UIControlContentHorizontalAlignment : nint { Left = 1, Right = 2, Fill = 3, + Leading = 4, + Trailing = 5 } // NSUInteger -> UIControl.h @@ -280,10 +283,10 @@ public enum UIBarMetrics : nint { DefaultPrompt = 101, CompactPrompt, - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_8_0, Message = "Use UIBarMetrics.Compat instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_8_0, Message = "Use 'UIBarMetrics.Compat' instead.")] LandscapePhone = Compact, - [Availability (Introduced = Platform.iOS_7_0, Deprecated = Platform.iOS_8_0, Message = "Use UIBarMetrics.CompactPrompt instead")] + [Availability (Introduced = Platform.iOS_7_0, Deprecated = Platform.iOS_8_0, Message = "Use 'UIBarMetrics.CompactPrompt' instead.")] LandscapePhonePrompt = CompactPrompt } @@ -297,7 +300,8 @@ public enum UIButtonType : nint { InfoLight, InfoDark, ContactAdd, - System = RoundedRect + Plain, + System = RoundedRect, } // NSInteger -> UIStringDrawing.h @@ -423,11 +427,11 @@ public enum UIBarStyle : nint { Black, // The header doesn't say when it was deprecated, but the earliest headers I have (iOS 5.1) it is already deprecated. - [Availability (Deprecated = Platform.iOS_5_1, Message = "Use UIBarStyle.Black")] + [Availability (Deprecated = Platform.iOS_5_1, Message = "Use 'UIBarStyle.Black'.")] BlackOpaque = 1, // The header doesn't say when it was deprecated, but the earliest headers I have (iOS 5.1) it is already deprecated. - [Availability (Deprecated = Platform.iOS_5_1, Message = "Use UIBarStyle.Black and set the translucency property to true")] + [Availability (Deprecated = Platform.iOS_5_1, Message = "Use 'UIBarStyle.Black' and set the translucency property to true.")] BlackTranslucent = 2, } @@ -491,7 +495,7 @@ public enum UIKeyboardType : nint { // NSInteger -> UISegmentedControl.h [Native] [NoTV][NoWatch] - [Availability (Deprecated = Platform.iOS_7_0, Message = "Deprecated in iOS 7, this no longer has any effect")] + [Availability (Deprecated = Platform.iOS_7_0, Message = "This no longer has any effect.")] public enum UISegmentedControlStyle : nint { Plain, Bordered, @@ -630,6 +634,7 @@ public enum UITableViewCellStyle : nint { public enum UITableViewCellSeparatorStyle : nint { None, SingleLine, + [Deprecated (PlatformName.iOS, 11, 0, message:"Use 'SingleLine' for a single line separator.")] SingleLineEtched, DoubleLineEtched = SingleLineEtched } @@ -791,12 +796,12 @@ public enum UIActionSheetStyle : nint { public enum UIStatusBarStyle : nint { Default, - [Availability (Deprecated = Platform.iOS_7_0, Message = "Use LightContent instead")] + [Availability (Deprecated = Platform.iOS_7_0, Message = "Use 'LightContent' instead.")] BlackTranslucent = 1, LightContent = 1, - [Availability (Deprecated = Platform.iOS_7_0, Message = "Use LightContent instead")] + [Availability (Deprecated = Platform.iOS_7_0, Message = "Use 'LightContent' instead.")] BlackOpaque = 2, } @@ -880,6 +885,7 @@ public enum UIModalPresentationStyle : nint { OverCurrentContext, [NoTV] Popover, + BlurOverFullScreen, None = -1 } @@ -1067,7 +1073,7 @@ public enum UIAccessibilityScrollDirection : nint { public enum UIScreenOverscanCompensation : nint { Scale, InsetBounds, None, - [Obsolete ("Use UIScreenOverscanCompensation.None instead")] + [Obsolete ("Use 'UIScreenOverscanCompensation.None' instead.")] InsetApplicationFrame = None } @@ -1248,6 +1254,10 @@ public enum NSLayoutFormatOptions : nuint_compat_int { DirectionLeadingToTrailing = 0 << 16, // default DirectionLeftToRight = 1 << 16, DirectionRightToLeft = 2 << 16, + + SpacingEdgeToEdge = 0 << 19, + SpacingBaselineToBaseline = 1 << 19, + SpacingMask = 1 << 19, DirectionMask = 0x3 << 16, } @@ -1651,7 +1661,7 @@ public enum UIPrinterJobTypes : nint { [NoTV][NoWatch] [iOS (8,0)] - [Deprecated (PlatformName.iOS, 10, 0, message:"Use UNAuthorizationOptions instead")] + [Deprecated (PlatformName.iOS, 10, 0, message:"Use 'UNAuthorizationOptions' instead.")] [Native] [Flags] public enum UIUserNotificationType : nuint { @@ -1663,7 +1673,7 @@ public enum UIUserNotificationType : nuint { [NoTV][NoWatch] [iOS (8, 0)] - [Deprecated (PlatformName.iOS, 10, 0, message: "Use UNNotificationActionOptions instead")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'UNNotificationActionOptions' instead.")] [Native] public enum UIUserNotificationActivationMode : nuint { Foreground, @@ -1672,13 +1682,14 @@ public enum UIUserNotificationActivationMode : nuint { [NoTV][NoWatch] [iOS (8, 0)] - [Deprecated (PlatformName.iOS, 10, 0, message: "Use UNNotificationCategory.Actions instead")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'UNNotificationCategory.Actions' instead.")] [Native] public enum UIUserNotificationActionContext : nuint { Default, Minimal } + [Deprecated (PlatformName.iOS, 11, 0)] [NoTV][NoWatch] [iOS (8, 0)] [Native] @@ -1788,7 +1799,7 @@ public enum UIPrinterCutterBehavior : nint [NoTV][NoWatch] [iOS (9,0)] - [Deprecated (PlatformName.iOS, 10, 0, message: "Use UNNotificationAction or UNTextInputNotificationAction instead")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'UNNotificationAction' or 'UNTextInputNotificationAction' instead.")] [Native] public enum UIUserNotificationActionBehavior : nuint { @@ -1988,4 +1999,305 @@ public enum UIScrollViewIndexDisplayMode : nint { Automatic, AlwaysHidden } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Native] + public enum UIScrollViewContentInsetAdjustmentBehavior : nint + { + Automatic, + ScrollableAxes, + Never, + Always + } + + [iOS (11,0), TV (11,0), Watch (4,0)] + [Native] + public enum UIAccessibilityContainerType : nint + { + None = 0, + DataTable, + List, + Landmark + } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Native] + public enum UITextSmartQuotesType : nint + { + Default, + No, + Yes + } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Native] + public enum UITextSmartDashesType : nint + { + Default, + No, + Yes + } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Native] + public enum UITextSmartInsertDeleteType : nint + { + Default, + No, + Yes + } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Native] + public enum UIAccessibilityCustomSystemRotorType : nint + { + None = 0, + Link, + VisitedLink, + Heading, + HeadingLevel1, + HeadingLevel2, + HeadingLevel3, + HeadingLevel4, + HeadingLevel5, + HeadingLevel6, + BoldText, + ItalicText, + UnderlineText, + MisspelledWord, + Image, + TextField, + Table, + List, + Landmark + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UIDropOperation : nuint + { + Cancel = 0, + Forbidden = 1, + Copy = 2, + Move = 3 + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + [Flags] + public enum UITextDragOptions : nint + { + None = 0, + StripTextColorFromPreviews = (1 << 0) + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UITextDropAction : nuint + { + Insert = 0, + ReplaceSelection, + ReplaceAll + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UITextDropProgressMode : nuint + { + System = 0, + Custom + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UITextDropEditability : nuint + { + No = 0, + Temporary, + Yes + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UICollectionViewReorderingCadence : nint + { + Immediate, + Fast, + Slow + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UICollectionViewDropIntent : nint + { + Unspecified, + InsertAtDestinationIndexPath, + InsertIntoDestinationIndexPath + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UICollectionViewCellDragState : nint + { + None, + Lifting, + Dragging + } + + [NoWatch] + [NoTV, iOS (11,0)] + [Native] + public enum UIImagePickerControllerImageUrlExportPreset : nint + { + Compatible = 0, + Current + } + + [NoWatch] + [NoTV, iOS (11,0)] + [Native] + public enum UIContextualActionStyle : nint + { + Normal, + Destructive + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UITableViewCellDragState : nint + { + None, + Lifting, + Dragging + } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Native] + public enum UITableViewSeparatorInsetReference : nint + { + CellEdges, + AutomaticInsets + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UITableViewDropIntent : nint + { + Unspecified, + InsertAtDestinationIndexPath, + InsertIntoDestinationIndexPath, + Automatic + } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Native] + public enum UISplitViewControllerPrimaryEdge : nint + { + Leading, + Trailing + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UIDropSessionProgressIndicatorStyle : nuint + { + None, + Default + } + + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UISpringLoadedInteractionEffectState : nint + { + Inactive, + Possible, + Activating, + Activated + } + + [NoWatch] + [NoTV, iOS (11,0)] + [Native] + public enum UIDocumentBrowserImportMode : nuint + { + None, + Copy, + Move + } + + [NoWatch] + [NoTV, iOS (11,0)] + [Native] + public enum UIDocumentBrowserUserInterfaceStyle : nuint + { + White = 0, + Light, + Dark + } + + [NoWatch] + [NoTV, iOS (11,0)] + [Native] + [Flags] + public enum UIDocumentBrowserActionAvailability : nint + { + Menu = 1, + NavigationBar = 1 << 1 + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Native] + public enum UITextDropPerformer : nuint + { + View = 0, + Delegate, + } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Native] + public enum UINavigationItemLargeTitleDisplayMode : nint + { + Automatic, + Always, + Never, + } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Native] + public enum UICollectionViewFlowLayoutSectionInsetReference : nint + { + ContentInset, + SafeArea, + LayoutMargins, + } + + [NoWatch][NoTV] + [iOS (11,0)] + [Native] + public enum UIPreferredPresentationStyle : nint + { + Unspecified = 0, + Inline, + Attachment, + } + + [NoWatch, NoTV, NoMac, iOS (11,0)] + [Native] + [ErrorDomain ("UIDocumentBrowserErrorDomain")] + public enum UIDocumentBrowserErrorCode : nint + { + Generic = 1, + } + + } diff --git a/src/UIKit/UIImagePickerController.cs b/src/UIKit/UIImagePickerController.cs index a96c68375b48..170ed0d1fa68 100644 --- a/src/UIKit/UIImagePickerController.cs +++ b/src/UIKit/UIImagePickerController.cs @@ -139,6 +139,20 @@ public NSUrl ReferenceUrl { return (NSUrl) Info [UIImagePickerController.ReferenceUrl]; } } + + [iOS (11,0)] + public PHAsset PHAsset { + get { + return (PHAsset) Info [UIImagePickerController.PHAsset]; + } + } + + [iOS (11,0)] + public NSUrl ImageUrl { + get { + return (NSUrl) Info [UIImagePickerController.ImageUrl]; + } + } } } diff --git a/src/UIKit/UIPopoverPresentationController.cs b/src/UIKit/UIPopoverPresentationController.cs index 4c4da55d1b90..72a6d941a7cc 100644 --- a/src/UIKit/UIPopoverPresentationController.cs +++ b/src/UIKit/UIPopoverPresentationController.cs @@ -27,14 +27,14 @@ public virtual Type PopoverBackgroundViewType { #if !XAMCORE_3_0 public partial class UIPopoverPresentationControllerDelegate { - [Obsolete ("Use the overload with `ref` parameters for targetRect and inView")] + [Obsolete ("Use the overload with 'ref' parameters for 'targetRect' and 'inView'.")] public virtual void WillRepositionPopover (UIPopoverPresentationController popoverPresentationController, CGRect targetRect, UIView inView) { } } public static partial class UIPopoverPresentationControllerDelegate_Extensions { - [Obsolete ("Use the overload with `ref` parameters for targetRect and inView")] + [Obsolete ("Use the overload with 'ref' parameters for 'targetRect' and 'inView'.")] public static void WillRepositionPopover (IUIPopoverPresentationControllerDelegate This, UIPopoverPresentationController popoverPresentationController, CGRect targetRect, UIView inView) { } diff --git a/src/UIKit/UIResponder.cs b/src/UIKit/UIResponder.cs index 2b3b7b6587f5..9ea529011957 100644 --- a/src/UIKit/UIResponder.cs +++ b/src/UIKit/UIResponder.cs @@ -35,7 +35,7 @@ public virtual void Cut () [Obsolete ("Override Paste(NSObject)")] public virtual void Paste () { - Paste (null); + Paste ((NSObject)null); } [Obsolete ("Override Delete(NSObject)")] diff --git a/src/UIKit/UITypes.cs b/src/UIKit/UITypes.cs index a5ba29651e45..1922da03360f 100644 --- a/src/UIKit/UITypes.cs +++ b/src/UIKit/UITypes.cs @@ -102,6 +102,83 @@ public override string ToString () #endif } + [Watch (4,0), TV (11,0), iOS (11,0)] + [StructLayout (LayoutKind.Sequential)] + public struct NSDirectionalEdgeInsets { + + // API match for NSDirectionalEdgeInsetsZero field/constant + [Field ("NSDirectionalEdgeInsetsZero")] // fake (but helps testing and could also help documentation) + public static readonly NSDirectionalEdgeInsets Zero; + + public nfloat Top, Leading, Bottom, Trailing; + +#if !COREBUILD + public NSDirectionalEdgeInsets (nfloat top, nfloat leading, nfloat bottom, nfloat trailing) + { + Top = top; + Leading = leading; + Bottom = bottom; + Trailing = trailing; + } + + // note: NSDirectionalEdgeInsetsEqualToDirectionalEdgeInsets (UIGeometry.h) is a macro + public bool Equals (NSDirectionalEdgeInsets other) + { + if (Leading != other.Leading) + return false; + if (Trailing != other.Trailing) + return false; + if (Top != other.Top) + return false; + return (Bottom == other.Bottom); + } + + public override bool Equals (object obj) + { + if (obj is NSDirectionalEdgeInsets) + return Equals ((NSDirectionalEdgeInsets) obj); + return false; + } + + public static bool operator == (NSDirectionalEdgeInsets insets1, NSDirectionalEdgeInsets insets2) + { + return insets1.Equals (insets2); + } + + public static bool operator != (NSDirectionalEdgeInsets insets1, NSDirectionalEdgeInsets insets2) + { + return !insets1.Equals (insets2); + } + + public override int GetHashCode () + { + return Top.GetHashCode () ^ Leading.GetHashCode () ^ Trailing.GetHashCode () ^ Bottom.GetHashCode (); + } + + [DllImport (Constants.UIKitLibrary)] + extern static NSDirectionalEdgeInsets NSDirectionalEdgeInsetsFromString (IntPtr /* NSString */ s); + + static public NSDirectionalEdgeInsets FromString (string s) + { + // note: null is allowed + var ptr = NSString.CreateNative (s); + var value = NSDirectionalEdgeInsetsFromString (ptr); + NSString.ReleaseNative (ptr); + return value; + } + + [DllImport (Constants.UIKitLibrary)] + extern static IntPtr /* NSString */ NSStringFromDirectionalEdgeInsets (NSDirectionalEdgeInsets insets); + + // note: ensure we can roundtrip ToString into FromString + public override string ToString () + { + using (var ns = new NSString (NSStringFromDirectionalEdgeInsets (this))) + return ns.ToString (); + } +#endif + } + #if !WATCH [iOS (9,0)] [StructLayout (LayoutKind.Sequential)] diff --git a/src/UIKit/UIVibrancyEffect.cs b/src/UIKit/UIVibrancyEffect.cs index 52a76d4d030c..ed3f0f905342 100644 --- a/src/UIKit/UIVibrancyEffect.cs +++ b/src/UIKit/UIVibrancyEffect.cs @@ -18,7 +18,7 @@ public partial class UIVibrancyEffect { // https://trello.com/c/iQpXOxCd/227-category-and-static-methods-selectors // note: we cannot reuse the same method name - as it would break compilation of existing apps [iOS (8,0)] - [Deprecated (PlatformName.iOS, 10,0, message: "Use CreatePrimaryVibrancyEffectForNotificationCenter")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CreatePrimaryVibrancyEffectForNotificationCenter' instead.")] static public UIVibrancyEffect CreateForNotificationCenter () { return (null as UIVibrancyEffect).NotificationCenterVibrancyEffect (); diff --git a/src/UIKit/UIView.cs b/src/UIKit/UIView.cs index f44aa7dde387..8aa33712a884 100644 --- a/src/UIKit/UIView.cs +++ b/src/UIKit/UIView.cs @@ -118,7 +118,7 @@ public static event NSAction AnimationWillEnd { } } - [Advice ("Use the *Notify method that has `UICompletionHandler completion` parameter, the `bool` will tell you if the operation finished")] + [Advice ("Use the *Notify method that has 'UICompletionHandler completion' parameter, the 'bool' will tell you if the operation finished.")] public static void Animate (double duration, NSAction animation, NSAction completion) { // animation null check will be done in AnimateNotify @@ -128,7 +128,7 @@ public static void Animate (double duration, NSAction animation, NSAction comple }); } - [Advice ("Use the *Notify method that has `UICompletionHandler completion` parameter, the `bool` will tell you if the operation finished")] + [Advice ("Use the *Notify method that has 'UICompletionHandler completion' parameter, the 'bool' will tell you if the operation finished.")] public static void Animate (double duration, double delay, UIViewAnimationOptions options, NSAction animation, NSAction completion) { // animation null check will be done in AnimateNotify @@ -138,7 +138,7 @@ public static void Animate (double duration, double delay, UIViewAnimationOption }); } - [Advice ("Use the *Notify method that has `UICompletionHandler completion` parameter, the `bool` will tell you if the operation finished")] + [Advice ("Use the *Notify method that has 'UICompletionHandler completion' parameter, the 'bool' will tell you if the operation finished.")] public static void Transition (UIView fromView, UIView toView, double duration, UIViewAnimationOptions options, NSAction completion) { TransitionNotify (fromView, toView, duration, options, (x) => { @@ -147,7 +147,7 @@ public static void Transition (UIView fromView, UIView toView, double duration, }); } - [Advice ("Use the *Notify method that has `UICompletionHandler completion` parameter, the `bool` will tell you if the operation finished")] + [Advice ("Use the *Notify method that has 'UICompletionHandler completion' parameter, the 'bool' will tell you if the operation finished.")] public static void Transition (UIView withView, double duration, UIViewAnimationOptions options, NSAction animation, NSAction completion) { // animation null check will be done in AnimateNotify @@ -158,14 +158,14 @@ public static void Transition (UIView withView, double duration, UIViewAnimation } #if !XAMCORE_2_0 - [Advice ("Use the version with a `ref float actualFontSize`")] + [Advice ("Use the version with a 'ref float actualFontSize'.")] public CGSize DrawString (string str, CGPoint point, nfloat width, XamCore.UIKit.UIFont font, nfloat minFontSize, nfloat actualFontSize, XamCore.UIKit.UILineBreakMode breakMode, XamCore.UIKit.UIBaselineAdjustment adjustment) { nfloat temp = actualFontSize; return DrawString (str, point, width, font, minFontSize, ref temp, breakMode, adjustment); } - [Obsolete ("Use TranslatesAutoresizingMaskIntoConstraints")] + [Obsolete ("Use 'TranslatesAutoresizingMaskIntoConstraints'.")] bool TranslatesAutoresizingMaskIntoConstrainst { get { return TranslatesAutoresizingMaskIntoConstraints; } set { TranslatesAutoresizingMaskIntoConstraints = value; } diff --git a/src/Vision/VNBarcodeSymbologyExtensions.cs b/src/Vision/VNBarcodeSymbologyExtensions.cs new file mode 100644 index 000000000000..465ceb86c153 --- /dev/null +++ b/src/Vision/VNBarcodeSymbologyExtensions.cs @@ -0,0 +1,39 @@ +// +// VNBarcodeSymbologyExtensions.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; + +namespace XamCore.Vision { + public static partial class VNBarcodeSymbologyExtensions { + public static NSString [] GetConstants (this VNBarcodeSymbology [] self) + { + if (self == null) + throw new ArgumentNullException (nameof (self)); + + var array = new NSString [self.Length]; + for (int n = 0; n < self.Length; n++) + array [n] = self [n].GetConstant (); + return array; + } + + public static VNBarcodeSymbology [] GetValues (NSString [] constants) + { + if (constants == null) + throw new ArgumentNullException (nameof (constants)); + + var array = new VNBarcodeSymbology [constants.Length]; + for (int n = 0; n < constants.Length; n++) + array [n] = GetValue (constants [n]); + return array; + } + } +} +#endif diff --git a/src/Vision/VNDetectBarcodesRequest.cs b/src/Vision/VNDetectBarcodesRequest.cs new file mode 100644 index 000000000000..b7aa60628470 --- /dev/null +++ b/src/Vision/VNDetectBarcodesRequest.cs @@ -0,0 +1,22 @@ +// +// VNDetectBarcodesRequest.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; + +namespace XamCore.Vision { + public partial class VNDetectBarcodesRequest { + + public VNBarcodeSymbology [] Symbologies { + get { return VNBarcodeSymbologyExtensions.GetValues (WeakSymbologies); } + set { WeakSymbologies = value.GetConstants (); } + } + } +} +#endif diff --git a/src/Vision/VNFaceLandmarkRegion2D.cs b/src/Vision/VNFaceLandmarkRegion2D.cs new file mode 100644 index 000000000000..afff1bca0d5f --- /dev/null +++ b/src/Vision/VNFaceLandmarkRegion2D.cs @@ -0,0 +1,54 @@ +// +// VNFaceLandmarkRegion2D.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.CoreGraphics; + +namespace XamCore.Vision { + public partial class VNFaceLandmarkRegion2D { + + public virtual CGPoint [] NormalizedPoints { + get { + var ret = _GetNormalizedPoints (); + if (ret == IntPtr.Zero) + return null; + + unsafe { + var count = (int) PointCount; + var rv = new CGPoint [count]; + var ptr = (CGPoint*) ret; + for (int i = 0; i < count; i++) + rv [i] = *ptr++; + return rv; + } + } + } + + public virtual CGPoint [] GetPointsInImage (CGSize imageSize) + { + // return the address of the array of pointCount points + // or NULL if the conversion could not take place. + var ret = _GetPointsInImage (imageSize); + if (ret == IntPtr.Zero) + return null; + + unsafe { + var count = (int) PointCount; + var rv = new CGPoint [count]; + var ptr = (CGPoint*) ret; + for (int i = 0; i < count; i++) + rv [i] = *ptr++; + return rv; + } + } + } +} +#endif diff --git a/src/Vision/VNRequest.cs b/src/Vision/VNRequest.cs new file mode 100644 index 000000000000..5d0660c99ed6 --- /dev/null +++ b/src/Vision/VNRequest.cs @@ -0,0 +1,29 @@ +// +// VNRequest.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.Vision { + public partial class VNRequest { + + public virtual T [] GetResults () where T : VNObservation + { + // From docs: If the request failed, this property will be nil; + // otherwise, it will be an array of zero or more VNObservation + // subclasses specific to the VNRequest subclass. + // ArrayFromHandle does the null checking for us. + return NSArray.ArrayFromHandle (_Results); + } + } +} +#endif diff --git a/src/Vision/VNUtils.cs b/src/Vision/VNUtils.cs new file mode 100644 index 000000000000..b00c1fc3d26a --- /dev/null +++ b/src/Vision/VNUtils.cs @@ -0,0 +1,66 @@ +// +// VNUtils.cs +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using System.Runtime.InteropServices; +using XamCore.CoreGraphics; +using XamCore.ObjCRuntime; +using XamCore.Foundation; + +using Vector2 = global::OpenTK.Vector2; + +namespace XamCore.Vision { + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + public static partial class VNUtils { + + [Field ("VNNormalizedIdentityRect", Constants.VisionLibrary)] + public static CGRect NormalizedIdentityRect { get; } = Dlfcn.GetCGRect (Libraries.Vision.Handle, "VNNormalizedIdentityRect"); + + [DllImport (Constants.VisionLibrary, EntryPoint = "VNNormalizedRectIsIdentityRect")] + public static extern bool IsIdentityRect (CGRect rect); + + [DllImport (Constants.VisionLibrary, EntryPoint = "VNImagePointForNormalizedPoint")] + public static extern CGPoint GetImagePoint (CGPoint normalizedPoint, nuint imageWidth, nuint imageHeight); + + [DllImport (Constants.VisionLibrary, EntryPoint = "VNImageRectForNormalizedRect")] + public static extern CGRect GetImageRect (CGRect normalizedRect, nuint imageWidth, nuint imageHeight); + + [DllImport (Constants.VisionLibrary, EntryPoint = "VNNormalizedRectForImageRect")] + public static extern CGRect GetNormalizedRect (CGRect imageRect, nuint imageWidth, nuint imageHeight); + + [DllImport ("__Internal", EntryPoint = "xamarin_CGPoint__VNNormalizedFaceBoundingBoxPointForLandmarkPoint_Vector2_CGRect_nuint_nuint_string")] + static extern CGPoint VNNormalizedFaceBoundingBoxPointForLandmarkPoint (Vector2 faceLandmarkPoint, CGRect faceBoundingBox, nuint imageWidth, nuint imageHeight, out IntPtr error); + + public static CGPoint GetNormalizedFaceBoundingBoxPoint (Vector2 faceLandmarkPoint, CGRect faceBoundingBox, nuint imageWidth, nuint imageHeight) + { + IntPtr error; + var result = VNNormalizedFaceBoundingBoxPointForLandmarkPoint (faceLandmarkPoint, faceBoundingBox, imageWidth, imageHeight, out error); + if (error != IntPtr.Zero) + throw new InvalidOperationException (Marshal.PtrToStringAuto (error)); + + return result; + } + + [DllImport ("__Internal", EntryPoint = "xamarin_CGPoint__VNImagePointForFaceLandmarkPoint_Vector2_CGRect_nuint_nuint_string")] + static extern CGPoint VNImagePointForFaceLandmarkPoint (Vector2 faceLandmarkPoint, CGRect faceBoundingBox, nuint imageWidth, nuint imageHeight, out IntPtr error); + + public static CGPoint GetImagePoint (Vector2 faceLandmarkPoint, CGRect faceBoundingBox, nuint imageWidth, nuint imageHeight) + { + IntPtr error; + var result = VNImagePointForFaceLandmarkPoint (faceLandmarkPoint, faceBoundingBox, imageWidth, imageHeight, out error); + if (error != IntPtr.Zero) + throw new InvalidOperationException (Marshal.PtrToStringAuto (error)); + + return result; + } + } +} +#endif diff --git a/src/WKWebKit/Defs.cs b/src/WKWebKit/Defs.cs index 716827ca0932..169b248dacc8 100644 --- a/src/WKWebKit/Defs.cs +++ b/src/WKWebKit/Defs.cs @@ -56,6 +56,14 @@ public enum WKErrorCode : nint { JavaScriptExceptionOccurred, [iOS (9,0)][Mac (10,11, onlyOn64 : true)] JavaScriptResultTypeIsUnsupported, + [iOS (11,0)][Mac (10,13, onlyOn64 : true)] + ContentRuleListStoreCompileFailed, + [iOS (11,0)][Mac (10,13, onlyOn64 : true)] + ContentRuleListStoreLookUpFailed, + [iOS (11,0)][Mac (10,13, onlyOn64 : true)] + ContentRuleListStoreRemoveFailed, + [iOS (11,0)][Mac (10,13, onlyOn64 : true)] + ContentRuleListStoreVersionMismatch } #if !MONOMAC || !XAMCORE_4_0 diff --git a/src/WatchKit/WKAccessibility.cs b/src/WatchKit/WKAccessibility.cs index 6c951fd545a1..3e5133bf1c43 100644 --- a/src/WatchKit/WKAccessibility.cs +++ b/src/WatchKit/WKAccessibility.cs @@ -15,6 +15,15 @@ public partial class WKAccessibility { static public bool IsVoiceOverRunning { get { return WKAccessibilityIsVoiceOverRunning (); } } + + [Watch (4,0)] + [DllImport (Constants.WatchKitLibrary)] + static extern bool WKAccessibilityIsReduceMotionEnabled (); + + [Watch (4,0)] + static public bool IsReduceMotionEnabled { + get { return WKAccessibilityIsReduceMotionEnabled (); } + } } } diff --git a/src/WatchKit/WKDefs.cs b/src/WatchKit/WKDefs.cs index 7eec910f0264..0d8719dec41a 100644 --- a/src/WatchKit/WKDefs.cs +++ b/src/WatchKit/WKDefs.cs @@ -216,4 +216,38 @@ public enum WKWaterResistanceRating : nint { Ipx7, Wr50, } + + [Watch (4,0)][NoiOS] + [Native] + public enum WKSnapshotReason : nint { + AppScheduled = 0, + ReturnToDefaultState, + ComplicationUpdate, + Prelaunch, + AppBackgrounded, + } + + [Watch (4,0)][NoiOS] + [Native] + public enum WKPageOrientation : nint { + Horizontal, + Vertical, + } + + [Watch (4,0)][NoiOS] + [Native] + public enum WKInterfaceScrollPosition : nint { + Top, + CenteredVertically, + Bottom, + } + + [Watch (4,0)][NoiOS] + [Native] + public enum WKInterfaceDeviceBatteryState : nint { + Unknown, + Unplugged, + Charging, + Full, + } } diff --git a/src/accounts.cs b/src/accounts.cs index bfd44026897e..8e116bf0e941 100644 --- a/src/accounts.cs +++ b/src/accounts.cs @@ -66,6 +66,7 @@ interface ACAccountCredential : NSSecureCoding { } delegate void ACAccountStoreSaveCompletionHandler (bool success, NSError error); + delegate void ACAccountStoreRemoveCompletionHandler (bool success, NSError error); delegate void ACRequestCompletionHandler (bool granted, NSError error); [Since (5,0)] @@ -89,7 +90,7 @@ interface ACAccountStore { void SaveAccount (ACAccount account, ACAccountStoreSaveCompletionHandler completionHandler); [Export ("requestAccessToAccountsWithType:withCompletionHandler:")] - [Availability (Deprecated = Platform.iOS_6_0, Message = "Use RequestAccewss (ACAccountType, AccountStoreOptions, ACRequestCompletionHandler) instead")] + [Availability (Deprecated = Platform.iOS_6_0, Message = "Use 'RequestAccess (ACAccountType, AccountStoreOptions, ACRequestCompletionHandler)' instead.")] [Async] void RequestAccess (ACAccountType accountType, ACRequestCompletionHandler completionHandler); @@ -112,6 +113,11 @@ interface ACAccountStore { [Wrap ("RequestAccess (accountType, options == null ? null : options.Dictionary, completion)")] [Async] void RequestAccess (ACAccountType accountType, [NullAllowed] AccountStoreOptions options, ACRequestCompletionHandler completion); + + [iOS (6,0)] + [Export ("removeAccount:withCompletionHandler:")] + [Async] + void RemoveAccount (ACAccount account, ACAccountStoreRemoveCompletionHandler completionHandler); } [Since (5,0)] @@ -127,29 +133,40 @@ interface ACAccountType : NSSecureCoding { [Export ("accessGranted")] bool AccessGranted { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Twitter SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Twitter SDK instead.")] [Field ("ACAccountTypeIdentifierTwitter")] NSString Twitter { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Sina Weibo SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Sina Weibo SDK instead.")] [Since (6,0)] [Field ("ACAccountTypeIdentifierSinaWeibo")] NSString SinaWeibo { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Facebook SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Facebook SDK instead.")] [Since (6,0)] [Field ("ACAccountTypeIdentifierFacebook")] NSString Facebook { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Tencent Weibo SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Tencent Weibo SDK instead.")] [Since (7,0)] [Mac (10,9)] [Field ("ACAccountTypeIdentifierTencentWeibo")] NSString TencentWeibo { get; } #if MONOMAC + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use LinkedIn SDK instead.")] [Mac (10,9)] [Field ("ACAccountTypeIdentifierLinkedIn")] NSString LinkedIn { get; } #endif } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Facebook SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Facebook SDK instead.")] [Since (6,0)] [Mac (10,8, onlyOn64 : true)] [Static] @@ -165,6 +182,8 @@ interface ACFacebookKey { NSString Audience { get; } } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Facebook SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Facebook SDK instead.")] [Since (6,0)] [Mac (10,8, onlyOn64 : true)] [Static] @@ -180,6 +199,8 @@ interface ACFacebookAudienceValue NSString OnlyMe { get; } } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Tencent Weibo SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Tencent Weibo SDK instead.")] [Since (7,0)] [Mac (10,9, onlyOn64 : true)] [Static] @@ -189,6 +210,7 @@ interface ACTencentWeiboKey { } #if MONOMAC + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use LinkedIn SDK instead.")] [Mac (10,9, onlyOn64 : true)] [Static] interface ACLinkedInKey { diff --git a/src/addressbookui.cs b/src/addressbookui.cs index bfd2a59fcddc..93d96dbdad81 100644 --- a/src/addressbookui.cs +++ b/src/addressbookui.cs @@ -18,7 +18,7 @@ namespace XamCore.AddressBookUI { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [BaseType (typeof (UIViewController))] interface ABNewPersonViewController { [Export ("initWithNibName:bundle:")] @@ -42,7 +42,7 @@ interface ABNewPersonViewController { NSObject WeakDelegate { get; set; } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -57,7 +57,7 @@ interface ABNewPersonViewControllerDelegate { #endif } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [BaseType (typeof (UINavigationController))] interface ABPeoplePickerNavigationController : UIAppearance { [Export ("initWithNibName:bundle:")] @@ -98,7 +98,7 @@ interface ABPeoplePickerNavigationController : UIAppearance { NSPredicate PredicateForSelectionOfProperty { get; set; } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] #if XAMCORE_3_0 [BaseType (typeof (NSObject))] #else @@ -107,7 +107,7 @@ interface ABPeoplePickerNavigationController : UIAppearance { [Model] [Protocol] interface ABPeoplePickerNavigationControllerDelegate { - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use DidSelectPerson instead (or ABPeoplePickerNavigationController.PredicateForSelectionOfPerson)")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'DidSelectPerson' instead (or 'ABPeoplePickerNavigationController.PredicateForSelectionOfPerson').")] [Export ("peoplePickerNavigationController:shouldContinueAfterSelectingPerson:")] #if XAMCORE_2_0 bool ShouldContinue (ABPeoplePickerNavigationController peoplePicker, ABPerson selectedPerson); @@ -115,7 +115,7 @@ interface ABPeoplePickerNavigationControllerDelegate { bool ShouldContinue (ABPeoplePickerNavigationController peoplePicker, IntPtr selectedPerson); #endif - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use DidSelectPerson instead (or ABPeoplePickerNavigationController.PredicateForSelectionOfProperty)")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'DidSelectPerson' instead (or 'ABPeoplePickerNavigationController.PredicateForSelectionOfProperty').")] [Export ("peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:")] #if XAMCORE_2_0 bool ShouldContinue (ABPeoplePickerNavigationController peoplePicker, ABPerson selectedPerson, int /* ABPropertyId = int32 */ propertyId, int /* ABMultiValueIdentifier = int32 */ identifier); @@ -138,7 +138,7 @@ interface ABPeoplePickerNavigationControllerDelegate { #endif } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [BaseType (typeof (UIViewController))] interface ABPersonViewController : UIViewControllerRestoration { [Export ("initWithNibName:bundle:")] @@ -181,7 +181,7 @@ interface ABPersonViewController : UIViewControllerRestoration { void SetHighlightedItemForProperty (int /* ABPropertyId = int32 */ property, int /* ABMultiValueIdentifier = int32 */ identifier); } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [Static, iOS (8,0)] interface ABPersonPredicateKey { [Field ("ABPersonBirthdayProperty")] @@ -254,7 +254,7 @@ interface ABPersonPredicateKey { NSString UrlAddresses { get; } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -269,7 +269,7 @@ interface ABPersonViewControllerDelegate { #endif } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [BaseType (typeof (UIViewController))] interface ABUnknownPersonViewController { [Export ("initWithNibName:bundle:")] @@ -305,7 +305,7 @@ interface ABUnknownPersonViewController { NSObject WeakDelegate {get; set;} } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Contacts API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Contacts' API instead.")] [BaseType (typeof (NSObject))] [Model] [Protocol] diff --git a/src/appkit.cs b/src/appkit.cs index 57faa68536ed..e18e3e232738 100644 --- a/src/appkit.cs +++ b/src/appkit.cs @@ -141,7 +141,7 @@ interface NSAnimation : NSCoding, NSCopying { IntPtr Constructor (double duration, NSAnimationCurve animationCurve); #if !XAMCORE_4_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initWithDuration:animationCurve:")] IntPtr Constant (double duration, NSAnimationCurve animationCurve); #endif @@ -274,7 +274,7 @@ interface NSAlert { [Static, Export ("alertWithError:")] NSAlert WithError (NSError error); - [Availability (Introduced = Platform.Mac_10_3, Deprecated = Platform.Mac_10_10, Message = "Use constructor instead")] + [Availability (Introduced = Platform.Mac_10_3, Deprecated = Platform.Mac_10_10, Message = "Use constructor instead.")] [Static, Export ("alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:")] NSAlert WithMessage([NullAllowed] string message, [NullAllowed] string defaultButton, [NullAllowed] string alternateButton, [NullAllowed] string otherButton, string full); @@ -324,7 +324,7 @@ interface NSAlert { [Export ("runModal")] nint RunModal (); - [Availability (Introduced = Platform.Mac_10_3, Deprecated = Platform.Mac_10_10, Message = "Use BeginSheetModalForWindow (NSWindow sheetWindow, Action handler) instead")] + [Availability (Introduced = Platform.Mac_10_3, Deprecated = Platform.Mac_10_10, Message = "Use BeginSheetModalForWindow (NSWindow sheetWindow, Action handler) instead.")] [Export ("beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:")] void BeginSheet ([NullAllowed] NSWindow window, [NullAllowed] NSObject modalDelegate, [NullAllowed] Selector didEndSelector, IntPtr contextInfo); @@ -505,11 +505,11 @@ interface NSApplication : NSAccessibilityElementProtocol, NSAccessibility { [Export ("cancelUserAttentionRequest:")] void CancelUserAttentionRequest (nint request); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSWindow.BeginSheet instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSWindow.BeginSheet instead.")] [Export ("beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:")] void BeginSheet (NSWindow sheet, NSWindow docWindow, [NullAllowed] NSObject modalDelegate, [NullAllowed] Selector didEndSelector, IntPtr contextInfo); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSWindow.EndSheet instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use NSWindow.EndSheet instead.")] [Export ("endSheet:")] void EndSheet (NSWindow sheet); @@ -763,6 +763,29 @@ interface NSApplication : NSAccessibilityElementProtocol, NSAccessibility { void EnumerateWindows (NSWindowListOptions options, NSApplicationEnumerateWindowsHandler block); } + [Static] + interface NSAboutPanelOption { + [Mac (10, 13)] + [Field ("NSAboutPanelOptionCredits")] + NSString Credits { get; } + + [Mac (10, 13)] + [Field ("NSAboutPanelOptionApplicationName")] + NSString ApplicationName { get; } + + [Mac (10, 13)] + [Field ("NSAboutPanelOptionApplicationIcon")] + NSString ApplicationIcon { get; } + + [Mac (10, 13)] + [Field ("NSAboutPanelOptionVersion")] + NSString Version { get; } + + [Mac (10, 13)] + [Field ("NSAboutPanelOptionApplicationVersion")] + NSString ApplicationVersion { get; } + } + delegate void NSApplicationEnumerateWindowsHandler (NSWindow window, ref bool stop); delegate void ContinueUserActivityRestorationHandler (NSObject [] restorableObjects); @@ -911,6 +934,10 @@ interface NSApplicationDelegate { [Export ("application:userDidAcceptCloudKitShareWithMetadata:"), EventArgs ("NSApplicationUserAcceptedCloudKitShare")] void UserDidAcceptCloudKitShare (NSApplication application, CKShareMetadata metadata); #endif + + [Mac (10,13), EventArgs ("NSApplicationOpenUrls")] + [Export ("application:openURLs:")] + void OpenUrls (NSApplication application, NSUrl[] urls); } [Protocol] @@ -1192,6 +1219,7 @@ interface NSBezierPath : NSCoding, NSCopying { [Export ("appendBezierPathWithArcFromPoint:toPoint:radius:")] void AppendPathWithArc (CGPoint point1, CGPoint point2, nfloat radius); + [Availability (Obsoleted = Platform.Mac_10_13, Message = "Use 'AppendPathWithCGGlyph (CGGlyph, NSFont)' instead.")] [Export ("appendBezierPathWithGlyph:inFont:")] void AppendPathWithGlyph (uint /* NSGlyph = unsigned int */ glyph, NSFont font); @@ -1199,6 +1227,7 @@ interface NSBezierPath : NSCoding, NSCopying { void _AppendPathWithGlyphs (IntPtr glyphs, nint count, NSFont font); //IntPtr is exposed because the packedGlyphs should be treated as a "black box" + [Availability (Obsoleted = Platform.Mac_10_13, Message = "Use 'Append (uint[], NSFont)' instead.")] [Export ("appendBezierPathWithPackedGlyphs:")] void AppendPathWithPackedGlyphs (IntPtr packedGlyphs); @@ -1250,6 +1279,18 @@ interface NSBezierPath : NSCoding, NSCopying { [Export ("flatness")] nfloat Flatness { get; set; } + + [Mac (10,13)] + [Export ("appendBezierPathWithCGGlyph:inFont:")] + void AppendPathWithCGGlyph (CGGlyph glyph, NSFont font); + + [Mac (10,13)] + [Export ("appendBezierPathWithCGGlyphs:count:inFont:")] + [Internal] + void _AppendBezierPathWithCGGlyphs (IntPtr glyphs, nint count, NSFont font); + + [Wrap ("AppendPath (path)")] + void Append (NSBezierPath path); } [BaseType (typeof (NSImageRep))] @@ -1463,7 +1504,7 @@ interface NSBox { bool Transparent { [Bind ("isTransparent")] get; set; } [Export ("setTitleWithMnemonic:")] - [Availability (Deprecated = Platform.Mac_10_8, Message = "Mnemonics are deprecated in 10.8. Historically they have not done anything. For compatability, this method still sets the Title with the ampersand stripped from it.")] + [Availability (Deprecated = Platform.Mac_10_8, Message = "For compatability, this method still sets the Title with the ampersand stripped from it.")] void SetTitleWithMnemonic (string stringWithMnemonic); [Export ("borderWidth")] @@ -1551,6 +1592,7 @@ partial interface NSBrowser { nint SelectedRow (nint column); [Export ("selectionIndexPath", ArgumentSemantic.Copy)] + [NullAllowed] NSIndexPath SelectionIndexPath { get; set; } [Export ("selectionIndexPaths", ArgumentSemantic.Copy)] @@ -1589,11 +1631,11 @@ partial interface NSBrowser { [Export ("lastVisibleColumn")] nint LastVisibleColumn { get; } - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use the item based NSBrowser instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use the item based NSBrowser instead.")] [Export ("columnOfMatrix:")] nint ColumnOfMatrix (NSMatrix matrix); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use the item based NSBrowser instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use the item based NSBrowser instead.")] [Export ("matrixInColumn:")] NSMatrix MatrixInColumn (nint column); @@ -1700,7 +1742,7 @@ partial interface NSBrowser { [Export ("doubleAction")] Selector DoubleAction { get; set; } - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use the item based NSBrowser instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use the item based NSBrowser instead.")] [Export ("matrixClass")] Class MatrixClass { get; [Bind ("setMatrixClass:")] set; } @@ -1837,6 +1879,7 @@ interface NSBrowserDelegate { [Export ("browser:writeRowsWithIndexes:inColumn:toPasteboard:")] bool WriteRowsWithIndexesToPasteboard (NSBrowser browser, NSIndexSet rowIndexes, nint column, NSPasteboard pasteboard); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSFilePromiseReceiver' objects instead.")] [Export ("browser:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:inColumn:")] string [] PromisedFilesDroppedAtDestination (NSBrowser browser, NSUrl dropDestination, NSIndexSet rowIndexes, nint column); @@ -1857,6 +1900,7 @@ interface NSBrowserDelegate { [Export ("browser:acceptDrop:atRow:column:dropOperation:")] bool AcceptDrop (NSBrowser browser, [Protocolize (4)] NSDraggingInfo info, nint row, nint column, NSBrowserDropOperation dropOperation); + [return: NullAllowed] [Export ("browser:typeSelectStringForRow:inColumn:")] string TypeSelectString (NSBrowser browser, nint row, nint column); @@ -2350,6 +2394,7 @@ interface NSCell : NSUserInterfaceItemIdentification, NSCoding, NSCopying, NSAcc CGSize CellSizeForBounds (CGRect bounds); [Export ("highlightColorWithFrame:inView:")] + [return: NullAllowed] NSColor HighlightColor (CGRect cellFrame, NSView controlView); [Export ("calcDrawInfo:")] @@ -2406,6 +2451,7 @@ interface NSCell : NSUserInterfaceItemIdentification, NSCoding, NSCopying, NSAcc [Static] [Export ("defaultMenu")] + [NullAllowed] NSMenu DefaultMenu { get; } [Export ("setSendsActionOnEndEditing:")] @@ -2451,15 +2497,15 @@ interface NSCell : NSUserInterfaceItemIdentification, NSCoding, NSCopying, NSAcc [Export ("showsFirstResponder")] bool ShowsFirstResponder { get; set; } - [Availability (Deprecated = Platform.Mac_10_8, Message = "In 10.8 and higher, all the Mnemonic methods are deprecated. On MacOS they have typically not been used.")] + [Availability (Deprecated = Platform.Mac_10_8, Message = "Mnemonic methods have typically not been used.")] [Export ("mnemonicLocation")] nint MnemonicLocation { get; set; } - [Availability (Deprecated = Platform.Mac_10_8, Message = "In 10.8 and higher, all the Mnemonic methods are deprecated. On MacOS they have typically not been used.")] + [Availability (Deprecated = Platform.Mac_10_8, Message = "Mnemonic methods have typically not been used.")] [Export ("mnemonic")] string Mnemonic { get; } - [Availability (Deprecated = Platform.Mac_10_8, Message = "In 10.8 and higher, all the Mnemonic methods are deprecated. On MacOS they have typically not been used.")] + [Availability (Deprecated = Platform.Mac_10_8, Message = "Mnemonic methods have typically not been used.")] [Export ("setTitleWithMnemonic:")] void SetTitleWithMnemonic (string stringWithAmpersand); @@ -2587,7 +2633,7 @@ interface NSClipView { [Export ("autoscroll:")] bool Autoscroll (NSEvent theEvent); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use ConstrainBoundsRect instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use ConstrainBoundsRect instead.")] [Export ("constrainScrollPoint:")] CGPoint ConstrainScrollPoint (CGPoint newOrigin); @@ -2623,6 +2669,7 @@ interface NSCollectionViewItem : NSCopying { IntPtr Constructor ([NullAllowed] string nibNameOrNull, [NullAllowed] NSBundle nibBundleOrNull); [Export ("collectionView")] + [NullAllowed] NSCollectionView CollectionView { get; } [Export ("selected")] @@ -2885,6 +2932,10 @@ interface NSCollectionView : NSDraggingSource, NSDraggingDestination { [Mac (10,12)] [Export ("toggleSectionCollapse:")] void ToggleSectionCollapse (NSObject sender); + + [Mac (10, 13)] + [NullAllowed, Export ("prefetchDataSource", ArgumentSemantic.Weak)] + INSCollectionViewPrefetching PrefetchDataSource { get; set; } } // @protocol NSCollectionViewDataSource @@ -2920,6 +2971,7 @@ partial interface NSCollectionViewDelegate { [Export ("collectionView:writeItemsAtIndexes:toPasteboard:")] bool WriteItems (NSCollectionView collectionView, NSIndexSet indexes, NSPasteboard toPasteboard); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSFilePromiseReceiver' objects instead.")] [Export ("collectionView:namesOfPromisedFilesDroppedAtDestination:forDraggedItemsAtIndexes:")] string [] NamesOfPromisedFilesDroppedAtDestination (NSCollectionView collectionView, NSUrl dropUrl, NSIndexSet indexes); @@ -2945,6 +2997,7 @@ partial interface NSCollectionViewDelegate { bool WriteItems (NSCollectionView collectionView, NSSet indexPaths, NSPasteboard pasteboard); [Mac (10,11)] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSFilePromiseReceiver' objects instead.")] [Export ("collectionView:namesOfPromisedFilesDroppedAtDestination:forDraggedItemsAtIndexPaths:")] string[] GetNamesOfPromisedFiles (NSCollectionView collectionView, NSUrl dropURL, NSSet indexPaths); @@ -3408,9 +3461,16 @@ interface NSCollectionViewGridLayout } [Mac (10,11)] + [DisableDefaultCtor] [BaseType (typeof(NSCollectionViewLayout))] interface NSCollectionViewTransitionLayout { +#if !XAMCORE_4_0 + [Obsolete ("Use the constructor that allows you to set currentLayout and newLayout.")] + [Export ("init")] + IntPtr Constructor (); +#endif + [Export ("transitionProgress", ArgumentSemantic.Assign)] nfloat TransitionProgress { get; set; } @@ -3847,6 +3907,72 @@ partial interface NSColor : NSCoding, NSCopying, NSSecureCoding, NSPasteboardRea [Static] [Export ("scrubberTexturedBackgroundColor", ArgumentSemantic.Strong)] NSColor ScrubberTexturedBackgroundColor { get; } + + [Mac (10,13)] + [Static] + [Export ("colorNamed:bundle:")] + [return: NullAllowed] + NSColor FromName (string name, [NullAllowed] NSBundle bundle); + + [Mac (10,13)] + [Static] + [Export ("colorNamed:")] + [return: NullAllowed] + NSColor FromName (string name); + + [Mac (10, 13)] + [Export ("type")] + NSColorType Type { get; } + + [Mac (10,13)] + [Export ("colorUsingType:")] + [return: NullAllowed] + NSColor GetColor (NSColorType type); + + [Mac (10, 10)] + [Static] + [Export ("systemRedColor", ArgumentSemantic.Strong)] + NSColor SystemRedColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemGreenColor", ArgumentSemantic.Strong)] + NSColor SystemGreenColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemBlueColor", ArgumentSemantic.Strong)] + NSColor SystemBlueColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemOrangeColor", ArgumentSemantic.Strong)] + NSColor SystemOrangeColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemYellowColor", ArgumentSemantic.Strong)] + NSColor SystemYellowColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemBrownColor", ArgumentSemantic.Strong)] + NSColor SystemBrownColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemPinkColor", ArgumentSemantic.Strong)] + NSColor SystemPinkColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemPurpleColor", ArgumentSemantic.Strong)] + NSColor SystemPurpleColor { get; } + + [Mac (10, 10)] + [Static] + [Export ("systemGrayColor", ArgumentSemantic.Strong)] + NSColor SystemGrayColor { get; } } [BaseType (typeof (NSObject))] @@ -4594,6 +4720,7 @@ interface NSCursor : NSCoding { [Static] [Export ("currentSystemCursor")] + [NullAllowed] NSCursor CurrentSystemCursor { get; } [Static] @@ -4672,7 +4799,7 @@ interface NSCursor : NSCoding { [Export ("initWithImage:hotSpot:")] IntPtr Constructor (NSImage newImage, CGPoint aPoint); - [Availability (Deprecated = Platform.Mac_10_12, Message = "Color hints are ignored. Use NSCursor (NSImage newImage, CGPoint aPoint) instead")] + [Availability (Deprecated = Platform.Mac_10_12, Message = "Color hints are ignored. Use NSCursor (NSImage newImage, CGPoint aPoint) instead.")] [Export ("initWithImage:foregroundColorHint:backgroundColorHint:hotSpot:")] IntPtr Constructor (NSImage newImage, NSColor fg, NSColor bg, CGPoint hotSpot); @@ -4707,22 +4834,28 @@ interface NSCursor : NSCoding { [Export ("set")] void Set (); + [Deprecated (PlatformName.MacOSX, 10, 13)] [Export ("setOnMouseExited:")] void SetOnMouseExited (bool flag); [Export ("setOnMouseEntered:")] + [Deprecated (PlatformName.MacOSX, 10, 13)] void SetOnMouseEntered (bool flag); [Export ("isSetOnMouseExited")] + [Deprecated (PlatformName.MacOSX, 10, 13)] bool IsSetOnMouseExited (); + [Deprecated (PlatformName.MacOSX, 10, 13)] [Export ("isSetOnMouseEntered")] bool IsSetOnMouseEntered (); [Export ("mouseEntered:")] + [Deprecated (PlatformName.MacOSX, 10, 13)] void MouseEntered (NSEvent theEvent); [Export ("mouseExited:")] + [Deprecated (PlatformName.MacOSX, 10, 13)] void MouseExited (NSEvent theEvent); } @@ -5156,11 +5289,11 @@ partial interface NSDocument { [Export ("windowForSheet")] NSWindow WindowForSheet { get; } - [Static, Export ("readableTypes")] + [Static, Export ("readableTypes", ArgumentSemantic.Copy)] string [] ReadableTypes { get; } [Static] - [Export ("writableTypes")] + [Export ("writableTypes", ArgumentSemantic.Copy)] string [] WritableTypes (); [Static] @@ -5290,7 +5423,7 @@ partial interface NSDocument { // This one comes from the NSRestorableState category ('@interface NSResponder (NSRestorableState)') [Static] - [Export ("restorableStateKeyPaths")] + [Export ("restorableStateKeyPaths", ArgumentSemantic.Copy)] string [] RestorableStateKeyPaths (); #if XAMCORE_2_0 @@ -5317,6 +5450,19 @@ partial interface NSDocument { [Export ("stopBrowsingVersionsWithCompletionHandler:")] [Async] void StopBrowsingVersions (Action completionHandler); + + [Mac (10, 13)] + [Export ("allowsDocumentSharing")] + bool AllowsDocumentSharing { get; } + + [Mac (10,13)] + [Export ("shareDocumentWithSharingService:completionHandler:")] + [Async] + void ShareDocument (NSSharingService sharingService, [NullAllowed] Action completionHandler); + + [Mac (10,13)] + [Export ("prepareSharingServicePicker:")] + void Prepare (NSSharingServicePicker sharingServicePicker); } delegate void OpenDocumentCompletionHandler (NSDocument document, bool documentWasAlreadyOpen, NSError error); @@ -5556,6 +5702,7 @@ interface NSDraggingInfo { #if XAMCORE_4_0 [Abstract] #endif + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use NSFilePromiseProvider objects instead.")] [Export ("namesOfPromisedFilesDroppedAtDestination:")] string [] PromisedFilesDroppedAtDestination (NSUrl dropDestination); @@ -5666,6 +5813,7 @@ interface NSDraggingSource { [Export ("draggingSourceOperationMaskForLocal:"), DefaultValue (NSDragOperation.None)] NSDragOperation DraggingSourceOperationMaskForLocal (bool flag); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use NSFilePromiseProvider objects instead.")] [Export ("namesOfPromisedFilesDroppedAtDestination:"), DefaultValue (new string[0])] string [] NamesOfPromisedFilesDroppedAtDestination (NSUrl dropDestination); @@ -5681,12 +5829,13 @@ interface NSDraggingSource { [Export ("ignoreModifierKeysWhileDragging"), DefaultValue (false)] bool IgnoreModifierKeysWhileDragging { get; } - [Availability (Deprecated = Platform.Mac_10_1, Message = "Use DraggedImageEndedAtOperation instead")] + [Availability (Deprecated = Platform.Mac_10_1, Message = "Use DraggedImageEndedAtOperation instead.")] [Export ("draggedImage:endedAt:deposited:")] void DraggedImageEndedAtDeposited (NSImage image, CGPoint screenPoint, bool deposited); } [BaseType (typeof (NSResponder), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] { typeof (NSDrawerDelegate)})] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSSplitViewController' instead.")] partial interface NSDrawer : NSAccessibilityElementProtocol, NSAccessibility { [Export ("initWithContentSize:preferredEdge:")] IntPtr Constructor (CGSize contentSize, NSRectEdge edge); @@ -5750,6 +5899,7 @@ partial interface NSDrawer : NSAccessibilityElementProtocol, NSAccessibility { [BaseType (typeof (NSObject))] [Model] [Protocol] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSSplitViewController' instead.")] interface NSDrawerDelegate { [Export ("drawerDidClose:"), EventArgs ("NSNotification")] void DrawerDidClose (NSNotification notification); @@ -5894,6 +6044,7 @@ partial interface NSFont : NSSecureCoding, NSCopying { NSStringEncoding MostCompatibleStringEncoding { get; } [Export ("glyphWithName:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use the 'CGGlyph' APIs instead.")] uint GlyphWithName (string aName); /* NSGlyph = unsigned int */ [Export ("coveredCharacterSet")] @@ -5933,23 +6084,13 @@ partial interface NSFont : NSSecureCoding, NSCopying { bool IsFixedPitch { get; } [Export ("boundingRectForGlyph:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use the 'CGGlyph' APIs instead.")] CGRect BoundingRectForGlyph (uint /* NSGlyph = unsigned int */ aGlyph); [Export ("advancementForGlyph:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use the 'CGGlyph' APIs instead.")] CGSize AdvancementForGlyph (uint /* NSGlyph = unsigned int */ aGlyph); - // FIXME binding - //[Export ("getBoundingRects:forGlyphs:count:")] - //void GetBoundingRectsforGlyphscount (NSRect *bounds, uint glyphs, int glyphCount); - - // FIXME binding - //[Export ("getAdvancements:forGlyphs:count:")] - //void GetAdvancementsforGlyphscount (NSSizeArray advancements, const uint glyphs, int glyphCount); - - // FIXME binding - //[Export ("getAdvancements:forPackedGlyphs:length:")] - //void GetAdvancementsforPackedGlyphslength (NSSizeArray advancements, void *packedGlyphs, uint length); - [Export ("set")] void Set (); @@ -5957,15 +6098,19 @@ partial interface NSFont : NSSecureCoding, NSCopying { void SetInContext (NSGraphicsContext graphicsContext); [Export ("printerFont")] + [Deprecated (PlatformName.MacOSX, 10, 13)] NSFont PrinterFont { get; } [Export ("screenFont")] + [Deprecated (PlatformName.MacOSX, 10, 13)] NSFont ScreenFont { get; } [Export ("screenFontWithRenderingMode:")] + [Deprecated (PlatformName.MacOSX, 10, 13)] NSFont ScreenFontWithRenderingMode (NSFontRenderingMode renderingMode); [Export ("renderingMode")] + [Deprecated (PlatformName.MacOSX, 10, 13)] NSFontRenderingMode RenderingMode { get; } [Export ("isVertical")] @@ -6056,6 +6201,23 @@ partial interface NSFont : NSSecureCoding, NSCopying { [Export ("monospacedDigitSystemFontOfSize:weight:")] NSFont MonospacedDigitSystemFontOfSize (nfloat fontSize, nfloat weight); + [Mac (10,13)] + [Export ("boundingRectForCGGlyph:")] + CGRect GetBoundingRect (CGGlyph glyph); + + [Mac (10,13)] + [Export ("advancementForCGGlyph:")] + CGSize GetAdvancement (CGGlyph glyph); + + [Mac (10,13)] + [Internal] + [Export ("getBoundingRects:forCGGlyphs:count:")] + void _GetBoundingRects (IntPtr bounds, IntPtr glyphs, nuint glyphCount); + + [Mac (10,13)] + [Internal] + [Export ("getAdvancements:forCGGlyphs:count:")] + void _GetAdvancements (IntPtr advancements, IntPtr glyphs, nuint glyphCount); } [Lion] @@ -6081,7 +6243,7 @@ interface NSFontCollection : NSSecureCoding, NSMutableCopying { NSFontCollection FromDescriptors (NSFontDescriptor [] queryDescriptors); [Static] - [Export ("fontCollectionWithAllAvailableDescriptors")] + [Export ("fontCollectionWithAllAvailableDescriptors", ArgumentSemantic.Copy)] NSFontCollection GetAllAvailableFonts (); [Static] @@ -6101,7 +6263,7 @@ interface NSFontCollection : NSSecureCoding, NSMutableCopying { bool RenameFontCollection (string fromName, NSFontCollectionVisibility visibility, string toName, out NSError error); [Static] - [Export ("allFontCollectionNames")] + [Export ("allFontCollectionNames", ArgumentSemantic.Copy)] string [] AllFontCollectionNames { get; } [Static] @@ -6200,7 +6362,7 @@ interface NSMutableFontCollection { [Mac(10,10)] [Static] - [Export ("fontCollectionWithAllAvailableDescriptors")] + [Export ("fontCollectionWithAllAvailableDescriptors", ArgumentSemantic.Copy)] NSMutableFontCollection GetAllAvailableFonts (); [Mac(10,10)] @@ -6277,6 +6439,10 @@ interface NSFontDescriptor : NSSecureCoding, NSCopying { [Export ("fontDescriptorWithFamily:")] NSFontDescriptor FontDescriptorWithFamily (string newFamily); + + [Mac (10, 13)] + [Export ("requiresFontAssetRequest")] + bool RequiresFontAssetRequest { get; } } [BaseType (typeof (NSObject))] @@ -6590,7 +6756,7 @@ partial interface NSFormCell { [Export ("titleBaseWritingDirection")] NSWritingDirection TitleBaseWritingDirection { get; set; } - [Availability (Deprecated = Platform.Mac_10_8, Message = "Deprecated in 10.8 and higher. Set Title instead")] + [Availability (Deprecated = Platform.Mac_10_8, Message = "Set Title instead.")] [Export ("setTitleWithMnemonic:")] void SetTitleWithMnemonic (string stringWithAmpersand); @@ -7273,7 +7439,7 @@ interface NSEvent : NSCoding, NSCopying { [BaseType (typeof (NSObject), Delegates=new string [] {"WeakDelegate"}, Events=new Type[] {typeof (NSGestureRecognizerDelegate)})] interface NSGestureRecognizer : NSCoding { [Export ("initWithTarget:action:")] - IntPtr Constructor (NSObject target, Selector action); + IntPtr Constructor ([NullAllowed] NSObject target, [NullAllowed] Selector action); [Export ("target", ArgumentSemantic.Weak), NullAllowed] NSObject Target { get; set; } @@ -7424,7 +7590,7 @@ interface NSGestureRecognizerDelegate { #if !XAMCORE_4_0 [Export ("xamarinselector:removed:"), DelegateName ("NSGestureEvent"), DefaultValue (true)] - [Obsolete ("No longer an OS X API - it will never be called")] + [Obsolete ("It will never be called.")] bool ShouldReceiveEvent (NSGestureRecognizer gestureRecognizer, NSEvent gestureEvent); #endif @@ -7506,7 +7672,7 @@ partial interface NSMenu : NSCoding, NSCopying, NSAccessibility, NSAccessibility nint IndexOf (nint itemTag); [Export ("indexOfItemWithRepresentedObject:")] - nint IndexOfItem (NSObject obj); + nint IndexOfItem ([NullAllowed] NSObject obj); [Export ("indexOfItemWithSubmenu:")] nint IndexOfItem ([NullAllowed] NSMenu submenu); @@ -7662,6 +7828,7 @@ interface NSMenuItem : NSCoding, NSCopying, NSAccessibility, NSAccessibilityElem string UserKeyEquivalent { get; } [Export ("setTitleWithMnemonic:")] + [Availability (Deprecated = Platform.Mac_10_13, Message = "Use 'Title' instead.")] void SetTitleWithMnemonic (string stringWithAmpersand); [Export ("isHighlighted")] @@ -7738,6 +7905,10 @@ interface NSMenuItem : NSCoding, NSCopying, NSAccessibility, NSAccessibilityElem [Export ("toolTip")] string ToolTip { get; set; } + + [Mac (10, 13)] + [Export ("allowsKeyEquivalentWhenHidden")] + bool AllowsKeyEquivalentWhenHidden { get; set; } } [BaseType (typeof (NSButtonCell))] @@ -8212,12 +8383,12 @@ interface NSOpenPanel { bool CanChooseFiles { get; set; } // Deprecated methods, but needed to run on pre 10.6 systems - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use Urls instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use Urls instead.")] [Export ("filenames")] string [] Filenames { get; } //runModalForWindows:Completeion - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use NSApplication.RunModal instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use NSApplication.RunModal instead.")] [Export ("beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo:")] void BeginSheet ([NullAllowed] string directory, [NullAllowed] string fileName, [NullAllowed] string [] fileTypes, [NullAllowed] NSWindow modalForWindow, [NullAllowed] NSObject modalDelegate, [NullAllowed] Selector didEndSelector, IntPtr contextInfo); @@ -8225,11 +8396,11 @@ interface NSOpenPanel { [Export ("beginForDirectory:file:types:modelessDelegate:didEndSelector:contextInfo:")] void Begin ([NullAllowed] string directory, [NullAllowed] string fileName, [NullAllowed] string [] fileTypes, [NullAllowed] NSObject modelessDelegate, [NullAllowed] Selector didEndSelector, IntPtr contextInfo); - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use NSApplication.RunModal instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use NSApplication.RunModal instead.")] [Export ("runModalForDirectory:file:types:")] nint RunModal ([NullAllowed] string directory, [NullAllowed] string fileName, [NullAllowed] string [] types); - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use NSApplication.RunModal instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use NSApplication.RunModal instead.")] [Export ("runModalForTypes:")] nint RunModal (string [] types); } @@ -8263,19 +8434,19 @@ interface NSOpenSavePanelDelegate { [Export ("panelSelectionDidChange:"), EventArgs ("NSOpenSaveSelectionChanged")] void SelectionDidChange (NSSavePanel panel); - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use ValidateUrl instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use ValidateUrl instead.")] [Export ("panel:isValidFilename:"), DelegateName ("NSOpenSaveFilename"), DefaultValue (true)] bool IsValidFilename (NSSavePanel panel, string fileName); - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use DidChangeToDirectory instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use DidChangeToDirectory instead.")] [Export ("panel:directoryDidChange:"), EventArgs ("NSOpenSaveFilename")] void DirectoryDidChange (NSSavePanel panel, string path); - [Availability (Deprecated = Platform.Mac_10_6, Message = "This method is obsolete and does not control sorting order")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "This method does not control sorting order.")] [Export ("panel:compareFilename:with:caseSensitive:"), DelegateName ("NSOpenSaveCompare"), DefaultValue (NSComparisonResult.Same)] NSComparisonResult CompareFilenames (NSSavePanel panel, string name1, string name2, bool caseSensitive); - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use ShouldEnableUrl instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use ShouldEnableUrl instead.")] [Export ("panel:shouldShowFilename:"), DelegateName ("NSOpenSaveFilename"), DefaultValue (true)] bool ShouldShowFilename (NSSavePanel panel, string filename); } @@ -8532,6 +8703,7 @@ partial interface NSOutlineViewDataSource { bool AcceptDrop (NSOutlineView outlineView, [Protocolize (4)] NSDraggingInfo info, [NullAllowed] NSObject item, nint index); [Export ("outlineView:namesOfPromisedFilesDroppedAtDestination:forDraggedItems:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSFilePromiseReceiver' objects instead.")] string [] FilesDropped (NSOutlineView outlineView, NSUrl dropDestination, NSArray items); } @@ -8707,11 +8879,11 @@ partial interface NSImage : NSCoding, NSCopying, NSSecureCoding, NSPasteboardRea string [] ImagePasteboardTypes { get; } [Static] - [Export ("imageTypes")] + [Export ("imageTypes", ArgumentSemantic.Copy)] string [] ImageTypes { get; } [Static] - [Export ("imageUnfilteredTypes")] + [Export ("imageUnfilteredTypes", ArgumentSemantic.Copy)] string [] ImageUnfilteredTypes { get; } [Static] @@ -8790,7 +8962,7 @@ partial interface NSImage : NSCoding, NSCopying, NSSecureCoding, NSPasteboardRea [Sealed] void DrawInRect (CGRect dstRect, CGRect srcRect, NSCompositingOperation operation, nfloat delta); - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use DrawInRect with respectContextIsFlipped instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use DrawInRect with respectContextIsFlipped instead.")] [Export ("flipped")] bool Flipped { [Bind ("isFlipped")] get; set; } @@ -9237,6 +9409,10 @@ public enum NSImageName [Mac (10, 12, 2)] [Field ("NSImageNameTouchBarVolumeUpTemplate")] TouchBarVolumeUpTemplate, + + [Mac (10, 13)] + [Field ("NSImageNameTouchBarRemoveTemplate")] + TouchBarRemoveTemplate, } interface NSStringAttributes { @@ -9503,11 +9679,11 @@ partial interface NSImageRep : NSCoding, NSCopying { string [] ImagePasteboardTypes { get; } [Static] - [Export ("imageUnfilteredTypes")] + [Export ("imageUnfilteredTypes", ArgumentSemantic.Copy)] string []ImageUnfilteredTypes { get; } [Static] - [Export ("imageTypes")] + [Export ("imageTypes", ArgumentSemantic.Copy)] string [] ImageTypes { get; } [Static] @@ -9878,6 +10054,38 @@ interface NSLevelIndicator { [Mac (10,10)] [Export ("levelIndicatorStyle")] NSLevelIndicatorStyle LevelIndicatorStyle { get; set; } + + [Mac (10, 13)] + [Export ("fillColor", ArgumentSemantic.Copy)] + NSColor FillColor { get; set; } + + [Mac (10, 13)] + [Export ("warningFillColor", ArgumentSemantic.Copy)] + NSColor WarningFillColor { get; set; } + + [Mac (10, 13)] + [Export ("criticalFillColor", ArgumentSemantic.Copy)] + NSColor CriticalFillColor { get; set; } + + [Mac (10, 13)] + [Export ("drawsTieredCapacityLevels")] + bool DrawsTieredCapacityLevels { get; set; } + + [Mac (10, 13)] + [Export ("placeholderVisibility", ArgumentSemantic.Assign)] + NSLevelIndicatorPlaceholderVisibility PlaceholderVisibility { get; set; } + + [Mac (10, 13)] + [NullAllowed, Export ("ratingImage", ArgumentSemantic.Strong)] + NSImage RatingImage { get; set; } + + [Mac (10, 13)] + [NullAllowed, Export ("ratingPlaceholderImage", ArgumentSemantic.Strong)] + NSImage RatingPlaceholderImage { get; set; } + + [Mac (10, 13)] + [Export ("editable")] + bool Editable { [Bind ("isEditable")] get; set; } } [BaseType (typeof (NSActionCell))] @@ -9958,6 +10166,22 @@ interface NSLayoutAnchor : NSCoding, NSCopying [Export ("constraintLessThanOrEqualToAnchor:constant:")] NSLayoutConstraint ConstraintLessThanOrEqualToAnchor (NSLayoutAnchor anchor, nfloat constant); + + [Mac (10, 12)] + [Export ("name")] + string Name { get; } + + [Mac (10, 12)] + [NullAllowed, Export ("item", ArgumentSemantic.Weak)] + NSObject Item { get; } + + [Mac (10, 12)] + [Export ("hasAmbiguousLayout")] + bool HasAmbiguousLayout { get; } + + [Mac (10, 12)] + [Export ("constraintsAffectingLayout")] + NSLayoutConstraint[] ConstraintsAffectingLayout { get; } } [Mac (10,11)] @@ -9965,6 +10189,9 @@ interface NSLayoutAnchor : NSCoding, NSCopying [DisableDefaultCtor] // Handle is nil interface NSLayoutXAxisAnchor { + [Mac (10,12)] + [Export ("anchorWithOffsetToAnchor:")] + NSLayoutDimension GetAnchorWithOffset (NSLayoutXAxisAnchor otherAnchor); } [Mac (10,11)] @@ -9972,6 +10199,9 @@ interface NSLayoutXAxisAnchor [DisableDefaultCtor] // Handle is nil interface NSLayoutYAxisAnchor { + [Mac (10,12)] + [Export ("anchorWithOffsetToAnchor:")] + NSLayoutDimension GetAnchorWithOffset (NSLayoutYAxisAnchor otherAnchor); } [Mac (10,11)] @@ -10177,7 +10407,7 @@ partial interface NSLayoutManager : NSCoding { void InvalidateDisplayForGlyphRange (NSRange glyphRange); #if !XAMCORE_4_0 - [Availability (Deprecated = Platform.Mac_10_11, Message = "Use ProcessEditing (NSTextStorage textStorage, NSTextStorageEditActions editMask, NSRange newCharRange, nint delta, NSRange invalidatedCharRange) instead)")] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use ProcessEditing (NSTextStorage textStorage, NSTextStorageEditActions editMask, NSRange newCharRange, nint delta, NSRange invalidatedCharRange) instead).")] [Export ("textStorage:edited:range:changeInLength:invalidatedRange:")] void TextStorageEdited (NSTextStorage str, NSTextStorageEditedFlags editedMask, NSRange newCharRange, nint changeInLength, NSRange invalidatedCharRange); #endif @@ -10252,18 +10482,6 @@ partial interface NSLayoutManager : NSCoding { [Export ("intAttribute:forGlyphAtIndex:")] nint IntAttributeforGlyphAtIndex (nint attributeTag, nint glyphIndex); - // TODO: bind this with a safe version - [Export ("getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:"), Internal] - nint GetGlyphs (NSRange glyphRange, IntPtr glyphBuffer, IntPtr charIndexBuffer, IntPtr inscribeBuffer, IntPtr elasticBuffer); - - // TODO: bind this with a safe version - [Internal, Export ("getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:bidiLevels:")] - nint GetGlyphs (NSRange glyphRange, IntPtr glyphBuffer, IntPtr charIndexBuffer, IntPtr inscribeBuffer, IntPtr elasticBuffer, IntPtr bidiLevelBuffer); - - // TODO: bidn this with a safe version - [Internal, Export ("getGlyphs:range:")] - nuint GetGlyphsrange (IntPtr glyphArray, NSRange glyphRange); - [Export ("setTextContainer:forGlyphRange:")] void SetTextContainerForRange (NSTextContainer container, NSRange glyphRange); @@ -10692,7 +10910,7 @@ interface NSPanel { [BaseType (typeof (NSObject))] interface NSParagraphStyle : NSSecureCoding, NSMutableCopying { [Static] - [Export ("defaultParagraphStyle")] + [Export ("defaultParagraphStyle", ArgumentSemantic.Copy)] NSParagraphStyle DefaultParagraphStyle { get; [NotImplemented] set; } [Static] @@ -11036,20 +11254,45 @@ partial interface NSPasteboard // NSPasteboard does _not_ implement NSPasteboard // Pasteboard names: for NSPasteboard.FromName() [Field ("NSGeneralPboard")] + [Availability (Deprecated = Platform.Mac_10_13, Message = "Use 'NSPasteboardNameGeneral' instead.")] NSString NSGeneralPasteboardName { get; } [Field ("NSFontPboard")] + [Availability (Deprecated = Platform.Mac_10_13, Message = "Use 'NSPasteboardNameFont' instead.")] NSString NSFontPasteboardName { get; } [Field ("NSRulerPboard")] + [Availability (Deprecated = Platform.Mac_10_13, Message = "Use 'NSPasteboardNameRuler' instead.")] NSString NSRulerPasteboardName { get; } [Field ("NSFindPboard")] + [Availability (Deprecated = Platform.Mac_10_13, Message = "Use 'NSPasteboardNameFind' instead.")] NSString NSFindPasteboardName { get; } [Field ("NSDragPboard")] + [Availability (Deprecated = Platform.Mac_10_13, Message = "Use 'NSPasteboardNameDrag' instead.")] NSString NSDragPasteboardName { get; } + [Mac (10, 13)] + [Field ("NSPasteboardNameGeneral")] + NSString NSPasteboardNameGeneral { get; } + + [Mac (10, 13)] + [Field ("NSPasteboardNameFont")] + NSString NSPasteboardNameFont { get; } + + [Mac (10, 13)] + [Field ("NSPasteboardNameRuler")] + NSString NSPasteboardNameRuler { get; } + + [Mac (10, 13)] + [Field ("NSPasteboardNameFind")] + NSString NSPasteboardNameFind { get; } + + [Mac (10, 13)] + [Field ("NSPasteboardNameDrag")] + NSString NSPasteboardNameDrag { get; } + [Mac (10,6)] [Field ("NSPasteboardTypeString")] NSString NSPasteboardTypeString { get; } @@ -11106,6 +11349,14 @@ partial interface NSPasteboard // NSPasteboard does _not_ implement NSPasteboard [Field ("NSPasteboardTypeFindPanelSearchOptions")] NSString NSPasteboardTypeFindPanelSearchOptions { get; } + [Mac (10, 13)] + [Field ("NSPasteboardTypeURL")] + NSString NSPasteboardTypeUrl { get; } + + [Mac (10, 13)] + [Field ("NSPasteboardTypeFileURL")] + NSString NSPasteboardTypeFileUrl { get; } + [Mac (10,12)] [Export ("prepareForNewContentsWithOptions:")] nint PrepareForNewContents (NSPasteboardContentsOptions options); @@ -11191,7 +11442,7 @@ interface NSPasteboardReading { // This binding is just broken, it's an ObjC ctor (init*) bound as a normal method. [Abstract] [Export ("xamarinselector:removed:")] - [Obsolete ("No longer an OS X API - it will never be called")] + [Obsolete ("It will never be called.")] NSObject InitWithPasteboardPropertyList (NSObject propertyList, string type); #else FIXME: (compiler error to not forget) @@ -11409,9 +11660,10 @@ interface NSPathControlItem } [BaseType (typeof (NSResponder))] - interface NSPopover : NSAccessibilityElementProtocol, NSAccessibility { + interface NSPopover : NSAppearanceCustomization, NSAccessibilityElementProtocol, NSAccessibility { + [Obsolete ("Use 'GetAppearance' and 'SetAppearance' methods instead.")] [Export ("appearance", ArgumentSemantic.Retain)] - NSPopoverAppearance Appearance { get; set; } + new NSPopoverAppearance Appearance { get; set; } [Export ("behavior")] NSPopoverBehavior Behavior { get; set; } @@ -11743,11 +11995,11 @@ partial interface NSPopUpButtonCell { [BaseType (typeof (NSObject))] interface NSPrinter : NSCoding, NSCopying { [Static] - [Export ("printerNames")] + [Export ("printerNames", ArgumentSemantic.Copy)] string [] PrinterNames{ get; } [Static] - [Export ("printerTypes")] + [Export ("printerTypes", ArgumentSemantic.Copy)] string [] PrinterTypes { get; } [Static] @@ -12249,7 +12501,7 @@ partial interface NSResponder : NSCoding, NSTouchBarProvider { void InvalidateRestorableState (); [Static] - [Lion, Export ("restorableStateKeyPaths")] + [Lion, Export ("restorableStateKeyPaths", ArgumentSemantic.Copy)] string [] RestorableStateKeyPaths (); [Lion] @@ -12288,6 +12540,10 @@ partial interface NSResponder : NSCoding, NSTouchBarProvider { [Sealed] [Export ("presentError:modalForWindow:delegate:didPresentSelector:contextInfo:")] void PresentError (NSError error, NSWindow window, [NullAllowed] NSObject @delegate, [NullAllowed] Selector didPresentSelector, IntPtr contextInfo); + + [Mac (10,13)] + [Export ("encodeRestorableStateWithCoder:backgroundQueue:")] + void EncodeRestorableState (NSCoder coder, NSOperationQueue queue); } [Category] @@ -12424,6 +12680,9 @@ partial interface NSRulerView { nfloat ReservedThicknessForAccessoryView { get; set; } [Export ("measurementUnits")] +#if XAMCORE_4_0 + [BindAs (typeof (NSRulerViewUnits))] +#endif string MeasurementUnits { get; set; } [Export ("originOffset")] @@ -12439,6 +12698,22 @@ partial interface NSRulerView { NSView AccessoryView { get; set; } } + [Mac (10, 13)] + enum NSRulerViewUnits + { + [Field ("NSRulerViewUnitInches")] + Inches, + + [Field ("NSRulerViewUnitCentimeters")] + Centimeters, + + [Field ("NSRulerViewUnitPoints")] + Points, + + [Field ("NSRulerViewUnitPicas")] + Picas, + } + delegate void NSSavePanelComplete (nint result); [BaseType (typeof (NSPanel), Delegates=new string [] { "Delegate" }, Events=new Type [] { typeof (NSOpenSavePanelDelegate)})] @@ -12517,23 +12792,23 @@ interface NSSavePanel { [Export ("showsHiddenFiles")] bool ShowsHiddenFiles { get; set; } - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use Url instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use Url instead.")] [Export ("filename")] string Filename { get; } - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use DirectoryUrl instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use DirectoryUrl instead.")] [Export ("directory")] string Directory { get; set; } - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use AllowedFileTypes instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use AllowedFileTypes instead.")] [Export ("requiredFileType")] string RequiredFileType { get; set; } - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use Begin with the callback instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use Begin with the callback instead.")] [Export ("beginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo:")] void Begin (string directory, string filename, NSWindow docWindow, NSObject modalDelegate, Selector selector, IntPtr context); - [Availability (Deprecated = Platform.Mac_10_6, Message = "Use RunModal without parameters instead")] + [Availability (Deprecated = Platform.Mac_10_6, Message = "Use RunModal without parameters instead.")] [Export ("runModalForDirectory:file:")] nint RunModal ([NullAllowed] string directory, [NullAllowed] string filename); @@ -12557,7 +12832,7 @@ interface NSRemoteSavePanel {} [BaseType (typeof (NSObject))] partial interface NSScreen { [Static] - [Export ("screens")] + [Export ("screens", ArgumentSemantic.Copy)] NSScreen [] Screens { get; } [Static] @@ -12616,12 +12891,12 @@ interface NSScroller { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frameRect); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use GetScrollerWidth instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use GetScrollerWidth instead.")] [Static] [Export ("scrollerWidth")] nfloat ScrollerWidth { get; } - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use GetScrollerWidth instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use GetScrollerWidth instead.")] [Static] [Export ("scrollerWidthForControlSize:")] nfloat ScrollerWidthForControlSize (NSControlSize controlSize); @@ -12987,7 +13262,7 @@ interface NSSearchFieldCell { } [BaseType (typeof (NSControl))] - interface NSSegmentedControl { + interface NSSegmentedControl : NSUserInterfaceCompression { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frameRect); @@ -13073,6 +13348,43 @@ interface NSSegmentedControl { [Mac (10, 12, 2)] [NullAllowed, Export ("selectedSegmentBezelColor", ArgumentSemantic.Copy)] NSColor SelectedSegmentBezelColor { get; set; } + + [Mac (10,13)] + [Export ("setToolTip:forSegment:")] + void SetToolTip ([NullAllowed] string toolTip, nint segment); + + [Mac (10,13)] + [Export ("toolTipForSegment:")] + [return: NullAllowed] + string GetToolTip (nint forSegment); + + [Mac (10,13)] + [Export ("setTag:forSegment:")] + void SetTag (nint tag, nint segment); + + [Mac (10,13)] + [Export ("tagForSegment:")] + nint GetTag (nint segment); + + [Mac (10,13)] + [Export ("setShowsMenuIndicator:forSegment:")] + void SetShowsMenuIndicator (bool showsMenuIndicator, nint segment); + + [Mac (10,13)] + [Export ("showsMenuIndicatorForSegment:")] + bool ShowsMenuIndicator (nint segment); + + [Mac (10,13)] + [Export ("setAlignment:forSegment:")] + void SetAlignment (NSTextAlignment alignment, nint segment); + + [Mac (10,13)] + [Export ("alignmentForSegment:")] + NSTextAlignment GetAlignment (nint segment); + + [Mac (10, 13)] + [Export ("segmentDistribution", ArgumentSemantic.Assign)] + NSSegmentDistribution SegmentDistribution { get; set; } } [BaseType (typeof (NSActionCell))] @@ -13732,7 +14044,7 @@ partial interface NSSound : NSCoding, NSCopying, NSPasteboardReading, NSPasteboa bool CanCreateFromPasteboard (NSPasteboard pasteboard); [Static] - [Export ("soundUnfilteredTypes")] + [Export ("soundUnfilteredTypes", ArgumentSemantic.Copy)] string [] SoundUnfilteredTypes (); [Export ("initWithPasteboard:")] @@ -13886,7 +14198,7 @@ interface INSSplitViewDelegate {} [Mac (10,10)] [BaseType (typeof (NSViewController))] - interface NSSplitViewController : NSSplitViewDelegate { + interface NSSplitViewController : NSSplitViewDelegate, NSUserInterfaceValidations { [Export ("splitView", ArgumentSemantic.Strong)] NSSplitView SplitView { get; set; } @@ -14188,44 +14500,44 @@ partial interface NSStatusItem { [Export ("length")] nfloat Length { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("action"), NullAllowed] Selector Action { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("sendActionOn:")] nint SendActionOn (NSTouchPhase mask); - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("popUpStatusItemMenu:")] void PopUpStatusItemMenu (NSMenu menu); - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("drawStatusBarBackgroundInRect:withHighlight:")] void DrawStatusBarBackground (CGRect rect, bool highlight); //Detected properties - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("doubleAction")] Selector DoubleAction { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("target", ArgumentSemantic.Assign), NullAllowed] NSObject Target { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("title")] string Title { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("attributedTitle")] NSAttributedString AttributedTitle { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("image")] NSImage Image { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("alternateImage")] NSImage AlternateImage { get; set; } @@ -14233,19 +14545,19 @@ partial interface NSStatusItem { [NullAllowed] NSMenu Menu { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("enabled")] bool Enabled { [Bind ("isEnabled")]get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("toolTip")] string ToolTip { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("highlightMode")] bool HighlightMode { get; set; } - [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Soft-deprecation, forwards message to button, but will be gone in the future.")] [Export ("view")] NSView View { get; [NullAllowed] set; } @@ -14452,6 +14764,11 @@ interface NSStoryboard { [Export ("instantiateControllerWithIdentifier:")] NSObject InstantiateControllerWithIdentifier (string identifier); + + [Mac (10, 13)] + [Static] + [NullAllowed, Export ("mainStoryboard", ArgumentSemantic.Strong)] + NSStoryboard MainStoryboard { get; } } [Mac (10,10)] @@ -14869,9 +15186,11 @@ partial interface NSView : NSDraggingDestination, NSAnimatablePropertyContainer, bool LockFocusIfCanDraw (); [Export ("lockFocusIfCanDrawInContext:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSView.DisplayRectIgnoringOpacity (CGRect, NSGraphicsContext)' to draw a view subtree into a graphics context.")] bool LockFocusIfCanDrawInContext (NSGraphicsContext context); [Export ("focusView")][Static] + [return: NullAllowed] NSView FocusView (); [Export ("visibleRect")] @@ -15150,14 +15469,16 @@ partial interface NSView : NSDraggingDestination, NSAnimatablePropertyContainer, [Export ("beginDraggingSessionWithItems:event:source:")] NSDraggingSession BeginDraggingSession (NSDraggingItem [] items, NSEvent evnt, [Protocolize] NSDraggingSource source); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use BeginDraggingSession instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use BeginDraggingSession instead.")] [Export ("dragImage:at:offset:event:pasteboard:source:slideBack:")] void DragImage (NSImage anImage, CGPoint viewLocation, CGSize initialOffset, NSEvent theEvent, NSPasteboard pboard, NSObject sourceObj, bool slideFlag); [Export ("dragFile:fromRect:slideBack:event:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'BeginDraggingSession (NSDraggingItem [], NSEvent, NSDraggingSource)' instead.")] bool DragFile (string filename, CGRect aRect, bool slideBack, NSEvent theEvent); [Export ("dragPromisedFilesOfTypes:fromRect:source:slideBack:event:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'BeginDraggingSession (NSDraggingItem [], NSEvent, NSDraggingSource)' instead.")] bool DragPromisedFilesOfTypes (string[] typeArray, CGRect aRect, NSObject sourceObject, bool slideBack, NSEvent theEvent); [Export ("exitFullScreenModeWithOptions:")] @@ -15186,6 +15507,7 @@ partial interface NSView : NSDraggingDestination, NSAnimatablePropertyContainer, NSString FrameChangedNotification { get; } [Notification, Field ("NSViewFocusDidChangeNotification")] + [Deprecated (PlatformName.MacOSX, 10, 4)] NSString FocusChangedNotification { get; } [Notification, Field ("NSViewBoundsDidChangeNotification")] @@ -16195,35 +16517,35 @@ partial interface NSTableView : NSDraggingSource, NSAccessibilityTable { [Export ("frameOfCellAtColumn:row:")] CGRect GetCellFrame (nint column, nint row); - [Availability (Introduced = Platform.Mac_10_5, Deprecated = Platform.Mac_10_10, Message = "Use View Based TableView and GetView")] + [Availability (Introduced = Platform.Mac_10_5, Deprecated = Platform.Mac_10_10, Message = "Use View Based TableView and GetView.")] [Export ("preparedCellAtColumn:row:")] NSCell GetCell (nint column, nint row ); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField.")] [Export ("textShouldBeginEditing:")] bool TextShouldBeginEditing (NSText textObject); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField.")] [Export ("textShouldEndEditing:")] bool TextShouldEndEditing (NSText textObject); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField.")] [Export ("textDidBeginEditing:")] void TextDidBeginEditing (NSNotification notification); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField.")] [Export ("textDidEndEditing:")] void TextDidEndEditing (NSNotification notification); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView with an NSTextField.")] [Export ("textDidChange:")] void TextDidChange (NSNotification notification); - [Availability (Introduced = Platform.Mac_10_6, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView; observe the window’s firstResponder for focus change notifications")] + [Availability (Introduced = Platform.Mac_10_6, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView; observe the window’s firstResponder for focus change notifications.")] [Export ("shouldFocusCell:atColumn:row:")] bool ShouldFocusCell (NSCell cell, nint column, nint row ); - [Availability (Introduced = Platform.Mac_10_6, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView; directly interact with a particular view as required and call PerformClick on it, if necessary")] + [Availability (Introduced = Platform.Mac_10_6, Deprecated = Platform.Mac_10_10, Message = "Use a View Based TableView; directly interact with a particular view as required and call PerformClick on it, if necessary.")] [Export ("performClickOnCellAtColumn:row:")] void PerformClick (nint column, nint row ); @@ -16430,6 +16752,10 @@ partial interface NSTableView : NSDraggingSource, NSAccessibilityTable { [Mac (10,12)] [Export ("userInterfaceLayoutDirection")] NSUserInterfaceLayoutDirection UserInterfaceLayoutDirection { get; set; } + + [Mac (10, 13)] + [Export ("usesAutomaticRowHeights")] + bool UsesAutomaticRowHeights { get; set; } } [BaseType (typeof (NSObject))] @@ -16681,6 +17007,7 @@ interface NSTableViewSource { [Export ("tableView:acceptDrop:row:dropOperation:")] bool AcceptDrop (NSTableView tableView, [Protocolize (4)] NSDraggingInfo info, nint row, NSTableViewDropOperation dropOperation); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSFilePromiseReceiver' objects instead.")] [Export ("tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:")] string [] FilesDropped (NSTableView tableView, NSUrl dropDestination, NSIndexSet indexSet ); @@ -17608,8 +17935,18 @@ partial interface NSTextInputContext { [BaseType (typeof (NSObject))] interface NSTextList : NSCoding, NSCopying { [Export ("initWithMarkerFormat:options:")] - IntPtr Constructor (string format, NSTextListOptions mask); + IntPtr Constructor ( +#if XAMCORE_4_0 + [BindAs (typeof (NSTextListMarkerFormats))] +#endif + string format, NSTextListOptions mask); + [Wrap ("this (format.GetConstant(), mask)")] + IntPtr Constructor (NSTextListMarkerFormats format, NSTextListOptions mask); + +#if XAMCORE_4_0 + [BindAs (typeof (NSTextListMarkerFormats))] +#endif [Export ("markerFormat")] string MarkerFormat { get; } @@ -17624,6 +17961,77 @@ interface NSTextList : NSCoding, NSCopying { nint StartingItemNumber { get; set; } } + + enum NSTextListMarkerFormats + { + [Mac (10, 13)] + [Field ("NSTextListMarkerBox")] + Box, + + [Mac (10, 13)] + [Field ("NSTextListMarkerCheck")] + Check, + + [Mac (10, 13)] + [Field ("NSTextListMarkerCircle")] + Circle, + + [Mac (10, 13)] + [Field ("NSTextListMarkerDiamond")] + Diamond, + + [Mac (10, 13)] + [Field ("NSTextListMarkerDisc")] + Disc, + + [Mac (10, 13)] + [Field ("NSTextListMarkerHyphen")] + Hyphen, + + [Mac (10, 13)] + [Field ("NSTextListMarkerSquare")] + Square, + + [Mac (10, 13)] + [Field ("NSTextListMarkerLowercaseHexadecimal")] + LowercaseHexadecimal, + + [Mac (10, 13)] + [Field ("NSTextListMarkerUppercaseHexadecimal")] + UppercaseHexadecimal, + + [Mac (10, 13)] + [Field ("NSTextListMarkerOctal")] + Octal, + + [Mac (10, 13)] + [Field ("NSTextListMarkerLowercaseAlpha")] + LowercaseAlpha, + + [Mac (10, 13)] + [Field ("NSTextListMarkerUppercaseAlpha")] + UppercaseAlpha, + + [Mac (10, 13)] + [Field ("NSTextListMarkerLowercaseLatin")] + LowercaseLatin, + + [Mac (10, 13)] + [Field ("NSTextListMarkerUppercaseLatin")] + UppercaseLatin, + + [Mac (10, 13)] + [Field ("NSTextListMarkerLowercaseRoman")] + LowercaseRoman, + + [Mac (10, 13)] + [Field ("NSTextListMarkerUppercaseRoman")] + UppercaseRoman, + + [Mac (10, 13)] + [Field ("NSTextListMarkerDecimal")] + Decimal, + } [BaseType (typeof (NSTextBlock))] [DisableDefaultCtor] @@ -17709,7 +18117,7 @@ partial interface NSTextContainer : NSCoding { [Export ("heightTracksTextView")] bool HeightTracksTextView { get; set; } - [Availability (Deprecated = Platform.Mac_10_11, Message = "Use Size instead")] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use Size instead.")] [Export ("containerSize")] CGSize ContainerSize { get; set; } @@ -17794,11 +18202,11 @@ partial interface NSTextStorage { [Model] [Protocol] interface NSTextStorageDelegate { - [Availability (Deprecated = Platform.Mac_10_11, Message = "Use WillProcessEditing instead")] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use WillProcessEditing instead.")] [Export ("textStorageWillProcessEditing:")] void TextStorageWillProcessEditing (NSNotification notification); - [Availability (Deprecated = Platform.Mac_10_11, Message = "Use DidProcessEditing instead")] + [Availability (Deprecated = Platform.Mac_10_11, Message = "Use DidProcessEditing instead.")] [Export ("textStorageDidProcessEditing:")] void TextStorageDidProcessEditing (NSNotification notification); @@ -18542,6 +18950,7 @@ interface NSTokenFieldDelegate { string GetEditingString (NSTokenField tokenField, NSObject representedObject); [Export ("tokenField:representedObjectForEditingString:")] + [return: NullAllowed] NSObject GetRepresentedObject (NSTokenField tokenField, string editingString); [Export ("tokenField:writeRepresentedObjects:toPasteboard:")] @@ -18563,9 +18972,14 @@ interface NSTokenFieldDelegate { [BaseType (typeof (NSObject), Delegates=new string [] { "Delegate" }, Events=new Type [] { typeof (NSToolbarDelegate)})] #if XAMCORE_2_0 - [DisableDefaultCtor] + [DisableDefaultCtor] // init was added in 10.13 #endif partial interface NSToolbar { +#if XAMCORE_2_0 + [Mac (10, 13)] + [Export ("init")] + IntPtr Constructor (); +#endif [Export ("initWithIdentifier:")] IntPtr Constructor (string identifier); @@ -18977,7 +19391,11 @@ interface NSTreeController { void RearrangeObjects (); [Export ("arrangedObjects")] +#if XAMCORE_4_0 + NSTreeNode ArrangedObjects { get; } +#else NSObject ArrangedObjects { get; } +#endif [Export ("childrenKeyPath")] string ChildrenKeyPath { get; set; } @@ -19390,11 +19808,11 @@ partial interface NSWindow : NSAnimatablePropertyContainer, NSUserInterfaceItemI [Export ("preventsApplicationTerminationWhenModal")] bool PreventsApplicationTerminationWhenModal { get; set; } - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use ConvertRectToScreen instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use ConvertRectToScreen instead.")] [Export ("convertBaseToScreen:")] CGPoint ConvertBaseToScreen (CGPoint aPoint); - [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use ConvertRectFromScreen instead")] + [Availability (Introduced = Platform.Mac_10_0, Deprecated = Platform.Mac_10_7, Message = "Use ConvertRectFromScreen instead.")] [Export ("convertScreenToBase:")] CGPoint ConvertScreenToBase (CGPoint aPoint); @@ -19534,12 +19952,15 @@ partial interface NSWindow : NSAnimatablePropertyContainer, NSUserInterfaceItemI void RemoveFrameUsingName (string name); [Export ("cacheImageInRect:")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "This method shouldn’t be used as it doesn’t work in all drawing situations; instead, a subview should be used that implements the desired drawing behavior.")] void CacheImageInRect (CGRect aRect); [Export ("restoreCachedImage")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "This method shouldn’t be used as it doesn’t work in all drawing situations; instead, a subview should be used that implements the desired drawing behavior.")] void RestoreCachedImage (); [Export ("discardCachedImage")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "This method shouldn’t be used as it doesn’t work in all drawing situations; instead, a subview should be used that implements the desired drawing behavior.")] void DiscardCachedImage (); [Export ("minSize")] @@ -19716,32 +20137,32 @@ partial interface NSWindow : NSAnimatablePropertyContainer, NSUserInterfaceItemI void SetAnchorAttribute (NSLayoutAttribute layoutAttribute, NSLayoutConstraintOrientation forOrientation); [Lion, Export ("visualizeConstraints:")] - void VisualizeConstraints (NSLayoutConstraint [] constraints); + void VisualizeConstraints ([NullAllowed] NSLayoutConstraint [] constraints); - [Lion, Export ("convertRectToScreen:")] - CGRect ConvertRectToScreen (CGRect aRect); + [Lion, Export ("convertRectToScreen:")] + CGRect ConvertRectToScreen (CGRect aRect); - [Lion, Export ("convertRectFromScreen:")] - CGRect ConvertRectFromScreen (CGRect aRect); + [Lion, Export ("convertRectFromScreen:")] + CGRect ConvertRectFromScreen (CGRect aRect); - [Lion, Export ("convertRectToBacking:")] - CGRect ConvertRectToBacking (CGRect aRect); + [Lion, Export ("convertRectToBacking:")] + CGRect ConvertRectToBacking (CGRect aRect); - [Lion, Export ("convertRectFromBacking:")] - CGRect ConvertRectFromBacking (CGRect aRect); + [Lion, Export ("convertRectFromBacking:")] + CGRect ConvertRectFromBacking (CGRect aRect); - [Lion, Export ("backingAlignedRect:options:")] - CGRect BackingAlignedRect (CGRect aRect, NSAlignmentOptions options); + [Lion, Export ("backingAlignedRect:options:")] + CGRect BackingAlignedRect (CGRect aRect, NSAlignmentOptions options); - [Lion, Export ("backingScaleFactor")] - nfloat BackingScaleFactor { get; } + [Lion, Export ("backingScaleFactor")] + nfloat BackingScaleFactor { get; } - [Lion, Export ("toggleFullScreen:")] - void ToggleFullScreen ([NullAllowed] NSObject sender); + [Lion, Export ("toggleFullScreen:")] + void ToggleFullScreen ([NullAllowed] NSObject sender); - //Detected properties - [Export ("animationBehavior")] - NSWindowAnimationBehavior AnimationBehavior { get; set; } + //Detected properties + [Export ("animationBehavior")] + NSWindowAnimationBehavior AnimationBehavior { get; set; } #if !XAMARIN_MAC // @@ -19904,7 +20325,7 @@ partial interface NSWindow : NSAnimatablePropertyContainer, NSUserInterfaceItemI [Export ("endSheet:returnCode:")] void EndSheet (NSWindow sheetWindow, NSModalResponse returnCode); #if !XAMCORE_4_0 - [Obsolete ("Use the EndSheet(NSWindow,NSModalResponse) overload")] + [Obsolete ("Use the EndSheet(NSWindow,NSModalResponse) overload.")] [Mac (10,9)] [Wrap ("EndSheet (sheetWindow, (NSModalResponse)(long)returnCode)", IsVirtual = true)] void EndSheet (NSWindow sheetWindow, nint returnCode); @@ -21262,14 +21683,16 @@ partial interface NSTypesetter { [Export ("setLineFragmentRect:forGlyphRange:usedRect:baselineOffset:")] void SetLineFragment (CGRect fragmentRect, NSRange glyphRange, CGRect usedRect, nfloat baselineOffset); - // TODO: high level C# binding [Export ("substituteGlyphsInRange:withGlyphs:")] + [Deprecated (PlatformName.MacOSX, 10, 13)] void SubstituteGlyphs (NSRange glyphRange, IntPtr glyphs); [Export ("insertGlyph:atGlyphIndex:characterIndex:")] + [Deprecated (PlatformName.MacOSX, 10, 13)] void InsertGlyph (uint glyph, nuint glyphIndex, nuint characterIndex); // glyph is NSGlyph - typedef unsigned int NSGlyph; [Export ("deleteGlyphsInRange:")] + [Deprecated (PlatformName.MacOSX, 10, 13)] void DeleteGlyphs (NSRange glyphRange); [Export ("setNotShownAttribute:forGlyphRange:")] @@ -21652,6 +22075,18 @@ partial interface NSWindow { [Mac (10, 12)] [Export ("windowTitlebarLayoutDirection")] NSUserInterfaceLayoutDirection WindowTitlebarLayoutDirection { get; } + + [Mac (10,13)] + [Export ("toggleTabOverview:")] + void ToggleTabOverview ([NullAllowed] NSObject sender); + + [Mac (10, 13)] + [Export ("tab", ArgumentSemantic.Strong)] + NSWindowTab Tab { get; } + + [Mac (10, 13)] + [NullAllowed, Export ("tabGroup", ArgumentSemantic.Weak)] + NSWindowTabGroup TabGroup { get; } } partial interface NSPrintOperation { @@ -21978,6 +22413,10 @@ partial interface NSDocument { [MountainLion, Static, Export ("usesUbiquitousStorage")] bool UsesUbiquitousStorage { get; } + + [Mac (10,13)] + [Export ("encodeRestorableStateWithCoder:backgroundQueue:")] + void EncodeRestorableState (NSCoder coder, NSOperationQueue queue); } delegate void NSDocumentControllerOpenPanelWithCompletionHandler (NSArray urlsToOpen); @@ -21990,6 +22429,14 @@ partial interface NSDocumentController { [MountainLion, Export ("beginOpenPanel:forTypes:completionHandler:")] void BeginOpenPanel (NSOpenPanel openPanel, NSArray inTypes, NSDocumentControllerOpenPanelResultHandler completionHandler); + + [Mac (10, 13)] + [Export ("allowsAutomaticShareMenu")] + bool AllowsAutomaticShareMenu { get; } + + [Mac (10, 13)] + [Export ("standardShareMenuItem")] + NSMenuItem StandardShareMenuItem { get; } } partial interface NSImage { @@ -22128,6 +22575,20 @@ partial interface NSGlyphInfo : NSCoding, NSCopying, NSSecureCoding { [Export ("characterCollection")] NSCharacterCollection CharacterCollection { get; } + + [Mac (10,13)] + [Static] + [Export ("glyphInfoWithCGGlyph:forFont:baseString:")] + [return: NullAllowed] + NSGlyphInfo GetGlyphInfo (ushort glyph, NSFont font, string @string); + + [Mac (10, 13)] + [Export ("glyphID")] + ushort GlyphId { get; } + + [Mac (10, 13)] + [Export ("baseString")] + string BaseString { get; } } partial interface NSTableViewDelegate { @@ -22163,15 +22624,19 @@ partial interface NSHelpManager { } partial interface NSDrawer { + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSSplitViewController' instead.")] [Notification, Field ("NSDrawerWillOpenNotification")] NSString WillOpenNotification { get; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSSplitViewController' instead.")] [Notification, Field ("NSDrawerDidOpenNotification")] NSString DidOpenNotification { get; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSSplitViewController' instead.")] [Notification, Field ("NSDrawerWillCloseNotification")] NSString WillCloseNotification { get; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'NSSplitViewController' instead.")] [Notification, Field ("NSDrawerDidCloseNotification")] NSString DidCloseNotification { get; } } @@ -22268,6 +22733,10 @@ partial interface NSText { [Notification, Field ("NSTextDidChangeNotification")] NSString DidChangeNotification { get; } + + [Mac (10, 13)] + [Field ("NSTextMovementUserInfoKey")] + NSString MovementUserInfoKey { get; } } partial interface NSTextInputContext { @@ -23180,6 +23649,26 @@ interface NSAccessibility [Field ("NSAccessibilityAnnouncementRequestedNotification")] NSString AnnouncementRequestedNotification { get; } + [Mac (10, 13)] +#if XAMCORE_4_0 + [Abstract] +#endif + [NullAllowed, Export ("accessibilityChildrenInNavigationOrder", ArgumentSemantic.Copy)] + NSAccessibilityElement[] AccessibilityChildrenInNavigationOrder { get; set; } + + [Mac (10, 13)] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("accessibilityCustomRotors", ArgumentSemantic.Copy)] + NSAccessibilityCustomRotor[] AccessibilityCustomRotors { get; set; } + + [Mac (10, 13)] +#if XAMCORE_4_0 + [Abstract] +#endif + [NullAllowed, Export ("accessibilityCustomActions", ArgumentSemantic.Copy)] + NSAccessibilityCustomAction[] AccessibilityCustomActions { get; set; } } [Protocol] @@ -23696,6 +24185,31 @@ partial interface NSAccessibilityAttributes { [Mac (10, 12)] [Field ("NSAccessibilityTextAlignmentAttribute")] NSString TextAlignmentAttribute { get; } + + [Mac (10, 13)] + [Field ("NSAccessibilityLanguageTextAttribute")] + NSString LanguageTextAttribute { get; } + + [Mac (10, 13)] + [Field ("NSAccessibilityCustomTextAttribute")] + NSString CustomTextAttribute { get; } + + [Mac (10, 13)] + [Field ("NSAccessibilityAnnotationTextAttribute")] + NSString AnnotationTextAttribute { get; } + } + + [Static] + [Mac (10, 13)] + partial interface NSAccessibilityAnnotationAttributeKey { + [Field ("NSAccessibilityAnnotationLabel")] + NSString AnnotationLabel { get; } + + [Field ("NSAccessibilityAnnotationElement")] + NSString AnnotationElement { get; } + + [Field ("NSAccessibilityAnnotationLocation")] + NSString AnnotationLocation { get; } } [Static] @@ -23885,6 +24399,10 @@ interface NSAccessibilityRoles { [Mac (10, 12)] [Field ("NSAccessibilityMenuBarItemRole")] NSString MenuBarItemRole { get; } + + [Mac (10, 13)] + [Field ("NSAccessibilityPageRole")] + NSString PageRole { get; } } [Static] @@ -23984,6 +24502,18 @@ interface NSAccessibilitySubroles { [Mac (10, 9)] [Field ("NSAccessibilityDescriptionListSubrole")] NSString DescriptionListSubrole { get; } + + [Mac (10, 13)] + [Field ("NSAccessibilityTabButtonSubrole")] + NSString TabButtonSubrole { get; } + + [Mac (10, 13)] + [Field ("NSAccessibilityCollectionListSubrole")] + NSString CollectionListSubrole { get; } + + [Mac (10, 13)] + [Field ("NSAccessibilitySectionListSubrole")] + NSString SectionListSubrole { get; } } #if !XAMCORE_4_0 @@ -24411,43 +24941,43 @@ interface NSAccessibilityLayoutItem : NSAccessibilityGroup { } interface NSObjectAccessibilityExtensions { - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityAttributeNames")] NSArray AccessibilityAttributeNames { get; } - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityAttributeValue:")] NSObject GetAccessibilityValue (NSString attribute); - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityIsAttributeSettable:")] bool IsAccessibilityAttributeSettable (NSString attribute); - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilitySetValue:forAttribute:")] void SetAccessibilityValue (NSString attribute, NSObject value); - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityParameterizedAttributeNames")] NSArray AccessibilityParameterizedAttributeNames { get; } - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityAttributeValue:forParameter:")] NSObject GetAccessibilityValue (NSString attribute, NSObject parameter); - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityActionNames")] NSArray AccessibilityActionNames { get; } - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityActionDescription:")] NSString GetAccessibilityActionDescription (NSString action); - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityPerformAction:")] void AccessibilityPerformAction (NSString action); - [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead")] + [Availability (Obsoleted = Platform.Mac_10_10, Message = "Use the NSAccessibility protocol methods instead.")] [Export ("accessibilityIsIgnored")] bool AccessibilityIsIgnored { get; } @@ -24490,6 +25020,14 @@ interface NSWorkspaceAccessibilityExtensions { [Mac (10, 12)] [Export ("accessibilityDisplayShouldReduceMotion")] bool AccessibilityDisplayShouldReduceMotion { get; } + + [Mac (10, 13)] + [Export ("voiceOverEnabled")] + bool VoiceOverEnabled { [Bind ("isVoiceOverEnabled")] get; } + + [Mac (10, 13)] + [Export ("switchControlEnabled")] + bool SwitchControlEnabled { [Bind ("isSwitchControlEnabled")] get; } } interface INSFilePromiseProviderDelegate {} @@ -24531,7 +25069,7 @@ interface NSFilePromiseProviderDelegate interface NSFilePromiseReceiver : NSPasteboardReading { [Static] - [Export ("readableDraggedTypes")] + [Export ("readableDraggedTypes", ArgumentSemantic.Copy)] string[] ReadableDraggedTypes { get; } [Export ("fileTypes", ArgumentSemantic.Copy)] @@ -24604,6 +25142,8 @@ interface NSToolTipOwner string GetStringForToolTip (NSView view, nint tag, CGPoint point, IntPtr data); } + interface INSUserInterfaceValidations {} + [Protocol] interface NSUserInterfaceValidations { @@ -24742,6 +25282,10 @@ interface NSColorPickerTouchBarItem [Export ("enabled")] bool Enabled { [Bind ("isEnabled")] get; set; } + + [Mac (10, 13)] + [NullAllowed, Export ("allowedColorSpaces", ArgumentSemantic.Copy)] + NSColorSpace[] AllowedColorSpaces { get; set; } } [Mac (10,12,2)] @@ -24794,6 +25338,36 @@ interface NSGroupTouchBarItem [Export ("customizationLabel")] string CustomizationLabel { get; set; } + + [Mac (10,13)] + [Static] + [Export ("groupItemWithIdentifier:items:allowedCompressionOptions:")] + NSGroupTouchBarItem CreateGroupItem (string identifier, NSTouchBarItem[] items, NSUserInterfaceCompressionOptions allowedCompressionOptions); + + [Mac (10,13)] + [Static] + [Export ("alertStyleGroupItemWithIdentifier:")] + NSGroupTouchBarItem CreateAlertStyleGroupItem (string identifier); + + [Mac (10, 13)] + [Export ("groupUserInterfaceLayoutDirection", ArgumentSemantic.Assign)] + NSUserInterfaceLayoutDirection GroupUserInterfaceLayoutDirection { get; set; } + + [Mac (10, 13)] + [Export ("prefersEqualWidths")] + bool PrefersEqualWidths { get; set; } + + [Mac (10, 13)] + [Export ("preferredItemWidth")] + nfloat PreferredItemWidth { get; set; } + + [Mac (10, 13)] + [Export ("effectiveCompressionOptions")] + NSUserInterfaceCompressionOptions EffectiveCompressionOptions { get; } + + [Mac (10, 13)] + [Export ("prioritizedCompressionOptions", ArgumentSemantic.Copy)] + NSUserInterfaceCompressionOptions[] PrioritizedCompressionOptions { get; set; } } [Mac (10,12,2)] @@ -25219,4 +25793,274 @@ interface NSSliderAccessoryBehavior : NSCoding, NSCopying [Export ("handleAction:")] void HandleAction (NSSliderAccessory sender); } + + [Mac (10,13)] + [BaseType (typeof(NSObject))] + interface NSAccessibilityCustomAction + { + [Export ("initWithName:handler:")] + IntPtr Constructor (string name, [NullAllowed] Func handler); + + [Export ("initWithName:target:selector:")] + IntPtr Constructor (string name, NSObject target, Selector selector); + + [Export ("name")] + string Name { get; set; } + + [NullAllowed, Export ("handler", ArgumentSemantic.Copy)] + Func Handler { get; set; } + + [NullAllowed, Export ("target", ArgumentSemantic.Weak)] + NSObject Target { get; set; } + + [Advice (@"It must conform to one of the following signatures: 'bool ActionMethod ()' or 'bool ActionMethod (NSAccessibilityCustomAction)' and be decorated with a corresponding [Export].")] + [NullAllowed, Export ("selector", ArgumentSemantic.Assign)] + Selector Selector { get; set; } + } + + [Mac (10,13)] + [BaseType (typeof(NSObject))] + interface NSAccessibilityCustomRotor + { + [Export ("initWithLabel:itemSearchDelegate:")] + IntPtr Constructor (string label, INSAccessibilityCustomRotorItemSearchDelegate itemSearchDelegate); + + [Export ("initWithRotorType:itemSearchDelegate:")] + IntPtr Constructor (NSAccessibilityCustomRotorType rotorType, INSAccessibilityCustomRotorItemSearchDelegate itemSearchDelegate); + + [Export ("type", ArgumentSemantic.Assign)] + NSAccessibilityCustomRotorType Type { get; set; } + + [Export ("label")] + string Label { get; set; } + + [NullAllowed, Export ("itemSearchDelegate", ArgumentSemantic.Weak)] + INSAccessibilityCustomRotorItemSearchDelegate ItemSearchDelegate { get; set; } + + [NullAllowed, Export ("itemLoadingDelegate", ArgumentSemantic.Weak)] + INSAccessibilityElementLoading ItemLoadingDelegate { get; set; } + } + + [Mac (10,13)] + [BaseType (typeof(NSObject))] + interface NSAccessibilityCustomRotorSearchParameters + { + [NullAllowed, Export ("currentItem", ArgumentSemantic.Strong)] + NSAccessibilityCustomRotorItemResult CurrentItem { get; set; } + + [Export ("searchDirection", ArgumentSemantic.Assign)] + NSAccessibilityCustomRotorSearchDirection SearchDirection { get; set; } + + [Export ("filterString")] + string FilterString { get; set; } + } + + [Mac (10,13)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface NSAccessibilityCustomRotorItemResult + { + [Export ("initWithTargetElement:")] + [DesignatedInitializer] + IntPtr Constructor (NSAccessibilityElement targetElement); + + [Export ("initWithItemLoadingToken:customLabel:")] + [DesignatedInitializer] + IntPtr Constructor (INSSecureCoding itemLoadingToken, string customLabel); + + [NullAllowed, Export ("targetElement", ArgumentSemantic.Weak)] + NSAccessibilityElement TargetElement { get; } + + [NullAllowed, Export ("itemLoadingToken", ArgumentSemantic.Strong)] + INSSecureCoding ItemLoadingToken { get; } + + [Export ("targetRange", ArgumentSemantic.Assign)] + NSRange TargetRange { get; set; } + + [NullAllowed, Export ("customLabel")] + string CustomLabel { get; set; } + } + + interface INSAccessibilityCustomRotorItemSearchDelegate {} + + [Mac (10,13)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface NSAccessibilityCustomRotorItemSearchDelegate + { + [Abstract] + [Export ("rotor:resultForSearchParameters:")] + [return: NullAllowed] + NSAccessibilityCustomRotorItemResult GetResult (NSAccessibilityCustomRotor rotor, NSAccessibilityCustomRotorSearchParameters searchParameters); + } + + interface INSAccessibilityElementLoading {} + + [Mac (10,13)] + [Protocol] + interface NSAccessibilityElementLoading + { + [Abstract] + [Export ("accessibilityElementWithToken:")] + [return: NullAllowed] + NSAccessibilityElement GetAccessibilityElement (INSSecureCoding token); + + [Export ("accessibilityRangeInTargetElementWithToken:")] + NSRange GetAccessibilityRangeInTargetElement (INSSecureCoding token); + } + + interface INSCollectionViewPrefetching { } + + [Mac (10,13)] + [Protocol] + interface NSCollectionViewPrefetching + { + [Abstract] + [Export ("collectionView:prefetchItemsAtIndexPaths:")] + void PrefetchItems (NSCollectionView collectionView, NSIndexPath[] indexPaths); + + [Export ("collectionView:cancelPrefetchingForItemsAtIndexPaths:")] + void CancelPrefetching (NSCollectionView collectionView, NSIndexPath[] indexPaths); + } + + delegate bool DownloadFontAssetsRequestCompletionHandler (NSError error); + + [Mac (10,13)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface NSFontAssetRequest : INSProgressReporting + { + [Export ("initWithFontDescriptors:options:")] + [DesignatedInitializer] + IntPtr Constructor (NSFontDescriptor[] fontDescriptors, NSFontAssetRequestOptions options); + + [Export ("downloadedFontDescriptors", ArgumentSemantic.Copy)] + NSFontDescriptor[] DownloadedFontDescriptors { get; } + + [Export ("progress", ArgumentSemantic.Strong)] + NSProgress Progress { get; } + + [Export ("downloadFontAssetsWithCompletionHandler:")] + void DownloadFontAssets (DownloadFontAssetsRequestCompletionHandler completionHandler); + } + + [Category] + [BaseType (typeof(NSObject))] + interface NSObject_NSFontPanelValidationAdditions + { + [Export ("validModesForFontPanel:")] + NSFontPanelModeMask GetValidModes (NSFontPanel fontPanel); + } + + [Mac (10, 13)] + [BaseType (typeof(NSObject))] + interface NSUserInterfaceCompressionOptions : NSCopying, NSCoding + { + [Export ("initWithIdentifier:")] + [DesignatedInitializer] + IntPtr Constructor (string identifier); + + [Export ("initWithCompressionOptions:")] + [DesignatedInitializer] + IntPtr Constructor (NSSet options); + + [Export ("containsOptions:")] + bool Contains (NSUserInterfaceCompressionOptions options); + + [Export ("intersectsOptions:")] + bool Intersects (NSUserInterfaceCompressionOptions options); + + [Export ("empty")] + bool Empty { [Bind ("isEmpty")] get; } + + [Export ("optionsByAddingOptions:")] + NSUserInterfaceCompressionOptions GetOptionsByAdding (NSUserInterfaceCompressionOptions options); + + [Export ("optionsByRemovingOptions:")] + NSUserInterfaceCompressionOptions GetOptionsByRemoving (NSUserInterfaceCompressionOptions options); + + [Static] + [Export ("hideImagesOption", ArgumentSemantic.Copy)] + NSUserInterfaceCompressionOptions HideImagesOption { get; } + + [Static] + [Export ("hideTextOption", ArgumentSemantic.Copy)] + NSUserInterfaceCompressionOptions HideTextOption { get; } + + [Static] + [Export ("reduceMetricsOption", ArgumentSemantic.Copy)] + NSUserInterfaceCompressionOptions ReduceMetricsOption { get; } + + [Static] + [Export ("breakEqualWidthsOption", ArgumentSemantic.Copy)] + NSUserInterfaceCompressionOptions BreakEqualWidthsOption { get; } + + [Static] + [Export ("standardOptions", ArgumentSemantic.Copy)] + NSUserInterfaceCompressionOptions StandardOptions { get; } + } + + [Mac (10, 13)] + [Protocol] + interface NSUserInterfaceCompression + { + [Abstract] + [Export ("compressWithPrioritizedCompressionOptions:")] + void Compress (NSUserInterfaceCompressionOptions[] prioritizedOptions); + + [Abstract] + [Export ("minimumSizeWithPrioritizedCompressionOptions:")] + CGSize GetMinimumSize (NSUserInterfaceCompressionOptions[] prioritizedOptions); + + [Abstract] + [Export ("activeCompressionOptions", ArgumentSemantic.Copy)] + NSUserInterfaceCompressionOptions ActiveCompressionOptions { get; } + } + + [Mac (10,13)] + [BaseType (typeof(NSObject))] + interface NSWindowTab + { + [Export ("title")] + string Title { get; set; } + + [NullAllowed, Export ("attributedTitle", ArgumentSemantic.Copy)] + NSAttributedString AttributedTitle { get; set; } + + [Export ("toolTip")] + string ToolTip { get; set; } + + [NullAllowed, Export ("accessoryView", ArgumentSemantic.Strong)] + NSView AccessoryView { get; set; } + } + + [Mac (10,13)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface NSWindowTabGroup + { + [Export ("identifier")] + string Identifier { get; } + + [Export ("windows", ArgumentSemantic.Copy)] + NSWindow[] Windows { get; } + + [Export ("overviewVisible")] + bool OverviewVisible { [Bind ("isOverviewVisible")] get; set; } + + [Export ("tabBarVisible")] + bool TabBarVisible { [Bind ("isTabBarVisible")] get; } + + [NullAllowed, Export ("selectedWindow", ArgumentSemantic.Weak)] + NSWindow SelectedWindow { get; set; } + + [Export ("addWindow:")] + void Add (NSWindow window); + + [Export ("insertWindow:atIndex:")] + void Insert (NSWindow window, nint index); + + [Export ("removeWindow:")] + void Remove (NSWindow window); + } } diff --git a/src/arkit.cs b/src/arkit.cs new file mode 100644 index 000000000000..0597f698cfa6 --- /dev/null +++ b/src/arkit.cs @@ -0,0 +1,895 @@ +// +// ARKit bindings +// +// Authors: +// Vincent Dondain +// +// Copyright 2017 Microsoft Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using System.ComponentModel; +using XamCore.AVFoundation; +using XamCore.CoreFoundation; +using XamCore.CoreGraphics; +using XamCore.CoreMedia; +using XamCore.CoreVideo; +using XamCore.Foundation; +using XamCore.ObjCRuntime; +using XamCore.Metal; +using XamCore.SpriteKit; +using XamCore.SceneKit; +using XamCore.UIKit; + +using Vector2 = global::OpenTK.Vector2; +using Vector3 = global::OpenTK.NVector3; +using Matrix3 = global::OpenTK.NMatrix3; +using Matrix4 = global::OpenTK.NMatrix4; + +namespace XamCore.ARKit { + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Native] + public enum ARTrackingState : nint { + NotAvailable, + Limited, + Normal, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Native] + public enum ARTrackingStateReason : nint { + None, + Initializing, + ExcessiveMotion, + InsufficientFeatures, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [ErrorDomain ("ARErrorDomain")] + [Native] + public enum ARErrorCode : nint { + UnsupportedConfiguration = 100, + SensorUnavailable = 101, + SensorFailed = 102, + CameraUnauthorized = 103, + WorldTrackingFailed = 200, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Flags] + [Native] + public enum ARHitTestResultType : nuint { + FeaturePoint = 1 << 0, + EstimatedHorizontalPlane = 1 << 1, + ExistingPlane = 1 << 3, + ExistingPlaneUsingExtent = 1 << 4, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Native] + public enum ARPlaneAnchorAlignment : nint { + Horizontal, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Flags] + [Native] + public enum ARSessionRunOptions : nuint { + ResetTracking = 1 << 0, + RemoveExistingAnchors = 1 << 1, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Native] + public enum ARWorldAlignment : nint { + Gravity, + GravityAndHeading, + Camera, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Flags] + [Native] + public enum ARPlaneDetection : nuint { + None = 0, + Horizontal = 1 << 0, + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ARAnchor : NSCopying { + + [NullAllowed, Export ("identifier")] + NSUuid Identifier { get; } + + [Export ("transform")] + Matrix4 Transform { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("initWithTransform:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (Matrix4 transform); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ARCamera : NSCopying { + + [Export ("transform")] + Matrix4 Transform { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("eulerAngles")] + Vector3 EulerAngles { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("trackingState")] + ARTrackingState TrackingState { get; } + + [Export ("trackingStateReason")] + ARTrackingStateReason TrackingStateReason { get; } + + [Export ("intrinsics")] + Matrix3 Intrinsics { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("imageResolution")] + CGSize ImageResolution { get; } + + [Export ("projectionMatrix")] + Matrix4 ProjectionMatrix { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("projectPoint:orientation:viewportSize:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + CGPoint GetProjectPoint (Vector3 point, UIInterfaceOrientation orientation, CGSize viewportSize); + + [Export ("projectionMatrixForOrientation:viewportSize:zNear:zFar:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + Matrix4 GetProjectionMatrix (UIInterfaceOrientation orientation, CGSize viewportSize, nfloat zNear, nfloat zFar); + + [Export ("viewMatrixForOrientation:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + Matrix4 GetViewMatrix (UIInterfaceOrientation orientation); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ARFrame : NSCopying { + + [Export ("timestamp")] + double Timestamp { get; } + + [Export ("capturedImage")] + CVPixelBuffer CapturedImage { get; } + + [NullAllowed, Export ("capturedDepthData", ArgumentSemantic.Strong)] + AVDepthData CapturedDepthData { get; } + + [Export ("capturedDepthDataTimestamp")] + double CapturedDepthDataTimestamp { get; } + + [Export ("camera", ArgumentSemantic.Copy)] + ARCamera Camera { get; } + + [Export ("anchors", ArgumentSemantic.Copy)] + ARAnchor[] Anchors { get; } + + [NullAllowed, Export ("lightEstimate", ArgumentSemantic.Strong)] + ARLightEstimate LightEstimate { get; } + + [NullAllowed, Export ("rawFeaturePoints", ArgumentSemantic.Strong)] + ARPointCloud RawFeaturePoints { get; } + + [Export ("hitTest:types:")] + ARHitTestResult[] HitTest (CGPoint point, ARHitTestResultType types); + + [Export ("displayTransformForOrientation:viewportSize:")] + CGAffineTransform GetDisplayTransform (UIInterfaceOrientation orientation, CGSize viewportSize); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ARHitTestResult { + + [Export ("type")] + ARHitTestResultType Type { get; } + + [Export ("distance")] + nfloat Distance { get; } + + [Export ("localTransform")] + Matrix4 LocalTransform { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("worldTransform")] + Matrix4 WorldTransform { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [NullAllowed, Export ("anchor", ArgumentSemantic.Strong)] + ARAnchor Anchor { get; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ARLightEstimate { + + [Export ("ambientIntensity")] + nfloat AmbientIntensity { get; } + + [Export ("ambientColorTemperature")] + nfloat AmbientColorTemperature { get; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (ARAnchor))] + [DisableDefaultCtor] + interface ARPlaneAnchor { + + // [Export ("initWithTransform:")] marked as NS_UNAVAILABLE + + [Export ("alignment")] + ARPlaneAnchorAlignment Alignment { get; } + + [Export ("center")] + Vector3 Center { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("extent")] + Vector3 Extent { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ARPointCloud { + + [Export ("count")] + nuint Count { get; } + + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Protected, Export ("points")] + IntPtr GetRawPoints (); + + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Protected, Export ("identifiers")] + IntPtr GetRawIdentifiers (); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (SCNView))] + interface ARSCNView { + + [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] + IARSCNViewDelegate Delegate { get; set; } + + [Export ("session", ArgumentSemantic.Strong)] + ARSession Session { get; set; } + + [Export ("scene", ArgumentSemantic.Strong)] + SCNScene Scene { get; set; } + + [Export ("automaticallyUpdatesLighting")] + bool AutomaticallyUpdatesLighting { get; set; } + + [Export ("anchorForNode:")] + [return: NullAllowed] + ARAnchor GetAnchor (SCNNode node); + + [Export ("nodeForAnchor:")] + [return: NullAllowed] + SCNNode GetNode (ARAnchor anchor); + + [Export ("hitTest:types:")] + ARHitTestResult[] HitTest (CGPoint point, ARHitTestResultType types); + } + + interface IARSCNViewDelegate {} + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Protocol, Model] + [BaseType (typeof (NSObject))] + interface ARSCNViewDelegate : SCNSceneRendererDelegate, ARSessionObserver { + + [Export ("renderer:nodeForAnchor:")] + [return: NullAllowed] + SCNNode GetNode (ISCNSceneRenderer renderer, ARAnchor anchor); + + [Export ("renderer:didAddNode:forAnchor:")] + void DidAddNode (ISCNSceneRenderer renderer, SCNNode node, ARAnchor anchor); + + [Export ("renderer:willUpdateNode:forAnchor:")] + void WillUpdateNode (ISCNSceneRenderer renderer, SCNNode node, ARAnchor anchor); + + [Export ("renderer:didUpdateNode:forAnchor:")] + void DidUpdateNode (ISCNSceneRenderer renderer, SCNNode node, ARAnchor anchor); + + [Export ("renderer:didRemoveNode:forAnchor:")] + void DidRemoveNode (ISCNSceneRenderer renderer, SCNNode node, ARAnchor anchor); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (SKView))] + interface ARSKView { + + [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] + IARSKViewDelegate Delegate { get; set; } + + [Export ("session", ArgumentSemantic.Strong)] + ARSession Session { get; set; } + + [Export ("anchorForNode:")] + [return: NullAllowed] + ARAnchor GetAnchor (SKNode node); + + [Export ("nodeForAnchor:")] + [return: NullAllowed] + SKNode GetNode (ARAnchor anchor); + + [Export ("hitTest:types:")] + ARHitTestResult[] HitTest (CGPoint point, ARHitTestResultType types); + } + + interface IARSKViewDelegate {} + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Protocol, Model] + [BaseType (typeof (NSObject))] + interface ARSKViewDelegate : SKViewDelegate, ARSessionObserver { + + [Export ("view:nodeForAnchor:")] + [return: NullAllowed] + SKNode GetNode (ARSKView view, ARAnchor anchor); + + [Export ("view:didAddNode:forAnchor:")] + void DidAddNode (ARSKView view, SKNode node, ARAnchor anchor); + + [Export ("view:willUpdateNode:forAnchor:")] + void WillUpdateNode (ARSKView view, SKNode node, ARAnchor anchor); + + [Export ("view:didUpdateNode:forAnchor:")] + void DidUpdateNode (ARSKView view, SKNode node, ARAnchor anchor); + + [Export ("view:didRemoveNode:forAnchor:")] + void DidRemoveNode (ARSKView view, SKNode node, ARAnchor anchor); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + interface ARSession { + + [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] + IARSessionDelegate Delegate { get; set; } + + [NullAllowed, Export ("delegateQueue", ArgumentSemantic.Strong)] + DispatchQueue DelegateQueue { get; set; } + + [NullAllowed, Export ("currentFrame", ArgumentSemantic.Copy)] + ARFrame CurrentFrame { get; } + + [NullAllowed, Export ("configuration", ArgumentSemantic.Copy)] + ARConfiguration Configuration { get; } + + // 'runWithConfiguration:' selector marked as unavailable in Xcode 9 beta 5. Use 'Run (ARConfiguration configuration, ARSessionRunOptions options)' instead. + [Export ("runWithConfiguration:options:")] + void Run (ARConfiguration configuration, ARSessionRunOptions options); + + [Export ("pause")] + void Pause (); + + [Export ("addAnchor:")] + void AddAnchor (ARAnchor anchor); + + [Export ("removeAnchor:")] + void RemoveAnchor (ARAnchor anchor); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Protocol] + interface ARSessionObserver { + + [Export ("session:didFailWithError:")] + void DidFail (ARSession session, NSError error); + + [Export ("session:cameraDidChangeTrackingState:")] + void CameraDidChangeTrackingState (ARSession session, ARCamera camera); + + [Export ("sessionWasInterrupted:")] + void WasInterrupted (ARSession session); + + [Export ("sessionInterruptionEnded:")] + void InterruptionEnded (ARSession session); + + [Export ("session:didOutputAudioSampleBuffer:")] + void DidOutputAudioSampleBuffer (ARSession session, CMSampleBuffer audioSampleBuffer); + } + + interface IARSessionDelegate {} + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Protocol, Model] + [BaseType (typeof (NSObject))] + interface ARSessionDelegate : ARSessionObserver { + + [Export ("session:didUpdateFrame:")] + void DidUpdateFrame (ARSession session, ARFrame frame); + + [Export ("session:didAddAnchors:")] + void DidAddAnchors (ARSession session, ARAnchor[] anchors); + + [Export ("session:didUpdateAnchors:")] + void DidUpdateAnchors (ARSession session, ARAnchor[] anchors); + + [Export ("session:didRemoveAnchors:")] + void DidRemoveAnchors (ARSession session, ARAnchor[] anchors); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (NSObject))] + [Abstract] + [DisableDefaultCtor] + interface ARConfiguration : NSCopying { + + [Static] + [Export ("isSupported")] + bool IsSupported { get; } + + [Export ("worldAlignment", ArgumentSemantic.Assign)] + ARWorldAlignment WorldAlignment { get; set; } + + [Export ("lightEstimationEnabled")] + bool LightEstimationEnabled { [Bind ("isLightEstimationEnabled")] get; set; } + + [Export ("providesAudioData")] + bool ProvidesAudioData { get; set; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof (ARConfiguration))] + interface ARWorldTrackingConfiguration { + + [Export ("planeDetection", ArgumentSemantic.Assign)] + ARPlaneDetection PlaneDetection { get; set; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof(ARConfiguration))] + interface AROrientationTrackingConfiguration {} + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Static] + interface ARSCNDebugOptions { + + [Field ("ARSCNDebugOptionShowWorldOrigin")] + SCNDebugOptions ShowWorldOrigin { get; } + + [Field ("ARSCNDebugOptionShowFeaturePoints")] + SCNDebugOptions ShowFeaturePoints { get; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Protocol] + interface ARTrackable { + [Abstract] + [Export ("isTracked")] + bool IsTracked { get; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof(ARConfiguration))] + interface ARFaceTrackingConfiguration {} + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [StrongDictionary ("ARBlendShapeLocationKeys")] + interface ARBlendShapeLocationOptions { + + float BrowDownLeft { get; set; } + + float BrowDownRight { get; set; } + + float BrowInnerUp { get; set; } + + float BrowOuterUpLeft { get; set; } + + float BrowOuterUpRight { get; set; } + + float CheekPuff { get; set; } + + float CheekSquintLeft { get; set; } + + float CheekSquintRight { get; set; } + + float EyeBlinkLeft { get; set; } + + float EyeBlinkRight { get; set; } + + float EyeLookDownLeft { get; set; } + + float EyeLookDownRight { get; set; } + + float EyeLookInLeft { get; set; } + + float EyeLookInRight { get; set; } + + float EyeLookOutLeft { get; set; } + + float EyeLookOutRight { get; set; } + + float EyeLookUpLeft { get; set; } + + float EyeLookUpRight { get; set; } + + float EyeSquintLeft { get; set; } + + float EyeSquintRight { get; set; } + + float EyeWideLeft { get; set; } + + float EyeWideRight { get; set; } + + float JawForward { get; set; } + + float JawLeft { get; set; } + + float JawOpen { get; set; } + + float JawRight { get; set; } + + float MouthClose { get; set; } + + float MouthDimpleLeft { get; set; } + + float MouthDimpleRight { get; set; } + + float MouthFrownLeft { get; set; } + + float MouthFrownRight { get; set; } + + float MouthFunnel { get; set; } + + float MouthLeft { get; set; } + + float MouthLowerDownLeft { get; set; } + + float MouthLowerDownRight { get; set; } + + float MouthPressLeft { get; set; } + + float MouthPressRight { get; set; } + + float MouthPucker { get; set; } + + float MouthRight { get; set; } + + float MouthRollLower { get; set; } + + float MouthRollUpper { get; set; } + + float MouthShrugLower { get; set; } + + float MouthShrugUpper { get; set; } + + float MouthSmileLeft { get; set; } + + float MouthSmileRight { get; set; } + + float MouthStretchLeft { get; set; } + + float MouthStretchRight { get; set; } + + float MouthUpperUpLeft { get; set; } + + float MouthUpperUpRight { get; set; } + + float NoseSneerLeft { get; set; } + + float NoseSneerRight { get; set; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [Static] + [Internal] + interface ARBlendShapeLocationKeys { + + [Field ("ARBlendShapeLocationBrowDownLeft")] + NSString BrowDownLeftKey { get; } + + [Field ("ARBlendShapeLocationBrowDownRight")] + NSString BrowDownRightKey { get; } + + [Field ("ARBlendShapeLocationBrowInnerUp")] + NSString BrowInnerUpKey { get; } + + [Field ("ARBlendShapeLocationBrowOuterUpLeft")] + NSString BrowOuterUpLeftKey { get; } + + [Field ("ARBlendShapeLocationBrowOuterUpRight")] + NSString BrowOuterUpRightKey { get; } + + [Field ("ARBlendShapeLocationCheekPuff")] + NSString CheekPuffKey { get; } + + [Field ("ARBlendShapeLocationCheekSquintLeft")] + NSString CheekSquintLeftKey { get; } + + [Field ("ARBlendShapeLocationCheekSquintRight")] + NSString CheekSquintRightKey { get; } + + [Field ("ARBlendShapeLocationEyeBlinkLeft")] + NSString EyeBlinkLeftKey { get; } + + [Field ("ARBlendShapeLocationEyeBlinkRight")] + NSString EyeBlinkRightKey { get; } + + [Field ("ARBlendShapeLocationEyeLookDownLeft")] + NSString EyeLookDownLeftKey { get; } + + [Field ("ARBlendShapeLocationEyeLookDownRight")] + NSString EyeLookDownRightKey { get; } + + [Field ("ARBlendShapeLocationEyeLookInLeft")] + NSString EyeLookInLeftKey { get; } + + [Field ("ARBlendShapeLocationEyeLookInRight")] + NSString EyeLookInRightKey { get; } + + [Field ("ARBlendShapeLocationEyeLookOutLeft")] + NSString EyeLookOutLeftKey { get; } + + [Field ("ARBlendShapeLocationEyeLookOutRight")] + NSString EyeLookOutRightKey { get; } + + [Field ("ARBlendShapeLocationEyeLookUpLeft")] + NSString EyeLookUpLeftKey { get; } + + [Field ("ARBlendShapeLocationEyeLookUpRight")] + NSString EyeLookUpRightKey { get; } + + [Field ("ARBlendShapeLocationEyeSquintLeft")] + NSString EyeSquintLeftKey { get; } + + [Field ("ARBlendShapeLocationEyeSquintRight")] + NSString EyeSquintRightKey { get; } + + [Field ("ARBlendShapeLocationEyeWideLeft")] + NSString EyeWideLeftKey { get; } + + [Field ("ARBlendShapeLocationEyeWideRight")] + NSString EyeWideRightKey { get; } + + [Field ("ARBlendShapeLocationJawForward")] + NSString JawForwardKey { get; } + + [Field ("ARBlendShapeLocationJawLeft")] + NSString JawLeftKey { get; } + + [Field ("ARBlendShapeLocationJawOpen")] + NSString JawOpenKey { get; } + + [Field ("ARBlendShapeLocationJawRight")] + NSString JawRightKey { get; } + + [Field ("ARBlendShapeLocationMouthClose")] + NSString MouthCloseKey { get; } + + [Field ("ARBlendShapeLocationMouthDimpleLeft")] + NSString MouthDimpleLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthDimpleRight")] + NSString MouthDimpleRightKey { get; } + + [Field ("ARBlendShapeLocationMouthFrownLeft")] + NSString MouthFrownLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthFrownRight")] + NSString MouthFrownRightKey { get; } + + [Field ("ARBlendShapeLocationMouthFunnel")] + NSString MouthFunnelKey { get; } + + [Field ("ARBlendShapeLocationMouthLeft")] + NSString MouthLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthLowerDownLeft")] + NSString MouthLowerDownLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthLowerDownRight")] + NSString MouthLowerDownRightKey { get; } + + [Field ("ARBlendShapeLocationMouthPressLeft")] + NSString MouthPressLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthPressRight")] + NSString MouthPressRightKey { get; } + + [Field ("ARBlendShapeLocationMouthPucker")] + NSString MouthPuckerKey { get; } + + [Field ("ARBlendShapeLocationMouthRight")] + NSString MouthRightKey { get; } + + [Field ("ARBlendShapeLocationMouthRollLower")] + NSString MouthRollLowerKey { get; } + + [Field ("ARBlendShapeLocationMouthRollUpper")] + NSString MouthRollUpperKey { get; } + + [Field ("ARBlendShapeLocationMouthShrugLower")] + NSString MouthShrugLowerKey { get; } + + [Field ("ARBlendShapeLocationMouthShrugUpper")] + NSString MouthShrugUpperKey { get; } + + [Field ("ARBlendShapeLocationMouthSmileLeft")] + NSString MouthSmileLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthSmileRight")] + NSString MouthSmileRightKey { get; } + + [Field ("ARBlendShapeLocationMouthStretchLeft")] + NSString MouthStretchLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthStretchRight")] + NSString MouthStretchRightKey { get; } + + [Field ("ARBlendShapeLocationMouthUpperUpLeft")] + NSString MouthUpperUpLeftKey { get; } + + [Field ("ARBlendShapeLocationMouthUpperUpRight")] + NSString MouthUpperUpRightKey { get; } + + [Field ("ARBlendShapeLocationNoseSneerLeft")] + NSString NoseSneerLeftKey { get; } + + [Field ("ARBlendShapeLocationNoseSneerRight")] + NSString NoseSneerRightKey { get; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof(ARAnchor))] + interface ARFaceAnchor : ARTrackable { + [Export ("geometry")] + ARFaceGeometry Geometry { get; } + + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Export ("blendShapes")] + NSDictionary WeakBlendShapes { get; } + + [Wrap ("WeakBlendShapes")] + ARBlendShapeLocationOptions BlendShapes { get; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface ARFaceGeometry : NSCopying { + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Export ("initWithBlendShapes:")] + IntPtr Constructor (NSDictionary blendShapes); + + [Wrap ("this ((NSDictionary)blendShapes?.Dictionary)")] + IntPtr Constructor (ARBlendShapeLocationOptions blendShapes); + + [Export ("vertexCount")] + nuint VertexCount { get; } + + [Export ("vertices")] + Vector3 Vertices { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("textureCoordinateCount")] + nuint TextureCoordinateCount { get; } + + [Export ("textureCoordinates")] + Vector2 TextureCoordinates { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("triangleCount")] + nuint TriangleCount { get; } + + [Export ("triangleIndices")] + short TriangleIndices { get; } + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof(SCNGeometry))] + [DisableDefaultCtor] + interface ARSCNFaceGeometry { + [Static] + [Export ("faceGeometryWithDevice:")] + [return: NullAllowed] + ARSCNFaceGeometry CreateFaceGeometry (IMTLDevice device); + + [Static] + [Export ("faceGeometryWithDevice:fillMesh:")] + [return: NullAllowed] + ARSCNFaceGeometry CreateFaceGeometry (IMTLDevice device, bool fillMesh); + + [Export ("updateFromFaceGeometry:")] + void Update (ARFaceGeometry faceGeometry); + } + + [iOS (11,0)] + [NoWatch, NoTV, NoMac] + [BaseType (typeof(ARLightEstimate))] + [DisableDefaultCtor] + interface ARDirectionalLightEstimate { + [Export ("sphericalHarmonicsCoefficients", ArgumentSemantic.Copy)] + NSData SphericalHarmonicsCoefficients { get; } + + [Export ("primaryLightDirection")] + Vector3 PrimaryLightDirection { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } + + [Export ("primaryLightIntensity")] + nfloat PrimaryLightIntensity { get; } + } +} + +#endif // XAMCORE_2_0 \ No newline at end of file diff --git a/src/assetslibrary.cs b/src/assetslibrary.cs index 8c32f75e86e6..b045ea0edd9d 100644 --- a/src/assetslibrary.cs +++ b/src/assetslibrary.cs @@ -18,7 +18,7 @@ namespace XamCore.AssetsLibrary { - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] interface ALAssetLibraryChangedEventArgs { [Export ("ALAssetLibraryUpdatedAssetsKey")] NSSet UpdatedAssets { get; } @@ -33,7 +33,7 @@ interface ALAssetLibraryChangedEventArgs { NSSet DeletedAssetGroupsKey { get; } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [BaseType (typeof (NSObject))] interface ALAssetsLibrary { [Export ("assetForURL:resultBlock:failureBlock:")] @@ -134,17 +134,17 @@ interface ALAssetsLibrary { } #if !XAMCORE_2_0 - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] delegate void ALAssetsLibraryAssetForURLResultDelegate (ALAsset asset); - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] delegate void ALAssetsLibraryAccessFailureDelegate (NSError error); - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] delegate void ALAssetsLibraryWriteCompletionDelegate (NSUrl assetURL, NSError error); #endif - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] delegate void ALAssetsLibraryGroupsEnumerationResultsDelegate (ALAssetsGroup group, ref bool stop); - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [BaseType (typeof (NSObject))] interface ALAsset { [Export ("valueForProperty:")] @@ -243,7 +243,7 @@ interface ALAsset { } [BaseType (typeof (NSObject))] - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] interface ALAssetRepresentation { [Export ("UTI")] string Uti { get; } @@ -287,7 +287,7 @@ interface ALAssetRepresentation { CGSize Dimensions { get; } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [BaseType (typeof (NSObject))] interface ALAssetsFilter { [Static, Export ("allPhotos")] @@ -300,20 +300,20 @@ interface ALAssetsFilter { ALAssetsFilter AllAssets { get; } } - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] delegate void ALAssetsEnumerator (ALAsset result, nint index, ref bool stop); #if !XAMCORE_2_0 [Since (5,0)] - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] delegate void ALAssetsLibraryGroupResult (ALAssetsGroup group); [Since (5,0)] - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] delegate void ALAssetsLibraryAccessFailure (NSError error); #endif - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use Photos API instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the 'Photos' API instead.")] [BaseType (typeof (NSObject))] interface ALAssetsGroup { [Export ("valueForProperty:"), Internal] diff --git a/src/audiounit.cs b/src/audiounit.cs index 66025d3d3103..f20150ad529f 100644 --- a/src/audiounit.cs +++ b/src/audiounit.cs @@ -8,6 +8,7 @@ using System; using System.ComponentModel; +using System.Runtime.InteropServices; using XamCore.AudioUnit; using XamCore.CoreFoundation; @@ -39,6 +40,8 @@ internal delegate AudioUnitStatus AURenderPullInputBlock (ref AudioUnitRenderAct uint frameCount, nint inputBusNumber, AudioBuffers inputData); delegate void AUScheduleParameterBlock (AUEventSampleTime eventSampleTime, uint rampDurationSampleFrames, ulong parameterAddress, float value); + [iOS (11, 0), Mac (10,13), TV (11,0), NoWatch] + delegate int AUMidiOutputEventBlock (long eventSampleTime, byte cable, nint length, IntPtr midiBytes); delegate void AUImplementorValueObserver (AUParameter param, float value); delegate float AUImplementorValueProvider (AUParameter param); @@ -107,6 +110,10 @@ interface AUAudioUnit [NullAllowed, Export ("manufacturerName")] string ManufacturerName { get; } + [iOS (11, 0), Mac (10, 13), TV (11, 0), NoWatch] + [NullAllowed, Export ("audioUnitShortName")] + string ShortName { get; } + [Export ("componentVersion")] uint ComponentVersion { get; } @@ -140,6 +147,18 @@ interface AUAudioUnit // [NullAllowed, Export ("musicalContextBlock", ArgumentSemantic.Copy)] // AUHostMusicalContextBlock MusicalContextBlock { get; set; } + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("MIDIOutputNames", ArgumentSemantic.Copy)] + string[] MidiOutputNames { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("providesUserInterface")] + bool ProvidesUserInterface { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("MIDIOutputEventBlock", ArgumentSemantic.Copy)] + AUMidiOutputEventBlock MidiOutputEventBlock { get; set; } + [NullAllowed, Export ("transportStateBlock", ArgumentSemantic.Copy)] AUHostTransportStateBlock TransportStateBlock { get; set; } @@ -202,7 +221,7 @@ interface AUAudioUnit [NullAllowed, Export ("contextName")] string ContextName { get; set; } - [iOS (10,0), Mac (10,12, onlyOn64 : true), TV (10,0)] + [iOS (10,0), Mac (10,12, onlyOn64 : true), TV (10,0), Watch (4, 0)] [Export ("supportsMPE")] bool SupportsMpe { get; } @@ -229,6 +248,11 @@ interface AUAudioUnit [Mac (10,11)][iOS (7,0)] [Notification, Field ("kAudioComponentInstanceInvalidationNotification")] NSString AudioComponentInstanceInvalidationNotification { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("MIDIOutputBufferSizeHint")] + nint MidiOutputBufferSizeHint { get; set; } + } // kept separate from AUAudioUnit, quote: @@ -238,6 +262,14 @@ interface AUAudioUnit [BaseType (typeof (AUAudioUnit))] interface AUAudioUnit_AUAudioInputOutputUnit { + [Mac (10,12), NoTV, NoiOS, NoWatch] + [Export ("deviceID")] + uint GetDeviceId (); + + [Mac (10,12), NoTV, NoiOS, NoWatch] + [Export ("setDeviceID:error:")] + bool SetDeviceId (uint deviceID, out NSError outError); + [Export ("canPerformInput")] bool GetCanPerformInput (); @@ -273,7 +305,20 @@ interface AUAudioUnit_AUAudioInputOutputUnit { [NullAllowed, Export ("setOutputProvider:")] void SetOutputProvider (AURenderPullInputBlock provider); -} + + // the following are properties but we cannot have properties in Categories. + [Mac (10, 13), NoWatch, NoiOS, NoTV] + [Export ("deviceInputLatency")] + double GetDeviceInputLatency (); + + [Mac (10, 13), NoWatch, NoiOS, NoTV] + [Export ("deviceOutputLatency")] + double GetDeviceOutputLatency (); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("running")] + bool IsRunning (); + } [iOS (9,0), Mac(10,11, onlyOn64 : true)] [BaseType (typeof(NSObject))] @@ -315,6 +360,10 @@ interface AUAudioUnitBus [Export ("maximumChannelCount")] uint MaximumChannelCount { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("shouldAllocateBuffer")] + bool ShouldAllocateBuffer { get; set; } } [iOS (9,0), Mac(10,11, onlyOn64 : true)] @@ -407,7 +456,7 @@ interface AUParameter : NSSecureCoding #if XAMCORE_4_0 // undo breaking change introduced in xamarin/maccore @ 1f207bd3f3df363cb5a74e59b93acd8eb6e1fec2 [Internal][Sealed] #else - [Obsolete ("Use the AUParameterObserverToken overload")] + [Obsolete ("Use the 'AUParameterObserverToken' overload.")] #endif [Export ("setValue:originator:")] void SetValue (float value, IntPtr originator); @@ -416,7 +465,7 @@ interface AUParameter : NSSecureCoding #if XAMCORE_4_0 // undo breaking change introduced in xamarin/maccore @ 1f207bd3f3df363cb5a74e59b93acd8eb6e1fec2 [Internal][Sealed] #else - [Obsolete ("Use the AUParameterObserverToken overload")] + [Obsolete ("Use the 'AUParameterObserverToken' overload.")] #endif [Export ("setValue:originator:atHostTime:")] void SetValue (float value, IntPtr originator, ulong hostTime); @@ -437,8 +486,7 @@ interface AUParameter : NSSecureCoding [Export ("setValue:originator:atHostTime:eventType:")] void SetValue (float value, IntPtr originator, ulong hostTime, AUParameterAutomationEventType eventType); - [iOS (10,0), Mac (10,12, onlyOn64 : true)] - [TV (10,0)] + [iOS (10,0), Mac (10,12, onlyOn64 : true), Watch (4, 0), TV (10, 0)] [Wrap ("SetValue (value, originator.ObserverToken, hostTime, eventType)")] void SetValue (float value, AUParameterObserverToken originator, ulong hostTime, AUParameterAutomationEventType eventType); } @@ -466,7 +514,7 @@ interface AUParameterNode #if XAMCORE_4_0 // undo breaking change introduced in xamarin/maccore @ 1f207bd3f3df363cb5a74e59b93acd8eb6e1fec2 [Internal][Sealed] #else - [Obsolete ("Use the CreateTokenByAddingParameterObserver instead")] + [Obsolete ("Use the 'CreateTokenByAddingParameterObserver' instead.")] #endif [Export ("tokenByAddingParameterObserver:")] /* void * */ IntPtr TokenByAddingParameterObserver (AUParameterObserver observer); @@ -475,7 +523,7 @@ interface AUParameterNode #if XAMCORE_4_0 // undo breaking change introduced in xamarin/maccore @ 1f207bd3f3df363cb5a74e59b93acd8eb6e1fec2 [Internal][Sealed] #else - [Obsolete ("Use the CreateTokenByAddingParameterRecordingObserver instead")] + [Obsolete ("Use the 'CreateTokenByAddingParameterRecordingObserver' instead.")] #endif [Export ("tokenByAddingParameterRecordingObserver:")] /* void * */ IntPtr TokenByAddingParameterRecordingObserver (AUParameterRecordingObserver observer); @@ -493,7 +541,7 @@ interface AUParameterNode #if XAMCORE_4_0 // undo breaking change introduced in xamarin/maccore @ 1f207bd3f3df363cb5a74e59b93acd8eb6e1fec2 [Internal][Sealed] #else - [Obsolete ("Use the AUParameterObserverToken overload")] + [Obsolete ("Use the 'AUParameterObserverToken' overload.")] #endif [Export ("removeParameterObserver:")] void RemoveParameterObserver (/* void * */ IntPtr token); diff --git a/src/avfoundation.cs b/src/avfoundation.cs index 04c9e7b5090d..83249423be7d 100644 --- a/src/avfoundation.cs +++ b/src/avfoundation.cs @@ -32,8 +32,10 @@ using System.ComponentModel; #if !WATCH +using XamCore.AudioToolbox; using XamCore.AudioUnit; using XamCore.AVKit; +using XamCore.Foundation; using XamCore.CoreAnimation; using XamCore.CoreImage; using XamCore.CoreMedia; @@ -45,6 +47,8 @@ using XamCore.Foundation; using XamCore.CoreFoundation; using XamCore.CoreGraphics; +using XamCore.CoreVideo; +using XamCore.ImageIO; using System; using OpenTK; @@ -174,6 +178,10 @@ enum AVMediaTypes { [Since (6,0)][Mac (10,8)] [Field ("AVMediaTypeMetadata")] Metadata = 9, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVMediaTypeDepthData")] + DepthData = 10, } #if !XAMCORE_4_0 @@ -254,6 +262,112 @@ interface AVMutableDateRangeMetadataGroup AVMetadataItem[] Items { get; set; } } + [TV (11,0), NoWatch, iOS (11,0), Mac (10, 13)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVDepthData { + [Static] + [Export ("depthDataFromDictionaryRepresentation:error:")] + [return: NullAllowed] + AVDepthData Create (NSDictionary imageSourceAuxDataInfoDictionary, [NullAllowed] out NSError outError); + + [Export ("depthDataByConvertingToDepthDataType:")] + AVDepthData ConvertToDepthDataType (CVPixelFormatType depthDataType); + + [Export ("depthDataByApplyingExifOrientation:")] + AVDepthData ApplyExifOrientation (CGImagePropertyOrientation exifOrientation); + + [Export ("depthDataByReplacingDepthDataMapWithPixelBuffer:error:")] + [return: NullAllowed] + AVDepthData ReplaceDepthDataMap (CVPixelBuffer pixelBuffer, [NullAllowed] out NSError outError); + + [Protected] + [Export ("availableDepthDataTypes")] + NSNumber[] WeakAvailableDepthDataTypes { get; } + + [Export ("dictionaryRepresentationForAuxiliaryDataType:")] + [return: NullAllowed] + NSDictionary GetDictionaryRepresentation ([NullAllowed] out string outAuxDataType); + + [Export ("depthDataType")] + CVPixelFormatType DepthDataType { get; } + + [Export ("depthDataMap")] + CVPixelBuffer DepthDataMap { get; } + + [Export ("depthDataFiltered")] + bool IsDepthDataFiltered { [Bind ("isDepthDataFiltered")] get; } + + [Export ("depthDataAccuracy")] + AVDepthDataAccuracy DepthDataAccuracy { get; } + + [NullAllowed, Export ("cameraCalibrationData")] + AVCameraCalibrationData CameraCalibrationData { get; } + } + + // values are manually given since not some are platform specific + [NoWatch] + enum AVMediaCharacteristics { + [Field ("AVMediaCharacteristicVisual")] + Visual = 0, + + [Field ("AVMediaCharacteristicAudible")] + Audible = 1, + + [Field ("AVMediaCharacteristicLegible")] + Legible = 2, + + [Field ("AVMediaCharacteristicFrameBased")] + FrameBased = 3, + + [iOS (10, 0), TV (10,0), Mac (10,12)] + [Field ("AVMediaCharacteristicUsesWideGamutColorSpace")] + UsesWideGamutColorSpace = 4, + + [Mac (10, 8), iOS (5,0)] + [Field ("AVMediaCharacteristicIsMainProgramContent")] + IsMainProgramContent = 5, + + [MountainLion][Since (5,0)] + [Field ("AVMediaCharacteristicIsAuxiliaryContent")] + IsAuxiliaryContent = 6, + + [MountainLion][Since (5,0)] + [Field ("AVMediaCharacteristicContainsOnlyForcedSubtitles")] + ContainsOnlyForcedSubtitles = 7, + + [MountainLion][Since (5,0)] + [Field ("AVMediaCharacteristicTranscribesSpokenDialogForAccessibility")] + TranscribesSpokenDialogForAccessibility = 8, + + [MountainLion][Since (5,0)] + [Field ("AVMediaCharacteristicDescribesMusicAndSoundForAccessibility")] + DescribesMusicAndSoundForAccessibility = 9, + + [MountainLion][Since (5,0)] + [Field ("AVMediaCharacteristicDescribesVideoForAccessibility")] + DescribesVideoForAccessibility = 10, + + [NoMac][Since (6,0)] + [Field ("AVMediaCharacteristicEasyToRead")] + EasyToRead = 11, + + [iOS (9,0), Mac (10,11)] + [Field ("AVMediaCharacteristicLanguageTranslation")] + LanguageTranslation = 12, + + [iOS (9,0), Mac (10,11)] + [Field ("AVMediaCharacteristicDubbedTranslation")] + DubbedTranslation = 13, + + [iOS (9,0), Mac (10,11)] + [Field ("AVMediaCharacteristicVoiceOverTranslation")] + VoiceOverTranslation = 14, + + } + +#if !XAMCORE_4_0 + [Obsolete ("Use AVMediaCharacteristics enum values")] [NoWatch] [Since (4,0)] [BaseType (typeof (NSObject))][Static] @@ -315,10 +429,115 @@ interface AVMediaCharacteristic { [Field ("AVMediaCharacteristicVoiceOverTranslation")] NSString VoiceOverTranslation { get; } } +#endif + + [NoWatch] + enum AVMetadataFormat { + [iOS (8,0)][Mac (10,10)] + [Field ("AVMetadataFormatHLSMetadata")] + FormatHlsMetadata = 0, + + [Field ("AVMetadataFormatiTunesMetadata")] + FormatiTunesMetadata = 1, + + [Field ("AVMetadataFormatID3Metadata")] + FormatID3Metadata = 2, + + [Since (7,0), Mavericks] + [Field ("AVMetadataFormatISOUserData")] + FormatISOUserData = 3, + + [Field ("AVMetadataFormatQuickTimeUserData")] + FormatQuickTimeUserData = 4, + + [iOS (11,0), Mac (10,13), TV (11,0)] + [Field ("AVMetadataFormatUnknown")] + Unknown = 5, + } + + [NoWatch] + enum AVFileTypes { + [Field ("AVFileTypeQuickTimeMovie")] + QuickTimeMovie = 0, + + [Field ("AVFileTypeMPEG4")] + Mpeg4 = 1, + + [Field ("AVFileTypeAppleM4V")] + AppleM4V = 2, + + [Mac (10,11)] + [Field ("AVFileType3GPP")] + ThreeGpp = 3, + + [Field ("AVFileTypeAppleM4A")] + AppleM4a = 4, + + [Field ("AVFileTypeCoreAudioFormat")] + CoreAudioFormat = 5, + + [Field ("AVFileTypeWAVE")] + Wave = 6, + + [Field ("AVFileTypeAIFF")] + Aiff = 7, + + [Field ("AVFileTypeAIFC")] + Aifc = 8, + + [Field ("AVFileTypeAMR")] + Amr = 9, + + [iOS (7,0), Mac (10,11)] + [Field ("AVFileType3GPP2")] + ThreeGpp2 = 10, + + [Since (7,0), Mavericks] + [Field ("AVFileTypeMPEGLayer3")] + MpegLayer3 = 11, + + [Since (7,0), Mavericks] + [Field ("AVFileTypeSunAU")] + SunAU = 12, + + [Since (7,0), Mavericks] + [Field ("AVFileTypeAC3")] + AC3 = 13, + + [iOS (9,0), Mac (10,11)] + [Field ("AVFileTypeEnhancedAC3")] + EnhancedAC3 = 14, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVFileTypeJPEG")] + Jpeg = 15, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVFileTypeDNG")] + Dng = 16, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVFileTypeHEIC")] + Heic = 17, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVFileTypeAVCI")] + Avci = 18, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVFileTypeHEIF")] + Heif = 19, + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVFileTypeTIFF")] + Tiff = 20, + } +#if !XAMCORE_4_0 [NoWatch] [Since (4,0)] [BaseType (typeof (NSObject))][Static] + [Obsolete ("Use AVFileTypes enum values")] interface AVFileType { [Field ("AVFileTypeQuickTimeMovie")] NSString QuickTimeMovie { get; } @@ -370,6 +589,7 @@ interface AVFileType { [Field ("AVFileTypeEnhancedAC3")] NSString EnhancedAC3 { get; } } +#endif [NoWatch] [iOS (9,0), Mac (10,11)] @@ -449,16 +669,20 @@ interface AVVideo { [Field ("AVVideoH264EntropyModeKey")] NSString H264EntropyModeKey { get; } + [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_7 | Platform.TV_9_0, Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.TV_11_0, Message = "Use 'AVVideoCodecType' enum instead.")] [Field ("AVVideoCodecH264")] NSString CodecH264 { get; } + [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_7 | Platform.TV_9_0, Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.TV_11_0, Message = "Use 'AVVideoCodecType' enum instead.")] [Field ("AVVideoCodecJPEG")] NSString CodecJPEG { get; } + [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_7 | Platform.TV_9_0, Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.TV_11_0, Message = "Use 'AVVideoCodecType' enum instead.")] [NoiOS, NoTV, Mac (10,7)] [Field ("AVVideoCodecAppleProRes4444")] NSString AppleProRes4444 { get; } + [Availability (Introduced = Platform.Mac_10_7, Deprecated = Platform.Mac_10_13, Message = "Use 'AVVideoCodecType' enum instead.")] [NoiOS, NoTV, Mac (10,7)] [Field ("AVVideoCodecAppleProRes422")] NSString AppleProRes422 { get; } @@ -661,7 +885,12 @@ interface AVAudioConnectionPoint [Export ("bus")] nuint Bus { get; } } - + +#if XAMCORE_2_0 + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + delegate AVAudioEngineManualRenderingStatus AVAudioEngineManualRenderingBlock (/* AVAudioFrameCount = uint */ uint numberOfFrames, AudioBuffers outBuffer, [NullAllowed] /* OSStatus */ ref int outError); +#endif + [Watch (3,0)] [iOS (8,0)][Mac (10,10)] [BaseType (typeof (NSObject))] @@ -675,7 +904,8 @@ interface AVAudioEngine { [Export ("outputNode")] AVAudioOutputNode OutputNode { get; } - [NoTV, NoWatch] + [TV (11,0)] + [Watch (4,0)] [Export ("inputNode"), NullAllowed] AVAudioInputNode InputNode { get; } @@ -741,6 +971,44 @@ interface AVAudioEngine { [Notification] [Field ("AVAudioEngineConfigurationChangeNotification")] NSString ConfigurationChangeNotification { get; } + + [TV (11, 0), NoWatch, Mac (10, 13), iOS (11, 0)] + [Export ("autoShutdownEnabled")] + bool AutoShutdownEnabled { [Bind ("isAutoShutdownEnabled")] get; set; } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("enableManualRenderingMode:format:maximumFrameCount:error:")] + bool EnableManualRenderingMode (AVAudioEngineManualRenderingMode mode, AVAudioFormat pcmFormat, uint maximumFrameCount, out NSError outError); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("renderOffline:toBuffer:error:")] + AVAudioEngineManualRenderingStatus RenderOffline (uint numberOfFrames, AVAudioPcmBuffer buffer, [NullAllowed] out NSError outError); + +#if XAMCORE_2_0 + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("manualRenderingBlock")] + AVAudioEngineManualRenderingBlock ManualRenderingBlock { get; } +#endif + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("isInManualRenderingMode")] + bool InManualRenderingMode { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("manualRenderingMode")] + AVAudioEngineManualRenderingMode ManualRenderingMode { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("manualRenderingFormat")] + AVAudioFormat ManualRenderingFormat { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("manualRenderingMaximumFrameCount")] + uint ManualRenderingMaximumFrameCount { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("manualRenderingSampleTime")] + long ManualRenderingSampleTime { get; } } [NoWatch] @@ -1043,6 +1311,20 @@ interface AVAudioNode { [Export ("removeTapOnBus:")] void RemoveTapOnBus (nuint bus); + +#if XAMCORE_2_0 + [NoWatch, TV (11, 0), Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [Export ("AUAudioUnit")] + AUAudioUnit AUAudioUnit { get; } +#endif + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("latency")] + double Latency { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("outputPresentationLatency")] + double OutputPresentationLatency { get; } } [Watch (3,0)] @@ -1078,14 +1360,23 @@ interface AVAudioOutputNode { } - [NoTV] - [NoWatch] - [iOS (8,0)][Mac (10,10)] - [BaseType (typeof (AVAudioIONode))] +#if XAMCORE_2_0 + [Watch (4,0), TV (11,0), Mac (10,10), iOS (8,0)] + delegate AudioBuffers AVAudioIONodeInputBlock (uint frameCount); +#endif + + [Watch (4,0)] + [iOS (8,0)][Mac (10,10)][TV (11,0)] + [BaseType (typeof (AVAudioIONode))] [DisableDefaultCtor] // returned Handle is nil // note: sample source (header) suggest it comes from AVAudioEngine properties interface AVAudioInputNode : AVAudioMixing { +#if XAMCORE_2_0 + [Mac (10,13), iOS (11,0)] + [Export ("setManualRenderingInputPCMFormat:inputBlock:")] + bool SetManualRenderingInputPcmFormat (AVAudioFormat format, AVAudioIONodeInputBlock block); +#endif } [Watch (3,0)] @@ -1223,7 +1514,8 @@ interface AVAudioPlayer { [Since (7,0), Mac (10,9), Export ("initWithContentsOfURL:fileTypeHint:error:")] IntPtr Constructor (NSUrl url, [NullAllowed] string fileTypeHint, out NSError outError); - [NoWatch, iOS (10, 0), TV (10,0), Mac (10,12)] + [iOS (10, 0), TV (10,0), Mac (10,12)] + [Watch (4,0)] [Export ("format")] AVAudioFormat Format { get; } } @@ -1277,14 +1569,34 @@ interface AVAudioPlayerNode : AVAudioMixing { [Export ("scheduleBuffer:atTime:options:completionHandler:")] void ScheduleBuffer (AVAudioPcmBuffer buffer, [NullAllowed] AVAudioTime when, AVAudioPlayerNodeBufferOptions options, [NullAllowed] Action completionHandler); + [Async] + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("scheduleBuffer:completionCallbackType:completionHandler:")] + void ScheduleBuffer (AVAudioPcmBuffer buffer, AVAudioPlayerNodeCompletionCallbackType callbackType, [NullAllowed] Action completionHandler); + + [Async] + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("scheduleBuffer:atTime:options:completionCallbackType:completionHandler:")] + void ScheduleBuffer (AVAudioPcmBuffer buffer, [NullAllowed] AVAudioTime when, AVAudioPlayerNodeBufferOptions options, AVAudioPlayerNodeCompletionCallbackType callbackType, [NullAllowed] Action completionHandler); + [Async] [Export ("scheduleFile:atTime:completionHandler:")] void ScheduleFile (AVAudioFile file, [NullAllowed] AVAudioTime when, [NullAllowed] Action completionHandler); + [Async] + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("scheduleFile:atTime:completionCallbackType:completionHandler:")] + void ScheduleFile (AVAudioFile file, [NullAllowed] AVAudioTime when, AVAudioPlayerNodeCompletionCallbackType callbackType, [NullAllowed] Action completionHandler); + [Async] [Export ("scheduleSegment:startingFrame:frameCount:atTime:completionHandler:")] void ScheduleSegment (AVAudioFile file, long startFrame, uint /* AVAudioFrameCount = uint32_t */ numberFrames, [NullAllowed] AVAudioTime when, [NullAllowed] Action completionHandler); + [Async] + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("scheduleSegment:startingFrame:frameCount:atTime:completionCallbackType:completionHandler:")] + void ScheduleSegment (AVAudioFile file, long startFrame, uint numberFrames, [NullAllowed] AVAudioTime when, AVAudioPlayerNodeCompletionCallbackType callbackType, [NullAllowed] Action completionHandler); + [Export ("stop")] void Stop (); @@ -1310,7 +1622,8 @@ interface AVAudioPlayerNode : AVAudioMixing { } [BaseType (typeof (NSObject))] - [NoTV, NoWatch] + [NoTV] + [Watch (4,0)] interface AVAudioRecorder { [Export ("initWithURL:settings:error:")][Internal] IntPtr InitWithUrl (NSUrl url, NSDictionary settings, out NSError error); @@ -1405,7 +1718,8 @@ interface AVAudioRecorder { [BaseType (typeof (NSObject))] [Model] [Protocol] - [NoTV, NoWatch] + [NoTV] + [Watch (4,0)] interface AVAudioRecorderDelegate { [Export ("audioRecorderDidFinishRecording:successfully:"), CheckDisposed] void FinishedRecording (AVAudioRecorder recorder, bool flag); @@ -1463,7 +1777,7 @@ interface AVAudioSession { [NoWatch] [Wrap ("WeakDelegate")] [Protocolize] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use AVAudioSession.Notification.Observe* methods instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'AVAudioSession.Notification.Observe*' methods instead.")] [NoTV] AVAudioSessionDelegate Delegate { get; set; } @@ -1472,14 +1786,14 @@ interface AVAudioSession { [NoTV] [Export ("setActive:withFlags:error:")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use SetActive (bool, AVAudioSessionSetActiveOptions, out NSError) instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'SetActive (bool, AVAudioSessionSetActiveOptions, out NSError)' instead.")] bool SetActive (bool beActive, AVAudioSessionFlags flags, out NSError outError); [Export ("setCategory:error:")] bool SetCategory (NSString theCategory, out NSError outError); [NoTV] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use SetPreferredSampleRate instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use 'SetPreferredSampleRate' instead.")] [Export ("setPreferredHardwareSampleRate:error:")] bool SetPreferredHardwareSampleRate (double sampleRate, out NSError outError); @@ -1500,7 +1814,7 @@ interface AVAudioSession { [NoTV] [Export ("preferredHardwareSampleRate")] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use PreferredSampleRate instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use 'PreferredSampleRate' instead.")] double PreferredHardwareSampleRate { get; } [NoWatch] @@ -1514,17 +1828,17 @@ interface AVAudioSession { [NoTV] [Export ("currentHardwareSampleRate")] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use SampleRate instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use 'SampleRate' instead.")] double CurrentHardwareSampleRate { get; } [NoTV] [Export ("currentHardwareInputNumberOfChannels")] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use InputNumberOfChannels instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use 'InputNumberOfChannels' instead.")] nint CurrentHardwareInputNumberOfChannels { get; } [NoTV] [Export ("currentHardwareOutputNumberOfChannels")] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use OutputNumberOfChannels instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_6_0, Message = "Use 'OutputNumberOfChannels' instead.")] nint CurrentHardwareOutputNumberOfChannels { get; } [Field ("AVAudioSessionCategoryAmbient")] @@ -1784,7 +2098,8 @@ interface AVAudioSession { [PostGet ("OutputDataSource")] bool SetOutputDataSource ([NullAllowed] AVAudioSessionDataSourceDescription dataSource, out NSError outError); - [NoTV, NoWatch] + [NoTV] + [Watch (4,0)] [Since (7,0)] [Export ("requestRecordPermission:")] void RequestRecordPermission (AVPermissionGranted responseCallback); @@ -1883,6 +2198,14 @@ interface AVAudioSession { [NoWatch, NoTV, iOS(10,0)] [Export ("setAggregatedIOPreference:error:")] bool SetAggregatedIOPreference (AVAudioSessionIOType ioType, out NSError error); + + [TV (11,0), NoWatch, iOS (11,0), NoMac] + [Export ("setCategory:mode:routeSharingPolicy:options:error:")] + bool SetCategory (string category, string mode, AVAudioSessionRouteSharingPolicy policy, AVAudioSessionCategoryOptions options, [NullAllowed] out NSError outError); + + [TV (11, 0), NoWatch, iOS (11, 0), NoMac] + [Export ("routeSharingPolicy")] + AVAudioSessionRouteSharingPolicy RouteSharingPolicy { get; } } [Since (6,0)] @@ -2085,7 +2408,7 @@ interface AVAudioUnit { [Async] void FromComponentDescription (AudioComponentDescription audioComponentDescription, AudioComponentInstantiationOptions options, Action completionHandler); - [iOS (9,0), Mac (10,11, onlyOn64 : true)] + [NoWatch, iOS (9,0), Mac (10,11, onlyOn64 : true)] [Export ("AUAudioUnit")] AUAudioUnit AUAudioUnit { get; } #endif @@ -2473,7 +2796,7 @@ interface AVAsset : NSCopying { CGAffineTransform PreferredTransform { get; } [Export ("naturalSize")] - [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_7, Deprecated = Platform.iOS_5_0 | Platform.Mac_10_8, Message = "Use NaturalSize/PreferredTransform as appropriate on the video track instead")] + [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_7, Deprecated = Platform.iOS_5_0 | Platform.Mac_10_8, Message = "Use 'NaturalSize/PreferredTransform' as appropriate on the video track instead.")] CGSize NaturalSize { get; } [Export ("providesPreciseDurationAndTiming")] @@ -2492,9 +2815,15 @@ interface AVAsset : NSCopying { [Export ("tracksWithMediaType:")] AVAssetTrack [] TracksWithMediaType (string mediaType); + [Wrap ("TracksWithMediaType (mediaType.GetConstant ())")] + AVAssetTrack [] GetTracks (AVMediaTypes mediaType); + [Export ("tracksWithMediaCharacteristic:")] AVAssetTrack [] TracksWithMediaCharacteristic (string mediaCharacteristic); + [Wrap ("TracksWithMediaType (mediaCharacteristic.GetConstant ())")] + AVAssetTrack [] GetTracks (AVMediaCharacteristics mediaCharacteristic); + [Export ("lyrics"), NullAllowed] string Lyrics { get; } @@ -2504,8 +2833,16 @@ interface AVAsset : NSCopying { [Export ("availableMetadataFormats")] string [] AvailableMetadataFormats { get; } - [Export ("metadataForFormat:")] +#if !XAMCORE_4_0 + [Obsolete ("Use 'GetMetadataForFormat' with enum values AVMetadataFormat.")] + [Wrap ("GetMetadataForFormat (new NSString (format))", IsVirtual = true)] AVMetadataItem [] MetadataForFormat (string format); +#endif + [Export ("metadataForFormat:")] + AVMetadataItem [] GetMetadataForFormat (NSString format); + + [Wrap ("GetMetadataForFormat (new NSString (format.GetConstant ()))")] + AVMetadataItem [] GetMetadataForFormat (AVMetadataFormat format); [Since (4,2)] [Export ("hasProtectedContent")] @@ -2566,6 +2903,9 @@ interface AVAsset : NSCopying { [Export ("mediaSelectionGroupForMediaCharacteristic:")] AVMediaSelectionGroup MediaSelectionGroupForMediaCharacteristic (string avMediaCharacteristic); + [Wrap ("MediaSelectionGroupForMediaCharacteristic (avMediaCharacteristic.GetConstant ())")] + AVMediaSelectionGroup GetMediaSelectionGroupForMediaCharacteristic (AVMediaCharacteristics avMediaCharacteristic); + [Export ("statusOfValueForKey:error:")] AVKeyValueStatus StatusOfValue (string key, out NSError error); @@ -2638,6 +2978,10 @@ interface AVAsset : NSCopying { [iOS (10, 2), Mac (10,12,2), TV (10, 2)] [Export ("overallDurationHint")] CMTime OverallDurationHint { get; } + + [iOS (11, 0), TV (11, 0), Mac (10, 13), NoWatch] + [Export ("allMediaSelections")] + AVMediaSelection[] AllMediaSelections { get; } } #if MONOMAC @@ -2677,8 +3021,15 @@ interface AVFragmentedAsset_AVFragmentedAssetTrackInspection { [Export ("tracksWithMediaType:")] AVFragmentedAssetTrack [] GetTracks (string mediaType); + [Wrap ("This.GetTracks (mediaType.GetConstant ())")] + AVFragmentedAssetTrack [] GetTracks (AVMediaTypes mediaType); + [Export ("tracksWithMediaCharacteristic:")] AVFragmentedAssetTrack [] GetTracksWithMediaCharacteristic (string mediaCharacteristic); + + [Wrap ("This.GetTracksWithMediaCharacteristic (mediaCharacteristic.GetConstant ())")] + AVFragmentedAssetTrack [] GetTracks (AVMediaCharacteristics mediaCharacteristic); + } [Mac (10,11)] @@ -2721,6 +3072,108 @@ interface AVCaptureFileOutputDelegate { void DidOutputSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection); } +#endif // MONOMAC + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVCaptureSynchronizedData + { + [Export ("timestamp")] + CMTime Timestamp { get; } + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVCaptureSynchronizedDataCollection : INSFastEnumeration + { + [Export ("synchronizedDataForCaptureOutput:")] + [return: NullAllowed] + AVCaptureSynchronizedData From (AVCaptureOutput captureOutput); + + [Export ("objectForKeyedSubscript:")] + [return: NullAllowed] + AVCaptureSynchronizedData ObjectForKeyedSubscript (AVCaptureOutput key); + + [Export ("count")] + nuint Count { get; } + } + + interface IAVCaptureDataOutputSynchronizerDelegate {} + + [NoWatch, NoTV, iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface AVCaptureDataOutputSynchronizerDelegate + { + [Abstract] + [Export ("dataOutputSynchronizer:didOutputSynchronizedDataCollection:")] + void DidOutputSynchronizedDataCollection (AVCaptureDataOutputSynchronizer synchronizer, AVCaptureSynchronizedDataCollection synchronizedDataCollection); + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVCaptureDataOutputSynchronizer + { + [Export ("initWithDataOutputs:")] + IntPtr Constructor (AVCaptureOutput[] dataOutputs); + + [Export ("dataOutputs", ArgumentSemantic.Retain)] + AVCaptureOutput[] DataOutputs { get; } + + [Export ("setDelegate:queue:")] + void SetDelegate ([NullAllowed] IAVCaptureDataOutputSynchronizerDelegate del, [NullAllowed] DispatchQueue delegateCallbackQueue); + + [Wrap ("WeakDelegate")] + [NullAllowed] + IAVCaptureDataOutputSynchronizerDelegate Delegate { get; } + + [NullAllowed, Export ("delegate")] + NSObject WeakDelegate { get; } + + [NullAllowed, Export ("delegateCallbackQueue")] + DispatchQueue DelegateCallbackQueue { get; } + } + + [NoMac, NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(AVCaptureSynchronizedData))] + interface AVCaptureSynchronizedSampleBufferData + { + [Export ("sampleBuffer")] + CMSampleBuffer SampleBuffer { get; } + + [Export ("sampleBufferWasDropped")] + bool SampleBufferWasDropped { get; } + + [Export ("droppedReason")] + AVCaptureOutputDataDroppedReason DroppedReason { get; } + } + + [NoMac, NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(AVCaptureSynchronizedData))] + interface AVCaptureSynchronizedMetadataObjectData + { + [Export ("metadataObjects")] + AVMetadataObject[] MetadataObjects { get; } + } + + [NoMac, NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(AVCaptureSynchronizedData))] + interface AVCaptureSynchronizedDepthData + { + [Export ("depthData")] + AVDepthData DepthData { get; } + + [Export ("depthDataWasDropped")] + bool DepthDataWasDropped { get; } + + [Export ("droppedReason")] + AVCaptureOutputDataDroppedReason DroppedReason { get; } + } + +#if MONOMAC [Mac (10,10)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] @@ -2770,6 +3223,7 @@ interface AVSampleBufferRequest { [Export ("overrideTime", ArgumentSemantic.Assign)] CMTime OverrideTime { get; set; } } + #endif [NoWatch] @@ -2960,7 +3414,7 @@ interface AVAssetReaderTrackOutput { #if XAMCORE_2_0 [Internal] #endif - [Advice ("Use Create method")] + [Advice ("Use 'Create' method.")] [Static, Export ("assetReaderTrackOutputWithTrack:outputSettings:")] AVAssetReaderTrackOutput FromTrack (AVAssetTrack track, [NullAllowed] NSDictionary outputSettings); @@ -3005,7 +3459,7 @@ interface AVAssetReaderAudioMixOutput { #if XAMCORE_2_0 [Internal] #endif - [Advice ("Use Create method")] + [Advice ("Use 'Create' method.")] [Static, Export ("assetReaderAudioMixOutputWithAudioTracks:audioSettings:")] AVAssetReaderAudioMixOutput FromTracks (AVAssetTrack [] audioTracks, [NullAllowed] NSDictionary audioSettings); @@ -3022,7 +3476,7 @@ interface AVAssetReaderAudioMixOutput { #if XAMCORE_2_0 [Internal] #endif - [Advice ("Use Settings property")] + [Advice ("Use 'Settings' property.")] [Export ("audioSettings"), NullAllowed] NSDictionary AudioSettings { get; } @@ -3051,7 +3505,7 @@ interface AVAssetReaderVideoCompositionOutput { #if XAMCORE_2_0 [Internal] #endif - [Advice ("Use Create method")] + [Advice ("Use 'Create' method.")] [Static] [Export ("assetReaderVideoCompositionOutputWithVideoTracks:videoSettings:")] AVAssetReaderVideoCompositionOutput WeakFromTracks (AVAssetTrack [] videoTracks, [NullAllowed] NSDictionary videoSettings); @@ -3169,7 +3623,7 @@ interface AVAssetResourceLoadingRequest { bool Finished { /* [Bind ("isFinished")] */ get; } [Export ("finishLoadingWithResponse:data:redirect:")] - [Availability (Introduced = Platform.iOS_6_0, Deprecated = Platform.iOS_7_0, Message = "Use the Response, Redirect properties and the AVAssetResourceLoadingDataRequest.Responds and AVAssetResourceLoadingRequest.FinishLoading methods instead")] + [Availability (Introduced = Platform.iOS_6_0, Deprecated = Platform.iOS_7_0, Message = "Use the 'Response', 'Redirect' properties and the 'AVAssetResourceLoadingDataRequest.Responds' and 'AVAssetResourceLoadingRequest.FinishLoading' methods instead.")] void FinishLoading ([NullAllowed] NSUrlResponse usingResponse, [NullAllowed] NSData data, [NullAllowed] NSUrlRequest redirect); [Export ("finishLoadingWithError:")] @@ -3316,7 +3770,7 @@ interface AVAssetWriter { void CancelWriting (); [Export ("finishWriting")] - [Availability (Introduced = Platform.iOS_4_1, Deprecated = Platform.iOS_6_0, Message = "Use the asynchronous FinishWriting(NSAction completionHandler) instead")] + [Availability (Introduced = Platform.iOS_4_1, Deprecated = Platform.iOS_6_0, Message = "Use the asynchronous 'FinishWriting (NSAction completionHandler)' instead.")] bool FinishWriting (); [Mac (10,9)] @@ -3505,6 +3959,12 @@ interface AVAssetWriterInput { [Export ("sampleReferenceBaseURL", ArgumentSemantic.Copy), NullAllowed] NSUrl SampleReferenceBaseUrl { get; set; } + // AVAssetWriterInput_AVAssetWriterInputFileTypeSpecificProperties + + [iOS (11, 0), Mac (10, 13), TV (11, 0), NoWatch] + [Export ("mediaDataLocation")] + string MediaDataLocation { get; set; } + } [NoWatch] @@ -3574,7 +4034,7 @@ interface AVAssetWriterInputPixelBufferAdaptor { CVPixelBufferPool PixelBufferPool { get; } #if XAMCORE_2_0 - [Advice ("Use Create method")] + [Advice ("Use 'Create' method.")] #endif [Static, Export ("assetWriterInputPixelBufferAdaptorWithAssetWriterInput:sourcePixelBufferAttributes:")] AVAssetWriterInputPixelBufferAdaptor FromInput (AVAssetWriterInput input, [NullAllowed] NSDictionary sourcePixelBufferAttributes); @@ -3700,6 +4160,10 @@ interface AVAssetTrack : NSCopying { [Export ("mediaType")] string MediaType { get; } + [iOS (11, 0), Mac (10, 13), TV (11, 0), NoWatch] + [Export ("decodable")] + bool Decodable { [Bind ("isDecodable")] get; } + // Weak version [Export ("formatDescriptions")] NSObject [] FormatDescriptionsAsObjects { get; } @@ -4089,8 +4553,11 @@ interface AVMetadata { [Field ("AVMetadataCommonKeySoftware")] NSString CommonKeySoftware { get; } +#if !XAMCORE_4_0 [Field ("AVMetadataFormatQuickTimeUserData")] + [Obsolete ("Use 'AVMetadataFormat' enum values")] NSString FormatQuickTimeUserData { get; } +#endif [Field ("AVMetadataKeySpaceQuickTimeUserData")] NSString KeySpaceQuickTimeUserData { get; } @@ -4265,10 +4732,13 @@ interface AVMetadata { [Field ("AVMetadata3GPUserDataKeyMediaRating")] NSString K3GPUserDataKeyMediaRating { get; } +#if !XAMCORE_4_0 [Since (7,0), Mavericks] [Field ("AVMetadataFormatISOUserData")] + [Obsolete ("Use 'AVMetadataFormat' enum values")] NSString KFormatISOUserData { get; } - +#endif + [Since (7,0), Mavericks] [Field ("AVMetadataKeySpaceISOUserData")] NSString KKeySpaceISOUserData { get; } @@ -4403,8 +4873,11 @@ interface AVMetadata { [Field ("AVMetadataQuickTimeMetadataKeyContentIdentifier")] NSString QuickTimeMetadataKeyContentIdentifier { get; } +#if !XAMCORE_4_0 [Field ("AVMetadataFormatiTunesMetadata")] + [Obsolete ("Use 'AVMetadataFormat' enum values")] NSString FormatiTunesMetadata { get; } +#endif [Field ("AVMetadataKeySpaceiTunes")] NSString KeySpaceiTunes { get; } @@ -4554,9 +5027,12 @@ interface AVMetadata { [Field ("AVMetadataiTunesMetadataKeyExecProducer")] NSString iTunesMetadataKeyExecProducer { get; } +#if !XAMCORE_4_0 [Field ("AVMetadataFormatID3Metadata")] + [Obsolete ("Use 'AVMetadataFormat' enum values")] NSString FormatID3Metadata { get; } - +#endif + [Field ("AVMetadataKeySpaceID3")] NSString KeySpaceID3 { get; } @@ -4862,14 +5338,21 @@ interface AVMetadata { [Field ("AVMetadataIcyMetadataKeyStreamURL")] NSString IcyMetadataKeyStreamUrl { get; } +#if !XAMCORE_4_0 [iOS (8,0)][Mac (10,10)] [Field ("AVMetadataFormatHLSMetadata")] + [Obsolete ("Use 'AVMetadataFormat' enum values")] NSString FormatHlsMetadata { get; } +#endif - [iOS (9,3)][NoMac] + [iOS (9,3)][Mac (10, 11, 3)] [TV (9,2)] [Field ("AVMetadataKeySpaceHLSDateRange")] NSString KeySpaceHlsDateRange { get; } + + [iOS (11, 0), Mac (10, 13)] + [Field ("AVMetadataKeySpaceAudioFile")] + NSString KeySpaceAudioFile { get; } } [NoWatch] @@ -6100,8 +6583,15 @@ interface AVMovie_AVMovieTrackInspection [Export ("tracksWithMediaType:")] AVMovieTrack[] GetTracks (string mediaType); + [Wrap ("This.GetTracks (mediaType.GetConstant ())")] + AVMovieTrack[] GetTracks (AVMediaTypes mediaType); + [Export ("tracksWithMediaCharacteristic:")] AVMovieTrack[] GetTracksWithMediaCharacteristic (string mediaCharacteristic); + + [Wrap ("This.GetTracksWithMediaCharacteristic (mediaCharacteristic.GetConstant ())")] + AVMovieTrack[] GetTracks (AVMediaCharacteristics mediaCharacteristic); + } [Mac (10,11)] @@ -6213,8 +6703,14 @@ interface AVMutableMovie_AVMutableMovieTrackInspection [Export ("tracksWithMediaType:")] AVMutableMovieTrack[] GetTracks (string mediaType); + [Wrap ("This.GetTracks (mediaType.GetConstant ())")] + AVMutableMovieTrack[] GetTracks (AVMediaTypes mediaType); + [Export ("tracksWithMediaCharacteristic:")] AVMutableMovieTrack[] GetTracksWithMediaCharacteristic (string mediaCharacteristic); + + [Wrap ("This.GetTracksWithMediaCharacteristic (mediaCharacteristic.GetConstant ())")] + AVMutableMovieTrack[] GetTracks (AVMediaCharacteristics mediaCharacteristic); } [Mac (10,11)] @@ -6271,8 +6767,14 @@ interface AVFragmentedMovie_AVFragmentedMovieTrackInspection [Export ("tracksWithMediaType:")] AVFragmentedMovieTrack[] GetTracks (string mediaType); + [Wrap ("This.GetTracks (mediaType.GetConstant ())")] + AVFragmentedMovieTrack[] GetTracks (AVMediaTypes mediaType); + [Export ("tracksWithMediaCharacteristic:")] AVFragmentedMovieTrack[] GetTracksWithMediaCharacteristic (string mediaCharacteristic); + + [Wrap ("This.GetTracksWithMediaCharacteristic (mediaCharacteristic.GetConstant ())")] + AVFragmentedMovieTrack[] GetTracks (AVMediaCharacteristics mediaCharacteristic); } [Mac (10,10)] @@ -6454,7 +6956,7 @@ interface AVFragmentedMovieTrack NSString SegmentsDidChangeNotification { get; } [Introduced (PlatformName.MacOSX, 10, 10)] - [Deprecated (PlatformName.MacOSX, 10, 11, message: "Use either AVFragmentedMovieTrackTimeRangeDidChangeNotification or AVFragmentedMovieTrackSegmentsDidChangeNotification instead. In either case you can assume that the sender's totalSampleDataLength has changed.")] + [Deprecated (PlatformName.MacOSX, 10, 11, message: "Use either 'AVFragmentedMovieTrackTimeRangeDidChangeNotification' or 'AVFragmentedMovieTrackSegmentsDidChangeNotification' instead. In either case, you can assume that the sender's 'TotalSampleDataLength' has changed.")] [Field ("AVFragmentedMovieTrackTotalSampleDataLengthDidChangeNotification")] NSString TotalSampleDataLengthDidChangeNotification { get; } } @@ -6676,8 +7178,14 @@ interface AVComposition_AVCompositionTrackInspection { [Export ("tracksWithMediaType:")] AVCompositionTrack[] GetTracks (string mediaType); + [Wrap ("This.GetTracks (mediaType.GetConstant ())")] + AVCompositionTrack[] GetTracks (AVMediaTypes mediaType); + [Export ("tracksWithMediaCharacteristic:")] AVCompositionTrack[] GetTracksWithMediaCharacteristic (string mediaCharacteristic); + + [Wrap ("This.GetTracksWithMediaCharacteristic (mediaCharacteristic.GetConstant ())")] + AVCompositionTrack[] GetTracks (AVMediaCharacteristics mediaCharacteristic); } [NoWatch] @@ -6732,8 +7240,14 @@ interface AVMutableComposition_AVMutableCompositionTrackInspection { [Export ("tracksWithMediaType:")] AVMutableCompositionTrack[] GetTracks (string mediaType); + [Wrap ("This.GetTracks (mediaType.GetConstant ())")] + AVMutableCompositionTrack[] GetTracks (AVMediaTypes mediaType); + [Export ("tracksWithMediaCharacteristic:")] AVMutableCompositionTrack[] GetTracksWithMediaCharacteristic (string mediaCharacteristic); + + [Wrap ("This.GetTracksWithMediaCharacteristic (mediaCharacteristic.GetConstant ())")] + AVMutableCompositionTrack[] GetTracks (AVMediaCharacteristics mediaCharacteristic); } [NoWatch] @@ -6861,6 +7375,14 @@ interface AVAssetExportSession { [Field ("AVAssetExportPresetHighestQuality")] NSString PresetHighestQuality { get; } + [iOS (11, 0), Mac (10,13)] + [Field ("AVAssetExportPresetHEVCHighestQuality")] + NSString PresetHevcHighestQuality { get; } + + [iOS (11, 0), Mac (10,13)] + [Field ("AVAssetExportPresetHEVC3840x2160")] + NSString PresetHevc3840x2160 { get; } + [Field ("AVAssetExportPreset640x480")] NSString Preset640x480 { get; } @@ -6878,6 +7400,10 @@ interface AVAssetExportSession { [Field ("AVAssetExportPreset3840x2160")] NSString Preset3840x2160 { get; } + [iOS (11, 0), Mac (10,13)] + [Field ("AVAssetExportPresetHEVC1920x1080")] + NSString PresetHevc1920x1080 { get; } + [Field ("AVAssetExportPresetAppleM4A")] NSString PresetAppleM4A { get; } @@ -6899,6 +7425,10 @@ interface AVAssetExportSession { [Async] void DetermineCompatibilityOfExportPreset (string presetName, AVAsset asset, [NullAllowed] string outputFileType, Action isCompatibleResult); + [Async] + [Wrap ("DetermineCompatibilityOfExportPreset (presetName, asset, outputFileType.GetConstant (), isCompatibleResult)")] + void DetermineCompatibilityOfExportPreset (string presetName, AVAsset asset, [NullAllowed] AVFileTypes outputFileType, Action isCompatibleResult); + [Since (6,0)] [Mavericks] [Export ("determineCompatibleFileTypesWithCompletionHandler:")] @@ -7338,6 +7868,33 @@ interface AVVideoCompositionCoreAnimationTool { AVVideoCompositionCoreAnimationTool FromComposedVideoFrames (CALayer [] videoLayers, CALayer inAnimationlayer); } + [TV (11,0), NoWatch, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVCameraCalibrationData + { + [Export ("intrinsicMatrix")] + NMatrix3 IntrinsicMatrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } + + [Export ("intrinsicMatrixReferenceDimensions")] + CGSize IntrinsicMatrixReferenceDimensions { get; } + + [Export ("extrinsicMatrix")] + NMatrix4x3 ExtrinsicMatrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } + + [Export ("pixelSize")] + float PixelSize { get; } + + [Export ("lensDistortionLookupTable")] + NSData LensDistortionLookupTable { get; } + + [Export ("inverseLensDistortionLookupTable")] + NSData InverseLensDistortionLookupTable { get; } + + [Export ("lensDistortionCenter")] + CGPoint LensDistortionCenter { get; } + } + [NoWatch] interface AVCaptureSessionRuntimeErrorEventArgs { [Export ("AVCaptureSessionErrorKey")] @@ -7612,11 +8169,11 @@ interface AVCaptureConnection { [Since (6,0)] [Export ("videoStabilizationEnabled")] - [Availability (Deprecated = Platform.iOS_8_0, Message="Starting with iOS 8, you should use ActiveVideoStabilizationMode instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message="Use 'ActiveVideoStabilizationMode' instead.")] bool VideoStabilizationEnabled { [Bind ("isVideoStabilizationEnabled")] get; } [Since (6,0)] - [Availability (Deprecated = Platform.iOS_8_0, Message="Starting with iOS 8, you should use PreferredVideoStabilizationMode instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message="Use 'PreferredVideoStabilizationMode' instead.")] [Export ("enablesVideoStabilizationWhenAvailable")] bool EnablesVideoStabilizationWhenAvailable { get; set; } @@ -7636,6 +8193,15 @@ interface AVCaptureConnection { [Export ("videoFieldMode")] AVVideoFieldMode VideoFieldMode { get; set; } #endif + + [iOS (11, 0), NoMac, TV (11, 0), NoWatch] + [Export ("cameraIntrinsicMatrixDeliverySupported")] + bool CameraIntrinsicMatrixDeliverySupported { [Bind ("isCameraIntrinsicMatrixDeliverySupported")] get; } + + [iOS (11, 0), NoMac, TV (11, 0), NoWatch] + [Export ("cameraIntrinsicMatrixDeliveryEnabled")] + bool CameraIntrinsicMatrixDeliveryEnabled { [Bind ("isCameraIntrinsicMatrixDeliveryEnabled")] get; set; } + } [NoWatch] @@ -7677,6 +8243,7 @@ interface AVCaptureInput { [NoTV] [Since (4,0)] [BaseType (typeof (NSObject))] + [DisableDefaultCtor] interface AVCaptureInputPort { [Export ("mediaType")] string MediaType { get; } @@ -7694,6 +8261,44 @@ interface AVCaptureInputPort { CMClock Clock { get; } } + interface IAVCaptureDepthDataOutputDelegate {} + + [NoWatch, NoTV, iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface AVCaptureDepthDataOutputDelegate + { + [Export ("depthDataOutput:didOutputDepthData:timestamp:connection:")] + void DidOutputDepthData (AVCaptureDepthDataOutput output, AVDepthData depthData, CMTime timestamp, AVCaptureConnection connection); + + [Export ("depthDataOutput:didDropDepthData:timestamp:connection:reason:")] + void DidDropDepthData (AVCaptureDepthDataOutput output, AVDepthData depthData, CMTime timestamp, AVCaptureConnection connection, AVCaptureOutputDataDroppedReason reason); + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(AVCaptureOutput))] + [DisableDefaultCtor] + interface AVCaptureDepthDataOutput + { + [Export ("setDelegate:callbackQueue:")] + void SetDelegate (IAVCaptureDepthDataOutputDelegate del, DispatchQueue callbackQueue); + + [Wrap ("WeakDelegate")] + IAVCaptureDepthDataOutputDelegate Delegate { get; } + + [NullAllowed, Export ("delegate")] + NSObject WeakDelegate { get; } + + [Export ("delegateCallbackQueue")] + DispatchQueue DelegateCallbackQueue { get; } + + [Export ("alwaysDiscardsLateDepthData")] + bool AlwaysDiscardsLateDepthData { get; set; } + + [Export ("filteringEnabled")] + bool FilteringEnabled { [Bind ("isFilteringEnabled")] get; set; } + } + [NoWatch] [NoTV] [Since (4,0)] @@ -7846,7 +8451,7 @@ interface AVCaptureScreenInput { bool CapturesCursor { get; set; } [Mac (10,8)] - [Availability (Deprecated=Platform.Mac_10_10, Message="Ignored since 10.10, if you want to get this behavior, use AVCaptureVideoDataOutput and compare the frame contents on your own code")] + [Availability (Deprecated=Platform.Mac_10_10, Message="Ignored since 10.10, if you want to get this behavior, use AVCaptureVideoDataOutput and compare the frame contents on your own code.")] [Export ("removesDuplicateFrames")] bool RemovesDuplicateFrames { get; set; } } @@ -7876,23 +8481,23 @@ interface AVCaptureVideoPreviewLayer { #if !MONOMAC [Export ("orientation")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use AVCaptureConnection.VideoOrientation instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'AVCaptureConnection.VideoOrientation' instead.")] AVCaptureVideoOrientation Orientation { get; set; } [Export ("automaticallyAdjustsMirroring")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use AVCaptureConnection.AutomaticallyAdjustsVideoMirroring instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'AVCaptureConnection.AutomaticallyAdjustsVideoMirroring' instead.")] bool AutomaticallyAdjustsMirroring { get; set; } [Export ("mirrored")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use AVCaptureConnection.VideoMirrored instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'AVCaptureConnection.VideoMirrored' instead.")] bool Mirrored { [Bind ("isMirrored")] get; set; } [Export ("isMirroringSupported")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use AVCaptureConnection.IsVideoMirroringSupported instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'AVCaptureConnection.IsVideoMirroringSupported' instead.")] bool MirroringSupported { get; } [Export ("isOrientationSupported")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use AVCaptureConnection.IsVideoOrientationSupported instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'AVCaptureConnection.IsVideoOrientationSupported' instead.")] bool OrientationSupported { get; } #endif @@ -7960,14 +8565,14 @@ interface AVCaptureVideoDataOutput { AVVideoSettingsCompressed CompressedVideoSetting { get; set; } [Export ("minFrameDuration")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_5_0, Message = "Use AVCaptureConnection.MinVideoFrameDuration instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_5_0, Message = "Use 'AVCaptureConnection.MinVideoFrameDuration' instead.")] CMTime MinFrameDuration { get; set; } [Export ("alwaysDiscardsLateVideoFrames")] bool AlwaysDiscardsLateVideoFrames { get; set; } #if !XAMARIN_4_0 - [Obsolete ("Use overload accepting a IAVCaptureVideoDataOutputSampleBufferDelegate")] + [Obsolete ("Use overload accepting a 'IAVCaptureVideoDataOutputSampleBufferDelegate'.")] [Export ("setSampleBufferDelegate:queue:")] [PostGet ("SampleBufferDelegate")] [PostGet ("SampleBufferCallbackQueue")] @@ -7995,6 +8600,20 @@ interface AVCaptureVideoDataOutput { [Export ("recommendedVideoSettingsForAssetWriterWithOutputFileType:")] NSDictionary GetRecommendedVideoSettingsForAssetWriter (string outputFileType); #endif + + [iOS (11,0), NoMac] + [Export ("availableVideoCodecTypesForAssetWriterWithOutputFileType:")] + string[] GetAvailableVideoCodecTypes (string outputFileType); + + [Internal] + [iOS (11,0), NoMac] + [Export ("recommendedVideoSettingsForVideoCodecType:assetWriterOutputFileType:")] + [return: NullAllowed] + NSDictionary GetWeakRecommendedVideoSettings (string videoCodecType, string outputFileType); + + [iOS (11,0), NoMac] + [Wrap ("new AVPlayerItemVideoOutputSettings (GetWeakRecommendedVideoSettings (videoCodecType, outputFileType))")] + AVPlayerItemVideoOutputSettings GetRecommendedVideoSettings (string videoCodecType, string outputFileType); } [NoWatch] @@ -8035,7 +8654,7 @@ interface AVCaptureAudioDataOutput { [Sealed] void SetSampleBufferDelegateQueue ([NullAllowed] IAVCaptureAudioDataOutputSampleBufferDelegate sampleBufferDelegate, [NullAllowed] DispatchQueue sampleBufferCallbackDispatchQueue); - [Obsolete ("Use overload accepting a IAVCaptureVideoDataOutputSampleBufferDelegate")] + [Obsolete ("Use overload accepting a 'IAVCaptureVideoDataOutputSampleBufferDelegate'.")] [Export ("setSampleBufferDelegate:queue:")] #if XAMCORE_2_0 void SetSampleBufferDelegateQueue ([NullAllowed] AVCaptureAudioDataOutputSampleBufferDelegate sampleBufferDelegate, [NullAllowed] DispatchQueue sampleBufferCallbackDispatchQueue); @@ -8368,12 +8987,18 @@ interface AVCapturePhotoCaptureDelegate [Export ("captureOutput:didCapturePhotoForResolvedSettings:")] void DidCapturePhoto (AVCapturePhotoOutput captureOutput, AVCaptureResolvedPhotoSettings resolvedSettings); + [Deprecated (PlatformName.iOS, 11,0, message: "Use the 'DidFinishProcessingPhoto' overload accepting a 'AVCapturePhoto' instead.")] [Export ("captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:")] void DidFinishProcessingPhoto (AVCapturePhotoOutput captureOutput, [NullAllowed] CMSampleBuffer photoSampleBuffer, [NullAllowed] CMSampleBuffer previewPhotoSampleBuffer, AVCaptureResolvedPhotoSettings resolvedSettings, [NullAllowed] AVCaptureBracketedStillImageSettings bracketSettings, [NullAllowed] NSError error); + [Deprecated (PlatformName.iOS, 11,0, message: "Use the 'DidFinishProcessingPhoto' overload accepting a 'AVCapturePhoto' instead.")] [Export ("captureOutput:didFinishProcessingRawPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:")] void DidFinishProcessingRawPhoto (AVCapturePhotoOutput captureOutput, [NullAllowed] CMSampleBuffer rawSampleBuffer, [NullAllowed] CMSampleBuffer previewPhotoSampleBuffer, AVCaptureResolvedPhotoSettings resolvedSettings, [NullAllowed] AVCaptureBracketedStillImageSettings bracketSettings, [NullAllowed] NSError error); + [iOS (11,0)] + [Export ("captureOutput:didFinishProcessingPhoto:error:")] + void DidFinishProcessingPhoto (AVCapturePhotoOutput output, AVCapturePhoto photo, [NullAllowed] NSError error); + [Export ("captureOutput:didFinishRecordingLivePhotoMovieForEventualFileAtURL:resolvedSettings:")] void DidFinishRecordingLivePhotoMovie (AVCapturePhotoOutput captureOutput, NSUrl outputFileUrl, AVCaptureResolvedPhotoSettings resolvedSettings); @@ -8502,7 +9127,7 @@ interface AVCaptureMovieFileOutput { [NoTV] [NoWatch] [Since (4,0)] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_10_0, Message = "Deprecated class, use AVCapturePhotoOutput instead.")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_10_0, Message = "Use 'AVCapturePhotoOutput' instead.")] [BaseType (typeof (AVCaptureOutput))] interface AVCaptureStillImageOutput { [Export ("availableImageDataCVPixelFormatTypes")] @@ -8596,8 +9221,8 @@ enum AVCaptureDeviceType { [Field ("AVCaptureDeviceTypeBuiltInTelephotoCamera")] BuiltInTelephotoCamera, - [Introduced (PlatformName.iOS, 10, 0, message: "Use BuiltInDualCamera instead")] - [Deprecated (PlatformName.iOS, 10, 2, message: "Use BuiltInDualCamera instead")] + [Introduced (PlatformName.iOS, 10, 0, message: "Use 'BuiltInDualCamera' instead.")] + [Deprecated (PlatformName.iOS, 10, 2, message: "Use 'BuiltInDualCamera' instead.")] [Field ("AVCaptureDeviceTypeBuiltInDuoCamera")] BuiltInDuoCamera, @@ -8625,11 +9250,11 @@ interface AVCaptureDevice { [Export ("connected")] bool Connected { [Bind ("isConnected")] get; } - [Deprecated (PlatformName.iOS, 10, 0, message: "Use AVCaptureDeviceDiscoverySession instead.")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'AVCaptureDeviceDiscoverySession' instead.")] [Static, Export ("devices")] AVCaptureDevice [] Devices { get; } - [Deprecated (PlatformName.iOS, 10, 0, message: "Use AVCaptureDeviceDiscoverySession instead.")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'AVCaptureDeviceDiscoverySession' instead.")] [Static] [Export ("devicesWithMediaType:")] AVCaptureDevice [] DevicesWithMediaType (string mediaType); @@ -8643,7 +9268,7 @@ interface AVCaptureDevice { AVCaptureDevice GetDefaultDevice (AVMediaTypes mediaType); #if !XAMCORE_4_0 - [Obsolete ("Use GetDefaultDevice(AVMediaTypes)")] + [Obsolete ("Use 'GetDefaultDevice (AVMediaTypes)'.")] [Static] [Wrap ("GetDefaultDevice ((NSString) mediaType)")] AVCaptureDevice DefaultDeviceWithMediaType (string mediaType); @@ -8668,11 +9293,11 @@ interface AVCaptureDevice { [Export ("supportsAVCaptureSessionPreset:")] bool SupportsAVCaptureSessionPreset (string preset); - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_10_0, Message="Deprecated property, use AVCapturePhotoSettings.FlashMode instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_10_0, Message="Use 'AVCapturePhotoSettings.FlashMode' instead.")] [Export ("flashMode")] AVCaptureFlashMode FlashMode { get; set; } - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_10_0, Message="Deprecated property, use AVCapturePhotoOutput.SupportedFlashModes instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_10_0, Message="Use 'AVCapturePhotoOutput.SupportedFlashModes' instead.")] [Export ("isFlashModeSupported:")] bool IsFlashModeSupported (AVCaptureFlashMode flashMode); @@ -8749,7 +9374,7 @@ interface AVCaptureDevice { [Export ("isFlashAvailable")] bool FlashAvailable { get; } - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_10_0, Message="Deprecated property, use AVCapturePhotoOutput.IsFlashScene instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_10_0, Message="Use 'AVCapturePhotoOutput.IsFlashScene' instead.")] [Since(5,0)] [Export ("isFlashActive")] bool FlashActive { get; } @@ -9073,7 +9698,7 @@ interface AVCaptureDeviceFormat { bool VideoBinned { [Bind ("isVideoBinned")] get; } [Export ("videoStabilizationSupported")] - [Availability (Deprecated = Platform.iOS_8_0, Message="Starting with iOS 8, you can use IsVideoStabilizationModeSupported(AVCaptureVideoStabilizationMode)")] + [Availability (Deprecated = Platform.iOS_8_0, Message="Use 'IsVideoStabilizationModeSupported (AVCaptureVideoStabilizationMode)' instead.")] bool VideoStabilizationSupported { [Bind ("isVideoStabilizationSupported")] get; } [Export ("videoMaxZoomFactor")] @@ -9206,15 +9831,15 @@ interface AVPlayer { #if !MONOMAC // 5.0 - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use AllowsExternalPlayback instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use 'AllowsExternalPlayback' instead.")] [Export ("allowsAirPlayVideo")] bool AllowsAirPlayVideo { get; set; } - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use ExternalPlaybackActive instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use 'ExternalPlaybackActive' instead.")] [Export ("airPlayVideoActive")] bool AirPlayVideoActive { [Bind ("isAirPlayVideoActive")] get; } - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use UsesExternalPlaybackWhileExternalScreenIsActive instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use 'UsesExternalPlaybackWhileExternalScreenIsActive' instead.")] [Export ("usesAirPlayVideoWhileAirPlayScreenIsActive")] bool UsesAirPlayVideoWhileAirPlayScreenIsActive { get; set; } #endif @@ -9832,6 +10457,10 @@ interface AVVideoColorPrimaries { [Field ("AVVideoColorPrimaries_P3_D65")] NSString P3_D65 { get; } + + [iOS (11,0), Mac (10,13), TV (11,0)] + [Field ("AVVideoColorPrimaries_ITU_R_2020")] + NSString Itu_R_2020 { get; } } [NoWatch] @@ -9862,6 +10491,10 @@ interface AVVideoYCbCrMatrix { [Field ("AVVideoYCbCrMatrix_SMPTE_240M_1995")] NSString Smpte_240M_1995 { get; } + [iOS (11, 0), TV (11, 0), Mac (10,13)] + [Field ("AVVideoYCbCrMatrix_ITU_R_2020")] + NSString Itu_R_2020 { get; } + } [NoWatch] @@ -10146,7 +10779,7 @@ interface AVPlayerItemErrorLog : NSCopying { [BaseType (typeof (NSObject))] [Since (4,3)] interface AVPlayerItemAccessLogEvent : NSCopying { - [Availability (Introduced = Platform.iOS_4_3 | Platform.Mac_10_7, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use NumberOfMediaRequests instead")] + [Availability (Introduced = Platform.iOS_4_3 | Platform.Mac_10_7, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use 'NumberOfMediaRequests' instead.")] [Export ("numberOfSegmentsDownloaded")] nint SegmentedDownloadedCount { get; } @@ -10367,12 +11000,12 @@ interface AVPlayerLooper [DesignatedInitializer] IntPtr Constructor (AVQueuePlayer player, AVPlayerItem itemToLoop, CMTimeRange loopRange); +#if !XAMCORE_4_0 // This API got introduced in Xcode 8.0 binding but is not currently present nor in Xcode 8.3 or Xcode 9.0 needs research + [PostSnippet ("loopingEnabled = false;")] +#endif [Export ("disableLooping")] void DisableLooping (); - [Export ("loopingEnabled")] - bool LoopingEnabled { [Bind ("isLoopingEnabled")] get; } - [Export ("loopCount")] nint LoopCount { get; } @@ -10482,6 +11115,10 @@ interface AVAudioSettings { [Field ("AVLinearPCMIsNonInterleaved")] NSString AVLinearPCMIsNonInterleaved { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Field ("AVAudioFileTypeKey")] + NSString FileTypeKey { get; } [Field ("AVEncoderAudioQualityKey")] NSString AVEncoderAudioQualityKey { get; } @@ -10763,6 +11400,49 @@ interface AVSpeechSynthesizerDelegate { void WillSpeakRangeOfSpeechString (AVSpeechSynthesizer synthesizer, NSRange characterRange, AVSpeechUtterance utterance); } + [NoWatch, NoTV, NoMac, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVAssetDownloadStorageManager + { + [Static] + [Export ("sharedDownloadStorageManager")] + AVAssetDownloadStorageManager SharedDownloadStorageManager { get; } + + [Export ("setStorageManagementPolicy:forURL:")] + void SetStorageManagementPolicy (AVAssetDownloadStorageManagementPolicy storageManagementPolicy, NSUrl downloadStorageUrl); + + [Export ("storageManagementPolicyForURL:")] + [return: NullAllowed] + AVAssetDownloadStorageManagementPolicy GetStorageManagementPolicy (NSUrl downloadStorageUrl); + } + + [NoWatch, NoTV, NoMac, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVAssetDownloadStorageManagementPolicy : NSCopying, NSMutableCopying + { + // Commented until rdar is fixed https://bugreport.apple.com/web/?problemID=34184435 + // [Export ("priority")] + // AVAssetDownloadedAssetEvictionPriority Priority { get; } + + [Export ("expirationDate", ArgumentSemantic.Copy)] + NSDate ExpirationDate { get; [NotImplemented] set; } + } + + [NoWatch, NoTV, NoMac, iOS (11,0)] + [BaseType (typeof(AVAssetDownloadStorageManagementPolicy))] + [DisableDefaultCtor] + interface AVMutableAssetDownloadStorageManagementPolicy + { + // Commented until rdar is fixed https://bugreport.apple.com/web/?problemID=34184435 + // [Export ("priority")] + // AVAssetDownloadedAssetEvictionPriority Priority { get; set; } + + [Export ("expirationDate", ArgumentSemantic.Copy)] + NSDate ExpirationDate { get; set; } + } + [NoWatch] [NoTV] [iOS (9,0)] @@ -10786,6 +11466,15 @@ interface AVAssetDownloadTask { } + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSUrlSessionTask))] + [DisableDefaultCtor] + interface AVAggregateAssetDownloadTask + { + [Export ("URLAsset")] + AVUrlAsset UrlAsset { get; } + } + [NoWatch] [Static, Internal] interface AVAssetDownloadTaskKeys { @@ -10816,7 +11505,7 @@ interface AVAssetDownloadUrlSession { [Export ("sessionWithConfiguration:assetDownloadDelegate:delegateQueue:")] AVAssetDownloadUrlSession CreateSession (NSUrlSessionConfiguration configuration, [NullAllowed] IAVAssetDownloadDelegate @delegate, [NullAllowed] NSOperationQueue delegateQueue); - [Availability (Introduced = Platform.iOS_9_0, Deprecated = Platform.iOS_10_0, Message="Deprecated method, please use GetAssetDownloadTask (AVUrlAsset, string, NSData, NSDictionary)")] + [Availability (Introduced = Platform.iOS_9_0, Deprecated = Platform.iOS_10_0, Message="Please use 'GetAssetDownloadTask (AVUrlAsset, string, NSData, NSDictionary)'.")] [Export ("assetDownloadTaskWithURLAsset:destinationURL:options:")] [return: NullAllowed] AVAssetDownloadTask GetAssetDownloadTask (AVUrlAsset urlAsset, NSUrl destinationUrl, [NullAllowed] NSDictionary options); @@ -10833,11 +11522,17 @@ interface AVAssetDownloadUrlSession { [Wrap ("GetAssetDownloadTask (urlAsset, title, artworkData, options != null ? options.Dictionary : null)")] AVAssetDownloadTask GetAssetDownloadTask (AVUrlAsset urlAsset, string title, [NullAllowed] NSData artworkData, AVAssetDownloadOptions options); + [NoMac, NoTV, NoWatch, iOS (11,0)] + [Export ("aggregateAssetDownloadTaskWithURLAsset:mediaSelections:assetTitle:assetArtworkData:options:")] + [return: NullAllowed] + AVAggregateAssetDownloadTask GetAssetDownloadTask (AVUrlAsset URLAsset, AVMediaSelection[] mediaSelections, string title, [NullAllowed] NSData artworkData, [NullAllowed] NSDictionary options); + } interface IAVAssetDownloadDelegate {} [NoTV] + [NoMac] [NoWatch] [iOS (9,0)] [Protocol, Model] @@ -10852,6 +11547,18 @@ interface AVAssetDownloadDelegate : NSUrlSessionTaskDelegate { [iOS (10,0)] [Export ("URLSession:assetDownloadTask:didFinishDownloadingToURL:")] void DidFinishDownloadingToUrl (NSUrlSession session, AVAssetDownloadTask assetDownloadTask, NSUrl location); + + [iOS (11,0)] + [Export ("URLSession:aggregateAssetDownloadTask:willDownloadToURL:")] + void WillDownloadToUrl (NSUrlSession session, AVAggregateAssetDownloadTask aggregateAssetDownloadTask, NSUrl location); + + [iOS (11,0)] + [Export ("URLSession:aggregateAssetDownloadTask:didCompleteForMediaSelection:")] + void DidCompleteForMediaSelection (NSUrlSession session, AVAggregateAssetDownloadTask aggregateAssetDownloadTask, AVMediaSelection mediaSelection); + + [iOS (11,0)] + [Export ("URLSession:aggregateAssetDownloadTask:didLoadTimeRange:totalTimeRangesLoaded:timeRangeExpectedToLoad:forMediaSelection:")] + void DidLoadTimeRange (NSUrlSession session, AVAggregateAssetDownloadTask aggregateAssetDownloadTask, CMTimeRange timeRange, NSValue[] loadedTimeRanges, CMTimeRange timeRangeExpectedToLoad, AVMediaSelection mediaSelection); } #endif @@ -10915,6 +11622,14 @@ interface AVOutputSettingsAssistant { [iOS (9,0), Mac (10,10)] [Internal, Field ("AVOutputSettingsPreset3840x2160")] NSString _Preset3840x2160 { get; } + + [iOS (11, 0), Mac (10, 13)] + [Internal, Field ("AVOutputSettingsPresetHEVC1920x1080")] + NSString _PresetHevc1920x1080 { get; } + + [iOS (11, 0), Mac (10, 13)] + [Internal, Field ("AVOutputSettingsPresetHEVC3840x2160")] + NSString _PresetHevc3840x2160 { get; } } [NoWatch] @@ -11293,6 +12008,10 @@ interface AVContentKeySessionDelegate [Export ("contentKeySessionContentProtectionSessionIdentifierDidChange:")] void DidChange (AVContentKeySession session); + + [NoWatch, NoTV, NoMac, iOS (11,0)] + [Export ("contentKeySession:didUpdatePersistableContentKey:forContentKeyIdentifier:")] + void DidUpdate (AVContentKeySession session, NSData persistableContentKey, NSObject keyIdentifier); } partial interface IAVContentKeyRecipient {} @@ -11309,6 +12028,12 @@ interface AVContentKeyRecipient { [DisableDefaultCtor] [BaseType (typeof (NSObject))] interface AVContentKeySession { + + [TV (11,0), NoWatch, Mac (10,13), iOS (11,0)] + [Static] + [Export ("contentKeySessionWithKeySystem:")] + AVContentKeySession Create (string keySystem); + [Static] [EditorBrowsable (EditorBrowsableState.Advanced)] [Export ("contentKeySessionWithKeySystem:storageDirectoryAtURL:")] @@ -11349,6 +12074,11 @@ interface AVContentKeySession { [Export ("renewExpiringResponseDataForContentKeyRequest:")] void RenewExpiringResponseData (AVContentKeyRequest contentKeyRequest); + [Async] + [NoWatch, NoTV, NoMac, iOS (11,0)] + [Export ("makeSecureTokenForExpirationDateOfPersistableContentKey:completionHandler:")] + void MakeSecureToken (NSData persistableContentKeyData, Action handler); + #region AVContentKeySession_AVContentKeySessionPendingExpiredSessionReports // binded because they are static and from a category. @@ -11439,6 +12169,74 @@ interface AVContentKeyResponse { [Static] [Export ("contentKeyResponseWithFairPlayStreamingKeyResponseData:")] AVContentKeyResponse Create (NSData fairPlayStreamingKeyResponseData); + + [TV (11,0), NoWatch, Mac (10,13), iOS (11,0)] + [Static] + [Export ("contentKeyResponseWithClearKeyData:initializationVector:")] + AVContentKeyResponse Create (NSData keyData, [NullAllowed] NSData initializationVector); + } + + [TV (11,0), NoWatch, Mac (10,13), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof(NSObject))] + interface AVRouteDetector { + [Notification] + [TV (11, 0), NoWatch, Mac (10, 13), iOS (11, 0)] + [Field ("AVRouteDetectorMultipleRoutesDetectedDidChangeNotification")] + NSString MultipleRoutesDetectedDidChange { get; } + + [Export ("routeDetectionEnabled")] + bool RouteDetectionEnabled { [Bind ("isRouteDetectionEnabled")] get; set; } + + [Export ("multipleRoutesDetected")] + bool MultipleRoutesDetected { get; } } + [NoTV, iOS (11,0), NoWatch, NoMac] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface AVCapturePhoto + { + [Export ("timestamp")] + CMTime Timestamp { get; } + + [Export ("rawPhoto")] + bool RawPhoto { [Bind ("isRawPhoto")] get; } + + [NullAllowed, Export ("pixelBuffer")] + CVPixelBuffer PixelBuffer { get; } + + [NullAllowed, Export ("previewPixelBuffer")] + CVPixelBuffer PreviewPixelBuffer { get; } + + [NullAllowed, Export ("embeddedThumbnailPhotoFormat")] + NSDictionary WeakEmbeddedThumbnailPhotoFormat { get; } + + [Wrap ("WeakEmbeddedThumbnailPhotoFormat")] + AVVideoSettingsCompressed EmbeddedThumbnailPhotoFormat { get; } + + [NullAllowed, Export ("depthData")] + AVDepthData DepthData { get; } + + [Export ("metadata")] + NSDictionary WeakMetadata { get; } + + [Wrap ("WeakMetadata")] + CoreGraphics.CGImageProperties Properties { get; } + + [NullAllowed, Export ("cameraCalibrationData")] + AVCameraCalibrationData CameraCalibrationData { get; } + + [Export ("resolvedSettings")] + AVCaptureResolvedPhotoSettings ResolvedSettings { get; } + + [Export ("photoCount")] + nint PhotoCount { get; } + + [NullAllowed, Export ("sourceDeviceType")] + NSString WeakSourceDeviceType { get; } + + [Wrap ("AVCaptureDeviceTypeExtensions.GetValue (WeakSourceDeviceType)")] + AVCaptureDeviceType SourceDeviceType { get; } + } } diff --git a/src/avkit.cs b/src/avkit.cs index 80f8e5a879d5..466cf96de3ac 100644 --- a/src/avkit.cs +++ b/src/avkit.cs @@ -124,6 +124,11 @@ interface AVPlayerViewController { [Export ("contentOverlayView")] UIView ContentOverlayView { get; } + [TV (11,0)] + [NoiOS] + [NullAllowed, Export ("unobscuredContentGuide")] + UILayoutGuide UnobscuredContentGuide { get; } + [NoTV] [iOS (9,0)] [Export ("allowsPictureInPicturePlayback")] @@ -134,6 +139,16 @@ interface AVPlayerViewController { [Export ("updatesNowPlayingInfoCenter")] bool UpdatesNowPlayingInfoCenter { get; set; } + [iOS (11,0)] + [NoTV] + [Export ("entersFullScreenWhenPlaybackBegins")] + bool EntersFullScreenWhenPlaybackBegins { get; set; } + + [iOS (11,0)] + [NoTV] + [Export ("exitsFullScreenWhenPlaybackEnds")] + bool ExitsFullScreenWhenPlaybackEnds { get; set; } + [Wrap ("WeakDelegate")] [NullAllowed] [Protocolize] @@ -175,6 +190,20 @@ interface AVPlayerViewController { [NoiOS, TV (10, 0), NoWatch, NoMac] [Export ("skipBackwardEnabled")] bool SkipBackwardEnabled { [Bind ("isSkipBackwardEnabled")] get; set; } + + // From AVPlayerViewControllerControls category + + [NoiOS, TV (11, 0), NoWatch, NoMac] + [Export ("playbackControlsIncludeTransportBar")] + bool PlaybackControlsIncludeTransportBar { get; set; } + + [NoiOS, TV (11, 0), NoWatch, NoMac] + [Export ("playbackControlsIncludeInfoViews")] + bool PlaybackControlsIncludeInfoViews { get; set; } + + [NoiOS, TV (11, 0), NoWatch, NoMac] + [Export ("customInfoViewController", ArgumentSemantic.Assign)] + UIViewController CustomInfoViewController { get; set; } } [Protocol, Model] @@ -214,6 +243,21 @@ interface AVPlayerViewControllerDelegate [Export ("playerViewController:didPresentInterstitialTimeRange:")] void DidPresentInterstitialTimeRange (AVPlayerViewController playerViewController, AVInterstitialTimeRange interstitial); + [NoiOS][NoMac] + [TV (11,0)] + [Export ("playerViewControllerShouldDismiss:")] + bool ShouldDismiss ([NullAllowed] AVPlayerViewController playerViewController); + + [NoiOS][NoMac] + [TV (11,0)] + [Export ("playerViewControllerWillBeginDismissalTransition:")] + void WillBeginDismissalTransition ([NullAllowed] AVPlayerViewController playerViewController); + + [NoiOS][NoMac] + [TV (11,0)] + [Export ("playerViewControllerDidEndDismissalTransition:")] + void DidEndDismissalTransition ([NullAllowed] AVPlayerViewController playerViewController); + [NoiOS][NoMac] [TV (9,0)] [Export ("playerViewController:willPresentInterstitialTimeRange:")] @@ -257,6 +301,21 @@ interface AVPlayerViewControllerDelegate [NoiOS, TV (10,0), NoWatch, NoMac] [Export ("playerViewController:didRejectContentProposal:")] void DidRejectContentProposal (AVPlayerViewController playerViewController, AVContentProposal proposal); + + [NoiOS, TV (11,0), NoWatch, NoMac] + [Export ("playerViewController:willTransitionToVisibilityOfTransportBar:withAnimationCoordinator:")] + void WillTransitionToVisibilityOfTransportBar ([NullAllowed] AVPlayerViewController playerViewController, bool visible, [NullAllowed] IAVPlayerViewControllerAnimationCoordinator coordinator); + } + + interface IAVPlayerViewControllerAnimationCoordinator { } + + [NoiOS, TV (11,0), NoWatch, NoMac] + [Protocol] + interface AVPlayerViewControllerAnimationCoordinator { + + [Abstract] + [Export ("addCoordinatedAnimations:completion:")] + void AddCoordinatedAnimations (Action animations, Action completion); } #else @@ -287,6 +346,10 @@ interface AVPlayerView { [Export ("contentOverlayView")] NSView ContentOverlayView { get; } + [Mac (10,13)] + [Export ("updatesNowPlayingInfoCenter")] + bool UpdatesNowPlayingInfoCenter { get; set; } + [Mac (10,9)] [Export ("actionPopUpButtonMenu")] NSMenu ActionPopUpButtonMenu { get; set; } @@ -388,7 +451,7 @@ interface AVNavigationMarkersGroup { } #if !MONOMAC - [NoiOS, TV (10,0), NoWatch, NoMac] + [NoiOS, TV (10,0), NoWatch] [BaseType (typeof(UIViewController))] interface AVContentProposalViewController { @@ -416,7 +479,7 @@ interface AVContentProposalViewController } [Static] - [NoiOS, TV (10,1), NoWatch, NoMac] + [NoiOS, TV (10,1), NoWatch] interface AVKitMetadataIdentifier { [Field ("AVKitMetadataIdentifierExternalContentIdentifier")] @@ -425,7 +488,66 @@ interface AVKitMetadataIdentifier { NSString ExternalUserProfileIdentifier { get; } [Field ("AVKitMetadataIdentifierPlaybackProgress")] NSString PlaybackProgress { get; } + + [TV (11,0)] + [Field ("AVKitMetadataIdentifierExactStartDate")] + NSString ExactStartDate { get; } + + [TV (11,0)] + [Field ("AVKitMetadataIdentifierApproximateStartDate")] + NSString ApproximateStartDate { get; } + + [TV (11,0)] + [Field ("AVKitMetadataIdentifierExactEndDate")] + NSString ExactEndDate { get; } + + [TV (11,0)] + [Field ("AVKitMetadataIdentifierApproximateEndDate")] + NSString ApproximateEndDate { get; } + + [TV (11,0)] + [Field ("AVKitMetadataIdentifierServiceIdentifier")] + NSString ServiceIdentifier { get; } + } + + [TV (11,0), iOS (11,0)] + [BaseType (typeof (UIView))] + interface AVRoutePickerView { + + [Export ("initWithFrame:")] + IntPtr Constructor (CGRect frame); + + [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] + IAVRoutePickerViewDelegate Delegate { get; set; } + + [Export ("activeTintColor", ArgumentSemantic.Assign), NullAllowed] + UIColor ActiveTintColor { get; set; } + + [NoiOS] + [Export ("routePickerButtonStyle", ArgumentSemantic.Assign)] + AVRoutePickerViewButtonStyle RoutePickerButtonStyle { get; set; } } + [TV (11,0), NoiOS] + [Native] + public enum AVRoutePickerViewButtonStyle : nint { + System, + Plain, + Custom, + } + + interface IAVRoutePickerViewDelegate { } + + [TV (11,0), iOS (11,0)] + [Protocol, Model] + [BaseType (typeof (NSObject))] + interface AVRoutePickerViewDelegate { + + [Export ("routePickerViewWillBeginPresentingRoutes:")] + void WillBeginPresentingRoutes (AVRoutePickerView routePickerView); + + [Export ("routePickerViewDidEndPresentingRoutes:")] + void DidEndPresentingRoutes (AVRoutePickerView routePickerView); + } #endif } diff --git a/src/callkit.cs b/src/callkit.cs index 1786e5a822a6..de2f4fcc8fe8 100644 --- a/src/callkit.cs +++ b/src/callkit.cs @@ -68,6 +68,8 @@ public enum CXErrorCodeCallDirectoryManagerError : nint { MaximumEntriesExceeded = 5, ExtensionDisabled = 6, CurrentlyLoading = 7, + [iOS (11,0)] + UnexpectedIncrementalRemoval = 8, } [Introduced (PlatformName.iOS, 10, 0)] @@ -199,6 +201,16 @@ interface CXCallController { [Async] [Export ("requestTransaction:completion:")] void RequestTransaction (CXTransaction transaction, Action completion); + + [iOS (11,0)] + [Async] + [Export ("requestTransactionWithActions:completion:")] + void RequestTransaction ([NullAllowed] CXAction[] actions, [NullAllowed] Action completion); + + [iOS (11,0)] + [Async] + [Export ("requestTransactionWithAction:completion:")] + void RequestTransaction ([NullAllowed] CXAction action, [NullAllowed] Action completion); } [Introduced (PlatformName.iOS, 10, 0)] @@ -217,6 +229,26 @@ interface CXCallDirectoryExtensionContext { [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] ICXCallDirectoryExtensionContextDelegate Delegate { get; set; } + + [iOS (11, 0)] + [Export ("incremental")] + bool Incremental { [Bind ("isIncremental")] get; } + + [iOS (11,0)] + [Export ("removeBlockingEntryWithPhoneNumber:")] + void RemoveBlockingEntry (/* CXCallDirectoryPhoneNumber -> int64_t */ long phoneNumber); + + [iOS (11,0)] + [Export ("removeAllBlockingEntries")] + void RemoveAllBlockingEntries (); + + [iOS (11,0)] + [Export ("removeIdentificationEntryWithPhoneNumber:")] + void RemoveIdentificationEntry (/* CXCallDirectoryPhoneNumber -> int64_t */ long phoneNumber); + + [iOS (11,0)] + [Export ("removeAllIdentificationEntries")] + void RemoveAllIdentificationEntries (); } interface ICXCallDirectoryExtensionContextDelegate {} @@ -442,12 +474,17 @@ interface CXProviderConfiguration : NSCopying { [Export ("maximumCallsPerCallGroup")] nuint MaximumCallsPerCallGroup { get; set; } + [iOS (11, 0)] + [Export ("includesCallsInRecents")] + bool IncludesCallsInRecents { get; set; } + [Export ("supportsVideo")] bool SupportsVideo { get; set; } [Export ("supportedHandleTypes", ArgumentSemantic.Copy)] NSSet SupportedHandleTypes { get; set; } + [DesignatedInitializer] [Export ("initWithLocalizedName:")] IntPtr Constructor (string localizedName); } @@ -461,7 +498,7 @@ interface CXSetGroupCallAction { [DesignatedInitializer] IntPtr Constructor (NSUuid callUuid, [NullAllowed] NSUuid callUuidToGroupWith); - [NullAllowed, Export ("callUUIDToGroupWith", ArgumentSemantic.Assign)] + [NullAllowed, Export ("callUUIDToGroupWith", ArgumentSemantic.Copy)] NSUuid CallUuidToGroupWith { get; set; } } diff --git a/src/clockkit.cs b/src/clockkit.cs index b9069d7d76a8..eddf43a053fc 100644 --- a/src/clockkit.cs +++ b/src/clockkit.cs @@ -53,16 +53,20 @@ interface CLKComplicationDataSource { [Export ("getTimelineEntriesForComplication:afterDate:limit:withHandler:")] void GetTimelineEntriesAfterDate (CLKComplication complication, NSDate afterDate, nuint limit, Action handler); + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'WKRefreshBackgroundTask' instead.")] [Export ("getNextRequestedUpdateDateWithHandler:")] void GetNextRequestedUpdateDate (Action handler); + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'WKRefreshBackgroundTask' instead.")] [Export ("requestedUpdateDidBegin")] void RequestedUpdateDidBegin (); + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'WKRefreshBackgroundTask' instead.")] [Export ("requestedUpdateBudgetExhausted")] void RequestedUpdateBudgetExhausted (); // this was @required in watchOS 2.x but is now deprecated and downgraded to @optional in watchOS 3 (betas) + [Deprecated (PlatformName.WatchOS, 3, 0, message: "Use 'GetLocalizableSampleTemplate' instead.")] [Export ("getPlaceholderTemplateForComplication:withHandler:")] void GetPlaceholderTemplate (CLKComplication complication, Action handler); diff --git a/src/cloudkit.cs b/src/cloudkit.cs index b89cf72d0958..83ee4a4cabc5 100644 --- a/src/cloudkit.cs +++ b/src/cloudkit.cs @@ -73,6 +73,10 @@ interface CKUserIdentity : NSSecureCoding, NSCopying [Export ("hasiCloudAccount")] bool HasICloudAccount { get; } + + [Watch (4, 0), NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [Export ("contactIdentifiers", ArgumentSemantic.Copy)] + string[] ContactIdentifiers { get; } } [iOS (10,0), Watch (3,0), TV (10,0), Mac (10,12, onlyOn64 : true)] @@ -178,7 +182,7 @@ interface CKShareParticipant : NSSecureCoding, NSCopying interface CKContainer { [NoWatch] - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use CurrentUserDefaultName instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'CurrentUserDefaultName' instead.")] [Field ("CKOwnerDefaultName")] NSString OwnerDefaultName { get; } @@ -236,7 +240,7 @@ interface CKContainer { [Async] void DiscoverAllIdentities (Action completionHandler); - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use DiscoverAllIdentities instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'DiscoverAllIdentities' instead.")] [NoWatch] [NoTV] [Export ("discoverAllContactUserInfosWithCompletionHandler:")] @@ -253,7 +257,7 @@ interface CKContainer { [Async] void DiscoverUserIdentityWithPhoneNumber (string phoneNumber, Action completionHandler); - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use DiscoverUserIdentityWithEmailAddress instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'DiscoverUserIdentityWithEmailAddress' instead.")] [NoWatch] [Export ("discoverUserInfoWithEmailAddress:completionHandler:")] [Async] @@ -264,7 +268,7 @@ interface CKContainer { [Async] void DiscoverUserIdentity (CKRecordID userRecordID, Action completionHandler); - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use DiscoverUserIdentity instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'DiscoverUserIdentity' instead.")] [NoWatch] [Export ("discoverUserInfoWithUserRecordID:completionHandler:")] [Async] @@ -395,7 +399,7 @@ interface CKDatabaseOperation { [NoWatch] [NoTV] - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use CKDiscoverAllUserIdentitiesOperation instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'CKDiscoverAllUserIdentitiesOperation' instead.")] [iOS (8,0), Mac (10,10, onlyOn64 : true)] [BaseType (typeof (CKOperation))] interface CKDiscoverAllContactsOperation { @@ -404,7 +408,7 @@ interface CKDiscoverAllContactsOperation { Action DiscoverAllContactsHandler { get; set; } } - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use CKUserIdentity instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'CKUserIdentity' instead.")] [iOS (8,0), Mac (10,10, onlyOn64 : true)] [NoWatch] [BaseType (typeof (NSObject))] @@ -413,11 +417,11 @@ interface CKDiscoveredUserInfo : NSCoding, NSCopying, NSSecureCoding { [Export ("userRecordID", ArgumentSemantic.Copy)] CKRecordID UserRecordId { get; } - [Availability (Introduced = Platform.Mac_10_10 | Platform.iOS_8_0, Deprecated = Platform.Mac_10_11 | Platform.iOS_9_0, Message = "Use DisplayContact.GivenName")] + [Availability (Introduced = Platform.Mac_10_10 | Platform.iOS_8_0, Deprecated = Platform.Mac_10_11 | Platform.iOS_9_0, Message = "Use 'DisplayContact.GivenName'.")] [Export ("firstName", ArgumentSemantic.Copy)] string FirstName { get; } - [Availability (Introduced = Platform.Mac_10_10 | Platform.iOS_8_0, Deprecated = Platform.Mac_10_11 | Platform.iOS_9_0, Message = "Use DisplayContact.FamilyName")] + [Availability (Introduced = Platform.Mac_10_10 | Platform.iOS_8_0, Deprecated = Platform.Mac_10_11 | Platform.iOS_9_0, Message = "Use 'DisplayContact.FamilyName'.")] [Export ("lastName", ArgumentSemantic.Copy)] string LastName { get; } @@ -435,7 +439,7 @@ interface CKDiscoveredUserInfo : NSCoding, NSCopying, NSSecureCoding { [iOS (8,0), Mac (10,10, onlyOn64 : true)] delegate void CKDiscoverUserInfosCompletionHandler (NSDictionary emailsToUserInfos, NSDictionary userRecordIdsToUserInfos, NSError operationError); - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use CKDiscoverUserIdentitiesOperation instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'CKDiscoverUserIdentitiesOperation' instead.")] [iOS (8,0), Mac (10,10, onlyOn64 : true)] [NoWatch] [BaseType (typeof (CKOperation))] @@ -489,6 +493,8 @@ interface CKErrorFields { [iOS (8,0), Watch (3,0), TV (10,0), Mac (10,10, onlyOn64 : true)] [BaseType (typeof (CKOperation))] + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0, + Message = "Use 'CKDatabaseSubscription', 'CKFetchDatabaseChangesOperation' and 'CKFetchRecordZoneChangesOperation' instead.")] interface CKFetchNotificationChangesOperation { [Export ("initWithPreviousServerChangeToken:")] IntPtr Constructor ([NullAllowed] CKServerChangeToken previousServerChangeToken); @@ -530,7 +536,7 @@ interface CKServerChangeToken : NSCopying, NSSecureCoding { [iOS (8,0), Mac (10,10, onlyOn64 : true)] delegate void CKFetchRecordChangesHandler (CKServerChangeToken serverChangeToken, NSData clientChangeTokenData, NSError operationError); - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use CKFetchRecordZoneChangesOperation instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'CKFetchRecordZoneChangesOperation' instead.")] [iOS (8,0), Mac (10,10, onlyOn64 : true)] [NoWatch] [BaseType (typeof (CKDatabaseOperation))] @@ -578,16 +584,16 @@ CKFetchRecordChangesHandler AllChangesReported { } } - [iOS (10,0), Watch (3,0), TV (10,0), Mac (12,10, onlyOn64 : true)] + [iOS (10,0), Watch (3,0), TV (10,0), Mac (10, 12, onlyOn64 : true)] delegate void CKFetchRecordZoneChangesWithIDWasDeletedHandler (CKRecordID recordID, NSString recordType); - [iOS (10,0), Watch (3,0), TV (10,0), Mac (12,10, onlyOn64 : true)] + [iOS (10,0), Watch (3,0), TV (10,0), Mac (10,12, onlyOn64 : true)] delegate void CKFetchRecordZoneChangesTokensUpdatedHandler (CKRecordZoneID recordZoneID, CKServerChangeToken serverChangeToken, NSData clientChangeTokenData); - [iOS (10,0), Watch (3,0), TV (10,0), Mac (12,10, onlyOn64 : true)] + [iOS (10,0), Watch (3,0), TV (10,0), Mac (10,12, onlyOn64 : true)] delegate void CKFetchRecordZoneChangesFetchCompletedHandler (CKRecordZoneID recordZoneID, CKServerChangeToken serverChangeToken, NSData clientChangeTokenData, bool moreComing, NSError recordZoneError); - [iOS (10,0), Watch (3,0), TV (10,0), Mac (12,10, onlyOn64 : true)] + [iOS (10,0), Watch (3,0), TV (10,0), Mac (10,12, onlyOn64 : true)] [BaseType (typeof(CKDatabaseOperation))] interface CKFetchRecordZoneChangesOperation { @@ -622,7 +628,7 @@ interface CKFetchRecordZoneChangesOperation [iOS (10,0), Watch (3,0), TV (10,0), Mac (10,12, onlyOn64 : true)] [BaseType (typeof(NSObject))] - interface CKFetchRecordZoneChangesOptions : NSSecureCoding + interface CKFetchRecordZoneChangesOptions : NSSecureCoding, NSCopying { [NullAllowed, Export ("previousServerChangeToken", ArgumentSemantic.Copy)] CKServerChangeToken PreviousServerChangeToken { get; set; } @@ -758,6 +764,8 @@ interface CKLocationSortDescriptor : NSSecureCoding { [iOS (8,0), Mac (10,10, onlyOn64 : true)] [BaseType (typeof (CKOperation))] [DisableDefaultCtor] // NSInvalidArgumentException Reason: You must call -[CKMarkNotificationsReadOperation initWithNotificationIDsToMarkRead:] + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0, + Message = "Use 'CKDatabaseSubscription', 'CKFetchDatabaseChangesOperation' and 'CKFetchRecordZoneChangesOperation' instead.")] interface CKMarkNotificationsReadOperation { [DesignatedInitializer] @@ -778,6 +786,7 @@ CKMarkNotificationsReadHandler Completed { [iOS (8,0), Watch (3,0), TV (10,0), Mac (10,10, onlyOn64 : true)] [DisableDefaultCtor] // does not work on watchOS, working stub provided to ease source compatibility [BaseType (typeof (CKOperation))] + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0)] interface CKModifyBadgeOperation { [Export ("initWithBadgeValue:")] @@ -794,7 +803,7 @@ Action Completed { } } - [iOS (8,0), Mac (10,10, onlyOn64 : true)] + [iOS (8,0), Mac (10,10, onlyOn64 : true), Watch (3,0)] delegate void CKModifyRecordsOperationHandler (CKRecord [] savedRecords, CKRecordID [] deletedRecordIds, NSError operationError); [iOS (8,0), Watch (3,0), TV (10,0), Mac (10,10, onlyOn64 : true)] @@ -968,6 +977,30 @@ interface CKNotification : NSSecureCoding { [iOS (9,0)][Mac (10,11)] [NullAllowed, Export ("category")] string Category { get; } + + [Watch (4, 0), NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("title")] + string Title { get; } + + [Watch (4, 0), NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("titleLocalizationKey")] + string TitleLocalizationKey { get; } + + [Watch (4, 0), NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("titleLocalizationArgs", ArgumentSemantic.Copy)] + string[] TitleLocalizationArgs { get; } + + [Watch (4, 0), NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("subtitle")] + string Subtitle { get; } + + [Watch (4, 0), NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("subtitleLocalizationKey")] + string SubtitleLocalizationKey { get; } + + [Watch (4, 0), NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("subtitleLocalizationArgs", ArgumentSemantic.Copy)] + string[] SubtitleLocalizationArgs { get; } } [Watch (3,0)] @@ -989,7 +1022,7 @@ interface CKQueryNotification : NSCoding, NSSecureCoding { [NullAllowed, Export ("recordID", ArgumentSemantic.Copy)] CKRecordID RecordId { get; } - [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use DatabaseScope instead")] + [Availability (Introduced = Platform.iOS_8_0 | Platform.Mac_10_10 , Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12, Message = "Use 'DatabaseScope' instead.")] [Export ("isPublicDatabase", ArgumentSemantic.UnsafeUnretained)] bool IsPublicDatabase { get; } @@ -1021,6 +1054,28 @@ interface CKDatabaseNotification CKDatabaseScope DatabaseScope { get; } } + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64 : true), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface CKOperationConfiguration : NSSecureCoding, NSCopying { + [NullAllowed, Export ("container", ArgumentSemantic.Strong)] + CKContainer Container { get; set; } + + [Export ("qualityOfService", ArgumentSemantic.Assign)] + NSQualityOfService QualityOfService { get; set; } + + [Export ("allowsCellularAccess")] + bool AllowsCellularAccess { get; set; } + + [Export ("longLived")] + bool LongLived { [Bind ("isLongLived")] get; set; } + + [Export ("timeoutIntervalForRequest")] + double TimeoutIntervalForRequest { get; set; } + + [Export ("timeoutIntervalForResource")] + double TimeoutIntervalForResource { get; set; } + } + [Watch (3,0)] [iOS (8,0), Mac (10,10, onlyOn64 : true)] [BaseType (typeof (NSOperation))] @@ -1035,15 +1090,19 @@ interface CKOperation { // [Export ("activityStart")] // ulong ActivityStart (); + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0, + Message = "Use 'CKOperationConfiguration' instead.")] [NullAllowed, Export ("container", ArgumentSemantic.Retain)] CKContainer Container { get; set; } [NoWatch] - [Deprecated (PlatformName.iOS, 9,0, message: "Use QualityOfService property")] - [Deprecated (PlatformName.MacOSX, 10,11, message: "Use QualityOfService property")] + [Deprecated (PlatformName.iOS, 9,0, message: "Use 'QualityOfService' property.")] + [Deprecated (PlatformName.MacOSX, 10,11, message: "Use 'QualityOfService' property.")] [Export ("usesBackgroundSession", ArgumentSemantic.UnsafeUnretained)] bool UsesBackgroundSession { get; set; } + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0, + Message = "Use 'CKOperationConfiguration' instead.")] [Export ("allowsCellularAccess", ArgumentSemantic.UnsafeUnretained)] bool AllowsCellularAccess { get; set; } @@ -1055,14 +1114,20 @@ interface CKOperation { [iOS (9,3)][Mac (10,11,4)] [TV (9,2)] [Export ("longLived")] + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0, + Message = "Use 'CKOperationConfiguration' instead.")] bool LongLived { [Bind ("isLongLived")] get; set; } [iOS (10,0), TV (10,0), Mac (10,12, onlyOn64 : true)] [Export ("timeoutIntervalForRequest")] + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0, + Message = "Use 'CKOperationConfiguration' instead.")] double TimeoutIntervalForRequest { get; set; } [iOS (10,0), TV (10,0), Mac (10,12, onlyOn64 : true)] [Export ("timeoutIntervalForResource")] + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13 | Platform.Watch_4_0 | Platform.TV_11_0, + Message = "Use 'CKOperationConfiguration' instead.")] double TimeoutIntervalForResource { get; set; } [iOS (9,3)][Mac (10,11,4)] @@ -1070,6 +1135,38 @@ interface CKOperation { [NullAllowed] [Export ("longLivedOperationWasPersistedBlock", ArgumentSemantic.Strong)] Action LongLivedOperationWasPersistedCallback { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [Export ("configuration", ArgumentSemantic.Copy)] + CKOperationConfiguration Configuration { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("group", ArgumentSemantic.Strong)] + CKOperationGroup Group { get; set; } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64 : true), iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface CKOperationGroup : NSSecureCoding { + + [Export ("operationGroupID")] + string OperationGroupId { get; } + + [Export ("defaultConfiguration", ArgumentSemantic.Copy)] + CKOperationConfiguration DefaultConfiguration { get; set; } + + [NullAllowed, Export ("name")] + string Name { get; set; } + + [Export ("quantity")] + nuint Quantity { get; set; } + + [Export ("expectedSendSize", ArgumentSemantic.Assign)] + CKOperationGroupTransferSize ExpectedSendSize { get; set; } + + [Export ("expectedReceiveSize", ArgumentSemantic.Assign)] + CKOperationGroupTransferSize ExpectedReceiveSize { get; set; } } [Watch (3,0)] @@ -1187,7 +1284,7 @@ interface CKRecord : NSSecureCoding, NSCopying { #if XAMCORE_2_0 CKRecordID Id { get; } #else - [Obsolete ("Use Id instead")] + [Obsolete ("Use 'Id' instead.")] CKRecordID RecordId { get; } #endif @@ -1400,24 +1497,24 @@ interface CKDatabaseSubscription : NSSecureCoding, NSCopying [BaseType (typeof (NSObject))] interface CKSubscription : NSSecureCoding, NSCopying { - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKQuerySubscription")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKQuerySubscription")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKQuerySubscription'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKQuerySubscription'.")] [Export ("initWithRecordType:predicate:options:")] IntPtr Constructor (string recordType, NSPredicate predicate, CKSubscriptionOptions subscriptionOptions); - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKQuerySubscription")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKQuerySubscription")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKQuerySubscription'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKQuerySubscription'.")] [DesignatedInitializer] [Export ("initWithRecordType:predicate:subscriptionID:options:")] IntPtr Constructor (string recordType, NSPredicate predicate, string subscriptionId, CKSubscriptionOptions subscriptionOptions); - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKRecordZoneSubscription")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKRecordZoneSubscription")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKRecordZoneSubscription'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKRecordZoneSubscription'.")] [Export ("initWithZoneID:options:")] IntPtr Constructor (CKRecordZoneID zoneId, CKSubscriptionOptions subscriptionOptions); - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKRecordZoneSubscription")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKRecordZoneSubscription")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKRecordZoneSubscription'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKRecordZoneSubscription'.")] [DesignatedInitializer] [Export ("initWithZoneID:subscriptionID:options:")] IntPtr Constructor (CKRecordZoneID zoneId, string subscriptionId, CKSubscriptionOptions subscriptionOptions); @@ -1428,18 +1525,18 @@ interface CKSubscription : NSSecureCoding, NSCopying { [Export ("subscriptionType", ArgumentSemantic.UnsafeUnretained)] CKSubscriptionType SubscriptionType { get; } - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKQuerySubscription")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKQuerySubscription")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKQuerySubscription'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKQuerySubscription'.")] [Export ("recordType")] string RecordType { get; } - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKQuerySubscription")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKQuerySubscription")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKQuerySubscription'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKQuerySubscription'.")] [Export ("predicate", ArgumentSemantic.Copy)] NSPredicate Predicate { get; } - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKQuerySubscriptionOptions")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKQuerySubscriptionOptions")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKQuerySubscriptionOptions'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKQuerySubscriptionOptions'.")] [Export ("subscriptionOptions", ArgumentSemantic.UnsafeUnretained)] CKSubscriptionOptions SubscriptionOptions { get; } @@ -1447,8 +1544,8 @@ interface CKSubscription : NSSecureCoding, NSCopying { [Export ("notificationInfo", ArgumentSemantic.Copy)] CKNotificationInfo NotificationInfo { get; set; } - [Deprecated (PlatformName.iOS, 10,0, message: "Use CKRecordZoneSubscription")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use CKRecordZoneSubscription")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'CKRecordZoneSubscription'.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'CKRecordZoneSubscription'.")] [Export ("zoneID", ArgumentSemantic.Copy)] CKRecordZoneID ZoneID { get; set; } } @@ -1503,6 +1600,38 @@ interface CKNotificationInfo : NSSecureCoding, NSCopying, NSCoding { [iOS (9,0)][Mac (10,11)] [NullAllowed, Export ("category")] string Category { get; set; } + + [NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("title")] + string Title { get; set; } + + [NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("titleLocalizationKey")] + string TitleLocalizationKey { get; set; } + + [NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("titleLocalizationArgs", ArgumentSemantic.Copy)] + string[] TitleLocalizationArgs { get; set; } + + [NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("subtitle")] + string Subtitle { get; set; } + + [NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("subtitleLocalizationKey")] + string SubtitleLocalizationKey { get; set; } + + [NoTV, Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("subtitleLocalizationArgs", ArgumentSemantic.Copy)] + string[] SubtitleLocalizationArgs { get; set; } + + [Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [Export ("shouldSendMutableContent")] + bool ShouldSendMutableContent { get; set; } + + [Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("collapseIDKey")] + string CollapseIdKey { get; set; } } [Watch (3,0)] @@ -1656,6 +1785,10 @@ interface CKFetchDatabaseChangesOperation [NullAllowed, Export ("changeTokenUpdatedBlock", ArgumentSemantic.Copy)] Action ChangeTokenUpdated { get; set; } + [Watch (4, 0), TV (11, 0), Mac (10, 13, onlyOn64 : true), iOS (11, 0)] + [NullAllowed, Export ("recordZoneWithIDWasPurgedBlock", ArgumentSemantic.Copy)] + Action WasPurged { get; set; } + [NullAllowed, Export ("fetchDatabaseChangesCompletionBlock", ArgumentSemantic.Copy)] CKFetchDatabaseChangesCompletionHandler ChangesCompleted { get; set; } } diff --git a/src/contacts.cs b/src/contacts.cs index ff267e4dde82..a669dd101e8e 100644 --- a/src/contacts.cs +++ b/src/contacts.cs @@ -12,6 +12,7 @@ using XamCore.ObjCRuntime; using XamCore.Foundation; + namespace XamCore.Contacts { #if XAMCORE_2_0 // The Contacts framework uses generics heavily, which is only supported in Unified (for now at least) @@ -26,7 +27,7 @@ interface CNKeyDescriptor : NSObjectProtocol, NSSecureCoding, NSCopying { [iOS (9,0), Mac (10,11, onlyOn64: true)] [BaseType (typeof (NSObject))] - interface CNContact : NSCopying, NSMutableCopying, NSSecureCoding { + interface CNContact : NSCopying, NSMutableCopying, NSSecureCoding, NSItemProviderReading, NSItemProviderWriting { [Export ("identifier")] string Identifier { get; } @@ -420,6 +421,14 @@ interface CNLabelContactRelationKey { [Field ("CNLabelContactRelationManager")] NSString Manager { get; } + + [iOS (11,0), Mac (10,13, onlyOn64: true)] + [Field ("CNLabelContactRelationSon")] + NSString Son { get; } + + [iOS (11,0), Mac (10,13, onlyOn64: true)] + [Field ("CNLabelContactRelationDaughter")] + NSString Daughter { get; } } delegate void CNContactStoreRequestAccessHandler (bool granted, NSError error); @@ -454,7 +463,7 @@ interface CNContactStore { NSObject GetUnifiedMeContact (NSArray keys, out NSError error); #if !XAMCORE_4_0 && !WATCH - [Obsolete ("Use the overload that takes CNContactStoreListContactsHandler instead")] + [Obsolete ("Use the overload that takes 'CNContactStoreListContactsHandler' instead.")] [Export ("enumerateContactsWithFetchRequest:error:usingBlock:")] bool EnumerateContacts (CNContactFetchRequest fetchRequest, out NSError error, CNContactStoreEnumerateContactsHandler handler); @@ -475,6 +484,7 @@ interface CNContactStore { #endif [Export ("defaultContainerIdentifier")] + [NullAllowed] string DefaultContainerIdentifier { get; } [Notification] @@ -521,17 +531,17 @@ interface CNContactVCardSerialization { [BaseType (typeof (CNContainer))] interface CNContainer_PredicatesExtension { - [Obsolete ("Use CNContainer.CreatePredicateForContainers instead")] + [Obsolete ("Use 'CNContainer.CreatePredicateForContainers' instead.")] [Static] [Export ("predicateForContainersWithIdentifiers:")] NSPredicate GetPredicateForContainers (string [] identifiers); - [Obsolete ("Use CNContainer.CreatePredicateForContainerOfContact instead")] + [Obsolete ("Use 'CNContainer.CreatePredicateForContainerOfContact' instead.")] [Static] [Export ("predicateForContainerOfContactWithIdentifier:")] NSPredicate GetPredicateForContainerOfContact (string contactIdentifier); - [Obsolete ("Use CNContainer.CreatePredicateForContainerOfGroup instead")] + [Obsolete ("Use 'CNContainer.CreatePredicateForContainerOfGroup' instead.")] [Static] [Export ("predicateForContainerOfGroupWithIdentifier:")] NSPredicate GetPredicateForContainerOfGroup (string groupIdentifier); @@ -617,18 +627,18 @@ interface CNErrorUserInfoKey { [BaseType (typeof (CNGroup))] interface CNGroup_PredicatesExtension { - [Obsolete ("Use CNGroup.CreatePredicateForGroups instead")] + [Obsolete ("Use 'CNGroup.CreatePredicateForGroups' instead.")] [Static] [Export ("predicateForGroupsWithIdentifiers:")] NSPredicate GetPredicateForGroups (string [] identifiers); - [Obsolete ("Use CNGroup.CreatePredicateForSubgroupsInGroup instead")] + [Obsolete ("Use 'CNGroup.CreatePredicateForSubgroupsInGroup' instead.")] [NoiOS][NoWatch] [Static] [Export ("predicateForSubgroupsInGroupWithIdentifier:")] NSPredicate GetPredicateForSubgroupsInGroup (string parentGroupIdentifier); - [Obsolete ("Use CNGroup.CreatePredicateForGroupsInContainer instead")] + [Obsolete ("Use 'CNGroup.CreatePredicateForGroupsInContainer' instead.")] [Static] [Export ("predicateForGroupsInContainerWithIdentifier:")] NSPredicate GetPredicateForGroupsInContainer (string containerIdentifier); @@ -988,15 +998,13 @@ interface CNMutablePostalAddress { [DisableDefaultCtor] // Apple doc: no handle (nil) if no string (or nil string) is given interface CNPhoneNumber : NSCopying, NSSecureCoding, INSCopying, INSSecureCoding { - // @required + (instancetype)phoneNumberWithStringValue:(NSString *)stringValue; [Static, Export ("phoneNumberWithStringValue:")] + [return: NullAllowed] CNPhoneNumber PhoneNumberWithStringValue (string stringValue); - // @required - (instancetype)initWithStringValue:(NSString *)string; [Export ("initWithStringValue:")] IntPtr Constructor (string stringValue); - // @property (readonly, copy, nonatomic) NSString * stringValue; [Export ("stringValue")] string StringValue { get; } } @@ -1061,8 +1069,13 @@ interface CNPostalAddress : NSCopying, NSMutableCopying, NSSecureCoding, INSCopy [Static] [Export ("localizedStringForKey:")] string LocalizeProperty (NSString property); + + [Static] + [Wrap ("LocalizeProperty (option.GetConstant ())")] + string LocalizeProperty (CNPostalAddressKeyOption option); } +#if !XAMCORE_4_0 [iOS (9,0), Mac (10,11, onlyOn64: true)] [Static] [EditorBrowsable (EditorBrowsableState.Advanced)] @@ -1094,6 +1107,31 @@ interface CNPostalAddressKey { // Can be used in KVO [Field ("CNPostalAddressISOCountryCodeKey")] NSString IsoCountryCode { get; } } +#endif + + [iOS (9,0), Mac (10,11, onlyOn64: true)] + public enum CNPostalAddressKeyOption { + [Field ("CNPostalAddressStreetKey")] + Street, + [Field ("CNPostalAddressCityKey")] + City, + [Field ("CNPostalAddressStateKey")] + State, + [Field ("CNPostalAddressPostalCodeKey")] + PostalCode, + [Field ("CNPostalAddressCountryKey")] + Country, + [Field ("CNPostalAddressISOCountryCodeKey")] + IsoCountryCode, + + [iOS (10,3)] [Mac (10,12,4, onlyOn64: true)] + [Field ("CNPostalAddressSubLocalityKey")] + SubLocality, + + [iOS (10,3)] [Mac (10,12,4, onlyOn64: true)] + [Field ("CNPostalAddressSubAdministrativeAreaKey")] + SubAdministrativeArea, + } [iOS (9,0), Mac (10,11, onlyOn64: true)] [BaseType (typeof (NSFormatter))] @@ -1182,9 +1220,14 @@ interface CNSocialProfile : NSCopying, NSSecureCoding, INSCopying, INSSecureCodi IntPtr Constructor ([NullAllowed] string url, [NullAllowed] string username, [NullAllowed] string userIdentifier, [NullAllowed] string service); [Static] + [EditorBrowsable (EditorBrowsableState.Advanced)] [Export ("localizedStringForKey:")] string LocalizeProperty (NSString key); + [Static] + [Wrap ("LocalizeProperty (key.GetConstant ())")] + string LocalizeProperty (CNPostalAddressKeyOption key); + [Static] [Export ("localizedStringForService:")] string LocalizeService (NSString service); diff --git a/src/coreanimation.cs b/src/coreanimation.cs index 28b994574937..7f5adc3092de 100644 --- a/src/coreanimation.cs +++ b/src/coreanimation.cs @@ -114,7 +114,7 @@ interface CAConstraintLayoutManager : NSCoding { } [BaseType (typeof (NSObject))] - interface CAConstraint : NSCoding { + interface CAConstraint : NSSecureCoding { [Export ("attribute")] CAConstraintAttribute Attribute { get; } @@ -170,9 +170,9 @@ interface CADisplayLink { [Export ("paused")] bool Paused { [Bind ("isPaused")] get; set; } - [Deprecated (PlatformName.iOS, 10,0, message: "Use PreferredFramesPerSecond property")] - [Deprecated (PlatformName.TvOS, 10,0, message: "Use PreferredFramesPerSecond property")] - [Deprecated (PlatformName.WatchOS, 3,0, message: "Use PreferredFramesPerSecond property")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'PreferredFramesPerSecond' property.")] + [Deprecated (PlatformName.TvOS, 10,0, message: "Use 'PreferredFramesPerSecond' property.")] + [Deprecated (PlatformName.WatchOS, 3,0, message: "Use 'PreferredFramesPerSecond' property.")] [Export ("frameInterval")] nint FrameInterval { get; set; } @@ -201,7 +201,7 @@ enum CAContentsFormat { [BaseType (typeof (NSObject))] [Dispose ("OnDispose ();")] - interface CALayer : CAMediaTiming, NSCoding { + interface CALayer : CAMediaTiming, NSSecureCoding { [Export ("layer")][Static] CALayer Create (); @@ -587,6 +587,11 @@ interface CALayer : CAMediaTiming, NSCoding { [NullAllowed] // by default this property is null [Export ("compositingFilter", ArgumentSemantic.Strong)] NSObject CompositingFilter { get; set; } + + [NoWatch] // headers not updated + [TV (11,0)][Mac (10,13)][iOS (11,0)] + [Export ("maskedCorners", ArgumentSemantic.Assign)] + CACornerMask MaskedCorners { get; set; } } #if XAMCORE_2_0 || !MONOMAC @@ -628,6 +633,16 @@ interface CAMetalLayer { [Export ("presentsWithTransaction")] bool PresentsWithTransaction { [Bind ("presentsWithTransaction")] get; set; } + + [NoWatch][NoTV][NoiOS] + [Mac (10,13)] + [Export ("displaySyncEnabled")] + bool DisplaySyncEnabled { get; set; } + + [NoWatch] // headers not updated + [TV (11,0)][Mac (10,13)][iOS (11,0)] + [Export ("allowsNextDrawableTimeout")] + bool AllowsNextDrawableTimeout { get; set; } } #endif @@ -912,7 +927,7 @@ interface CAAction { } [BaseType (typeof (NSObject), Delegates=new string [] {"WeakDelegate"}, Events=new Type [] { typeof (CAAnimationDelegate)})] - interface CAAnimation : CAAction, CAMediaTiming, NSCoding, NSMutableCopying { + interface CAAnimation : CAAction, CAMediaTiming, NSSecureCoding, NSMutableCopying { [Export ("animation"), Static] CAAnimation CreateAnimation (); @@ -998,15 +1013,15 @@ interface CAAnimation : CAAction, CAMediaTiming, NSCoding, NSMutableCopying { NSString RotateModeAutoReverse { get; } #region SceneKitAdditions - [iOS (8,0)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Export ("usesSceneTimeBase")] bool UsesSceneTimeBase { get; set; } - [iOS (8,0)][Mac (10,9)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Export ("fadeInDuration")] nfloat FadeInDuration { get; set; } - [iOS (8,0)][Mac (10,9)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Export ("fadeOutDuration")] nfloat FadeOutDuration { get; set; } @@ -1309,7 +1324,7 @@ interface CAGradientLayer { [BaseType (typeof (NSObject))] [DisableDefaultCtor] - interface CAMediaTimingFunction : NSCoding { + interface CAMediaTimingFunction : NSSecureCoding { [Export ("functionWithName:")][Static] CAMediaTimingFunction FromName (NSString name); @@ -1340,7 +1355,7 @@ interface CAMediaTimingFunction : NSCoding { } [BaseType (typeof (NSObject))] - interface CAValueFunction : NSCoding { + interface CAValueFunction : NSSecureCoding { [Export ("functionWithName:"), Static] CAValueFunction FromName (string name); @@ -1414,7 +1429,7 @@ interface CAOpenGLLayer { [Since (5,0)] [BaseType (typeof (NSObject))] - interface CAEmitterCell : CAMediaTiming, NSCoding { + interface CAEmitterCell : CAMediaTiming, NSSecureCoding { [NullAllowed] // by default this property is null [Export ("name", ArgumentSemantic.Copy)] string Name { get; set; } @@ -1645,7 +1660,7 @@ interface CAEmitterLayer { [Since(7,0), Mavericks] [BaseType (typeof (NSObject))] - interface CAEmitterBehavior : NSCoding { + interface CAEmitterBehavior : NSSecureCoding { [Export ("initWithType:")] IntPtr Constructor (NSString type); diff --git a/src/coreaudiokit.cs b/src/coreaudiokit.cs index 7f0a95e8b694..4c11fce972ac 100644 --- a/src/coreaudiokit.cs +++ b/src/coreaudiokit.cs @@ -33,6 +33,33 @@ interface AUViewController : NSExtensionRequestHandling { [PostGet ("NibBundle")] IntPtr Constructor ([NullAllowed] string nibName, [NullAllowed] NSBundle bundle); } + + [iOS (11,0)][Mac (10,13, onlyOn64: true)] + [BaseType (typeof (NSObject))] + interface AUAudioUnitViewConfiguration : NSSecureCoding { + [Export ("initWithWidth:height:hostHasController:")] + IntPtr Constructor (nfloat width, nfloat height, bool hostHasController); + + [Export ("width")] + nfloat Width { get; } + + [Export ("height")] + nfloat Height { get; } + + [Export ("hostHasController")] + bool HostHasController { get; } + } + + [Category] + [iOS (11,0)][Mac (10,13, onlyOn64: true)] + [BaseType (typeof (AUAudioUnit))] + interface AUAudioUnitViewControllerExtensions { + [Export ("supportedViewConfigurations:")] + NSIndexSet GetSupportedViewConfigurations (AUAudioUnitViewConfiguration [] availableViewConfigurations); + + [Export ("selectViewConfiguration:")] + void SelectViewConfiguration (AUAudioUnitViewConfiguration viewConfiguration); + } #endif #if !MONOMAC diff --git a/src/corebluetooth.cs b/src/corebluetooth.cs index 87edad0dea8b..ec9d2b2dce73 100644 --- a/src/corebluetooth.cs +++ b/src/corebluetooth.cs @@ -14,15 +14,16 @@ namespace XamCore.CoreBluetooth { -#if !MONOMAC + [Watch (4,0)] [iOS (8,0)] + [Mac (10,13)] [BaseType (typeof (NSObject))] interface CBAttribute { [Export ("UUID")] CBUUID UUID { get; [NotImplemented] set; } } -#endif + [Watch (4,0)] [StrongDictionary ("CBCentralManager")] interface CBCentralInitOptions { [Export ("OptionShowPowerAlertKey")] @@ -34,7 +35,9 @@ interface CBCentralInitOptions { #endif } - [iOS (10,0)][NoMac] + [Watch (4,0)] + [iOS (10,0)] + [Mac (10,13)] [BaseType (typeof(NSObject))] [DisableDefaultCtor] interface CBManager { @@ -42,23 +45,12 @@ interface CBManager { CBManagerState State { get; } } + [Watch (4,0)] [Since (5,0)] [Lion] - [BaseType ( -#if MONOMAC - typeof (NSObject) -#else - typeof (CBManager) -#endif - , Delegates=new[] {"WeakDelegate"}, Events = new[] { typeof (CBCentralManagerDelegate)})] + [BaseType (typeof (CBManager), Delegates=new[] {"WeakDelegate"}, Events = new[] { typeof (CBCentralManagerDelegate)})] [DisableDefaultCtor] // crash (at dispose time) on OSX interface CBCentralManager { -#if MONOMAC - // Removed in iOS 10 – The selector now exists in the base type. - // Note: macOS doesn't inherit from CBManager. - [Export ("state")] - CBCentralManagerState State { get; } -#endif [Export ("delegate", ArgumentSemantic.Assign), NullAllowed] NSObject WeakDelegate { get; set; } @@ -71,9 +63,7 @@ interface CBCentralManager { [PostGet ("WeakDelegate")] IntPtr Constructor ([NullAllowed, Protocolize] CBCentralManagerDelegate centralDelegate, [NullAllowed] DispatchQueue queue); -#if !MONOMAC [DesignatedInitializer] -#endif [iOS (7,0), Mac (10,9)] [Export ("initWithDelegate:queue:options:")] [PostGet ("WeakDelegate")] @@ -84,13 +74,17 @@ interface CBCentralManager { IntPtr Constructor ([NullAllowed, Protocolize] CBCentralManagerDelegate centralDelegate, [NullAllowed] DispatchQueue queue, CBCentralInitOptions options); [NoTV] + [NoWatch] [Availability (Obsoleted = Platform.iOS_9_0)] + [Mac (10, 7, onlyOn64: true)] // Was removed from 32-bit in 10.13 unannounced [Export ("retrievePeripherals:"), Internal] void RetrievePeripherals (NSArray peripheralUUIDs); [NoTV] + [NoWatch] + [Mac (10, 7, onlyOn64: true)] // Was removed from 32-bit in 10.13 unannounced [Export ("retrieveConnectedPeripherals")] - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_9_0, Message = "Use RetrievePeripheralsWithIdentifiers instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_9_0, Message = "Use 'RetrievePeripheralsWithIdentifiers' instead.")] void RetrieveConnectedPeripherals (); [Export ("scanForPeripheralsWithServices:options:"), Internal] @@ -111,37 +105,35 @@ interface CBCentralManager { [Field ("CBConnectPeripheralOptionNotifyOnDisconnectionKey")] NSString OptionNotifyOnDisconnectionKey { get; } -#if !MONOMAC - [Availability (Unavailable = Platform.Mac_Version)] + [Mac (10,13)] [Since (6,0)] [Field ("CBConnectPeripheralOptionNotifyOnConnectionKey")] NSString OptionNotifyOnConnectionKey { get; } - [Availability (Unavailable = Platform.Mac_Version)] + [Mac (10,13)] [Since (6,0)] [Field ("CBConnectPeripheralOptionNotifyOnNotificationKey")] NSString OptionNotifyOnNotificationKey { get; } - [Availability (Unavailable = Platform.Mac_Version)] [Field ("CBCentralManagerOptionRestoreIdentifierKey")] [Since (7,0)] + [Mac (10,13)] NSString OptionRestoreIdentifierKey { get; } [Field ("CBCentralManagerRestoredStatePeripheralsKey")] [Since (7,0)] - [Availability (Unavailable = Platform.Mac_Version)] + [Mac (10,13)] NSString RestoredStatePeripheralsKey { get; } [Field ("CBCentralManagerRestoredStateScanServicesKey")] [Since (7,0)] - [Availability (Unavailable = Platform.Mac_Version)] + [Mac (10,13)] NSString RestoredStateScanServicesKey { get; } [Field ("CBCentralManagerRestoredStateScanOptionsKey")] [Since (7,0)] - [Availability (Unavailable = Platform.Mac_Version)] + [Mac (10,13)] NSString RestoredStateScanOptionsKey { get; } -#endif [Since (7,0), Mac (10,9)] [Export ("retrievePeripheralsWithIdentifiers:")] @@ -159,13 +151,13 @@ interface CBCentralManager { [Since (7,0), Mac (10,9)] NSString ScanOptionSolicitedServiceUUIDsKey { get; } -#if !MONOMAC [iOS (9,0)] + [Mac (10,13)] [Export ("isScanning")] bool IsScanning { get; } -#endif } + [Watch (4,0)] [StrongDictionary ("AdvertisementDataKeys")] interface AdvertisementData { string LocalName { get; set; } @@ -183,6 +175,7 @@ interface AdvertisementData { CBUUID [] SolicitedServiceUuids { get; set; } } + [Watch (4,0)] [Static, Internal] interface AdvertisementDataKeys { [Field ("CBAdvertisementDataLocalNameKey")] @@ -212,10 +205,11 @@ interface AdvertisementDataKeys { NSString SolicitedServiceUuidsKey { get; } } + [Watch (4,0)] [StrongDictionary ("PeripheralScanningOptionsKeys")] interface PeripheralScanningOptions { } - + [Watch (4,0)] [StrongDictionary ("RestoredStateKeys")] interface RestoredState { CBPeripheral [] Peripherals { get; set; } @@ -223,6 +217,7 @@ interface RestoredState { PeripheralScanningOptions ScanOptions { get; set; } } + [Watch (4,0)] [Static, Internal] interface RestoredStateKeys { [Since (7,0)] @@ -238,6 +233,7 @@ interface RestoredStateKeys { NSString ScanOptionsKey { get; } } + [Watch (4,0)] [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -247,11 +243,13 @@ interface CBCentralManagerDelegate { void UpdatedState (CBCentralManager central); [NoTV] + [NoWatch] [Availability (Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_8_4)] // Available in iOS 5.0 through iOS 8.4. Deprecated in iOS 7.0. [Export ("centralManager:didRetrievePeripherals:"), EventArgs ("CBPeripherals")] void RetrievedPeripherals (CBCentralManager central, CBPeripheral [] peripherals); [NoTV] + [NoWatch] [Availability (Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_8_4)] // Available in iOS 5.0 through iOS 8.4. Deprecated in iOS 7.0. [Export ("centralManager:didRetrieveConnectedPeripherals:"), EventArgs ("CBPeripherals")] void RetrievedConnectedPeripherals (CBCentralManager central, CBPeripheral [] peripherals); @@ -272,6 +270,7 @@ interface CBCentralManagerDelegate { void WillRestoreState (CBCentralManager central, NSDictionary dict); } + [Watch (4,0)] [Since (5,0)] [Static] interface CBAdvertisement { @@ -304,18 +303,11 @@ interface CBAdvertisement { } + [Watch (4,0)] [Since (5,0)] -#if MONOMAC - [BaseType (typeof (NSObject))] -#else [BaseType (typeof (CBAttribute))] -#endif [DisableDefaultCtor] // crash (at dispose time) on OSX interface CBCharacteristic { -#if MONOMAC - [Export ("UUID")] - CBUUID UUID { get; [NotImplemented] set; } -#endif [Export ("properties")] CBCharacteristicProperties Properties { get; [NotImplemented ("Not available on CBCharacteristic, only available on CBMutableCharacteristic")] set; } @@ -326,7 +318,8 @@ interface CBCharacteristic { [Export ("descriptors", ArgumentSemantic.Retain)] CBDescriptor [] Descriptors { get; [NotImplemented ("Not available on CBCharacteristic, only available on CBMutableCharacteristic")] set; } - [Availability (Deprecated=Platform.iOS_8_0)] + [Deprecated (PlatformName.iOS, 8,0)] + [Deprecated (PlatformName.MacOSX, 10,13)] [Export ("isBroadcasted")] bool IsBroadcasted { get; } @@ -342,15 +335,15 @@ interface CBCharacteristic { #endif } + [Watch (4,0)] [Since (6, 0), Mac (10,9)] [BaseType (typeof (CBCharacteristic))] [DisableDefaultCtor] interface CBMutableCharacteristic { [NoTV] -#if !MONOMAC + [NoWatch] [DesignatedInitializer] -#endif [Export ("initWithType:properties:value:permissions:")] [PostGet ("UUID")] [PostGet ("Value")] @@ -360,10 +353,11 @@ interface CBMutableCharacteristic { CBAttributePermissions Permissions { get; set; } [NoTV] + [NoWatch] [NullAllowed] [Export ("UUID", ArgumentSemantic.Retain)] [Override] - CBUUID UUID { get; set; } + CBUUID UUID { get; [Availability (Obsoleted = Platform.Mac_10_13)] set; } [Export ("properties", ArgumentSemantic.Assign)] [Override] @@ -385,18 +379,11 @@ interface CBMutableCharacteristic { #endif } + [Watch (4,0)] [Since (5,0)] -#if MONOMAC - [BaseType (typeof (NSObject))] -#else [BaseType (typeof (CBAttribute))] -#endif [DisableDefaultCtor] // crash (at dispose time) on OSX interface CBDescriptor { -#if MONOMAC - [Export ("UUID")] - CBUUID UUID { get; } -#endif [Export ("value", ArgumentSemantic.Retain)] NSObject Value { get; } @@ -405,41 +392,40 @@ interface CBDescriptor { CBCharacteristic Characteristic { get; } } + [Watch (4,0)] [Since (6, 0), Mac (10,9)] [BaseType (typeof (CBDescriptor))] [DisableDefaultCtor] interface CBMutableDescriptor { [NoTV] -#if !MONOMAC + [NoWatch] [DesignatedInitializer] -#endif [Export ("initWithType:value:")] [PostGet ("UUID")] [PostGet ("Value")] IntPtr Constructor (CBUUID uuid, NSObject descriptorValue); } + [Watch (4,0)] [Since (5,0)] - [BaseType ( -#if MONOMAC - typeof (NSObject) -#else - typeof (CBPeer) -#endif - , Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof (CBPeripheralDelegate)})] + [BaseType (typeof (CBPeer), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof (CBPeripheralDelegate)})] [DisableDefaultCtor] // crash (at dispose time) on OSX interface CBPeripheral : NSCopying { [Export ("name", ArgumentSemantic.Retain)] [DisableZeroCopy] string Name { get; } - [Availability (Deprecated=Platform.iOS_8_0)] + [Deprecated (PlatformName.iOS, 8,0)] + [Deprecated (PlatformName.MacOSX, 10,13)] + [NoWatch] [Export ("RSSI", ArgumentSemantic.Retain)] NSNumber RSSI { get; } [NoTV] + [NoWatch] [Availability (Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_9_0)] [Export ("isConnected")] + [Mac (10, 7, onlyOn64: true)] // Was removed from 32-bit in 10.13 unannounced bool IsConnected { get; } [Export ("services", ArgumentSemantic.Retain)] @@ -482,14 +468,6 @@ interface CBPeripheral : NSCopying { [Export ("writeValue:forDescriptor:")] void WriteValue (NSData data, CBDescriptor descriptor); -#if MONOMAC - // Provided with the iOS7 SDK, but does not contain an NS_AVAILABLE macro. - // Moved to a new base class, CBPeer, in iOS 8. - [Since (7,0), Mavericks] - [Export ("identifier")] - NSUuid Identifier { get; } -#endif - [iOS (9,0)][Mac (10,12)] [Export ("maximumWriteValueLengthForType:")] nuint GetMaximumWriteValueLength (CBCharacteristicWriteType type); @@ -503,29 +481,29 @@ interface CBPeripheral : NSCopying { [Since (7,0), Mac (10,9)] [Export ("state")] CBPeripheralState State { get; } + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("canSendWriteWithoutResponse")] + bool CanSendWriteWithoutResponse { get; } + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("openL2CAPChannel:")] + void OpenL2CapChannel (ushort psm); } + [Watch (4,0)] [BaseType (typeof (NSObject))] [Model] [Protocol] interface CBPeripheralDelegate { - [Availability (Deprecated=Platform.iOS_8_0, Message="Use RssiRead")] + [Availability (Deprecated=Platform.iOS_8_0, Message="Use 'RssiRead' instead.")] [Export ("peripheralDidUpdateRSSI:error:"), EventArgs ("NSError", true)] void RssiUpdated (CBPeripheral peripheral, NSError error); -#if MONOMAC -#if !XAMCORE_4_0 - // This API was removed or never existed. Can't cleanly remove due to EventsArgs/Delegate - [Availability (Introduced=Platform.iOS_8_0)] - [Export ("xamarin:selector:removed:"), EventArgs ("CBRssi")] - [Obsolete ("No longer an OS X API - it will never be called")] - void RssiRead (CBPeripheral peripheral, NSNumber rssi, NSError error); -#endif -#else - [Availability (Introduced=Platform.iOS_8_0)] + [iOS (8,0)] + [Mac (10,13)] [Export ("peripheral:didReadRSSI:error:"), EventArgs ("CBRssi")] void RssiRead (CBPeripheral peripheral, NSNumber rssi, NSError error); -#endif // FIXME: TYPO: missing 's' (plural) [Export ("peripheral:didDiscoverServices:"), EventArgs ("NSError", true)] @@ -561,6 +539,7 @@ interface CBPeripheralDelegate { void WroteDescriptorValue (CBPeripheral peripheral, CBDescriptor descriptor, NSError error); [NoTV] + [NoWatch] [Availability (Introduced = Platform.iOS_6_0, Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_8_4)] [Export ("peripheralDidInvalidateServices:")] void InvalidatedService (CBPeripheral peripheral); @@ -572,20 +551,22 @@ interface CBPeripheralDelegate { [Since (7,0)] [Export ("peripheral:didModifyServices:"), EventArgs ("CBPeripheralServices")] void ModifiedServices (CBPeripheral peripheral, CBService [] services); + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [EventArgs ("CBPeripheralOpenL2CapChannel")] + [Export ("peripheral:didOpenL2CAPChannel:error:")] + void DidOpenL2CapChannel (CBPeripheral peripheral, [NullAllowed] CBL2CapChannel channel, [NullAllowed] NSError error); + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("peripheralIsReadyToSendWriteWithoutResponse:")] + void IsReadyToSendWriteWithoutResponse (CBPeripheral peripheral); } + [Watch (4,0)] [Since (5,0)] -#if MONOMAC - [BaseType (typeof (NSObject))] -#else [BaseType (typeof (CBAttribute))] -#endif [DisableDefaultCtor] // crash (at dispose time) on OSX interface CBService { -#if MONOMAC - [Export ("UUID", ArgumentSemantic.Retain)] - CBUUID UUID { get; } -#endif [iOS (6,0), Mac (10,9)] [Export ("isPrimary")] bool Primary { get; [NotImplemented ("Not available on CBCharacteristic, only available on CBMutableService")] set; } @@ -601,26 +582,26 @@ interface CBService { } + [Watch (4,0)] [Since (6, 0), Mac(10,9)] [BaseType (typeof (CBService))] [DisableDefaultCtor] interface CBMutableService { [NoTV] -#if !MONOMAC + [NoWatch] [DesignatedInitializer] -#endif [Export ("initWithType:primary:")] [PostGet ("UUID")] IntPtr Constructor (CBUUID uuid, bool primary); [NoTV] + [NoWatch] [Export ("UUID", ArgumentSemantic.Retain)] -#if !MONOMAC [Override] -#endif - CBUUID UUID { get; set; } + CBUUID UUID { get; [Availability (Obsoleted = Platform.Mac_10_13)] set; } [NoTV] + [NoWatch] [Export ("isPrimary")] [Override] bool Primary { get; set; } @@ -634,6 +615,7 @@ interface CBMutableService { CBCharacteristic[] Characteristics { get; set; } // TODO: check array type } + [Watch (4,0)] [Since (5,0)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // crash (at dispose time) on OSX @@ -651,6 +633,7 @@ interface CBUUID : NSCopying { CBUUID FromData (NSData theData); [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_9_0)] + [NoWatch] [Static] [Export ("UUIDWithCFUUID:")] CBUUID FromCFUUID (IntPtr theUUID); @@ -690,14 +673,27 @@ interface CBUUID : NSCopying { [Field ("CBUUIDCharacteristicAggregateFormatString")] NSString CharacteristicAggregateFormatString { get; } -#if !MONOMAC // Filled radar://27160443 – Trello: https://trello.com/c/oqB27JA6 +#if MONOMAC + [Internal] + [Field ("CBUUIDValidRangeString")] + NSString CBUUIDValidRangeString { get; } + + [Internal] + [Mac (10,13)] + [Field ("CBUUIDCharacteristicValidRangeString")] + NSString CBUUIDCharacteristicValidRangeString { get; } +#else [iOS (10,0)] [TV (10,0)] [Field ("CBUUIDCharacteristicValidRangeString")] -#else - [Field ("CBUUIDValidRangeString")] -#endif NSString CharacteristicValidRangeString { get; } +#endif + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Field ("CBUUIDL2CAPPSMCharacteristicString")] + NSString L2CapPsmCharacteristicString { get; } #if !XAMCORE_3_0 [Deprecated (PlatformName.iOS, 7, 0)] @@ -736,6 +732,7 @@ interface CBUUID : NSCopying { string Uuid { get; } } + [Watch (4,0)] [Since (6,0), Mac(10,9)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] @@ -753,13 +750,10 @@ interface CBATTRequest { NSData Value { get; set; } } -#if MONOMAC [Mac (10,9)] - [BaseType (typeof (NSObject))] -#else + [Watch (4,0)] [iOS (6,0)] [BaseType (typeof (CBPeer))] -#endif // `delloc` a default instance crash applications and a default instance, without the ability to change the UUID, does not make sense [DisableDefaultCtor] interface CBCentral : NSCopying { @@ -783,24 +777,19 @@ interface CBCentral : NSCopying { nuint MaximumUpdateValueLength { get; } } + [Watch (4,0)] [Since (6, 0), Mac(10,9)] - [BaseType ( -#if MONOMAC - typeof (NSObject) -#else - typeof (CBManager) -#endif - , Delegates=new[] { "WeakDelegate" }, Events=new[] { typeof (CBPeripheralManagerDelegate) })] + [BaseType (typeof (CBManager), Delegates=new[] { "WeakDelegate" }, Events=new[] { typeof (CBPeripheralManagerDelegate) })] interface CBPeripheralManager { [NoTV] + [NoWatch] [Export ("initWithDelegate:queue:")] [PostGet ("WeakDelegate")] IntPtr Constructor ([Protocolize] CBPeripheralManagerDelegate peripheralDelegate, [NullAllowed] DispatchQueue queue); [NoTV] -#if !MONOMAC + [NoWatch] [DesignatedInitializer] -#endif [Since (7,0),Mac (10,9)] [Export ("initWithDelegate:queue:options:")] [PostGet ("WeakDelegate")] @@ -818,13 +807,6 @@ interface CBPeripheralManager { [Export ("isAdvertising")] bool Advertising { get; } -#if MONOMAC - // Removed in iOS 10 – The selector now exists in the base type. - // Note: macOS doesn't inherit from CBManager. - [Export ("state")] - CBPeripheralManagerState State { get; } -#endif - [Export ("addService:")] void AddService (CBMutableService service); @@ -852,6 +834,14 @@ interface CBPeripheralManager { [Export ("updateValue:forCharacteristic:onSubscribedCentrals:")] bool UpdateValue (NSData value, CBMutableCharacteristic characteristic, [NullAllowed] CBCentral[] subscribedCentrals); + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("publishL2CAPChannelWithEncryption:")] + void PublishL2CapChannel (bool encryptionRequired); + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("unpublishL2CAPChannel:")] + void UnpublishL2CapChannel (ushort psm); + [Field ("CBPeripheralManagerOptionShowPowerAlertKey")] [Since (7,0)] NSString OptionShowPowerAlertKey { get; } @@ -876,6 +866,7 @@ interface CBPeripheralManager { #endif } + [Watch (4,0)] [Since (6, 0), Mac(10,9)] [BaseType (typeof (NSObject))] [Model] @@ -908,15 +899,33 @@ interface CBPeripheralManagerDelegate { [Export ("peripheralManagerIsReadyToUpdateSubscribers:")] void ReadyToUpdateSubscribers (CBPeripheralManager peripheral); + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [EventArgs ("CBPeripheralManagerOpenL2CapChannel")] + [Export ("peripheralManager:didOpenL2CAPChannel:error:")] + void DidOpenL2CapChannel (CBPeripheralManager peripheral, [NullAllowed] CBL2CapChannel channel, [NullAllowed] NSError error); + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [EventArgs ("CBPeripheralManagerL2CapChannelOperation")] + [Export ("peripheralManager:didUnpublishL2CAPChannel:error:")] + void DidUnpublishL2CapChannel (CBPeripheralManager peripheral, ushort psm, [NullAllowed] NSError error); + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [EventArgs ("CBPeripheralManagerL2CapChannelOperation")] + [Export ("peripheralManager:didPublishL2CAPChannel:error:")] + void DidPublishL2CapChannel (CBPeripheralManager peripheral, ushort psm, [NullAllowed] NSError error); } -#if !MONOMAC [Since (8, 0)] + [Mac (10,13)] + [Watch (4,0)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // CBPeer.h: - (instancetype)init NS_UNAVAILABLE; interface CBPeer : NSCopying { [Internal] [NoTV] + [NoWatch] + [NoMac] [Availability (Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_9_0)] [Export ("UUID")] IntPtr _UUID { get; } @@ -925,5 +934,21 @@ interface CBPeer : NSCopying { [Export ("identifier")] NSUuid Identifier { get; } } -#endif + + [Watch (4,0)][iOS (11,0)][TV (11,0)][Mac (10,13)] + [BaseType (typeof (NSObject), Name = "CBL2CAPChannel")] + interface CBL2CapChannel { + + [Export ("peer")] + CBPeer Peer { get; } + + [Export ("inputStream")] + NSInputStream InputStream { get; } + + [Export ("outputStream")] + NSOutputStream OutputStream { get; } + + [Export ("PSM")] + /* uint16_t */ ushort Psm { get; } + } } diff --git a/src/coredata.cs b/src/coredata.cs index bbde89b6ad02..162963419830 100644 --- a/src/coredata.cs +++ b/src/coredata.cs @@ -10,6 +10,9 @@ using System; using XamCore.Foundation; using XamCore.ObjCRuntime; +#if !WATCH && !MONOMAC +using XamCore.CoreSpotlight; +#endif namespace XamCore.CoreData { @@ -124,6 +127,49 @@ interface NSAtomicStore { NSAtomicStore ReferenceObjectForObjectID (NSManagedObjectID objectID); } + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface NSFetchIndexElementDescription : NSCoding + { + [Export ("initWithProperty:collationType:")] + IntPtr Constructor (NSPropertyDescription property, NSFetchIndexElementType collationType); + + [NullAllowed, Export ("property", ArgumentSemantic.Retain)] + NSPropertyDescription Property { get; } + + [NullAllowed, Export ("propertyName", ArgumentSemantic.Retain)] + string PropertyName { get; } + + [Export ("collationType", ArgumentSemantic.Assign)] + NSFetchIndexElementType CollationType { get; set; } + + [Export ("ascending")] + bool IsAscending { [Bind ("isAscending")] get; set; } + + [NullAllowed, Export ("indexDescription", ArgumentSemantic.Assign)] + NSFetchIndexDescription IndexDescription { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface NSFetchIndexDescription : NSCoding + { + [Export ("initWithName:elements:")] + IntPtr Constructor (string name, [NullAllowed] NSFetchIndexElementDescription[] elements); + + [Export ("name")] + string Name { get; set; } + + [Export ("elements", ArgumentSemantic.Copy)] + NSFetchIndexElementDescription[] Elements { get; set; } + + [NullAllowed, Export ("entity", ArgumentSemantic.Assign)] + NSEntityDescription Entity { get; } + + [NullAllowed, Export ("partialIndexPredicate", ArgumentSemantic.Copy)] + NSPredicate PartialIndexPredicate { get; set; } + } + [BaseType (typeof (NSObject))] // Objective-C exception thrown. Name: NSInvalidArgumentException Reason: NSAtomicStoreCacheNodes must be initialized using initWithObjectID:(NSManagedObjectID *) [DisableDefaultCtor] @@ -263,12 +309,22 @@ interface NSEntityDescription : NSCoding, NSCopying { [Since(5,0)] [NullAllowed] // by default this property is null [Export ("compoundIndexes", ArgumentSemantic.Retain)] + [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_7, Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13, Message = "Use 'NSEntityDescription.Indexes' instead.")] NSPropertyDescription [] CompoundIndexes { get; set; } + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed] // by default this property is null + [Export ("indexes", ArgumentSemantic.Copy)] + NSFetchIndexDescription[] Indexes { get; set; } + // @property (strong) NSArray * __nonnull> * __nonnull uniquenessConstraints __attribute__((availability(ios, introduced=9.0))); [iOS (9,0), Mac (10,11)] [Internal, Export ("uniquenessConstraints", ArgumentSemantic.Strong)] NSArray _UniquenessConstraints { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("coreSpotlightDisplayNameExpression", ArgumentSemantic.Retain)] + NSExpression CoreSpotlightDisplayNameExpression { get; set; } } [BaseType (typeof (NSObject))] @@ -844,7 +900,7 @@ interface NSManagedObject { [Watch (3,0), TV (10,0), iOS (10,0), Mac (10,12)] [BaseType (typeof(NSObject))] - interface NSQueryGenerationToken : NSCopying + interface NSQueryGenerationToken : NSSecureCoding, NSCopying { [Static, Export ("currentQueryGenerationToken", ArgumentSemantic.Strong)] NSQueryGenerationToken CurrentToken { get; } @@ -954,16 +1010,16 @@ interface NSManagedObjectContext : NSCoding bool Save (out NSError error); #if !WATCH && !TVOS - [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use a queue style context and PerformAndWait instead")] + [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use a queue style context and 'PerformAndWait' instead.")] [Export ("lock")] new void Lock (); - [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use a queue style context and PerformAndWait instead")] + [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use a queue style context and 'PerformAndWait' instead.")] [Export ("unlock")] new void Unlock (); [NoTV] - [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use a queue style context and Perform instead")] + [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use a queue style context and 'Perform' instead.")] [Export ("tryLock")] bool TryLock { get; } #endif // !WATCH && !TVOS @@ -1065,6 +1121,10 @@ interface NSManagedObjectContext : NSCoding [iOS (8,3), Mac (10,11)] [Export ("refreshAllObjects")] void RefreshAllObjects (); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("transactionAuthor")] + string TransactionAuthor { get; set; } } interface NSManagedObjectChangeEventArgs { @@ -1392,6 +1452,147 @@ interface NSMigrationManager { bool UsesStoreSpecificMigrationManager { get; set; } } + [Abstract] + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface NSPersistentHistoryChange : NSCopying + { + [Export ("changeID")] + long ChangeId { get; } + + [Export ("changedObjectID", ArgumentSemantic.Copy)] + NSManagedObjectID ChangedObjectId { get; } + + [Export ("changeType")] + NSPersistentHistoryChangeType ChangeType { get; } + + [NullAllowed, Export ("tombstone", ArgumentSemantic.Copy)] + NSDictionary Tombstone { get; } + + [NullAllowed, Export ("transaction", ArgumentSemantic.Strong)] + NSPersistentHistoryTransaction Transaction { get; } + + [NullAllowed, Export ("updatedProperties", ArgumentSemantic.Copy)] + NSSet UpdatedProperties { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof (NSObject))] + interface NSPersistentHistoryToken : NSCopying //, NSSecureCoding TODO: The class does state that it supports the NSSecureCoding YET SupportsSecureCoding returns false, radar 32761925 + { + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSPersistentStoreRequest))] + [DisableDefaultCtor] + interface NSPersistentHistoryChangeRequest + { + [Static] + [Export ("fetchHistoryAfterDate:")] + NSPersistentHistoryChangeRequest FetchHistoryAfter (NSDate date); + + [Static] + [Export ("fetchHistoryAfterToken:")] + NSPersistentHistoryChangeRequest FetchHistoryAfter ([NullAllowed] NSPersistentHistoryToken token); + + [Static] + [Export ("fetchHistoryAfterTransaction:")] + NSPersistentHistoryChangeRequest FetchHistoryAfter ([NullAllowed] NSPersistentHistoryTransaction transaction); + + [Static] + [Export ("deleteHistoryBeforeDate:")] + NSPersistentHistoryChangeRequest DeleteHistoryBefore (NSDate date); + + [Static] + [Export ("deleteHistoryBeforeToken:")] + NSPersistentHistoryChangeRequest DeleteHistoryBefore ([NullAllowed] NSPersistentHistoryToken token); + + [Static] + [Export ("deleteHistoryBeforeTransaction:")] + NSPersistentHistoryChangeRequest DeleteHistoryBefore ([NullAllowed] NSPersistentHistoryTransaction transaction); + + [Export ("resultType", ArgumentSemantic.Assign)] + NSPersistentHistoryResultType ResultType { get; set; } + + [NullAllowed, Export ("token", ArgumentSemantic.Strong)] + NSPersistentHistoryToken Token { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSPersistentStoreResult))] + interface NSPersistentHistoryResult + { + [NullAllowed] + [Export ("result", ArgumentSemantic.Strong)] + NSObject Result { get; } + + [Export ("resultType")] + NSPersistentHistoryResultType ResultType { get; } + } + + [Abstract] + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface NSPersistentHistoryTransaction : NSCopying + { + [Export ("timestamp", ArgumentSemantic.Copy)] + NSDate Timestamp { get; } + + [NullAllowed, Export ("changes", ArgumentSemantic.Copy)] + NSPersistentHistoryChange[] Changes { get; } + + [Export ("transactionNumber")] + long TransactionNumber { get; } + + [Export ("storeID")] + string StoreId { get; } + + [Export ("bundleID")] + string BundleId { get; } + + [Export ("processID")] + string ProcessId { get; } + + [NullAllowed, Export ("contextName")] + string ContextName { get; } + + [NullAllowed, Export ("author")] + string Author { get; } + + [Export ("token", ArgumentSemantic.Strong)] + NSPersistentHistoryToken Token { get; } + + [Export ("objectIDNotification")] + NSNotification ObjectIdNotification { get; } + } + +#if !WATCH && !MONOMAC + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface NSCoreDataCoreSpotlightDelegate + { + [Export ("domainIdentifier")] + string DomainIdentifier { get; } + + [NullAllowed, Export ("indexName")] + string IndexName { get; } + + [Export ("initForStoreWithDescription:model:")] + [DesignatedInitializer] + IntPtr Constructor (NSPersistentStoreDescription description, NSManagedObjectModel model); + + [Export ("attributeSetForObject:")] + [return: NullAllowed] + CSSearchableItemAttributeSet GetAttributeSet (NSManagedObject @object); + + [Export ("searchableIndex:reindexAllSearchableItemsWithAcknowledgementHandler:")] + void ReindexAllSearchableItems (CSSearchableIndex searchableIndex, Action acknowledgementHandler); + + [Export ("searchableIndex:reindexSearchableItemsWithIdentifiers:acknowledgementHandler:")] + void ReindexSearchableItems (CSSearchableIndex searchableIndex, string[] identifiers, Action acknowledgementHandler); + } +#endif + // NSPersistentStore is an abstract type according to Apple's documentation, but Apple // also have internal subclasses of NSPersistentStore, and in those cases our closest // type is NSPersistentStore, which means we must be able to create managed wrappers @@ -1465,6 +1666,12 @@ interface NSPersistentStore { [Field ("NSPersistentStoreSaveConflictsErrorKey")] NSString SaveConflictsErrorKey { get; } +#if !WATCH && !MONOMAC + [NoWatch, NoTV, Mac (10, 13), iOS (11, 0)] + [Export ("coreSpotlightExporter")] + NSCoreDataCoreSpotlightDelegate CoreSpotlightExporter { get; } +#endif + } [Watch (3,0), TV (10,0), iOS (10,0), Mac (10,12)] @@ -1585,7 +1792,7 @@ partial interface NSPersistentStoreCoordinator [Static, Export ("registerStoreClass:forStoreType:")] void RegisterStoreClass (Class storeClass, NSString storeType); - [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_5 , Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "This method is obsolete, please use the method that takes an out NSError parameter.")] + [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_5 , Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use the method that takes an out NSError parameter.")] [Static, Export ("metadataForPersistentStoreOfType:URL:error:")] [return: NullAllowed] NSDictionary MetadataForPersistentStoreOfType (NSString storeType, NSUrl url, out NSError error); @@ -1595,7 +1802,7 @@ partial interface NSPersistentStoreCoordinator [return: NullAllowed] NSDictionary GetMetadata (string storeType, NSUrl url, [NullAllowed] NSDictionary options, out NSError error); - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_9_0, Message = "This method is obsolete, please use the method that takes an out NSError parameter.")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_9_0, Message = "Use the method that takes an out NSError parameter.")] [Static, Export ("setMetadata:forPersistentStoreOfType:URL:error:")] bool SetMetadata (NSDictionary metadata, NSString storeType, NSUrl url, out NSError error); @@ -1660,16 +1867,16 @@ partial interface NSPersistentStoreCoordinator NSManagedObjectID ManagedObjectIDForURIRepresentation (NSUrl url); #if !WATCH && !TVOS - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_8_0, Message="Use PerformAndWait instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_8_0, Message="Use 'PerformAndWait' instead.")] [Export ("lock")] new void Lock (); - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_8_0, Message="Use PerformAndWait instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_8_0, Message="Use 'PerformAndWait' instead.")] [Export ("unlock")] new void Unlock (); [NoTV] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_8_0, Message="Use Perform instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_8_0, Message="Use 'Perform' instead.")] [Export ("tryLock")] bool TryLock { get; } #endif // !WATCH && !TVOS @@ -1687,7 +1894,15 @@ partial interface NSPersistentStoreCoordinator #endif [Field ("NSBinaryStoreType")] NSString BinaryStoreType { get; } - + + [Watch (4,0)][TV (11,0)][Mac (10,13)][iOS (11,0)] + [Field ("NSBinaryStoreSecureDecodingClasses")] + NSString BinaryStoreSecureDecodingClasses { get; } + + [Watch (4,0)][TV (11,0)][Mac (10,13)][iOS (11,0)] + [Field ("NSBinaryStoreInsecureDecodingCompatibilityOption")] + NSString BinaryStoreInsecureDecodingCompatibilityOption { get; } + [Field ("NSInMemoryStoreType")] NSString InMemoryStoreType { get; } @@ -1818,8 +2033,24 @@ partial interface NSPersistentStoreCoordinator [NoWatch][NoTV] [Since (7,0), Mavericks] [Field ("NSPersistentStoreUbiquitousContainerIdentifierKey")] + [Obsolete ("Use 'UbiquitousContainerIdentifierKey' instead.")] NSString eUbiquitousContainerIdentifierKey { get; } + [NoWatch][NoTV] + [Since (7,0), Mavericks] + [Field ("NSPersistentStoreUbiquitousContainerIdentifierKey")] + NSString UbiquitousContainerIdentifierKey { get; } + + // 11.0 + + [NoWatch, NoTV, Mac (10, 13), iOS (11, 0)] + [Field ("NSCoreDataCoreSpotlightExporter")] + NSString CoreSpotlightExporter { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Field ("NSPersistentHistoryTrackingKey")] + NSString HistoryTrackingKey { get; } + [iOS (8,0), Mac (10,10)] [NullAllowed, Export ("name")] string Name { get; set; } @@ -1947,6 +2178,7 @@ interface NSPropertyDescription : NSCoding, NSCopying { NSDictionary UserInfo { get; set; } [Export ("indexed")] + [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_5 , Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13, Message = "Use 'NSEntityDescription.Indexes' instead.")] bool Indexed { [Bind ("isIndexed")] get; set; } [Export ("versionHash")] @@ -1966,6 +2198,7 @@ interface NSPropertyDescription : NSCoding, NSCopying { [Since (5,0)] [Export ("storedInExternalRecord")] + [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_5 , Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13, Message = "Use 'CoreSpotlight' integration instead.")] bool StoredInExternalRecord { [Bind ("isStoredInExternalRecord")]get; set; } } diff --git a/src/coreimage.cs b/src/coreimage.cs index 8df5a23a47e9..b4072e4ee758 100644 --- a/src/coreimage.cs +++ b/src/coreimage.cs @@ -26,11 +26,14 @@ using System; using System.Reflection; +using XamCore.AVFoundation; using XamCore.Foundation; using XamCore.ObjCRuntime; using XamCore.CoreGraphics; using XamCore.CoreImage; using XamCore.CoreVideo; +using XamCore.ImageIO; +using XamCore.IOSurface; #if !MONOMAC || XAMCORE_2_0 using XamCore.Metal; #endif @@ -128,61 +131,61 @@ interface CIColor : NSSecureCoding, NSCopying { [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("blackColor")] + [Export ("blackColor", ArgumentSemantic.Strong)] CIColor BlackColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("whiteColor")] + [Export ("whiteColor", ArgumentSemantic.Strong)] CIColor WhiteColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("grayColor")] + [Export ("grayColor", ArgumentSemantic.Strong)] CIColor GrayColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("redColor")] + [Export ("redColor", ArgumentSemantic.Strong)] CIColor RedColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("greenColor")] + [Export ("greenColor", ArgumentSemantic.Strong)] CIColor GreenColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("blueColor")] + [Export ("blueColor", ArgumentSemantic.Strong)] CIColor BlueColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("cyanColor")] + [Export ("cyanColor", ArgumentSemantic.Strong)] CIColor CyanColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("magentaColor")] + [Export ("magentaColor", ArgumentSemantic.Strong)] CIColor MagentaColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("yellowColor")] + [Export ("yellowColor", ArgumentSemantic.Strong)] CIColor YellowColor { get; } [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Static] - [Export ("clearColor")] + [Export ("clearColor", ArgumentSemantic.Strong)] CIColor ClearColor { get; } [Export ("stringRepresentation")] @@ -262,6 +265,12 @@ interface CIContext { // null is not documented for CGColorSpace but it makes sense with the other overload not having this parameter (unit tested) void Render (CIImage image, CVPixelBuffer buffer, CGRect rectangle, [NullAllowed] CGColorSpace cs); + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Export ("render:toIOSurface:bounds:colorSpace:")] + void Render (CIImage image, IOSurface.IOSurface surface, CGRect bounds, [NullAllowed] CGColorSpace colorSpace); + #if !MONOMAC [Export ("inputImageMaximumSize")] CGSize InputImageMaximumSize { get; } @@ -276,7 +285,7 @@ interface CIContext { void Render (CIImage image, IMTLTexture texture, [NullAllowed] IMTLCommandBuffer commandBuffer, CGRect bounds, [NullAllowed] CGColorSpace colorSpace); #endif - [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "Use DrawImage (image, CGRect, CGRect) instead")] + [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_4, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "Use 'DrawImage (image, CGRect, CGRect)' instead.")] [Export ("drawImage:atPoint:fromRect:")] void DrawImage (CIImage image, CGPoint atPoint, CGRect fromRect); @@ -390,18 +399,88 @@ interface CIContext_ImageRepresentation { [return: NullAllowed] NSData GetTiffRepresentation (CIImage image, CIFormat format, CGColorSpace colorSpace, NSDictionary options); +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (10,0)][Mac (10,12)] + [Wrap ("GetTiffRepresentation (image, format, colorSpace, options?.Dictionary)")] + [return: NullAllowed] + NSData GetTiffRepresentation (CIImage image, CIFormat format, CGColorSpace colorSpace, CIImageRepresentationOptions options); +#endif + [iOS (10,0)][Mac (10,12)] [Export ("JPEGRepresentationOfImage:colorSpace:options:")] [return: NullAllowed] NSData GetJpegRepresentation (CIImage image, CGColorSpace colorSpace, NSDictionary options); +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (10,0)][Mac (10,12)] + [Wrap ("GetJpegRepresentation (image, format, colorSpace, options?.Dictionary)")] + [return: NullAllowed] + NSData GetJpegRepresentation (CIImage image, CGColorSpace colorSpace, CIImageRepresentationOptions options); +#endif + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("HEIFRepresentationOfImage:format:colorSpace:options:")] + [return: NullAllowed] + NSData GetHeifRepresentation (CIImage image, CIFormat format, CGColorSpace colorSpace, NSDictionary options); + +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Wrap ("GetHeifRepresentation (image, format, colorSpace, options?.Dictionary)")] + [return: NullAllowed] + NSData GetHeifRepresentation (CIImage image, CIFormat format, CGColorSpace colorSpace, CIImageRepresentationOptions options); +#endif + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("PNGRepresentationOfImage:format:colorSpace:options:")] + [return: NullAllowed] + NSData GetPngRepresentation (CIImage image, CIFormat format, CGColorSpace colorSpace, NSDictionary options); + +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Wrap ("GetPngRepresentation (image, format, colorSpace, options?.Dictionary)")] + [return: NullAllowed] + NSData GetPngRepresentation (CIImage image, CIFormat format, CGColorSpace colorSpace, CIImageRepresentationOptions options); +#endif + [iOS (10,0)][Mac (10,12)] [Export ("writeTIFFRepresentationOfImage:toURL:format:colorSpace:options:error:")] bool WriteTiffRepresentation (CIImage image, NSUrl url, CIFormat format, CGColorSpace colorSpace, NSDictionary options, out NSError error); +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (10,0)][Mac (10,12)] + [Wrap ("WriteTiffRepresentation (image, url, format, colorSpace, options?.Dictionary, out error)")] + bool WriteTiffRepresentation (CIImage image, NSUrl url, CIFormat format, CGColorSpace colorSpace, CIImageRepresentationOptions options, out NSError error); +#endif + [iOS (10,0)][Mac (10,12)] [Export ("writeJPEGRepresentationOfImage:toURL:colorSpace:options:error:")] bool WriteJpegRepresentation (CIImage image, NSUrl url, CGColorSpace colorSpace, NSDictionary options, [NullAllowed] out NSError error); + +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (10,0)][Mac (10,12)] + [Wrap ("WriteJpegRepresentation (image, url, format, colorSpace, options?.Dictionary, out error)")] + bool WriteJpegRepresentation (CIImage image, NSUrl url, CGColorSpace colorSpace, CIImageRepresentationOptions options, [NullAllowed] out NSError error); +#endif + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("writeHEIFRepresentationOfImage:toURL:format:colorSpace:options:error:")] + bool WriteHeifRepresentation (CIImage image, NSUrl url, CIFormat format, CGColorSpace colorSpace, NSDictionary options, [NullAllowed] out NSError error); + +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Wrap ("WriteHeifRepresentation (image, url, format, colorSpace, options?.Dictionary, out error)")] + bool WriteHeifRepresentation (CIImage image, NSUrl url, CIFormat format, CGColorSpace colorSpace, CIImageRepresentationOptions options, [NullAllowed] out NSError error); +#endif + + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Export ("writePNGRepresentationOfImage:toURL:format:colorSpace:options:error:")] + bool WritePngRepresentation (CIImage image, NSUrl url, CIFormat format, CGColorSpace colorSpace, NSDictionary options, [NullAllowed] out NSError error); + +#if false // [Wrap] does not support [Category] extension methods - https://bugzilla.xamarin.com/show_bug.cgi?id=59294 + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Wrap ("WritePngRepresentation (image, url, format, colorSpace, options?.Dictionary, out error)")] + bool WritePngRepresentation (CIImage image, NSUrl url, CIFormat format, CGColorSpace colorSpace, CIImageRepresentationOptions options, [NullAllowed] out NSError error); +#endif } [BaseType (typeof (NSObject))] @@ -476,7 +555,7 @@ string Name { #if XAMCORE_4_0 void RegisterFilterName (string name, ICIFilterConstructor constructorObject, NSDictionary classAttributes); #else - [Advice ("The constructorObject argument must implement ICIFilterConstructor")] + [Advice ("The 'constructorObject' argument must implement 'ICIFilterConstructor'.")] void RegisterFilterName (string name, NSObject constructorObject, NSDictionary classAttributes); #endif #endif @@ -623,6 +702,10 @@ interface CIRawFilterKeys { [Field ("kCIInputNoiseReductionAmountKey")] NSString NoiseReductionAmountKey { get; } + [iOS (11,0)][TV (11,0)][Mac (10,13)] + [Field ("kCIInputMoireAmountKey")] + NSString MoireAmountKey { get; } + [iOS (10,0)][Mac (10,10)] [Field ("kCIInputEnableVendorLensCorrectionKey")] NSString EnableVendorLensCorrectionKey { get; } @@ -1210,7 +1293,7 @@ interface CIImage : NSSecureCoding, NSCopying { #if XAMCORE_2_0 [Internal] // there's a CIFormat enum that maps to the kCIFormatARGB8, kCIFormatRGBA16, kCIFormatRGBAf, kCIFormatRGBAh constants #else - [Obsolete ("Use the overload acceping a CIFormat enum (instead of an int) for pixelFormat")] + [Obsolete ("Use the overload acceping a 'CIFormat' enum instead of an 'int'.")] #endif CIImage FromData (NSData bitmapData, nint bytesPerRow, CGSize size, int /* CIFormat = int */ pixelFormat, [NullAllowed] CGColorSpace colorSpace); @@ -1284,12 +1367,26 @@ interface CIImage : NSSecureCoding, NSCopying { [Wrap ("FromImageBuffer (buffer, options == null ? null : options.Dictionary)")] CIImage FromImageBuffer (CVPixelBuffer buffer, [NullAllowed] CIImageInitializationOptions options); #endif - //[Export ("imageWithIOSurface:")] - //CIImage ImageWithIOSurface (IOSurfaceRef surface, ); - // - //[Static] - //[Export ("imageWithIOSurface:options:")] - //CIImage ImageWithIOSurfaceoptions (IOSurfaceRef surface, NSDictionary d, ); + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Static] + [Export ("imageWithIOSurface:")] + CIImage FromSurface (IOSurface.IOSurface surface); + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Static] + [Export ("imageWithIOSurface:options:")] + CIImage FromSurface (IOSurface.IOSurface surface, NSDictionary options); + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Static] + [Wrap ("FromSurface (surface, options == null ? null : options.Dictionary)")] + CIImage FromSurface (IOSurface.IOSurface surface, CIImageInitializationOptions options); [Static] [Export ("imageWithColor:")] @@ -1344,13 +1441,24 @@ interface CIImage : NSSecureCoding, NSCopying { [Wrap ("this (url, options == null ? null : options.Dictionary)")] IntPtr Constructor (NSUrl url, [NullAllowed] CIImageInitializationOptions options); - // FIXME: bindings - //[Export ("initWithIOSurface:")] - //NSObject InitWithIOSurface (IOSurfaceRef surface, ); - // - //[Export ("initWithIOSurface:options:")] - //NSObject InitWithIOSurfaceoptions (IOSurfaceRef surface, NSDictionary d, ); - // + [iOS (11,0)] // IOSurface was not exposed before Xcode 9 + [TV (11,0)] + [Mac (10,13)] + [Export ("initWithIOSurface:")] + IntPtr Constructor (IOSurface.IOSurface surface); + + [iOS (11,0)] // IOSurface was not exposed before Xcode 9 + [TV (11,0)] + [Mac (10,13)] + [Export ("initWithIOSurface:options:")] + IntPtr Constructor (IOSurface.IOSurface surface, [NullAllowed] NSDictionary options); + + [iOS (11,0)] // IOSurface was not exposed before Xcode 9 + [TV (11,0)] + [Mac (10,13)] + [Wrap ("this (surface, options == null ? null : options.Dictionary)")] + IntPtr Constructor (IOSurface.IOSurface surface, [NullAllowed] CIImageInitializationOptions options); + [iOS(9,0)] [Export ("initWithCVImageBuffer:")] IntPtr Constructor (CVImageBuffer imageBuffer); @@ -1424,15 +1532,15 @@ interface CIImage : NSSecureCoding, NSCopying { [Since (5,0)] [Wrap ("WeakProperties")] - CGImageProperties Properties { get; } + CoreGraphics.CGImageProperties Properties { get; } #if MONOMAC - //[Export ("definition")] - //CIFilterShape Definition (); - + [Export ("definition")] + CIFilterShape Definition { get; } +#endif + [iOS (10,0)] [Field ("kCIFormatRGBA16")] int FormatRGBA16 { get; } /* CIFormat = int */ -#endif [Field ("kCIFormatARGB8")] [Since (6,0)] @@ -1506,6 +1614,38 @@ interface CIImage : NSSecureCoding, NSCopying { [iOS (9,0)][Mac (10,11)] int FormatRGf { get; } + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatL8")] + int FormatL8 { get; } + + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatL16")] + int FormatL16 { get; } + + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatLh")] + int FormatLh { get; } + + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatLf")] + int FormatLf { get; } + + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatLA8")] + int FormatLA8 { get; } + + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatLA16")] + int FormatLA16 { get; } + + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatLAh")] + int FormatLAh { get; } + + [iOS (10,0)][TV (10,0)][Mac (10,12)] + [Field ("kCIFormatLAf")] + int FormatLAf { get; } + #if !MONOMAC // UIKit extensions [Since (5,0)] @@ -1576,6 +1716,12 @@ interface CIImage : NSSecureCoding, NSCopying { [Export ("imageByApplyingFilter:withInputParameters:")] CIImage CreateByFiltering (string filterName, [NullAllowed] NSDictionary inputParameters); + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Export ("imageByApplyingFilter:")] + CIImage CreateByFiltering (string filterName); + [iOS (8,0), Mac (10,10)] [Field ("kCIImageAutoAdjustCrop"), Internal] NSString AutoAdjustCrop { get; } @@ -1660,6 +1806,24 @@ interface CIImage : NSSecureCoding, NSCopying { [TV (10,0)] [NullAllowed, Export ("CGImage")] CGImage CGImage { get; } + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [NullAllowed, Export ("depthData")] + AVDepthData DepthData { get; } + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Export ("imageByApplyingCGOrientation:")] + CIImage CreateByApplyingOrientation (CGImagePropertyOrientation orientation); + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Export ("imageTransformForCGOrientation:")] + CGAffineTransform GetImageTransform (CGImagePropertyOrientation orientation); } interface ICIImageProcessorInput {} @@ -1692,6 +1856,15 @@ interface CIImageProcessorInput { [NullAllowed, Export ("metalTexture")] IMTLTexture MetalTexture { get; } #endif + +#if XAMCORE_4_0 + [Abstract] // @required but it was added in Xcode9 +#endif + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Export ("surface")] + IOSurface.IOSurface Surface { get; } } interface ICIImageProcessorOutput {} @@ -1728,6 +1901,15 @@ interface CIImageProcessorOutput { [NullAllowed, Export ("metalCommandBuffer")] IMTLCommandBuffer MetalCommandBuffer { get; } #endif + +#if XAMCORE_4_0 + [Abstract] // @required but it was added in Xcode9 +#endif + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Export ("surface")] + IOSurface.IOSurface Surface { get; } } [iOS (9,0)] @@ -1779,6 +1961,22 @@ interface CIKernel { [Static, Export ("kernelWithString:")] CIKernel FromProgramSingle (string coreImageShaderProgram); + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Static] + [Export ("kernelWithFunctionName:fromMetalLibraryData:error:")] + [return: NullAllowed] + CIKernel FromFunction (string name, NSData data, [NullAllowed] out NSError error); + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Static] + [Export ("kernelWithFunctionName:fromMetalLibraryData:outputPixelFormat:error:")] + [return: NullAllowed] + CIKernel FromFunction (string name, NSData data, CIFormat format, [NullAllowed] out NSError error); + [Export ("name")] string Name { get; } @@ -1819,28 +2017,41 @@ interface CIWarpKernel { [iOS (9,0)] [BaseType (typeof (NSObject))] + [DisableDefaultCtor] // does not work in iOS 11 beta 4 interface CIImageAccumulator { +#if !XAMCORE_4_0 + [Obsolete ("The default initializer does not work in recent iOS version (11b4).")] + [Export ("init")] + IntPtr Constructor (); +#endif + [Static] [Export ("imageAccumulatorWithExtent:format:")] -#if !MONOMAC - [Internal] + CIImageAccumulator FromRectangle (CGRect rect, CIFormat format); + +#if MONOMAC && !XAMCORE_4_0 + [Obsolete ("Use the overload acceping a 'CIFormat' enum instead of an 'int'.")] + [Static] + [Wrap ("FromRectangle (rect, (CIFormat) ciImageFormat)")] + CIImageAccumulator FromRectangle (CGRect rect, int ciImageFormat); #endif - CIImageAccumulator FromRectangle (CGRect rect, int /* CIFormat = int */ ciImageFormat); [iOS (9,0)] - [Static, Internal] + [Static] [Export ("imageAccumulatorWithExtent:format:colorSpace:")] - CIImageAccumulator FromRectangle (CGRect extent, int format, CGColorSpace colorSpace); + CIImageAccumulator FromRectangle (CGRect extent, CIFormat format, CGColorSpace colorSpace); - [Export ("initWithExtent:format:")] -#if !MONOMAC - [Internal] + IntPtr Constructor (CGRect rectangle, CIFormat format); + +#if MONOMAC && !XAMCORE_4_0 + [Obsolete ("Use the overload acceping a 'CIFormat' enum instead of an 'int'.")] + [Wrap ("this (rectangle, (CIFormat) ciImageFormat)")] + IntPtr Constructor (CGRect rectangle, int ciImageFormat); #endif - IntPtr Constructor (CGRect rectangle, int /* CIFormat = int */ ciImageFormat); - [Export ("initWithExtent:format:colorSpace:")][Internal] - IntPtr Constructor (CGRect extent, int format, CGColorSpace colorSpace); + [Export ("initWithExtent:format:colorSpace:")] + IntPtr Constructor (CGRect extent, CIFormat format, CGColorSpace colorSpace); [Export ("extent")] CGRect Extent { get; } @@ -2230,7 +2441,7 @@ interface CIRectangleFeature { [iOS (8,0)] [Mac (10,12)] [BaseType (typeof (CIFeature))] - partial interface CIQRCodeFeature { + partial interface CIQRCodeFeature : NSSecureCoding, NSCopying { [Export ("bounds", ArgumentSemantic.Assign)] CGRect Bounds { get; } @@ -2249,6 +2460,12 @@ partial interface CIQRCodeFeature { [Export ("messageString")] string MessageString { get; } + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13, onlyOn64 : true)] + [NullAllowed, Export ("symbolDescriptor")] + CIQRCodeDescriptor SymbolDescriptor { get; } } [iOS (9,0)] @@ -2302,6 +2519,13 @@ interface CIImageProcessorKernel { [Export ("applyWithExtent:inputs:arguments:error:")] [return: NullAllowed] CIImage Apply (CGRect extent, [NullAllowed] CIImage[] inputs, [NullAllowed] NSDictionary args, out NSError error); + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Static] + [Export ("outputIsOpaque")] + bool OutputIsOpaque { get; } } [CoreImageFilter] @@ -4471,4 +4695,706 @@ interface CIThermal { [BaseType (typeof (CIFilter))] interface CIXRay { } + +#if false // Needs review: https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIAreaMinMaxRed { + // TODO: Needs review + //[CoreImageProperty ("inputExtent")] + //CIVector Extent { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIAttributedTextImageGenerator { + // TODO: Needs review + //[CoreImageProperty ("inputText")] + //NSAttributedString Text { get; set; } + + //[CoreImageProperty ("inputScaleFactor")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float ScaleFactor { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIBarcodeGenerator { + // TODO: Needs review + //[CoreImageProperty ("inputBarcodeDescriptor")] + //CIBarcodeDescriptor BarcodeDescriptor { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIBicubicScaleTransform { + // TODO: Needs review + //[CoreImageProperty ("inputB")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float B { get; set; } + //[CoreImageProperty ("inputScale")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float Scale { get; set; } + //[CoreImageProperty ("inputC")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float C { get; set; } + //[CoreImageProperty ("inputAspectRatio")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float AspectRatio { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIBokehBlur { + // TODO: Needs review + //[CoreImageProperty ("inputSoftness")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float Softness { get; set; } + //[CoreImageProperty ("inputRadius")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float Radius { get; set; } + //[CoreImageProperty ("inputRingSize")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float RingSize { get; set; } + //[CoreImageProperty ("inputRingAmount")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float RingAmount { get; set; } + } + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIColorCubesMixedWithMask { + // TODO: Needs review + //[CoreImageProperty ("inputCubeDimension")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float CubeDimension { get; set; } + //[CoreImageProperty ("inputMaskImage")] + //CIImage MaskImage { get; set; } + //[CoreImageProperty ("inputCube0Data")] + //NSData Cube0Data { get; set; } + //[CoreImageProperty ("inputCube1Data")] + //NSData Cube1Data { get; set; } + //[CoreImageProperty ("inputColorSpace")] + //NSObject ColorSpace { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIColorCurves { + // TODO: Needs review + //[CoreImageProperty ("inputColorSpace")] + //NSObject ColorSpace { get; set; } + //[CoreImageProperty ("inputCurvesDomain")] + //CIVector CurvesDomain { get; set; } + //[CoreImageProperty ("inputCurvesData")] + //NSData CurvesData { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIDepthBlurEffect { + // TODO: Needs review + //[CoreImageProperty ("inputAperture")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float Aperture { get; set; } + //[CoreImageProperty ("inputCalibrationData")] + //AVCameraCalibrationData CalibrationData { get; set; } + //[CoreImageProperty ("inputTuningParameters")] + //NSDictionary TuningParameters { get; set; } + //[CoreImageProperty ("inputNosePositions")] + //CIVector NosePositions { get; set; } + //[CoreImageProperty ("inputLumaNoiseScale")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float LumaNoiseScale { get; set; } + //[CoreImageProperty ("inputChinPositions")] + //CIVector ChinPositions { get; set; } + //[CoreImageProperty ("inputDisparityImage")] + //CIImage DisparityImage { get; set; } + //[CoreImageProperty ("inputScaleFactor")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float ScaleFactor { get; set; } + //[CoreImageProperty ("inputRightEyePositions")] + //CIVector RightEyePositions { get; set; } + //[CoreImageProperty ("inputLeftEyePositions")] + //CIVector LeftEyePositions { get; set; } + //[CoreImageProperty ("inputFocusRect")] + //CIVector FocusRect { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIDepthToDisparity { + // TODO: Needs review + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIDisparityToDepth { + // TODO: Needs review + } + + [CoreImageFilter] + [iOS (11,0)] + [NoMac] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIEdgePreserveUpsampleFilter { + // TODO: Needs review + //[CoreImageProperty ("inputLumaSigma")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float LumaSigma { get; set; } + //[CoreImageProperty ("inputSmallImage")] + //CIImage SmallImage { get; set; } + //[CoreImageProperty ("inputSpatialSigma")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float SpatialSigma { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CILabDeltaE { + // TODO: Needs review + //[CoreImageProperty ("inputImage2")] + //CIImage Image2 { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CITextImageGenerator { + // TODO: Needs review + //[CoreImageProperty ("inputText")] + //NSString Text { get; set; } + //[CoreImageProperty ("inputFontName")] + //NSString FontName { get; set; } + //[CoreImageProperty ("inputScaleFactor")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float ScaleFactor { get; set; } + //[CoreImageProperty ("inputFontSize")] + //// TODO: this was an NSNumber transformed to float, but maybe an int or bool is more appropriate + //float FontSize { get; set; } + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIMorphologyGradient { + // TODO: Needs review: https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIMorphologyMaximum { + // TODO: Needs review: https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIMorphologyMinimum { + // TODO: Needs review: https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIBlendWithBlueMask { + // TODO: Needs review: https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + } + + [CoreImageFilter] + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIFilter))] + interface CIBlendWithRedMask { + // TODO: Needs review: https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + } +#endif // false + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [Abstract] + [BaseType (typeof (NSObject))] + interface CIBarcodeDescriptor : NSSecureCoding, NSCopying { + // empty + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIBarcodeDescriptor))] + interface CIQRCodeDescriptor { + + [Export ("errorCorrectedPayload")] + NSData ErrorCorrectedPayload { get; } + + [Export ("symbolVersion")] + nint SymbolVersion { get; } + + [Export ("maskPattern")] + byte /* uint8_t */ MaskPattern { get; } + + [Export ("errorCorrectionLevel")] + CIQRCodeErrorCorrectionLevel ErrorCorrectionLevel { get; } + + [Export ("initWithPayload:symbolVersion:maskPattern:errorCorrectionLevel:")] + IntPtr Constructor (NSData errorCorrectedPayload, nint symbolVersion, byte maskPattern, CIQRCodeErrorCorrectionLevel errorCorrectionLevel); + + [Static] + [Export ("descriptorWithPayload:symbolVersion:maskPattern:errorCorrectionLevel:")] + [return: NullAllowed] + CIQRCodeDescriptor CreateDescriptor (NSData errorCorrectedPayload, nint symbolVersion, byte maskPattern, CIQRCodeErrorCorrectionLevel errorCorrectionLevel); + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIBarcodeDescriptor))] + interface CIAztecCodeDescriptor { + + [Export ("errorCorrectedPayload")] + NSData ErrorCorrectedPayload { get; } + + [Export ("isCompact")] + bool IsCompact { get; } + + [Export ("layerCount")] + nint LayerCount { get; } + + [Export ("dataCodewordCount")] + nint DataCodewordCount { get; } + + [Export ("initWithPayload:isCompact:layerCount:dataCodewordCount:")] + IntPtr Constructor (NSData errorCorrectedPayload, bool isCompact, nint layerCount, nint dataCodewordCount); + + [Static] + [Export ("descriptorWithPayload:isCompact:layerCount:dataCodewordCount:")] + [return: NullAllowed] + CIAztecCodeDescriptor CreateDescriptor (NSData errorCorrectedPayload, bool isCompact, nint layerCount, nint dataCodewordCount); + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIBarcodeDescriptor), Name = "CIPDF417CodeDescriptor")] + interface CIPdf417CodeDescriptor { + + [Export ("errorCorrectedPayload")] + NSData ErrorCorrectedPayload { get; } + + [Export ("isCompact")] + bool IsCompact { get; } + + [Export ("rowCount")] + nint RowCount { get; } + + [Export ("columnCount")] + nint ColumnCount { get; } + + [Export ("initWithPayload:isCompact:rowCount:columnCount:")] + IntPtr Constructor (NSData errorCorrectedPayload, bool isCompact, nint rowCount, nint columnCount); + + [Static] + [Export ("descriptorWithPayload:isCompact:rowCount:columnCount:")] + [return: NullAllowed] + CIPdf417CodeDescriptor CreateDescriptor (NSData errorCorrectedPayload, bool isCompact, nint rowCount, nint columnCount); + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIBarcodeDescriptor))] + interface CIDataMatrixCodeDescriptor { + + [Export ("errorCorrectedPayload")] + NSData ErrorCorrectedPayload { get; } + + [Export ("rowCount")] + nint RowCount { get; } + + [Export ("columnCount")] + nint ColumnCount { get; } + + [Export ("eccVersion")] + CIDataMatrixCodeEccVersion EccVersion { get; } + + [Export ("initWithPayload:rowCount:columnCount:eccVersion:")] + IntPtr Constructor (NSData errorCorrectedPayload, nint rowCount, nint columnCount, CIDataMatrixCodeEccVersion eccVersion); + + [Static] + [Export ("descriptorWithPayload:rowCount:columnCount:eccVersion:")] + [return: NullAllowed] + CIDataMatrixCodeDescriptor CreateDescriptor (NSData errorCorrectedPayload, nint rowCount, nint columnCount, CIDataMatrixCodeEccVersion eccVersion); + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (CIColorKernel))] + [DisableDefaultCtor] // Handle is nil for `init` + interface CIBlendKernel { + + [Static] + [Export ("kernelWithString:")] + [return: NullAllowed] + CIBlendKernel CreateKernel (string @string); + + [Export ("applyWithForeground:background:")] + [return: NullAllowed] + CIImage Apply (CIImage foreground, CIImage background); + + // @interface BuiltIn (CIBlendKernel) + + [Static] + [Export ("componentAdd", ArgumentSemantic.Strong)] + CIBlendKernel ComponentAdd { get; } + + [Static] + [Export ("componentMultiply", ArgumentSemantic.Strong)] + CIBlendKernel ComponentMultiply { get; } + + [Static] + [Export ("componentMin", ArgumentSemantic.Strong)] + CIBlendKernel ComponentMin { get; } + + [Static] + [Export ("componentMax", ArgumentSemantic.Strong)] + CIBlendKernel ComponentMax { get; } + + [Static] + [Export ("clear", ArgumentSemantic.Strong)] + CIBlendKernel Clear { get; } + + [Static] + [Export ("source", ArgumentSemantic.Strong)] + CIBlendKernel Source { get; } + + [Static] + [Export ("destination", ArgumentSemantic.Strong)] + CIBlendKernel Destination { get; } + + [Static] + [Export ("sourceOver", ArgumentSemantic.Strong)] + CIBlendKernel SourceOver { get; } + + [Static] + [Export ("destinationOver", ArgumentSemantic.Strong)] + CIBlendKernel DestinationOver { get; } + + [Static] + [Export ("sourceIn", ArgumentSemantic.Strong)] + CIBlendKernel SourceIn { get; } + + [Static] + [Export ("destinationIn", ArgumentSemantic.Strong)] + CIBlendKernel DestinationIn { get; } + + [Static] + [Export ("sourceOut", ArgumentSemantic.Strong)] + CIBlendKernel SourceOut { get; } + + [Static] + [Export ("destinationOut", ArgumentSemantic.Strong)] + CIBlendKernel DestinationOut { get; } + + [Static] + [Export ("sourceAtop", ArgumentSemantic.Strong)] + CIBlendKernel SourceAtop { get; } + + [Static] + [Export ("destinationAtop", ArgumentSemantic.Strong)] + CIBlendKernel DestinationAtop { get; } + + [Static] + [Export ("exclusiveOr", ArgumentSemantic.Strong)] + CIBlendKernel ExclusiveOr { get; } + + [Static] + [Export ("multiply", ArgumentSemantic.Strong)] + CIBlendKernel Multiply { get; } + + [Static] + [Export ("screen", ArgumentSemantic.Strong)] + CIBlendKernel Screen { get; } + + [Static] + [Export ("overlay", ArgumentSemantic.Strong)] + CIBlendKernel Overlay { get; } + + [Static] + [Export ("darken", ArgumentSemantic.Strong)] + CIBlendKernel Darken { get; } + + [Static] + [Export ("lighten", ArgumentSemantic.Strong)] + CIBlendKernel Lighten { get; } + + [Static] + [Export ("colorDodge", ArgumentSemantic.Strong)] + CIBlendKernel ColorDodge { get; } + + [Static] + [Export ("colorBurn", ArgumentSemantic.Strong)] + CIBlendKernel ColorBurn { get; } + + [Static] + [Export ("hardLight", ArgumentSemantic.Strong)] + CIBlendKernel HardLight { get; } + + [Static] + [Export ("softLight", ArgumentSemantic.Strong)] + CIBlendKernel SoftLight { get; } + + [Static] + [Export ("difference", ArgumentSemantic.Strong)] + CIBlendKernel Difference { get; } + + [Static] + [Export ("exclusion", ArgumentSemantic.Strong)] + CIBlendKernel Exclusion { get; } + + [Static] + [Export ("hue", ArgumentSemantic.Strong)] + CIBlendKernel Hue { get; } + + [Static] + [Export ("saturation", ArgumentSemantic.Strong)] + CIBlendKernel Saturation { get; } + + [Static] + [Export ("color", ArgumentSemantic.Strong)] + CIBlendKernel Color { get; } + + [Static] + [Export ("luminosity", ArgumentSemantic.Strong)] + CIBlendKernel Luminosity { get; } + + [Static] + [Export ("subtract", ArgumentSemantic.Strong)] + CIBlendKernel Subtract { get; } + + [Static] + [Export ("divide", ArgumentSemantic.Strong)] + CIBlendKernel Divide { get; } + + [Static] + [Export ("linearBurn", ArgumentSemantic.Strong)] + CIBlendKernel LinearBurn { get; } + + [Static] + [Export ("linearDodge", ArgumentSemantic.Strong)] + CIBlendKernel LinearDodge { get; } + + [Static] + [Export ("vividLight", ArgumentSemantic.Strong)] + CIBlendKernel VividLight { get; } + + [Static] + [Export ("linearLight", ArgumentSemantic.Strong)] + CIBlendKernel LinearLight { get; } + + [Static] + [Export ("pinLight", ArgumentSemantic.Strong)] + CIBlendKernel PinLight { get; } + + [Static] + [Export ("hardMix", ArgumentSemantic.Strong)] + CIBlendKernel HardMix { get; } + + [Static] + [Export ("darkerColor", ArgumentSemantic.Strong)] + CIBlendKernel DarkerColor { get; } + + [Static] + [Export ("lighterColor", ArgumentSemantic.Strong)] + CIBlendKernel LighterColor { get; } + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] // Handle is null if created thru `init` + interface CIRenderDestination { + + [Export ("initWithPixelBuffer:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer); + + [Export ("initWithIOSurface:")] + IntPtr Constructor (IOSurface.IOSurface surface); + +#if XAMCORE_2_0 + [Export ("initWithMTLTexture:commandBuffer:")] + IntPtr Constructor (IMTLTexture texture, [NullAllowed] IMTLCommandBuffer commandBuffer); + + [Export ("initWithWidth:height:pixelFormat:commandBuffer:mtlTextureProvider:")] + IntPtr Constructor (nuint width, nuint height, MTLPixelFormat pixelFormat, [NullAllowed] IMTLCommandBuffer commandBuffer, Func block); +#endif + + [Export ("initWithGLTexture:target:width:height:")] + IntPtr Constructor (uint texture, uint target, nuint width, nuint height); + + [Export ("initWithBitmapData:width:height:bytesPerRow:format:")] + IntPtr Constructor (IntPtr data, nuint width, nuint height, nuint bytesPerRow, CIFormat format); + + [Export ("width")] + nuint Width { get; } + + [Export ("height")] + nuint Height { get; } + + [Export ("alphaMode", ArgumentSemantic.Assign)] + CIRenderDestinationAlphaMode AlphaMode { get; set; } + + [Export ("flipped")] + bool Flipped { [Bind ("isFlipped")] get; set; } + + [Export ("dithered")] + bool Dithered { [Bind ("isDithered")] get; set; } + + [Export ("clamped")] + bool Clamped { [Bind ("isClamped")] get; set; } + + [NullAllowed, Export ("colorSpace", ArgumentSemantic.Assign)] + CGColorSpace ColorSpace { get; set; } + + [NullAllowed, Export ("blendKernel", ArgumentSemantic.Retain)] + CIBlendKernel BlendKernel { get; set; } + + [Export ("blendsInDestinationColorSpace")] + bool BlendsInDestinationColorSpace { get; set; } + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] // no docs, but only returned from CIRenderTask.WaitUntilCompleted. Handle is null if created thru `init` + interface CIRenderInfo { + + [Export ("kernelExecutionTime")] + double KernelExecutionTime { get; } + + [Export ("passCount")] + nint PassCount { get; } + + [Export ("pixelsProcessed")] + nint PixelsProcessed { get; } + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] // no docs, but only returned from CIContext.StartTaskToRender. Handle is null if created thru `init` + interface CIRenderTask { + [Export ("waitUntilCompletedAndReturnError:")] + [return: NullAllowed] + CIRenderInfo WaitUntilCompleted ([NullAllowed] out NSError error); + } + + [iOS (11,0)] + [Mac (10,13)] + [TV (11,0)] + [Category] + [BaseType (typeof (CIContext))] + interface CIContext_CIRenderDestination { + + [Export ("prepareRender:fromRect:toDestination:atPoint:error:")] + bool PrepareRender (CIImage image, CGRect fromRect, CIRenderDestination destination, CGPoint atPoint, [NullAllowed] out NSError error); + + [Export ("startTaskToRender:fromRect:toDestination:atPoint:error:")] + [return: NullAllowed] + CIRenderTask StartTaskToRender (CIImage image, CGRect fromRect, CIRenderDestination destination, CGPoint atPoint, [NullAllowed] out NSError error); + + [Export ("startTaskToRender:toDestination:error:")] + [return: NullAllowed] + CIRenderTask StartTaskToRender (CIImage image, CIRenderDestination destination, [NullAllowed] out NSError error); + + [Export ("startTaskToClear:error:")] + [return: NullAllowed] + CIRenderTask StartTaskToClear (CIRenderDestination destination, [NullAllowed] out NSError error); + } + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [Static] + [Internal] + partial interface CIImageRepresentationKeys { + + [Field ("kCGImageDestinationLossyCompressionQuality", "ImageIO")] + NSString LossyCompressionQualityKey { get; } + + [Field ("kCIImageRepresentationAVDepthData")] + NSString AVDepthDataKey { get; } + + [Field ("kCIImageRepresentationDepthImage")] + NSString DepthImageKey { get; } + + [Field ("kCIImageRepresentationDisparityImage")] + NSString DisparityImageKey { get; } + } + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13)] + [StrongDictionary ("CIImageRepresentationKeys")] + interface CIImageRepresentationOptions { + + float LossyCompressionQuality { get; set; } + +#if false // keys lack documentation (or sample) to expose properly - https://bugzilla.xamarin.com/show_bug.cgi?id=59296 + bool AVDepthData { get; set; } + + bool DepthImage { get; set; } + + bool DisparityImage { get; set; } +#endif + } } diff --git a/src/corelocation.cs b/src/corelocation.cs index dd8401c95bc3..b5677b6446c0 100644 --- a/src/corelocation.cs +++ b/src/corelocation.cs @@ -16,6 +16,9 @@ #if !MONOMAC using XamCore.UIKit; #endif +#if XAMCORE_2_0 && !TVOS +using XamCore.Contacts; +#endif using System; namespace XamCore.CoreLocation { @@ -101,7 +104,7 @@ partial interface CLLocation : NSSecureCoding, NSCopying { #if !XAMCORE_2_0 [Export ("getDistanceFrom:")] - [Availability (Deprecated = Platform.iOS_3_2, Message = "Use DistanceFrom instead")] + [Availability (Deprecated = Platform.iOS_3_2, Message = "Use 'DistanceFrom' instead.")] double Distancefrom (CLLocation location); #endif @@ -227,13 +230,13 @@ partial interface CLLocationManager { bool SignificantLocationChangeMonitoringAvailable { get; } [NoWatch][NoTV] - [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use IsMonitoringAvailable instead")] + [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'IsMonitoringAvailable' instead.")] [Export ("regionMonitoringAvailable"), Static] bool RegionMonitoringAvailable { get; } [NoWatch][NoTV] [Since (4,0)] - [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_10, Message = "Use IsMonitoringAvailable and AuthorizationStatus instead")] + [Availability (Introduced = Platform.iOS_4_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_10, Message = "Use 'IsMonitoringAvailable' and 'AuthorizationStatus' instead.")] [Export ("regionMonitoringEnabled"), Static] bool RegionMonitoringEnabled { get; } @@ -299,7 +302,8 @@ partial interface CLLocationManager { void StartMonitoring (CLRegion region); #if !MONOMAC - [NoWatch][NoTV] + [NoTV] + [Watch (4,0)] [Since (6,0)] [Export ("activityType", ArgumentSemantic.Assign)] CLActivityType ActivityType { get; set; } @@ -387,10 +391,14 @@ partial interface CLLocationManager { [Export ("requestLocation")] void RequestLocation (); - [NoWatch][NoTV] - [iOS (9,0)] + [NoTV] + [iOS (9,0), Watch (4,0)] [Export ("allowsBackgroundLocationUpdates")] bool AllowsBackgroundLocationUpdates { get; set; } + + [NoWatch, NoTV, NoMac, iOS (11,0)] + [Export ("showsBackgroundLocationIndicator")] + bool ShowsBackgroundLocationIndicator { get; set; } #endif } @@ -503,12 +511,12 @@ partial interface CLLocationDistance { [DisableDefaultCtor] // will crash, see CoreLocation.cs for compatibility stubs partial interface CLRegion : NSSecureCoding, NSCopying { [NoTV] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use CLCircularRegion instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'CLCircularRegion' instead.")] [Export ("center")] CLLocationCoordinate2D Center { get; } [NoTV] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use CLCircularRegion instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'CLCircularRegion' instead.")] [Export ("radius")] double Radius { get; } @@ -516,12 +524,12 @@ partial interface CLRegion : NSSecureCoding, NSCopying { string Identifier { get; } [NoTV] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use CLCircularRegion instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'CLCircularRegion' instead.")] [Export ("initCircularRegionWithCenter:radius:identifier:")] IntPtr Constructor (CLLocationCoordinate2D center, double radius, string identifier); [NoTV] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use CLCircularRegion instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'CLCircularRegion' instead.")] [Export ("containsCoordinate:")] bool Contains (CLLocationCoordinate2D coordinate); @@ -539,6 +547,9 @@ partial interface CLRegion : NSSecureCoding, NSCopying { [BaseType (typeof (NSObject))] [DisableDefaultCtor] // will crash, see CoreLocation.cs for compatibility stubs interface CLPlacemark : NSSecureCoding, NSCopying { + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'CLPlacemark' properties to access data.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'CLPlacemark' properties to access data.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'CLPlacemark' properties to access data.")] [Export("addressDictionary", ArgumentSemantic.Copy)] NSDictionary AddressDictionary { get; } @@ -593,6 +604,12 @@ interface CLPlacemark : NSSecureCoding, NSCopying { [Export ("timeZone")] [iOS (9,0), Mac(10,11)] NSTimeZone TimeZone { get; } +#if XAMCORE_2_0 && !TVOS + // From CLPlacemark (ContactsAdditions) category. + [Watch (4,0), NoTV, Mac (10,13), iOS (11,0)] + [NullAllowed, Export ("postalAddress")] + CNPostalAddress PostalAddress { get; } +#endif } [Mac (10,10)] @@ -684,6 +701,14 @@ interface CLGeocoder { [Async] void ReverseGeocodeLocation (CLLocation location, CLGeocodeCompletionHandler completionHandler); + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("reverseGeocodeLocation:preferredLocale:completionHandler:")] + [Async] + void ReverseGeocodeLocation (CLLocation location, [NullAllowed] NSLocale locale, CLGeocodeCompletionHandler completionHandler); + + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'GeocodeAddress (string, CLRegion, NSLocale, CLGeocodeCompletionHandler)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'GeocodeAddress (string, CLRegion, NSLocale, CLGeocodeCompletionHandler)' instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'GeocodeAddress (string, CLRegion, NSLocale, CLGeocodeCompletionHandler)' instead.")] [Export ("geocodeAddressDictionary:completionHandler:")] [Async] void GeocodeAddress (NSDictionary addressDictionary, CLGeocodeCompletionHandler completionHandler); @@ -696,8 +721,25 @@ interface CLGeocoder { [Async] void GeocodeAddress (string addressString, CLRegion region, CLGeocodeCompletionHandler completionHandler); + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Async] + [Export ("geocodeAddressString:inRegion:preferredLocale:completionHandler:")] + void GeocodeAddress (string addressString, [NullAllowed] CLRegion region, [NullAllowed] NSLocale locale, CLGeocodeCompletionHandler completionHandler); + [Export ("cancelGeocode")] void CancelGeocode (); + +#if XAMCORE_2_0 && !TVOS + [Watch (4,0), NoTV, Mac (10,13), iOS (11,0)] + [Export ("geocodePostalAddress:completionHandler:")] + [Async] + void GeocodePostalAddress (CNPostalAddress postalAddress, CLGeocodeCompletionHandler completionHandler); + + [Watch (4,0), NoTV, Mac (10,13), iOS (11,0)] + [Export ("geocodePostalAddress:preferredLocale:completionHandler:")] + [Async] + void GeocodePostalAddress (CNPostalAddress postalAddress, [NullAllowed] NSLocale locale, CLGeocodeCompletionHandler completionHandler); +#endif } #if !MONOMAC diff --git a/src/coreml.cs b/src/coreml.cs new file mode 100644 index 000000000000..74029a3f68c1 --- /dev/null +++ b/src/coreml.cs @@ -0,0 +1,350 @@ +// +// CoreML C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.ObjCRuntime; +using XamCore.CoreFoundation; +using XamCore.CoreVideo; +using XamCore.Foundation; + +namespace XamCore.CoreML { + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Native] + public enum MLFeatureType : nint { + Invalid = 0, + Int64 = 1, + Double = 2, + String = 3, + Image = 4, + MultiArray = 5, + Dictionary = 6, + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [ErrorDomain ("MLModelErrorDomain")] + [Native] + public enum MLModelError : nint { + Generic = 0, + FeatureType = 1, + IO = 3, + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Native] + public enum MLMultiArrayDataType : nint { + Double = 65536 | 64, + Float32 = 65536 | 32, + Int32 = 131072 | 32, + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + interface MLDictionaryFeatureProvider : MLFeatureProvider { + + [Export ("dictionary")] + NSDictionary Dictionary { get; } + + [Export ("initWithDictionary:error:")] + IntPtr Constructor (NSDictionary dictionary, out NSError error); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + interface MLFeatureDescription : NSCopying { + + [Export ("name")] + string Name { get; } + + [Export ("type")] + MLFeatureType Type { get; } + + [Export ("optional")] + bool Optional { [Bind ("isOptional")] get; } + + [Export ("isAllowedValue:")] + bool IsAllowed (MLFeatureValue value); + + // Category MLFeatureDescription (MLFeatureValueConstraints) + + [NullAllowed, Export ("multiArrayConstraint", ArgumentSemantic.Assign)] + MLMultiArrayConstraint MultiArrayConstraint { get; } + + [NullAllowed, Export ("imageConstraint", ArgumentSemantic.Assign)] + MLImageConstraint ImageConstraint { get; } + + [NullAllowed, Export ("dictionaryConstraint", ArgumentSemantic.Assign)] + MLDictionaryConstraint DictionaryConstraint { get; } + } + + interface IMLFeatureProvider { } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Protocol] + interface MLFeatureProvider { + + [Abstract] + [Export ("featureNames")] + NSSet FeatureNames { get; } + + [Abstract] + [Export ("featureValueForName:")] + [return: NullAllowed] + MLFeatureValue GetFeatureValue (string featureName); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + interface MLFeatureValue : NSCopying { + + [Export ("type")] + MLFeatureType Type { get; } + + [Export ("undefined")] + bool Undefined { [Bind ("isUndefined")] get; } + + [Export ("int64Value")] + long Int64Value { get; } + + [Export ("doubleValue")] + double DoubleValue { get; } + + [Export ("stringValue")] + string StringValue { get; } + + [NullAllowed, Export ("multiArrayValue")] + MLMultiArray MultiArrayValue { get; } + + [Export ("dictionaryValue")] + NSDictionary DictionaryValue { get; } + + [NullAllowed, Export ("imageBufferValue")] + CVPixelBuffer ImageBufferValue { get; } + + [Static] + [Export ("featureValueWithPixelBuffer:")] + MLFeatureValue Create (CVPixelBuffer value); + + [Static] + [Export ("featureValueWithInt64:")] + MLFeatureValue Create (long value); + + [Static] + [Export ("featureValueWithDouble:")] + MLFeatureValue Create (double value); + + [Static] + [Export ("featureValueWithString:")] + MLFeatureValue Create (string value); + + [Static] + [Export ("featureValueWithMultiArray:")] + MLFeatureValue Create (MLMultiArray value); + + [Static] + [Export ("undefinedFeatureValueWithType:")] + MLFeatureValue CreateUndefined (MLFeatureType type); + + [Static] + [Export ("featureValueWithDictionary:error:")] + [return: NullAllowed] + MLFeatureValue Create (NSDictionary value, out NSError error); + + [Export ("isEqualToFeatureValue:")] + bool IsEqual (MLFeatureValue value); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + interface MLModel { + + [Export ("modelDescription")] + MLModelDescription ModelDescription { get; } + + [Static] + [Export ("modelWithContentsOfURL:error:")] + [return: NullAllowed] + MLModel Create (NSUrl url, out NSError error); + + [Export ("predictionFromFeatures:error:")] + [return: NullAllowed] + IMLFeatureProvider GetPrediction (IMLFeatureProvider input, out NSError error); + + [Export ("predictionFromFeatures:options:error:")] + [return: NullAllowed] + IMLFeatureProvider GetPrediction (IMLFeatureProvider input, MLPredictionOptions options, out NSError error); + + // Category MLModel (MLModelCompilation) + + [Static] + [Export ("compileModelAtURL:error:")] + [return: NullAllowed] + NSUrl CompileModel (NSUrl modelUrl, out NSError error); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + interface MLModelDescription { + + [Export ("inputDescriptionsByName")] + NSDictionary InputDescriptionsByName { get; } + + [Export ("outputDescriptionsByName")] + NSDictionary OutputDescriptionsByName { get; } + + [NullAllowed, Export ("predictedFeatureName")] + string PredictedFeatureName { get; } + + [NullAllowed, Export ("predictedProbabilitiesName")] + string PredictedProbabilitiesName { get; } + + [Export ("metadata")] + [Internal] + NSDictionary _Metadata { get; } + + [Wrap ("_Metadata")] + MLModelMetadata Metadata { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Internal] + [Static] + interface MLModelMetadataKeys { + + [Field ("MLModelDescriptionKey")] + NSString DescriptionKey { get; } + + [Field ("MLModelVersionStringKey")] + NSString VersionStringKey { get; } + + [Field ("MLModelAuthorKey")] + NSString AuthorKey { get; } + + [Field ("MLModelLicenseKey")] + NSString LicenseKey { get; } + + [Field ("MLModelCreatorDefinedKey")] + NSString CreatorDefinedKey { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [StrongDictionary ("MLModelMetadataKeys")] + interface MLModelMetadata { + string Description { get; } + string VersionString { get; } + string Author { get; } + string License { get; } + string CreatorDefined { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface MLMultiArray { + + [Export ("dataPointer")] + IntPtr DataPointer { get; } + + [Export ("dataType")] + MLMultiArrayDataType DataType { get; } + + [Internal] + [Export ("shape")] + IntPtr _Shape { get; } + + [Internal] + [Export ("strides")] + IntPtr _Strides { get; } + + [Export ("count")] + nint Count { get; } + + // From MLMultiArray (Creation) Category + + [Export ("initWithShape:dataType:error:")] + IntPtr Constructor (NSNumber [] shape, MLMultiArrayDataType dataType, out NSError error); + + [Export ("initWithDataPointer:shape:dataType:strides:deallocator:error:")] + IntPtr Constructor (IntPtr dataPointer, NSNumber [] shape, MLMultiArrayDataType dataType, NSNumber [] strides, Action deallocator, out NSError error); + + // From MLMultiArray (NSNumberDataAccess) Category + + [Export ("objectAtIndexedSubscript:")] + NSNumber GetObject (nint idx); + + [Export ("objectForKeyedSubscript:")] + NSNumber GetObject (NSNumber [] key); + + [Sealed] + [Export ("objectForKeyedSubscript:")] + [Internal] + // Bind 'key' as IntPtr to avoid multiple conversions (nint[] -> NSNumber[] -> NSArray) + NSNumber GetObject (IntPtr key); + + [Export ("setObject:atIndexedSubscript:")] + void SetObject (NSNumber obj, nint idx); + + [Export ("setObject:forKeyedSubscript:")] + void SetObject (NSNumber obj, NSNumber [] key); + + [Sealed] + [Export ("setObject:forKeyedSubscript:")] + [Internal] + // Bind 'key' as IntPtr to avoid multiple conversions (nint[] -> NSNumber[] -> NSArray) + void SetObject (NSNumber obj, IntPtr key); + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface MLDictionaryConstraint { + + [Export ("keyType")] + MLFeatureType KeyType { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface MLImageConstraint { + + [Export ("pixelsHigh")] + nint PixelsHigh { get; } + + [Export ("pixelsWide")] + nint PixelsWide { get; } + + [Export ("pixelFormatType")] + uint PixelFormatType { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface MLMultiArrayConstraint { + + [Internal] + [Export ("shape")] + IntPtr _Shape { get; } + + [Export ("dataType")] + MLMultiArrayDataType DataType { get; } + } + + [Watch (4,0), TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + interface MLPredictionOptions { + + [Export ("usesCPUOnly")] + bool UsesCpuOnly { get; set; } + } +} +#endif // XAMCORE_2_0 diff --git a/src/coremotion.cs b/src/coremotion.cs index b0082b9f287d..c0e399ef7baf 100644 --- a/src/coremotion.cs +++ b/src/coremotion.cs @@ -204,6 +204,10 @@ interface CMDeviceMotion : NSSecureCoding { [Since (5,0)] [Export ("magneticField")] CMCalibratedMagneticField MagneticField { get; } + + [Watch (4,0), iOS (11,0)] + [Export ("heading")] + double Heading { get; } } [BaseType (typeof (CMLogItem))] @@ -236,7 +240,7 @@ interface CMMagnetometerData : NSSecureCoding { [NoWatch] [Since (7,0)] [BaseType (typeof (NSObject))] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use CMPedometer instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'CMPedometer' instead.")] interface CMStepCounter { [Static] @@ -340,6 +344,11 @@ interface CMPedometer { [Watch (3,0)][iOS (10,0)] [Export ("stopPedometerEventUpdates")] void StopPedometerEventUpdates (); + + [Watch (4,0), iOS (11,0)] + [Static] + [Export ("authorizationStatus")] + CMAuthorizationStatus AuthorizationStatus { get; } } [Since (7,0)] @@ -365,6 +374,11 @@ interface CMMotionActivityManager { [Export ("stopActivityUpdates")] void StopActivityUpdates (); + + [Watch (4,0), iOS (11,0)] + [Static] + [Export ("authorizationStatus")] + CMAuthorizationStatus AuthorizationStatus { get; } } [Since (7,0)] @@ -421,6 +435,20 @@ interface CMAltimeter { [Export ("stopRelativeAltitudeUpdates")] void StopRelativeAltitudeUpdates (); + + [Watch (4,0), iOS (11,0)] + [Static] + [Export ("authorizationStatus")] + CMAuthorizationStatus AuthorizationStatus { get; } + } + + [Watch (4,0), iOS (11,0)] + [Native] + public enum CMAuthorizationStatus : nint { + NotDetermined = 0, + Restricted, + Denied, + Authorized, } [iOS (9,0)] @@ -438,6 +466,8 @@ interface CMSensorRecorder [Export ("isAccelerometerRecordingAvailable")] bool IsAccelerometerRecordingAvailable { get; } + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'CMSensorRecorder.AuthorizationStatus' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'CMSensorRecorder.AuthorizationStatus' instead.")] [Static] [Export ("isAuthorizedForRecording")] bool IsAuthorizedForRecording { get; } @@ -450,6 +480,11 @@ interface CMSensorRecorder [iOS (9,3)] // Apple changed the selector in 9.3 and removed the old one [Export ("recordAccelerometerForDuration:")] void RecordAccelerometer (double duration); + + [Watch (4, 0), iOS (11, 0)] + [Static] + [Export ("authorizationStatus")] + CMAuthorizationStatus AuthorizationStatus { get; } } [Watch (3,0)][NoTV][iOS (10,0)] diff --git a/src/corenfc.cs b/src/corenfc.cs new file mode 100644 index 000000000000..16bfbe4b7f71 --- /dev/null +++ b/src/corenfc.cs @@ -0,0 +1,300 @@ +// +// CoreNFC C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.ObjCRuntime; +using XamCore.CoreFoundation; +using XamCore.Foundation; + +namespace XamCore.CoreNFC { + // Note on Availability: + // This framework says it is available on tvOS but + // nothing else but NFCReaderError is available on it in beta 1 + // keeping the original Availability attributes commented just in case + // this changes in a future beta and will just be enabled in iOS for now. + + //[iOS (11, 0), TV (11, 0), NoWatch, NoMac] + [iOS (11,0)] + [ErrorDomain ("NFCErrorDomain")] + [Native] + public enum NFCReaderError : nint { + UnsupportedFeature = 1, + SecurityViolation, + ReaderTransceiveErrorTagConnectionLost = 100, + ReaderTransceiveErrorRetryExceeded, + ReaderTransceiveErrorTagResponseError, + ReaderSessionInvalidationErrorUserCanceled = 200, + ReaderSessionInvalidationErrorSessionTimeout, + ReaderSessionInvalidationErrorSessionTerminatedUnexpectedly, + ReaderSessionInvalidationErrorSystemIsBusy, + ReaderSessionInvalidationErrorFirstNDEFTagRead, + TagCommandConfigurationErrorInvalidParameters = 300, + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [Native] + public enum NFCTagType : nuint { + Iso15693 = 1, + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + public enum NFCTypeNameFormat : byte { // uint8_t + Empty = 0x00, + NFCWellKnown = 0x01, + Media = 0x02, + AbsoluteUri = 0x03, + NFCExternal = 0x04, + Unknown = 0x05, + Unchanged = 0x06, + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NFCReaderSession), Name = "NFCISO15693ReaderSession")] + [DisableDefaultCtor] + interface NFCIso15693ReaderSession { + + [Field ("NFCISO15693TagResponseErrorKey")] + NSString TagResponseErrorKey { get; } + + [Export ("initWithDelegate:queue:")] + [DesignatedInitializer] + IntPtr Constructor (INFCReaderSessionDelegate @delegate, [NullAllowed] DispatchQueue queue); + + [Static] + [Export ("readingAvailable")] + bool ReadingAvailable { get; } + + [Export ("restartPolling")] + void RestartPolling (); + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NFCTagCommandConfiguration), Name = "NFCISO15693CustomCommandConfiguration")] + interface NFCIso15693CustomCommandConfiguration { + + [Export ("manufacturerCode")] + nuint ManufacturerCode { get; set; } + + [Export ("customCommandCode")] + nuint CustomCommandCode { get; set; } + + [Export ("requestParameters", ArgumentSemantic.Copy)] + NSData RequestParameters { get; set; } + + [Export ("initWithManufacturerCode:customCommandCode:requestParameters:")] + IntPtr Constructor (nuint manufacturerCode, nuint customCommandCode, [NullAllowed] NSData requestParameters); + + [Export ("initWithManufacturerCode:customCommandCode:requestParameters:maximumRetries:retryInterval:")] + IntPtr Constructor (nuint manufacturerCode, nuint customCommandCode, [NullAllowed] NSData requestParameters, nuint maximumRetries, double retryInterval); + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NFCTagCommandConfiguration), Name = "NFCISO15693ReadMultipleBlocksConfiguration")] + interface NFCIso15693ReadMultipleBlocksConfiguration { + + [Export ("range", ArgumentSemantic.Assign)] + NSRange Range { get; set; } + + [Export ("chunkSize")] + nuint ChunkSize { get; set; } + + [Export ("initWithRange:chunkSize:")] + IntPtr Constructor (NSRange range, nuint chunkSize); + + [Export ("initWithRange:chunkSize:maximumRetries:retryInterval:")] + IntPtr Constructor (NSRange range, nuint chunkSize, nuint maximumRetries, double retryInterval); + } + + interface INFCIso15693Tag { } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [Protocol (Name = "NFCISO15693Tag")] + interface NFCIso15693Tag : NFCTag { + + [Abstract] + [Export ("identifier", ArgumentSemantic.Copy)] + NSData Identifier { get; } + + [Abstract] + [Export ("icManufacturerCode")] + nuint IcManufacturerCode { get; } + + [Abstract] + [Export ("icSerialNumber", ArgumentSemantic.Copy)] + NSData IcSerialNumber { get; } + + [Abstract] + [Export ("sendCustomCommandWithConfiguration:completionHandler:")] + void SendCustomCommand (NFCIso15693CustomCommandConfiguration commandConfiguration, Action completionHandler); + + [Abstract] + [Export ("readMultipleBlocksWithConfiguration:completionHandler:")] + void ReadMultipleBlocks (NFCIso15693ReadMultipleBlocksConfiguration readConfiguration, Action completionHandler); + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "NFCNDEFPayload")] + [DisableDefaultCtor] + interface NFCNdefPayload : NSSecureCoding { + + [Export ("typeNameFormat", ArgumentSemantic.Assign)] + NFCTypeNameFormat TypeNameFormat { get; set; } + + [Export ("type", ArgumentSemantic.Copy)] + NSData Type { get; set; } + + [Export ("identifier", ArgumentSemantic.Copy)] + NSData Identifier { get; set; } + + [Export ("payload", ArgumentSemantic.Copy)] + NSData Payload { get; set; } + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "NFCNDEFMessage")] + [DisableDefaultCtor] + interface NFCNdefMessage : NSSecureCoding { + + [Export ("records", ArgumentSemantic.Copy)] + NFCNdefPayload [] Records { get; set; } + } + + interface INFCNdefReaderSessionDelegate { } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof (NSObject), Name = "NFCNDEFReaderSessionDelegate")] + interface NFCNdefReaderSessionDelegate { + + [Abstract] + [Export ("readerSession:didInvalidateWithError:")] + void DidInvalidate (NFCNdefReaderSession session, NSError error); + + [Abstract] + [Export ("readerSession:didDetectNDEFs:")] + void DidDetect (NFCNdefReaderSession session, NFCNdefMessage [] messages); + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NFCReaderSession), Name = "NFCNDEFReaderSession")] + [DisableDefaultCtor] + interface NFCNdefReaderSession { + + [Export ("initWithDelegate:queue:invalidateAfterFirstRead:")] + [DesignatedInitializer] + IntPtr Constructor (INFCNdefReaderSessionDelegate @delegate, [NullAllowed] DispatchQueue queue, bool invalidateAfterFirstRead); + + [Static] + [Export ("readingAvailable")] + bool ReadingAvailable { get; } + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface NFCReaderSession : NFCReaderSessionContract { + + [Export ("delegate", ArgumentSemantic.Weak), NullAllowed] + INFCReaderSessionDelegate Delegate { get; } + + [Export ("sessionQueue")] + DispatchQueue SessionQueue { get; } + } + + interface INFCReaderSessionContract { } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [Protocol (Name = "NFCReaderSession")] + interface NFCReaderSessionContract { + + [Abstract] + [Export ("ready")] + bool Ready { [Bind ("isReady")] get; } + + [Abstract] + [Export ("alertMessage")] + string AlertMessage { get; set; } + + [Abstract] + [Export ("beginSession")] + void BeginSession (); + + [Abstract] + [Export ("invalidateSession")] + void InvalidateSession (); + } + + interface INFCReaderSessionDelegate { } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof (NSObject))] + interface NFCReaderSessionDelegate { + + [Abstract] + [Export ("readerSessionDidBecomeActive:")] + void DidBecomeActive (NFCReaderSession session); + + [Abstract] + [Export ("readerSession:didDetectTags:")] + void DidDetectTags (NFCReaderSession session, INFCTag [] tags); + + [Abstract] + [Export ("readerSession:didInvalidateWithError:")] + void DidInvalidate (NFCReaderSession session, NSError error); + } + + interface INFCTag { } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [Protocol] + interface NFCTag : NSSecureCoding, NSCopying { + + [Abstract] + [Export ("type", ArgumentSemantic.Assign)] + NFCTagType Type { get; } + + [Abstract] + [NullAllowed, Export ("session", ArgumentSemantic.Weak)] + NFCReaderSession Session { get; } + + [Abstract] + [Export ("available")] + bool Available { [Bind ("isAvailable")] get; } + } + + //[iOS (11,0), NoTV, NoWatch, NoMac] + [iOS (11,0)] + [BaseType (typeof (NSObject))] + interface NFCTagCommandConfiguration : NSCopying { + + [Export ("maximumRetries")] + nuint MaximumRetries { get; set; } + + [Export ("retryInterval")] + double RetryInterval { get; set; } + } +} +#endif diff --git a/src/corespotlight.cs b/src/corespotlight.cs index 2302c8b58ca9..08236e41cc06 100644 --- a/src/corespotlight.cs +++ b/src/corespotlight.cs @@ -124,6 +124,16 @@ interface CSSearchableIndexDelegate { [Export ("searchableIndexDidFinishThrottle:")] void DidFinishThrottle (CSSearchableIndex searchableIndex); + + [iOS (11,0), NoTV, Mac (10,13)] + [Export ("dataForSearchableIndex:itemIdentifier:typeIdentifier:error:")] + [return: NullAllowed] + NSData GetData (CSSearchableIndex searchableIndex, string itemIdentifier, string typeIdentifier, out NSError outError); + + [iOS (11,0), NoTV, Mac (10,13)] + [Export ("fileURLForSearchableIndex:itemIdentifier:typeIdentifier:inPlace:error:")] + [return: NullAllowed] + NSUrl GetFileUrl (CSSearchableIndex searchableIndex, string itemIdentifier, string typeIdentifier, bool inPlace, out NSError outError); } [NoTV] // CS_TVOS_UNAVAILABLE @@ -979,6 +989,41 @@ interface CSSearchableItemAttributeSet : NSCopying, NSSecureCoding { [Export ("valueForCustomKey:")] [return: NullAllowed] INSSecureCoding ValueForCustomKey (CSCustomAttributeKey key); + + // CSSearchableItemAttributeSet_CSGeneral + + [iOS (11,0), NoTV, Mac (10, 11)] + [NullAllowed, Export ("userCreated", ArgumentSemantic.Strong)] + [Internal] // We would like to use [BindAs (typeof (bool?))] + NSNumber _IsUserCreated { [Bind ("isUserCreated")] get; set; } + + [iOS (11, 0), NoTV, Mac (10, 11)] + [NullAllowed, Export ("userOwned", ArgumentSemantic.Strong)] + [Internal] // We would like to use[BindAs (typeof (bool?))] + NSNumber _IsUserOwned { [Bind ("isUserOwned")] get; set; } + + [iOS (11, 0), NoTV, Mac (10, 11)] + [NullAllowed, Export ("userCurated", ArgumentSemantic.Strong)] + [Internal] // We would like to use [BindAs (typeof (bool?))] + NSNumber _IsUserCurated { [Bind ("isUserCurated")] get; set; } + + [iOS (11, 0), NoTV, Mac (10, 11)] + [NullAllowed, Export ("rankingHint", ArgumentSemantic.Strong)] + NSNumber RankingHint { get; set; } + + // CSSearchableItemAttributeSet_CSItemProvider + + [iOS (11, 0), NoTV, Mac (10, 11)] + [NullAllowed, Export ("providerDataTypeIdentifiers", ArgumentSemantic.Copy)] + string[] ProviderDataTypeIdentifiers { get; set; } + + [iOS (11, 0), NoTV, Mac (10, 11)] + [NullAllowed, Export ("providerFileTypeIdentifiers", ArgumentSemantic.Copy)] + string[] ProviderFileTypeIdentifiers { get; set; } + + [iOS (11, 0), NoTV, Mac (10, 11)] + [NullAllowed, Export ("providerInPlaceFileTypeIdentifiers", ArgumentSemantic.Copy)] + string[] ProviderInPlaceFileTypeIdentifiers { get; set; } } [NoTV][iOS (10,0)] diff --git a/src/coretelephony.cs b/src/coretelephony.cs index c0c9d72e42b1..17335860084a 100644 --- a/src/coretelephony.cs +++ b/src/coretelephony.cs @@ -6,11 +6,11 @@ namespace XamCore.CoreTelephony { [Since (4,0)] [BaseType (typeof (NSObject))] interface CTCall { - [Availability (Deprecated = Platform.iOS_10_0, Message = "Use CallKit")] + [Availability (Deprecated = Platform.iOS_10_0, Message = "Use 'CallKit' instead.")] [Export ("callID")] string CallID { get; } - [Availability (Deprecated = Platform.iOS_10_0, Message = "Use CallKit")] + [Availability (Deprecated = Platform.iOS_10_0, Message = "Use 'CallKit' instead.")] [Export ("callState")] string CallState { get; } @@ -90,10 +90,11 @@ interface CTTelephonyNetworkInfo { delegate void CTCallEventHandler (CTCall call); #endif + [Deprecated (PlatformName.iOS, 10, 0, message: "Replaced by 'CXCallObserver' from 'CallKit'.")] [BaseType (typeof (NSObject))] [Since (4,0)] interface CTCallCenter { - [Availability (Deprecated = Platform.iOS_10_0, Message = "Use CallKit")] + [Availability (Deprecated = Platform.iOS_10_0, Message = "Use 'CallKit' instead.")] [NullAllowed] // by default this property is null [Export ("callEventHandler")] #if XAMCORE_2_0 @@ -102,7 +103,7 @@ interface CTCallCenter { CTCallEventHandler CallEventHandler { get; set; } #endif - [Availability (Deprecated = Platform.iOS_10_0, Message = "Use CallKit")] + [Availability (Deprecated = Platform.iOS_10_0, Message = "Use 'CallKit' instead.")] [Export ("currentCalls")] NSSet CurrentCalls { get; } diff --git a/src/corevideo.cs b/src/corevideo.cs index 793acf00ad7b..69ce5ce1351f 100644 --- a/src/corevideo.cs +++ b/src/corevideo.cs @@ -267,10 +267,12 @@ interface CVPixelBuffer { NSString PlaneAlignmentKey { get; } #if !MONOMAC || !XAMCORE_2_0 + [NoWatch] [iOS (6,0)] [Field ("kCVPixelBufferOpenGLESCompatibilityKey")] NSString OpenGLESCompatibilityKey { get; } + [NoWatch] [iOS (9,0)] [Field ("kCVPixelBufferOpenGLESTextureCacheCompatibilityKey")] NSString OpenGLESTextureCacheCompatibilityKey { get; } @@ -301,6 +303,7 @@ interface CVPixelBufferPool : CVImageBuffer { } #if !MONOMAC + [NoWatch] [Partial] interface CVMetalTextureCache { [Internal] diff --git a/src/corewlan.cs b/src/corewlan.cs index 7c4f2a793d50..889c107e91d7 100644 --- a/src/corewlan.cs +++ b/src/corewlan.cs @@ -409,6 +409,18 @@ interface CWInterface { [Export ("commitConfiguration:authorization:error:")] bool CommitConfiguration (CWConfiguration configuration, NSObject authorization, out NSError error); + + [Mac (10,13)] + [Export ("scanForNetworksWithSSID:includeHidden:error:")] + [return: NullAllowed] + [Internal] + NSSet _ScanForNetworksWithSsid ([NullAllowed] NSData ssid, bool includeHidden, [NullAllowed] out NSError error); + + [Mac (10,13)] + [Export ("scanForNetworksWithName:includeHidden:error:")] + [return: NullAllowed] + [Internal] + NSSet _ScanForNetworksWithName ([NullAllowed] string networkName, bool includeHidden, [NullAllowed] out NSError error); } [BaseType (typeof (NSObject))] diff --git a/src/devicecheck.cs b/src/devicecheck.cs new file mode 100644 index 000000000000..805c331f5bf9 --- /dev/null +++ b/src/devicecheck.cs @@ -0,0 +1,45 @@ +// +// DeviceCheck C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.ObjCRuntime; +using XamCore.Foundation; + +namespace XamCore.DeviceCheck { + + [TV (11,0), NoWatch, NoMac, iOS (11,0)] + [ErrorDomain ("DCErrorDomain")] + [Native] + public enum DCError : nint { + UnknownSystemFailure, + FeatureUnsupported + } + + [TV (11,0), NoWatch, NoMac, iOS (11,0)] + delegate void DCDeviceGenerateTokenCompletionHandler ([NullAllowed] NSData token, [NullAllowed] NSError error); + + [TV (11,0), NoWatch, NoMac, iOS (11,0)] + [DisableDefaultCtor] // From the documentation it seems the only way to create a usable instance is to use the static CurrentDevice property. + [BaseType (typeof (NSObject))] + interface DCDevice { + + [Static] + [Export ("currentDevice")] + DCDevice CurrentDevice { get; } + + [Export ("supported")] + bool Supported { [Bind ("isSupported")] get; } + + [Async] + [Export ("generateTokenWithCompletionHandler:")] + void GenerateToken (DCDeviceGenerateTokenCompletionHandler completion); + } +} +#endif diff --git a/src/eventkit.cs b/src/eventkit.cs index bc4d95c0687b..c10e1234bedf 100644 --- a/src/eventkit.cs +++ b/src/eventkit.cs @@ -54,11 +54,14 @@ interface EKObject { [Since (5,0)] [Mac (10,8, onlyOn64: true)] [BaseType (typeof (EKObject))] +#if XAMCORE_4_0 + [Abstract] // "The EKCalendarItem class is a an abstract superclass ..." from Apple docs. +#endif interface EKCalendarItem { #if !MONOMAC // Never made avaialble on MonoMac [Export ("UUID")] - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use CalendarItemIdentifier instead")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use 'CalendarItemIdentifier' instead.")] string UUID { get; } #endif @@ -147,7 +150,7 @@ interface EKSource { #if !MONOMAC [Export ("calendars")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use GetCalendars (EKEntityType) instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'GetCalendars (EKEntityType)' instead.")] NSSet Calendars { get; } #endif @@ -188,6 +191,7 @@ interface EKStructuredLocation : NSCopying { [Since (4,0)] [Mac (10,8, onlyOn64: true)] [BaseType (typeof (EKObject))] + [DisableDefaultCtor] // Documentation says to use the static methods FromDate/FromTimeInterval to create instances interface EKAlarm : NSCopying { [Export ("relativeOffset")] double RelativeOffset { get; set; } @@ -267,7 +271,7 @@ interface EKCalendar { #if !MONOMAC [Since (5,0)] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use Create (EKEntityType, EKEventStore) instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'Create (EKEntityType, EKEventStore)' instead.")] [Static, Export ("calendarWithEventStore:")] EKCalendar FromEventStore (EKEventStore eventStore); #endif @@ -334,11 +338,11 @@ interface EKEvent { NSDate OccurrenceDate { get; } #if MONOMAC - [Availability (Introduced = Platform.Mac_10_8, Deprecated = Platform.Mac_10_11, Message = "Replaced by BirthdayContactIdentifier")] + [Availability (Introduced = Platform.Mac_10_8, Deprecated = Platform.Mac_10_11, Message = "Replaced by 'BirthdayContactIdentifier'.")] [Export ("birthdayPersonUniqueID")] string BirthdayPersonUniqueID { get; } #else - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_9_0, Message = "Replaced by BirthdayContactIdentifier")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_9_0, Message = "Replaced by 'BirthdayContactIdentifier'.")] [Export ("birthdayPersonID")] nint BirthdayPersonID { get; } #endif @@ -375,7 +379,7 @@ interface EKParticipant : NSCopying { // ABPerson GetPerson (ABAddressBook addressBook); #else #if !WATCH - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_9_0, Message = "Replaced by ContactPredicate")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_9_0, Message = "Replaced by 'ContactPredicate'.")] [Export ("ABRecordWithAddressBook:")] ABRecord GetRecord (ABAddressBook addressBook); #endif // !WATCH @@ -517,16 +521,20 @@ IntPtr Constructor (EKRecurrenceFrequency type, nint interval, [NullAllowed] EKR [Mac (10,8, onlyOn64: true)] [BaseType (typeof (NSObject))] interface EKEventStore { + [NoiOS, Mac (10,11, onlyOn64: true), NoWatch] + [Export ("initWithSources:")] + IntPtr Constructor (EKSource[] sources); + [Export ("eventStoreIdentifier")] string EventStoreIdentifier { get; } #if !MONOMAC [Export ("calendars")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use GetCalendars instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_6_0, Message = "Use 'GetCalendars' instead.")] EKCalendar [] Calendars { get; } #endif - [Export ("defaultCalendarForNewEvents")] + [Export ("defaultCalendarForNewEvents"), NullAllowed] EKCalendar DefaultCalendarForNewEvents { get; } #if !MONOMAC @@ -560,6 +568,7 @@ interface EKEventStore { EKSource [] Sources { get; } [Since (5,0)] + [return: NullAllowed] [Export ("sourceWithIdentifier:")] EKSource GetSource (string identifier); @@ -602,6 +611,7 @@ interface EKEventStore { void RefreshSourcesIfNecessary (); [Since (6,0)] + [return: NullAllowed] [Export ("calendarItemWithIdentifier:")] EKCalendarItem GetCalendarItem (string identifier); @@ -614,6 +624,7 @@ interface EKEventStore { EKCalendar[] GetCalendars (EKEntityType entityType); [Since (6,0)] + [NullAllowed] [Export ("defaultCalendarForNewReminders")] EKCalendar DefaultCalendarForNewReminders { get; } diff --git a/src/externalaccessory.cs b/src/externalaccessory.cs index 96d8d1293172..534287036a84 100644 --- a/src/externalaccessory.cs +++ b/src/externalaccessory.cs @@ -8,11 +8,13 @@ using XamCore.Foundation; using XamCore.CoreFoundation; using XamCore.ObjCRuntime; +#if !MONOMAC using XamCore.UIKit; +#endif namespace XamCore.ExternalAccessory { - [TV (10,0)] + [Mac (10, 13)][TV (10,0)] [BaseType (typeof (NSObject), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof(EAAccessoryDelegate)})] // Objective-C exception thrown. Name: EAAccessoryInitException Reason: -init not supported. EAAccessoryManager is responsible for creating all objects. [DisableDefaultCtor] @@ -56,7 +58,7 @@ interface EAAccessory { string DockType { get; } } - [TV (10,0)] + [Mac (10, 13)][TV (10,0)] [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -65,7 +67,7 @@ interface EAAccessoryDelegate { void Disconnected (EAAccessory accessory); } - [TV (10,0)] + [Mac (10, 13)][TV (10,0)] interface EAAccessoryEventArgs { [Export ("EAAccessoryKey")] EAAccessory Accessory { get; } @@ -75,7 +77,7 @@ interface EAAccessoryEventArgs { EAAccessory Selected { get; } } - [TV (10,0)] + [Mac (10, 13)][TV (10,0)] [BaseType (typeof (NSObject))] // Objective-C exception thrown. Name: EAAccessoryManagerInitException Reason: -init is not supported. Use +sharedAccessoryManager. [DisableDefaultCtor] @@ -100,20 +102,21 @@ interface EAAccessoryManager { [Notification (typeof (EAAccessoryEventArgs))] NSString DidDisconnectNotification { get; } -#if !XAMCORE_3_0 +#if !XAMCORE_3_0 && !MONOMAC // now exposed with the corresponding EABluetoothAccessoryPickerError enum [Since (6,0)] [Field ("EABluetoothAccessoryPickerErrorDomain")] NSString BluetoothAccessoryPickerErrorDomain { get; } #endif + [NoMac] [Since (6,0)] [Export ("showBluetoothAccessoryPickerWithNameFilter:completion:")] [Async] void ShowBluetoothAccessoryPicker ([NullAllowed] NSPredicate predicate, [NullAllowed] Action completion); } - [TV (10,0)] + [Mac (10, 13)][TV (10,0)] [BaseType (typeof (NSObject))] // Objective-C exception thrown. Name: EASessionInitException Reason: -init not supported. use -initWithAccessory:forProtocol. [DisableDefaultCtor] @@ -134,6 +137,7 @@ interface EASession { NSOutputStream OutputStream { get; } } + [NoMac] [TV (10,0)] [iOS (8,0)] [BaseType (typeof (NSObject))] @@ -163,6 +167,7 @@ interface IEAWiFiUnconfiguredAccessoryBrowserDelegate {} // This class is exposed for tvOS in the headers, but there's no available initializer (so it can't be constructed) // The API is also clearly unusable (you can list the unconfigured accessories, but you can't search for them first...) [NoTV] // [TV (10,0)] + [NoMac] [iOS (8,0)] #if TVOS [BaseType (typeof (NSObject))] @@ -201,12 +206,15 @@ interface EAWiFiUnconfiguredAccessoryBrowser { [Export ("stopSearchingForUnconfiguredAccessories")] void StopSearchingForUnconfiguredAccessories (); +#if !MONOMAC [NoTV] [iOS (8,0)] [Export ("configureAccessory:withConfigurationUIOnViewController:")] void ConfigureAccessory (EAWiFiUnconfiguredAccessory accessory, UIViewController viewController); +#endif } + [NoMac] [NoTV] // no member is available [iOS (8,0)] [Protocol, Model] diff --git a/src/fileprovider.cs b/src/fileprovider.cs new file mode 100644 index 000000000000..26904f322d06 --- /dev/null +++ b/src/fileprovider.cs @@ -0,0 +1,354 @@ +// +// FileProvider C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.ObjCRuntime; +using XamCore.CoreGraphics; +using XamCore.Foundation; + +namespace XamCore.FileProvider { + + [iOS (11,0)] + [ErrorDomain ("NSFileProviderErrorDomain")] + [Native] + enum NSFileProviderError : nint { + NotAuthenticated = -1000, + FilenameCollision = -1001, + SyncAnchorExpired = -1002, + PageExpired = SyncAnchorExpired, + InsufficientQuota = -1003, + ServerUnreachable = -1004, + NoSuchItem = -1005, + } + + [iOS (11,0)] + [Static] + interface NSFileProviderErrorKeys { + + [Field ("NSFileProviderErrorCollidingItemKey")] + NSString CollidingItemKey { get; } + + [Field ("NSFileProviderErrorNonExistentItemIdentifierKey")] + NSString NonExistentItemIdentifierKey { get; } + } + + [iOS (11,0)] + [Static] + interface NSFileProviderFavoriteRank { + + [Field ("NSFileProviderFavoriteRankUnranked")] + ulong Unranked { get; } + } + + [iOS (11,0)] + [Static] + interface NSFileProviderItemIdentifier { + + [Field ("NSFileProviderRootContainerItemIdentifier")] + NSString RootContainer { get; } + + [Field ("NSFileProviderWorkingSetContainerItemIdentifier")] + NSString WorkingSetContainer { get; } + } + + [iOS (11,0)] + [Native] + [Flags] + enum NSFileProviderItemCapabilities : nuint { + Reading = 1 << 0, + Writing = 1 << 1, + Reparenting = 1 << 2, + Renaming = 1 << 3, + Trashing = 1 << 4, + Deleting = 1 << 5, + AddingSubItems = Writing, + ContentEnumerating = Reading, + All = Reading | Writing | Reparenting | Renaming | Trashing | Deleting, + } + + [iOS (11,0)] + [Static] + interface NSFileProviderPage { + + [Internal] + [Field ("NSFileProviderInitialPageSortedByName")] + IntPtr _InitialPageSortedByName { get; } + + [Static] + [Wrap ("Runtime.GetNSObject (_InitialPageSortedByName)")] + NSData InitialPageSortedByName { get; } + + [Internal] + [Field ("NSFileProviderInitialPageSortedByDate")] + IntPtr _InitialPageSortedByDate { get; } + + [Static] + [Wrap ("Runtime.GetNSObject (_InitialPageSortedByDate)")] + NSData InitialPageSortedByDate { get; } + } + + [iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface NSFileProviderDomain { + + [Export ("initWithIdentifier:displayName:pathRelativeToDocumentStorage:")] + IntPtr Constructor (string identifier, string displayName, string pathRelativeToDocumentStorage); + + [Export ("identifier")] + string Identifier { get; } + + [Export ("displayName")] + string DisplayName { get; } + + [Export ("pathRelativeToDocumentStorage")] + string PathRelativeToDocumentStorage { get; } + } + + interface INSFileProviderEnumerationObserver { } + + [iOS (11,0)] + [Protocol] + interface NSFileProviderEnumerationObserver { + + [Abstract] + [Export ("didEnumerateItems:")] + void DidEnumerateItems (INSFileProviderItem [] updatedItems); + + [Abstract] + [Export ("finishEnumeratingUpToPage:")] + void FinishEnumerating ([NullAllowed] NSData upToPage); + + [Abstract] + [Export ("finishEnumeratingWithError:")] + void FinishEnumerating (NSError error); + } + + interface INSFileProviderChangeObserver { } + + [iOS (11,0)] + [Protocol] + interface NSFileProviderChangeObserver { + + [Abstract] + [Export ("didUpdateItems:")] + void DidUpdateItems (INSFileProviderItem [] updatedItems); + + [Abstract] + [Export ("didDeleteItemsWithIdentifiers:")] + void DidDeleteItems (string [] deletedItemIdentifiers); + + [Abstract] + [Export ("finishEnumeratingChangesUpToSyncAnchor:moreComing:")] + void FinishEnumeratingChanges (NSData anchor, bool moreComing); + + [Abstract] + [Export ("finishEnumeratingWithError:")] + void FinishEnumerating (NSError error); + } + + interface INSFileProviderEnumerator { } + + [iOS (11,0)] + [Protocol] + interface NSFileProviderEnumerator { + + [Abstract] + [Export ("invalidate")] + void Invalidate (); + + [Abstract] + [Export ("enumerateItemsForObserver:startingAtPage:")] + void EnumerateItems (INSFileProviderEnumerationObserver observer, NSData startPage); + + [Export ("enumerateChangesForObserver:fromSyncAnchor:")] + void EnumerateChanges (INSFileProviderChangeObserver observer, NSData syncAnchor); + + [Export ("currentSyncAnchorWithCompletionHandler:")] + void CurrentSyncAnchor (Action completionHandler); + } + + interface INSFileProviderItem { } + + [iOS (11,0)] + [Protocol] + interface NSFileProviderItem { + + [Abstract] + [Export ("itemIdentifier")] + string Identifier { get; } + + [Abstract] + [Export ("parentItemIdentifier")] + string ParentIdentifier { get; } + + [Abstract] + [Export ("filename")] + string Filename { get; } + + [Abstract] + [Export ("typeIdentifier")] + string TypeIdentifier { get; } + + [Export ("capabilities")] + NSFileProviderItemCapabilities GetCapabilities (); + + [return: NullAllowed] + [Export ("documentSize", ArgumentSemantic.Copy)] + NSNumber GetDocumentSize (); + + [return: NullAllowed] + [Export ("childItemCount", ArgumentSemantic.Copy)] + NSNumber GetChildItemCount (); + + [return: NullAllowed] + [Export ("creationDate", ArgumentSemantic.Copy)] + NSDate GetCreationDate (); + + [return: NullAllowed] + [Export ("contentModificationDate", ArgumentSemantic.Copy)] + NSDate GetContentModificationDate (); + + [return: NullAllowed] + [Export ("lastUsedDate", ArgumentSemantic.Copy)] + NSDate GetLastUsedDate (); + + [return: NullAllowed] + [Export ("tagData", ArgumentSemantic.Copy)] + NSData GetTagData (); + + [return: NullAllowed] + [Export ("favoriteRank", ArgumentSemantic.Copy)] + NSNumber GetFavoriteRank (); + + [Export ("isTrashed")] + bool IsTrashed (); + + [Export ("isUploaded")] + bool IsUploaded (); + + [Export ("isUploading")] + bool IsUploading (); + + [return: NullAllowed] + [Export ("uploadingError", ArgumentSemantic.Copy)] + NSError GetUploadingError (); + + [Export ("isDownloaded")] + bool IsDownloaded (); + + [Export ("isDownloading")] + bool IsDownloading (); + + [return: NullAllowed] + [Export ("downloadingError", ArgumentSemantic.Copy)] + NSError GetDownloadingError (); + + [Export ("isMostRecentVersionDownloaded")] + bool IsMostRecentVersionDownloaded (); + + [Export ("isShared")] + bool IsShared (); + + [Export ("isSharedByCurrentUser")] + bool IsSharedByCurrentUser (); + + [return: NullAllowed] + [Export ("ownerNameComponents")] + NSPersonNameComponents GetOwnerNameComponents (); + + [return: NullAllowed] + [Export ("mostRecentEditorNameComponents")] + NSPersonNameComponents GetMostRecentEditorNameComponents (); + + [return: NullAllowed] + [Export ("versionIdentifier")] + NSData GetVersionIdentifier (); + + [return: NullAllowed] + [Export ("userInfo")] + NSDictionary GetUserInfo (); + } + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface NSFileProviderManager { + + [Static] + [Export ("defaultManager", ArgumentSemantic.Strong)] + NSFileProviderManager DefaultManager { get; } + + [Export ("signalEnumeratorForContainerItemIdentifier:completionHandler:")] + // Not Async'ified on purpose, because this can switch from app to extension. + void SignalEnumerator (string containerItemIdentifier, Action completion); + + // Not Async'ified on purpose, because the task must be accesed while the completion action is performing... + [Export ("registerURLSessionTask:forItemWithIdentifier:completionHandler:")] + void Register (NSUrlSessionTask task, string identifier, Action completion); + + [Export ("providerIdentifier")] + string ProviderIdentifier { get; } + + [Export ("documentStorageURL")] + NSUrl DocumentStorageUrl { get; } + + [Static] + [Export ("writePlaceholderAtURL:withMetadata:error:")] + bool WritePlaceholder (NSUrl placeholderUrl, INSFileProviderItem metadata, out NSError error); + + [Static] + [Export ("placeholderURLForURL:")] + NSUrl GetPlaceholderUrl (NSUrl url); + + [Static] + [Async] + [Export ("addDomain:completionHandler:")] + void AddDomain (NSFileProviderDomain domain, Action completionHandler); + + [Static] + [Async] + [Export ("removeDomain:completionHandler:")] + void RemoveDomain (NSFileProviderDomain domain, Action completionHandler); + + [Static] + [Async] + [Export ("getDomainsWithCompletionHandler:")] + void GetDomains (Action completionHandler); + + [Static] + [Async] + [Export ("removeAllDomainsWithCompletionHandler:")] + void RemoveAllDomains (Action completionHandler); + + [Static] + [Export ("managerForDomain:")] + [return: NullAllowed] + NSFileProviderManager FromDomain (NSFileProviderDomain domain); + } + + interface INSFileProviderServiceSource {} + + [iOS (11,0)] + [Protocol] + interface NSFileProviderServiceSource { + + [Abstract] + [Export ("serviceName")] + string ServiceName { get; } + + [Abstract] + [Export ("makeListenerEndpointAndReturnError:")] + [return: NullAllowed] + NSXpcListenerEndpoint MakeListenerEndpoint (out NSError error); + } +} +#endif diff --git a/src/fileproviderui.cs b/src/fileproviderui.cs new file mode 100644 index 000000000000..da4fcfdd310c --- /dev/null +++ b/src/fileproviderui.cs @@ -0,0 +1,61 @@ +// +// FileProvider C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.ObjCRuntime; +using XamCore.Foundation; +using XamCore.UIKit; +using XamCore.FileProvider; + +namespace XamCore.FileProviderUI { + + [iOS (11,0)] + [ErrorDomain ("FPUIErrorDomain")] + [Native] + enum FPUIExtensionErrorCode : nuint { + UserCancelled, + Failed + } + + [iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSExtensionContext))] + interface FPUIActionExtensionContext { + + [NullAllowed, Export ("domainIdentifier")] + string DomainIdentifier { get; } + + [Export ("completeRequest")] + void CompleteRequest (); + + [Export ("cancelRequestWithError:")] + void CancelRequest (NSError error); + } + + [iOS (11,0)] + [BaseType (typeof (UIViewController))] + interface FPUIActionExtensionViewController { + + [Export ("initWithNibName:bundle:")] + [PostGet ("NibBundle")] + IntPtr Constructor ([NullAllowed] string nibName, [NullAllowed] NSBundle bundle); + + [Export ("extensionContext", ArgumentSemantic.Strong)] + FPUIActionExtensionContext ExtensionContext { get; } + + [Export ("prepareForError:")] + void Prepare (NSError error); + + [Export ("prepareForActionWithIdentifier:itemIdentifiers:")] + void Prepare (string actionIdentifier, NSString [] itemIdentifiers); + } +} +#endif diff --git a/src/findersync.cs b/src/findersync.cs index 7292fde77cb3..3e260f37f204 100644 --- a/src/findersync.cs +++ b/src/findersync.cs @@ -5,6 +5,8 @@ #if XAMCORE_2_0 namespace XamCore.FinderSync { + delegate void GetValuesCompletionHandler (NSDictionary values, NSError error); + [Mac (10, 10, onlyOn64: true)] [BaseType (typeof(NSExtensionContext))] interface FIFinderSyncController : NSSecureCoding, NSCopying @@ -27,6 +29,24 @@ interface FIFinderSyncController : NSSecureCoding, NSCopying [NullAllowed, Export ("selectedItemURLs")] NSUrl[] SelectedItemURLs { get; } + + [Mac (10,13, onlyOn64 : true)] + [Export ("lastUsedDateForItemWithURL:")] + [return: NullAllowed] + NSDate GetLastUsedDate (NSUrl itemUrl); + + [Mac (10,13, onlyOn64 : true)] + [Async, Export ("setLastUsedDate:forItemWithURL:completion:")] + void SetLastUsedDate (NSDate lastUsedDate, NSUrl itemUrl, Action completion); + + [Mac (10,13, onlyOn64 : true)] + [Export ("tagDataForItemWithURL:")] + [return: NullAllowed] + NSData GetTagData (NSUrl itemUrl); + + [Async, Mac (10,13, onlyOn64 : true)] + [Export ("setTagData:forItemWithURL:completion:")] + void SetTagData ([NullAllowed] NSData tagData, NSUrl itemUrl, Action completion); } [Mac (10, 10, onlyOn64: true)] @@ -54,7 +74,21 @@ interface FIFinderSyncProtocol [Export ("toolbarItemToolTip")] string ToolbarItemToolTip { get; } - } + + [Mac (10,13, onlyOn64 : true)] + [Export ("supportedServiceNamesForItemWithURL:")] + string[] SupportedServiceNames (NSUrl itemUrl); + +#if FALSE // TODO: Activate after 10.13 foundation APIs have been merged. Bug 57800 + [Mac (10,13, onlyOn64 : true)] + [Export ("makeListenerEndpointForServiceName:andReturnError:")] + [return: NullAllowed] + NSXpcListenerEndpoint MakeListenerEndpoint (string serviceName, [NullAllowed] out NSError error); +#endif + [Mac (10,13, onlyOn64 : true)] + [Async, Export ("valuesForAttributes:forItemWithURL:completion:")] + void GetValues (string[] attributes, NSUrl itemUrl, GetValuesCompletionHandler completion); + } [Mac (10, 10, onlyOn64: true)] [BaseType (typeof(NSObject))] diff --git a/src/foundation.cs b/src/foundation.cs index 7930656f1aea..b64c8443d598 100644 --- a/src/foundation.cs +++ b/src/foundation.cs @@ -43,6 +43,9 @@ using XamCore.Security; #if IOS using XamCore.CoreSpotlight; +#if XAMCORE_2_0 +using XamCore.FileProvider; +#endif #endif #if MONOMAC @@ -156,6 +159,16 @@ interface NSArray : NSSecureCoding, NSMutableCopying, INSFastEnumeration { [Export ("removeObserver:fromObjectsAtIndexes:forKeyPath:")] void RemoveObserver (NSObject observer, NSIndexSet indexes, string keyPath); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("writeToURL:error:")] + bool Write (NSUrl url, out NSError error); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("arrayWithContentsOfURL:error:")] + [return: NullAllowed] + NSArray FromUrl (NSUrl url, out NSError error); } #if MONOMAC @@ -168,6 +181,9 @@ partial interface NSAttributedString : NSCoding, NSMutableCopying, NSSecureCodin #if MONOMAC , NSPasteboardReading, NSPasteboardWriting #endif + #if IOS + , NSItemProviderReading, NSItemProviderWriting + #endif { #if !WATCH [Static, Export ("attributedStringWithAttachment:")] @@ -602,7 +618,7 @@ interface NSCalendar : NSSecureCoding, NSCopying { NSDateComponents Components (NSCalendarUnit unitFlags, NSDate fromDate, NSDate toDate, NSCalendarOptions opts); #if !XAMCORE_4_0 - [Obsolete ("Use the overload with a NSCalendarOptions parameter")] + [Obsolete ("Use the overload with a 'NSCalendarOptions' parameter.")] [Wrap ("Components (unitFlags, fromDate, toDate, (NSCalendarOptions) opts)")] NSDateComponents Components (NSCalendarUnit unitFlags, NSDate fromDate, NSDate toDate, NSDateComponentsWrappingBehavior opts); #endif @@ -611,7 +627,7 @@ interface NSCalendar : NSSecureCoding, NSCopying { NSDate DateByAddingComponents (NSDateComponents comps, NSDate date, NSCalendarOptions opts); #if !XAMCORE_4_0 - [Obsolete ("Use the overload with a NSCalendarOptions parameter")] + [Obsolete ("Use the overload with a 'NSCalendarOptions' parameter.")] [Wrap ("DateByAddingComponents (comps, date, (NSCalendarOptions) opts)")] NSDate DateByAddingComponents (NSDateComponents comps, NSDate date, NSDateComponentsWrappingBehavior opts); #endif @@ -882,7 +898,7 @@ interface NSCalendar : NSSecureCoding, NSCopying { #if MONOMAC // Obsolete, but the only API surfaced by WebKit.WebHistory. - [Availability (Introduced = Platform.Mac_10_4, Deprecated = Platform.Mac_10_10, Message="Obsolete, use NSCalendar and NSDateComponents")] + [Availability (Introduced = Platform.Mac_10_4, Deprecated = Platform.Mac_10_10, Message="Use NSCalendar and NSDateComponents.")] [BaseType (typeof (NSDate))] interface NSCalendarDate { [Export ("initWithString:calendarFormat:locale:")] @@ -1512,7 +1528,7 @@ interface NSDateComponents : NSSecureCoding, NSCopying, INSCopying, INSSecureCod nint Nanosecond { get; set; } [Export ("week")] - [Availability (Introduced = Platform.Mac_10_4 | Platform.iOS_2_0, Deprecated = Platform.Mac_10_9 | Platform.iOS_7_0, Message = "Use WeekOfMonth or WeekOfYear, depending on which you mean")] + [Availability (Introduced = Platform.Mac_10_4 | Platform.iOS_2_0, Deprecated = Platform.Mac_10_9 | Platform.iOS_7_0, Message = "Use 'WeekOfMonth' or 'WeekOfYear' instead.")] nint Week { get; set; } [Export ("weekday")] @@ -1715,7 +1731,11 @@ interface NSDateFormatter { [iOS (8,0), Mac (10,10)] [Export ("setLocalizedDateFormatFromTemplate:")] - void SetLocalizedDateFormatFromTemplate (string dateFormatTemplate); + void SetLocalizedDateFormatFromTemplate (string dateFormatTemplate); + + [Watch (2, 0), TV (9, 0), Mac (10, 10), iOS (8, 0)] + [Export ("formattingContext", ArgumentSemantic.Assign)] + NSFormattingContext FormattingContext { get; set; } } [iOS (8,0)][Mac(10,10)] @@ -1768,6 +1788,10 @@ interface NSDateComponentsFormatter { [Export ("getObjectValue:forString:errorDescription:")] bool GetObjectValue (out NSObject obj, string str, out string error); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("referenceDate", ArgumentSemantic.Copy)] + NSDate ReferenceDate { get; set; } } [iOS (8,0)][Mac(10,10)] @@ -2508,7 +2532,7 @@ interface NSMetadataQuery { [Field ("NSMetadataUbiquitousItemHasUnresolvedConflictsKey")] NSString UbiquitousItemHasUnresolvedConflictsKey { get; } - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message="Use UbiquitousItemDownloadingStatusKey")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message="Use 'UbiquitousItemDownloadingStatusKey' instead.")] [Field ("NSMetadataUbiquitousItemIsDownloadedKey")] NSString UbiquitousItemIsDownloadedKey { get; } @@ -2557,6 +2581,620 @@ interface NSMetadataQuery { [iOS(8,0),Mac(10,10)] [Field ("NSMetadataUbiquitousItemURLInLocalContainerKey")] NSString UbiquitousItemURLInLocalContainerKey { get; } + +#if MONOMAC + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemKeywordsKey")] + NSString KeywordsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemTitleKey")] + NSString TitleKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAuthorsKey")] + NSString AuthorsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemEditorsKey")] + NSString EditorsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemParticipantsKey")] + NSString ParticipantsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemProjectsKey")] + NSString ProjectsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemDownloadedDateKey")] + NSString DownloadedDateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemWhereFromsKey")] + NSString WhereFromsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCommentKey")] + NSString CommentKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCopyrightKey")] + NSString CopyrightKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemLastUsedDateKey")] + NSString LastUsedDateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemContentCreationDateKey")] + NSString ContentCreationDateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemContentModificationDateKey")] + NSString ContentModificationDateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemDateAddedKey")] + NSString DateAddedKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemDurationSecondsKey")] + NSString DurationSecondsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemContactKeywordsKey")] + NSString ContactKeywordsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemVersionKey")] + NSString VersionKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPixelHeightKey")] + NSString PixelHeightKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPixelWidthKey")] + NSString PixelWidthKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPixelCountKey")] + NSString PixelCountKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemColorSpaceKey")] + NSString ColorSpaceKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemBitsPerSampleKey")] + NSString BitsPerSampleKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemFlashOnOffKey")] + NSString FlashOnOffKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemFocalLengthKey")] + NSString FocalLengthKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAcquisitionMakeKey")] + NSString AcquisitionMakeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAcquisitionModelKey")] + NSString AcquisitionModelKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemISOSpeedKey")] + NSString IsoSpeedKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemOrientationKey")] + NSString OrientationKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemLayerNamesKey")] + NSString LayerNamesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemWhiteBalanceKey")] + NSString WhiteBalanceKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemApertureKey")] + NSString ApertureKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemProfileNameKey")] + NSString ProfileNameKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemResolutionWidthDPIKey")] + NSString ResolutionWidthDpiKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemResolutionHeightDPIKey")] + NSString ResolutionHeightDpiKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemExposureModeKey")] + NSString ExposureModeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemExposureTimeSecondsKey")] + NSString ExposureTimeSecondsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemEXIFVersionKey")] + NSString ExifVersionKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCameraOwnerKey")] + NSString CameraOwnerKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemFocalLength35mmKey")] + NSString FocalLength35mmKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemLensModelKey")] + NSString LensModelKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemEXIFGPSVersionKey")] + NSString ExifGpsVersionKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAltitudeKey")] + NSString AltitudeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemLatitudeKey")] + NSString LatitudeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemLongitudeKey")] + NSString LongitudeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemSpeedKey")] + NSString SpeedKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemTimestampKey")] + NSString TimestampKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSTrackKey")] + NSString GpsTrackKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemImageDirectionKey")] + NSString ImageDirectionKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemNamedLocationKey")] + NSString NamedLocationKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSStatusKey")] + NSString GpsStatusKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSMeasureModeKey")] + NSString GpsMeasureModeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSDOPKey")] + NSString GpsDopKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSMapDatumKey")] + NSString GpsMapDatumKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSDestLatitudeKey")] + NSString GpsDestLatitudeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSDestLongitudeKey")] + NSString GpsDestLongitudeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSDestBearingKey")] + NSString GpsDestBearingKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSDestDistanceKey")] + NSString GpsDestDistanceKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSProcessingMethodKey")] + NSString GpsProcessingMethodKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSAreaInformationKey")] + NSString GpsAreaInformationKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSDateStampKey")] + NSString GpsDateStampKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGPSDifferentalKey")] + NSString GpsDifferentalKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCodecsKey")] + NSString CodecsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemMediaTypesKey")] + NSString MediaTypesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemStreamableKey")] + NSString StreamableKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemTotalBitRateKey")] + NSString TotalBitRateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemVideoBitRateKey")] + NSString VideoBitRateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAudioBitRateKey")] + NSString AudioBitRateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemDeliveryTypeKey")] + NSString DeliveryTypeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAlbumKey")] + NSString AlbumKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemHasAlphaChannelKey")] + NSString HasAlphaChannelKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemRedEyeOnOffKey")] + NSString RedEyeOnOffKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemMeteringModeKey")] + NSString MeteringModeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemMaxApertureKey")] + NSString MaxApertureKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemFNumberKey")] + NSString FNumberKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemExposureProgramKey")] + NSString ExposureProgramKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemExposureTimeStringKey")] + NSString ExposureTimeStringKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemHeadlineKey")] + NSString HeadlineKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemInstructionsKey")] + NSString InstructionsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCityKey")] + NSString CityKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemStateOrProvinceKey")] + NSString StateOrProvinceKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCountryKey")] + NSString CountryKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemTextContentKey")] + NSString TextContentKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAudioSampleRateKey")] + NSString AudioSampleRateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAudioChannelCountKey")] + NSString AudioChannelCountKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemTempoKey")] + NSString TempoKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemKeySignatureKey")] + NSString KeySignatureKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemTimeSignatureKey")] + NSString TimeSignatureKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAudioEncodingApplicationKey")] + NSString AudioEncodingApplicationKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemComposerKey")] + NSString ComposerKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemLyricistKey")] + NSString LyricistKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAudioTrackNumberKey")] + NSString AudioTrackNumberKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemRecordingDateKey")] + NSString RecordingDateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemMusicalGenreKey")] + NSString MusicalGenreKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemIsGeneralMIDISequenceKey")] + NSString IsGeneralMidiSequenceKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemRecordingYearKey")] + NSString RecordingYearKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemOrganizationsKey")] + NSString OrganizationsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemLanguagesKey")] + NSString LanguagesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemRightsKey")] + NSString RightsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPublishersKey")] + NSString PublishersKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemContributorsKey")] + NSString ContributorsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCoverageKey")] + NSString CoverageKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemSubjectKey")] + NSString SubjectKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemThemeKey")] + NSString ThemeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemDescriptionKey")] + NSString DescriptionKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemIdentifierKey")] + NSString IdentifierKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAudiencesKey")] + NSString AudiencesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemNumberOfPagesKey")] + NSString NumberOfPagesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPageWidthKey")] + NSString PageWidthKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPageHeightKey")] + NSString PageHeightKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemSecurityMethodKey")] + NSString SecurityMethodKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCreatorKey")] + NSString CreatorKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemEncodingApplicationsKey")] + NSString EncodingApplicationsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemDueDateKey")] + NSString DueDateKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemStarRatingKey")] + NSString StarRatingKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPhoneNumbersKey")] + NSString PhoneNumbersKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemEmailAddressesKey")] + NSString EmailAddressesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemInstantMessageAddressesKey")] + NSString InstantMessageAddressesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemKindKey")] + NSString KindKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemRecipientsKey")] + NSString RecipientsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemFinderCommentKey")] + NSString FinderCommentKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemFontsKey")] + NSString FontsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAppleLoopsRootKeyKey")] + NSString AppleLoopsRootKeyKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAppleLoopsKeyFilterTypeKey")] + NSString AppleLoopsKeyFilterTypeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAppleLoopsLoopModeKey")] + NSString AppleLoopsLoopModeKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAppleLoopDescriptorsKey")] + NSString AppleLoopDescriptorsKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemMusicalInstrumentCategoryKey")] + NSString MusicalInstrumentCategoryKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemMusicalInstrumentNameKey")] + NSString MusicalInstrumentNameKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemCFBundleIdentifierKey")] + NSString CFBundleIdentifierKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemInformationKey")] + NSString InformationKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemDirectorKey")] + NSString DirectorKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemProducerKey")] + NSString ProducerKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemGenreKey")] + NSString GenreKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemPerformersKey")] + NSString PerformersKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemOriginalFormatKey")] + NSString OriginalFormatKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemOriginalSourceKey")] + NSString OriginalSourceKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAuthorEmailAddressesKey")] + NSString AuthorEmailAddressesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemRecipientEmailAddressesKey")] + NSString RecipientEmailAddressesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemAuthorAddressesKey")] + NSString AuthorAddressesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemRecipientAddressesKey")] + NSString RecipientAddressesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemIsLikelyJunkKey")] + NSString IsLikelyJunkKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemExecutableArchitecturesKey")] + NSString ExecutableArchitecturesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemExecutablePlatformKey")] + NSString ExecutablePlatformKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemApplicationCategoriesKey")] + NSString ApplicationCategoriesKey { get; } + + [NoWatch, NoTV, NoiOS, Mac (10, 9)] + [Field ("NSMetadataItemIsApplicationManagedKey")] + NSString IsApplicationManagedKey { get; } +#endif + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousItemIsSharedKey")] + NSString UbiquitousItemIsSharedKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemCurrentUserRoleKey")] + NSString UbiquitousSharedItemCurrentUserRoleKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemCurrentUserPermissionsKey")] + NSString UbiquitousSharedItemCurrentUserPermissionsKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemOwnerNameComponentsKey")] + NSString UbiquitousSharedItemOwnerNameComponentsKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemMostRecentEditorNameComponentsKey")] + NSString UbiquitousSharedItemMostRecentEditorNameComponentsKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemRoleOwner")] + NSString UbiquitousSharedItemRoleOwner { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemRoleParticipant")] + NSString UbiquitousSharedItemRoleParticipant { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemPermissionsReadOnly")] + NSString UbiquitousSharedItemPermissionsReadOnly { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSMetadataUbiquitousSharedItemPermissionsReadWrite")] + NSString UbiquitousSharedItemPermissionsReadWrite { get; } [Since (7,0), Mavericks] [NullAllowed] // by default this property is null @@ -2793,12 +3431,12 @@ interface NSMutableAttributedString { #if !MONOMAC [NoTV] [Since (7,0)] - [Deprecated (PlatformName.iOS, 9, 0, message: "Use ReadFromUrl")] + [Deprecated (PlatformName.iOS, 9, 0, message: "Use 'ReadFromUrl' instead.")] [Export ("readFromFileURL:options:documentAttributes:error:")] bool ReadFromFile (NSUrl url, NSDictionary options, ref NSDictionary returnOptions, ref NSError error); [NoTV] - [Deprecated (PlatformName.iOS, 9, 0, message: "Use ReadFromUrl")] + [Deprecated (PlatformName.iOS, 9, 0, message: "Use 'ReadFromUrl' instead.")] [Wrap ("ReadFromFile (url, options == null ? null : options.Dictionary, ref returnOptions, ref error)")] bool ReadFromFile (NSUrl url, NSAttributedStringDocumentAttributes options, ref NSDictionary returnOptions, ref NSError error); @@ -2964,6 +3602,16 @@ interface NSDictionary : NSSecureCoding, NSMutableCopying { [Export ("initWithContentsOfURL:")] IntPtr Constructor (NSUrl url); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("initWithContentsOfURL:error:")] + IntPtr Constructor (NSUrl url, out NSError error); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("dictionaryWithContentsOfURL:error:")] + [return: NullAllowed] + NSDictionary FromUrl (NSUrl url, out NSError error); [Export ("count")] nuint Count { get; } @@ -3159,6 +3807,14 @@ interface NSError : NSSecureCoding, NSCopying { [Field ("NSFilePathErrorKey")] NSString FilePathErrorKey { get; } + [iOS (9,0)][Mac (10,11)] + [Field ("NSDebugDescriptionErrorKey")] + NSString DebugDescriptionErrorKey { get; } + + [iOS (11,0), Mac (10,13), Watch (4,0), TV (11,0)] + [Field ("NSLocalizedFailureErrorKey")] + NSString LocalizedFailureErrorKey { get; } + [iOS (9,0)][Mac (10,11)] [Static] [Export ("setUserInfoValueProviderForDomain:provider:")] @@ -3169,6 +3825,21 @@ interface NSError : NSSecureCoding, NSCopying { [Export ("userInfoValueProviderForDomain:")] [return: NullAllowed] NSErrorUserInfoValueProvider GetUserInfoValueProvider (string errorDomain); + +#if XAMCORE_2_0 && IOS + + // From NSError (NSFileProviderError) Category to avoid static category uglyness + + [iOS (11,0)] + [Static] + [Export ("fileProviderErrorForCollisionWithItem:")] + NSError GetFileProviderError (INSFileProviderItem existingItem); + + [iOS (11,0)] + [Static] + [Export ("fileProviderErrorForNonExistentItemWithIdentifier:")] + NSError GetFileProviderError (string nonExistentItemIdentifier); +#endif #if false // FIXME that value is present in the header (7.0 DP 6) files but returns NULL (i.e. unusable) @@ -3233,7 +3904,7 @@ interface NSExpression : NSSecureCoding, NSCopying { NSExpression FromFormat (string expressionFormat); #if !XAMCORE_4_0 && !WATCH - [Obsolete("FromFormat (string, NSExpression[]) is deprecated, please use FromFormat (string, NSObject[]) instead.")] + [Obsolete("Use 'FromFormat (string, NSObject[])' instead.")] [Static, Export ("expressionWithFormat:argumentArray:")] NSExpression FromFormat (string format, NSExpression [] parameters); #endif @@ -3262,7 +3933,7 @@ interface NSExpression : NSSecureCoding, NSCopying { NSExpression FromFunction (NSExpression target, string name, NSExpression[] parameters); #if !XAMCORE_4_0 && !WATCH - [Obsolete("FromFunction (NSExpressionHandler, NSExpression[]) is deprecated, please use FromFunction (NSExpressionCallbackHandler, NSExpression[]) instead.")] + [Obsolete("Use 'FromFunction (NSExpressionCallbackHandler, NSExpression[])' instead.")] [Static, Export ("expressionForBlock:arguments:")] NSExpression FromFunction (NSExpressionHandler target, NSExpression[] parameters); #endif @@ -3489,8 +4160,58 @@ interface NSLinguisticTagger { [NullAllowed] // by default this property is null [Export ("string", ArgumentSemantic.Retain)] string AnalysisString { get; set; } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("tagsInRange:unit:scheme:options:tokenRanges:")] + string[] GetTags (NSRange range, NSLinguisticTaggerUnit unit, string scheme, NSLinguisticTaggerOptions options, [NullAllowed] out NSValue[] tokenRanges); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("enumerateTagsInRange:unit:scheme:options:usingBlock:")] + void EnumerateTags (NSRange range, NSLinguisticTaggerUnit unit, string scheme, NSLinguisticTaggerOptions options, LinguisticTagEnumerator enumerator); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("tagAtIndex:unit:scheme:tokenRange:")] + [return: NullAllowed] + string GetTag (nuint charIndex, NSLinguisticTaggerUnit unit, string scheme, [NullAllowed] ref NSRange tokenRange); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("tokenRangeAtIndex:unit:")] + NSRange GetTokenRange (nuint charIndex, NSLinguisticTaggerUnit unit); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("availableTagSchemesForUnit:language:")] + string[] GetAvailableTagSchemes (NSLinguisticTaggerUnit unit, string language); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("dominantLanguage")] + string DominantLanguage { get; } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("dominantLanguageForString:")] + [return: NullAllowed] + string GetDominantLanguage (string str); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("tagForString:atIndex:unit:scheme:orthography:tokenRange:")] + [return: NullAllowed] + string GetTag (string str, nuint charIndex, NSLinguisticTaggerUnit unit, string scheme, [NullAllowed] NSOrthography orthography, [NullAllowed] ref NSRange tokenRange); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("tagsForString:range:unit:scheme:options:orthography:tokenRanges:")] + string[] GetTags (string str, NSRange range, NSLinguisticTaggerUnit unit, string scheme, NSLinguisticTaggerOptions options, [NullAllowed] NSOrthography orthography, [NullAllowed] out NSValue[] tokenRanges); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("enumerateTagsForString:range:unit:scheme:options:orthography:usingBlock:")] + void EnumerateTags (string str, NSRange range, NSLinguisticTaggerUnit unit, string scheme, NSLinguisticTaggerOptions options, [NullAllowed] NSOrthography orthography, LinguisticTagEnumerator enumerator); } + delegate void LinguisticTagEnumerator (string tag, NSRange tokenRange, bool stop); + [Since (5,0)] [Static] interface NSLinguisticTag { @@ -3874,6 +4595,7 @@ interface NSRunLoop { [Field ("NSRunLoopCommonModes")] NSString NSRunLoopCommonModes { get; } + [Availability (Deprecated = Platform.Mac_10_13, Message = "Use 'NSXpcConnection' instead.")] [NoiOS, NoWatch, NoTV] [Field ("NSConnectionReplyMode")] NSString NSRunLoopConnectionReplyMode { get; } @@ -4175,6 +4897,7 @@ interface NSUbiquitousKeyValueStoreChangeEventArgs { [Since (5,0)] [BaseType (typeof (NSObject))] #if WATCH + [Advice ("Not available on watchOS")] [DisableDefaultCtor] // "NSUbiquitousKeyValueStore is unavailable" is printed to the log. #endif interface NSUbiquitousKeyValueStore { @@ -4272,7 +4995,7 @@ interface NSUuid : NSSecureCoding, NSCopying { string AsString (); } - [iOS (8,0)][Mac (10,10, onlyOn64 : true)] // .objc_class_name_NSUserActivity", referenced from '' not found + [iOS (8,0)][Mac (10,10, onlyOn64 : true), Watch (2,0), TV (9,0)] // .objc_class_name_NSUserActivity", referenced from '' not found [BaseType (typeof (NSObject))] [DisableDefaultCtor] // xcode 8 beta 4 marks it as API_DEPRECATED partial interface NSUserActivity { @@ -4325,31 +5048,31 @@ partial interface NSUserActivity { [Async (ResultTypeName="NSUserActivityContinuation")] void GetContinuationStreams (Action completionHandler); - [Mac(10,11), iOS (9,0)] + [Mac(10,11), iOS (9,0), Watch (3,0), TV (10,0)] [Export ("requiredUserInfoKeys", ArgumentSemantic.Copy)] NSSet RequiredUserInfoKeys { get; set; } - [Mac(10,11), iOS (9,0)] + [Mac(10,11), iOS (9,0), Watch (3,0), TV (10,0)] [Export ("expirationDate", ArgumentSemantic.Copy)] NSDate ExpirationDate { get; set; } - [Mac(10,11), iOS (9,0)] + [Mac(10,11), iOS (9,0), Watch (3,0), TV (10,0)] [Export ("keywords", ArgumentSemantic.Copy)] NSSet Keywords { get; set; } - [Mac(10,11), iOS (9,0)] + [Mac(10,11), iOS (9,0), Watch (3,0), TV (10,0)] [Export ("resignCurrent")] void ResignCurrent (); - [Mac(10,11), iOS (9,0)] + [Mac(10,11), iOS (9,0), Watch (3,0), TV (10,0)] [Export ("eligibleForHandoff")] bool EligibleForHandoff { [Bind ("isEligibleForHandoff")] get; set; } - [Mac(10,11), iOS (9,0)] + [Mac(10,11), iOS (9,0), Watch (3,0), TV (10,0)] [Export ("eligibleForSearch")] bool EligibleForSearch { [Bind ("isEligibleForSearch")] get; set; } - [Mac(10,11), iOS (9,0)] + [Mac(10,11), iOS (9,0), Watch (3,0), TV (10,0)] [Export ("eligibleForPublicIndexing")] bool EligibleForPublicIndexing { [Bind ("isEligibleForPublicIndexing")] get; set; } @@ -4360,6 +5083,9 @@ partial interface NSUserActivity { CSSearchableItemAttributeSet ContentAttributeSet { get; set; } #endif + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("referrerURL", ArgumentSemantic.Copy)] + NSUrl ReferrerUrl { get; set; } } [iOS (8,0)][Mac (10,10, onlyOn64 : true)] // same as NSUserActivity @@ -4369,7 +5095,7 @@ partial interface NSUserActivityType { NSString BrowsingWeb { get; } } - [iOS (8,0)][Mac (10,10, onlyOn64 : true)] // same as NSUserActivity + [iOS (8,0)][Mac (10,10, onlyOn64 : true), Watch (3,0), TV (9,0)] // same as NSUserActivity [Protocol, Model] [BaseType (typeof (NSObject))] partial interface NSUserActivityDelegate { @@ -4554,6 +5280,7 @@ partial interface NSUrl : NSSecureCoding, NSCopying #if MONOMAC , NSPasteboardReading, NSPasteboardWriting #endif + , NSItemProviderWriting, NSItemProviderReading { [Export ("initWithScheme:host:path:")] IntPtr Constructor (string scheme, string host, string path); @@ -4996,6 +5723,46 @@ partial interface NSUrl : NSSecureCoding, NSCopying [Field ("NSURLVolumeLocalizedNameKey")] NSString VolumeLocalizedNameKey { get; } + [Watch (3, 0), TV (10, 0), Mac (10, 12), iOS (10, 0)] + [Field ("NSURLVolumeIsEncryptedKey")] + NSString VolumeIsEncryptedKey { get; } + + [Watch (3, 0), TV (10, 0), Mac (10, 12), iOS (10, 0)] + [Field ("NSURLVolumeIsRootFileSystemKey")] + NSString VolumeIsRootFileSystemKey { get; } + + [Watch (3, 0), TV (10, 0), Mac (10, 12), iOS (10, 0)] + [Field ("NSURLVolumeSupportsCompressionKey")] + NSString VolumeSupportsCompressionKey { get; } + + [Watch (3, 0), TV (10, 0), Mac (10, 12), iOS (10, 0)] + [Field ("NSURLVolumeSupportsFileCloningKey")] + NSString VolumeSupportsFileCloningKey { get; } + + [Watch (3, 0), TV (10, 0), Mac (10, 12), iOS (10, 0)] + [Field ("NSURLVolumeSupportsSwapRenamingKey")] + NSString VolumeSupportsSwapRenamingKey { get; } + + [Watch (3, 0), TV (10, 0), Mac (10, 12), iOS (10, 0)] + [Field ("NSURLVolumeSupportsExclusiveRenamingKey")] + NSString VolumeSupportsExclusiveRenamingKey { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Field ("NSURLVolumeSupportsImmutableFilesKey")] + NSString VolumeSupportsImmutableFilesKey { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Field ("NSURLVolumeSupportsAccessPermissionsKey")] + NSString VolumeSupportsAccessPermissionsKey { get; } + + [NoWatch, NoTV, Mac (10, 13), iOS (11, 0)] + [Field ("NSURLVolumeAvailableCapacityForImportantUsageKey")] + NSString VolumeAvailableCapacityForImportantUsageKey { get; } + + [NoWatch, NoTV, Mac (10, 13), iOS (11, 0)] + [Field ("NSURLVolumeAvailableCapacityForOpportunisticUsageKey")] + NSString VolumeAvailableCapacityForOpportunisticUsageKey { get; } + [Since (5,0)] [Field ("NSURLIsUbiquitousItemKey")] NSString IsUbiquitousItemKey { get; } @@ -5021,13 +5788,49 @@ partial interface NSUrl : NSSecureCoding, NSCopying NSString UbiquitousItemIsUploadingKey { get; } [Field ("NSURLUbiquitousItemPercentDownloadedKey")] - [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_7, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "NSMetadataQuery.UbiquitousItemPercentDownloadedKey on NSMetadataItem instead")] + [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_7, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "Use 'NSMetadataQuery.UbiquitousItemPercentDownloadedKey' on 'NSMetadataItem' instead.")] NSString UbiquitousItemPercentDownloadedKey { get; } - [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_7, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "NSMetadataQuery.UbiquitousItemPercentUploadedKey on NSMetadataItem instead")] + [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_7, Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "Use 'NSMetadataQuery.UbiquitousItemPercentUploadedKey' on 'NSMetadataItem' instead.")] [Field ("NSURLUbiquitousItemPercentUploadedKey")] NSString UbiquitousItemPercentUploadedKey { get; } + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousItemIsSharedKey")] + NSString UbiquitousItemIsSharedKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemCurrentUserRoleKey")] + NSString UbiquitousSharedItemCurrentUserRoleKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemCurrentUserPermissionsKey")] + NSString UbiquitousSharedItemCurrentUserPermissionsKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemOwnerNameComponentsKey")] + NSString UbiquitousSharedItemOwnerNameComponentsKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemMostRecentEditorNameComponentsKey")] + NSString UbiquitousSharedItemMostRecentEditorNameComponentsKey { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemRoleOwner")] + NSString UbiquitousSharedItemRoleOwner { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemRoleParticipant")] + NSString UbiquitousSharedItemRoleParticipant { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemPermissionsReadOnly")] + NSString UbiquitousSharedItemPermissionsReadOnly { get; } + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [Field ("NSURLUbiquitousSharedItemPermissionsReadWrite")] + NSString UbiquitousSharedItemPermissionsReadWrite { get; } + [Since (5,1)] [MountainLion] [Field ("NSURLIsExcludedFromBackupKey")] @@ -5167,6 +5970,25 @@ partial interface NSUrl : NSSecureCoding, NSCopying [Field ("NSURLFileProtectionCompleteUntilFirstUserAuthentication")] NSString FileProtectionCompleteUntilFirstUserAuthentication { get; } #endif + + // From the NSItemProviderReading protocol + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("readableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] + new string[] ReadableTypeIdentifiers { get; } + + // From the NSItemProviderReading protocol + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("objectWithItemProviderData:typeIdentifier:error:")] + [return: NullAllowed] + new NSUrl GetObject (NSData data, string typeIdentifier, [NullAllowed] out NSError outError); + + // From the NSItemProviderWriting protocol + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("writableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] + new string[] WritableTypeIdentifiers { get; } } @@ -5391,6 +6213,10 @@ partial interface NSUrlComponents : NSCopying { [iOS (9,0), Mac(10,11)] [Export ("rangeOfFragment"), Mac(10,11)] NSRange RangeOfFragment { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("percentEncodedQueryItems", ArgumentSemantic.Copy)] + NSUrlQueryItem[] PercentEncodedQueryItems { get; set; } } [BaseType (typeof (NSObject), Name="NSURLAuthenticationChallenge")] @@ -5484,18 +6310,18 @@ interface NSUrlConnection : bool CanHandleRequest (NSUrlRequest request); [NoWatch] - [Deprecated (PlatformName.iOS, 9,0, message: "Use NSUrlSession instead")] - [Deprecated (PlatformName.MacOSX, 10,11, message: "Use NSUrlSession instead")] + [Deprecated (PlatformName.iOS, 9,0, message: "Use 'NSUrlSession' instead.")] + [Deprecated (PlatformName.MacOSX, 10,11, message: "Use 'NSUrlSession' instead.")] [Export ("connectionWithRequest:delegate:")][Static] NSUrlConnection FromRequest (NSUrlRequest request, [Protocolize] NSUrlConnectionDelegate connectionDelegate); - [Deprecated (PlatformName.iOS, 9,0, message: "Use NSUrlSession instead")] - [Deprecated (PlatformName.MacOSX, 10,11, message: "Use NSUrlSession instead")] + [Deprecated (PlatformName.iOS, 9,0, message: "Use 'NSUrlSession' instead.")] + [Deprecated (PlatformName.MacOSX, 10,11, message: "Use 'NSUrlSession' instead.")] [Export ("initWithRequest:delegate:")] IntPtr Constructor (NSUrlRequest request, [Protocolize] NSUrlConnectionDelegate connectionDelegate); - [Deprecated (PlatformName.iOS, 9,0, message: "Use NSUrlSession instead")] - [Deprecated (PlatformName.MacOSX, 10,11, message: "Use NSUrlSession instead")] + [Deprecated (PlatformName.iOS, 9,0, message: "Use 'NSUrlSession' instead.")] + [Deprecated (PlatformName.MacOSX, 10,11, message: "Use 'NSUrlSession' instead.")] [Export ("initWithRequest:delegate:startImmediately:")] IntPtr Constructor (NSUrlRequest request, [Protocolize] NSUrlConnectionDelegate connectionDelegate, bool startImmediately); @@ -5559,15 +6385,15 @@ interface NSUrlConnectionDelegate { #endif [Export ("connection:canAuthenticateAgainstProtectionSpace:")] - [Availability (Deprecated=Platform.iOS_8_0|Platform.Mac_10_10, Message="Use WillSendRequestForAuthenticationChallenge instead")] + [Availability (Deprecated=Platform.iOS_8_0|Platform.Mac_10_10, Message="Use 'WillSendRequestForAuthenticationChallenge' instead.")] bool CanAuthenticateAgainstProtectionSpace (NSUrlConnection connection, NSUrlProtectionSpace protectionSpace); [Export ("connection:didReceiveAuthenticationChallenge:")] - [Availability (Deprecated=Platform.iOS_8_0|Platform.Mac_10_10, Message="Use WillSendRequestForAuthenticationChallenge instead")] + [Availability (Deprecated=Platform.iOS_8_0|Platform.Mac_10_10, Message="Use 'WillSendRequestForAuthenticationChallenge' instead.")] void ReceivedAuthenticationChallenge (NSUrlConnection connection, NSUrlAuthenticationChallenge challenge); [Export ("connection:didCancelAuthenticationChallenge:")] - [Availability (Deprecated=Platform.iOS_8_0|Platform.Mac_10_10, Message="Use WillSendRequestForAuthenticationChallenge instead")] + [Availability (Deprecated=Platform.iOS_8_0|Platform.Mac_10_10, Message="Use 'WillSendRequestForAuthenticationChallenge' instead.")] void CanceledAuthenticationChallenge (NSUrlConnection connection, NSUrlAuthenticationChallenge challenge); [Export ("connectionShouldUseCredentialStorage:")] @@ -5810,7 +6636,7 @@ partial interface NSUrlSession { NSUrlSession FromWeakConfiguration (NSUrlSessionConfiguration configuration, [NullAllowed] NSObject weakDelegate, [NullAllowed] NSOperationQueue delegateQueue); #if !XAMCORE_4_0 - [Obsolete ("Use the overload with a `INSUrlSessionDelegate` parameter.")] + [Obsolete ("Use the overload with a 'INSUrlSessionDelegate' parameter.")] [Static, Wrap ("FromWeakConfiguration (configuration, sessionDelegate, delegateQueue);")] NSUrlSession FromConfiguration (NSUrlSessionConfiguration configuration, NSUrlSessionDelegate sessionDelegate, NSOperationQueue delegateQueue); #endif @@ -6010,8 +6836,8 @@ interface NSUrlSessionStreamTask [Since (7,0)] [Availability (Introduced = Platform.Mac_10_9)] [BaseType (typeof (NSObject), Name="NSURLSessionTask")] - partial interface NSUrlSessionTask : NSCopying { - + partial interface NSUrlSessionTask : NSCopying, NSProgressReporting + { [Export ("taskIdentifier")] nuint TaskIdentifier { get; } @@ -6063,6 +6889,19 @@ partial interface NSUrlSessionTask : NSCopying { [Export ("priority")] float Priority { get; set; } /* float, not CGFloat */ #endif + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("earliestBeginDate", ArgumentSemantic.Copy)] + NSDate EarliestBeginDate { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("countOfBytesClientExpectsToSend")] + long CountOfBytesClientExpectsToSend { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("countOfBytesClientExpectsToReceive")] + long CountOfBytesClientExpectsToReceive { get; set; } + } [Static] @@ -6123,7 +6962,7 @@ partial interface NSUrlSessionConfiguration : NSCopying { NSUrlSessionConfiguration EphemeralSessionConfiguration { get; } [Static, Export ("backgroundSessionConfiguration:")] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use CreateBackgroundSessionConfiguration instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'CreateBackgroundSessionConfiguration' instead.")] NSUrlSessionConfiguration BackgroundSessionConfiguration (string identifier); [Export ("identifier", ArgumentSemantic.Copy), NullAllowed] @@ -6204,6 +7043,14 @@ partial interface NSUrlSessionConfiguration : NSCopying { [iOS (9,0), Mac(10,11)] [Export ("shouldUseExtendedBackgroundIdleMode")] bool ShouldUseExtendedBackgroundIdleMode { get; set; } + + [NoWatch, NoTV, NoMac, iOS (11, 0)] + [Export ("multipathServiceType", ArgumentSemantic.Assign)] + NSUrlSessionMultipathServiceType MultipathServiceType { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("waitsForConnectivity")] + bool WaitsForConnectivity { get; set; } } [Since (7,0)] @@ -6246,6 +7093,14 @@ partial interface NSUrlSessionTaskDelegate { [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [Export ("URLSession:task:didFinishCollectingMetrics:")] void DidFinishCollectingMetrics (NSUrlSession session, NSUrlSessionTask task, NSUrlSessionTaskMetrics metrics); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("URLSession:task:willBeginDelayedRequest:completionHandler:")] + void WillBeginDelayedRequest (NSUrlSession session, NSUrlSessionTask task, NSUrlRequest request, Action completionHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("URLSession:taskIsWaitingForConnectivity:")] + void TaskIsWaitingForConnectivity (NSUrlSession session, NSUrlSessionTask task); } [Since (7,0)] @@ -6378,7 +7233,7 @@ interface NSUndoManager { [Export ("redoActionName")] string RedoActionName { get; } - [Advice ("Use correctly named method: SetActionName")] + [Advice ("Use the correctly named method: 'SetActionName'.")] [Export ("setActionName:")] void SetActionname (string actionName); @@ -6933,6 +7788,7 @@ interface NSString2 : NSSecureCoding, NSMutableCopying #if MONOMAC , NSPasteboardReading, NSPasteboardWriting // Documented that it implements NSPasteboard protocols even if header doesn't show it #endif + , NSItemProviderReading, NSItemProviderWriting { [Export ("initWithData:encoding:")] IntPtr Constructor (NSData data, NSStringEncoding encoding); @@ -7191,6 +8047,25 @@ interface NSString2 : NSSecureCoding, NSMutableCopying [Export ("paragraphRangeForRange:")] NSRange GetParagraphRange (NSRange range); + + // From the NSItemProviderReading protocol + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("readableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] + new string[] ReadableTypeIdentifiers { get; } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("objectWithItemProviderData:typeIdentifier:error:")] + [return: NullAllowed] + new NSString GetObject (NSData data, string typeIdentifier, [NullAllowed] out NSError outError); + + // From the NSItemProviderWriting protocol + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("writableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] + new string[] WritableTypeIdentifiers { get; } } [StrongDictionary ("NSString")] @@ -7455,23 +8330,23 @@ interface NSObject2 : NSObjectProtocol { Class GetBindingValueClass (NSString binding); #if !XAMCORE_4_0 - [Obsolete ("Use Bind (NSString binding, NSObject observable, string keyPath, [NullAllowed] NSDictionary options) instead")] + [Obsolete ("Use 'Bind (NSString binding, NSObject observable, string keyPath, [NullAllowed] NSDictionary options)' instead.")] [Export ("bind:toObject:withKeyPath:options:")] void Bind (string binding, NSObject observable, string keyPath, [NullAllowed] NSDictionary options); - [Obsolete ("Use Unbind (NSString binding) instead")] + [Obsolete ("Use 'Unbind (NSString binding)' instead.")] [Export ("unbind:")] void Unbind (string binding); - [Obsolete ("Use GetBindingValueClass (NSString binding) instead")] + [Obsolete ("Use 'GetBindingValueClass (NSString binding)' instead.")] [Export ("valueClassForBinding:")] Class BindingValueClass (string binding); - [Obsolete ("Use GetBindingInfo (NSString binding) instead")] + [Obsolete ("Use 'GetBindingInfo (NSString binding)' instead.")] [Export ("infoForBinding:")] NSDictionary BindingInfo (string binding); - [Obsolete ("Use GetBindingOptionDescriptions (NSString aBinding) instead")] + [Obsolete ("Use 'GetBindingOptionDescriptions (NSString aBinding)' instead.")] [Export ("optionDescriptionsForBinding:")] NSObject[] BindingOptionDescriptions (string aBinding); @@ -7480,7 +8355,7 @@ interface NSObject2 : NSObjectProtocol { NSObject GetDefaultPlaceholder (NSObject marker, string binding); [Static] - [Obsolete ("Use SetDefaultPlaceholder (NSObject placeholder, NSObject marker, NSString binding) instead")] + [Obsolete ("Use 'SetDefaultPlaceholder (NSObject placeholder, NSObject marker, NSString binding)' instead.")] [Wrap ("SetDefaultPlaceholder (placeholder, marker, (NSString) binding)")] void SetDefaultPlaceholder (NSObject placeholder, NSObject marker, string binding); @@ -8778,6 +9653,156 @@ partial interface NSItemProvider : NSCopying { [Export ("registerCloudKitShare:container:")] void RegisterCloudKitShare (CKShare share, CKContainer container); #endif + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("registerDataRepresentationForTypeIdentifier:visibility:loadHandler:")] + void RegisterDataRepresentation (string typeIdentifier, NSItemProviderRepresentationVisibility visibility, RegisterDataRepresentationLoadHandler loadHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:")] + void RegisterFileRepresentation (string typeIdentifier, NSItemProviderFileOptions fileOptions, NSItemProviderRepresentationVisibility visibility, RegisterFileRepresentationLoadHandler loadHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("registeredTypeIdentifiersWithFileOptions:")] + string[] GetRegisteredTypeIdentifiers (NSItemProviderFileOptions fileOptions); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("hasRepresentationConformingToTypeIdentifier:fileOptions:")] + bool HasConformingRepresentation (string typeIdentifier, NSItemProviderFileOptions fileOptions); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Async, Export ("loadDataRepresentationForTypeIdentifier:completionHandler:")] + NSProgress LoadDataRepresentation (string typeIdentifier, Action completionHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Async, Export ("loadFileRepresentationForTypeIdentifier:completionHandler:")] + NSProgress LoadFileRepresentation (string typeIdentifier, Action completionHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Async (ResultTypeName = "LoadInPlaceResult"), Export ("loadInPlaceFileRepresentationForTypeIdentifier:completionHandler:")] + NSProgress LoadInPlaceFileRepresentation (string typeIdentifier, LoadInPlaceFileRepresentationHandler completionHandler); + + [NoWatch, NoTV, NoMac, iOS (11, 0)] + [NullAllowed, Export ("suggestedName")] + string SuggestedName { get; set; } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("initWithObject:")] + IntPtr Constructor (INSItemProviderWriting @object); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("registerObject:visibility:")] + void RegisterObject (INSItemProviderWriting @object, NSItemProviderRepresentationVisibility visibility); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("registerObjectOfClass:visibility:loadHandler:")] + void RegisterObject (Class aClass, NSItemProviderRepresentationVisibility visibility, RegisterObjectRepresentationLoadHandler loadHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Wrap ("RegisterObject (new Class (type), visibility, loadHandler)")] + void RegisterObject (Type type, NSItemProviderRepresentationVisibility visibility, RegisterObjectRepresentationLoadHandler loadHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("canLoadObjectOfClass:")] + bool CanLoadObject (Class aClass); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Wrap ("CanLoadObject (new Class (type))")] + bool CanLoadObject (Type type); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Async, Export ("loadObjectOfClass:completionHandler:")] + NSProgress LoadObject (Class aClass, Action completionHandler); +#if !MONOMAC + // NSItemProvider_UIKitAdditions category + + [NoWatch, NoTV] + [iOS (11,0)] + [NullAllowed, Export ("teamData", ArgumentSemantic.Copy)] + NSData TeamData { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("preferredPresentationSize", ArgumentSemantic.Assign)] + CGSize PreferredPresentationSize { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("preferredPresentationStyle", ArgumentSemantic.Assign)] + UIPreferredPresentationStyle PreferredPresentationStyle { get; set; } +#endif // !MONOMAC + } + + delegate NSProgress RegisterFileRepresentationLoadHandler ([BlockCallback] RegisterFileRepresentationCompletionHandler completionHandler); + delegate void RegisterFileRepresentationCompletionHandler (NSUrl fileUrl, bool coordinated, NSError error); + delegate void ItemProviderDataCompletionHandler (NSData data, NSError error); + delegate NSProgress RegisterDataRepresentationLoadHandler ([BlockCallback] ItemProviderDataCompletionHandler completionHandler); + delegate void LoadInPlaceFileRepresentationHandler (NSUrl fileUrl, bool isInPlace, NSError error); + delegate NSProgress RegisterObjectRepresentationLoadHandler ([BlockCallback] RegisterObjectRepresentationCompletionHandler completionHandler); + delegate void RegisterObjectRepresentationCompletionHandler (INSItemProviderWriting @object, NSError error); + + interface INSItemProviderReading {} + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Protocol] + interface NSItemProviderReading + { + // This static method has to be implemented on each class that implements + // this, this is not a capability that exists in C#. + // We are inlining these on each class that implements NSItemProviderReading + // for the sake of the method being callable from C#, for user code, the + // user needs to manually [Export] the selector on a static method, like + // they do for the "layer" property on CALayer subclasses. + // + [Static, Abstract] + [Export ("readableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] + string[] ReadableTypeIdentifiers { get; } + + [Static, Abstract] + [Export ("objectWithItemProviderData:typeIdentifier:error:")] + [return: NullAllowed] + INSItemProviderReading GetObject (NSData data, string typeIdentifier, [NullAllowed] out NSError outError); + } + + interface INSItemProviderWriting {} + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Protocol] + interface NSItemProviderWriting + { + // + // This static method has to be implemented on each class that implements + // this, this is not a capability that exists in C#. + // We are inlining these on each class that implements NSItemProviderWriting + // for the sake of the method being callable from C#, for user code, the + // user needs to manually [Export] the selector on a static method, like + // they do for the "layer" property on CALayer subclasses. + // + [Static, Abstract] + [Export ("writableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] + string[] WritableTypeIdentifiers { get; } + + // This is an optional method, which means the generator will inline it in any classes + // that implements this interface. Unfortunately none of the native classes that implements + // the protocol actually implements this method, which means that inlining the method will cause + // introspection to complain (rightly). So comment out this method to avoid generator a lot of unusable API. + // See also https://bugzilla.xamarin.com/show_bug.cgi?id=59308. + // + // [Static] + // [Export ("itemProviderVisibilityForRepresentationWithTypeIdentifier:")] + // NSItemProviderRepresentationVisibility GetItemProviderVisibility (string typeIdentifier); + + [Export ("writableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] + // 'WritableTypeIdentifiers' is a nicer name, but there's a static property with that name. + string[] WritableTypeIdentifiersForItemProvider { get; } + + [Export ("itemProviderVisibilityForRepresentationWithTypeIdentifier:")] + // 'GetItemProviderVisibility' is a nicer name, but there's a static method with that name. + NSItemProviderRepresentationVisibility GetItemProviderVisibilityForTypeIdentifier (string typeIdentifier); + + [Abstract] + [Async, Export ("loadDataWithTypeIdentifier:forItemProviderCompletionHandler:")] + [return: NullAllowed] + NSProgress LoadData (string typeIdentifier, Action completionHandler); } #if XAMCORE_2_0 @@ -8956,7 +9981,7 @@ interface NSNetService { void Publish (NSNetServiceOptions options); [Export ("resolve")] - [Availability (Introduced = Platform.iOS_2_0 | Platform.Mac_10_2, Deprecated = Platform.iOS_2_0 | Platform.Mac_10_4, Message = "Use Resolve (double) instead")] + [Availability (Introduced = Platform.iOS_2_0 | Platform.Mac_10_2, Deprecated = Platform.iOS_2_0 | Platform.Mac_10_4, Message = "Use 'Resolve (double)' instead.")] [NoWatch] void Resolve (); @@ -9265,6 +10290,7 @@ interface NSNotificationQueue { // init returns NIL [DisableDefaultCtor] partial interface NSValue : NSSecureCoding, NSCopying { + [Availability (Deprecated = Platform.Mac_10_13 | Platform.iOS_11_0 | Platform.TV_11_0 | Platform.Watch_4_0, Message="Potential for buffer overruns. Use 'StoreValueAtAddress (IntPtr, nuint)' instead.")] [Export ("getValue:")] void StoreValueAtAddress (IntPtr value); @@ -9373,12 +10399,21 @@ partial interface NSValue : NSSecureCoding, NSCopying { [Export ("UIEdgeInsetsValue")] UIKit.UIEdgeInsets UIEdgeInsetsValue { get; } + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("directionalEdgeInsetsValue")] + NSDirectionalEdgeInsets DirectionalEdgeInsetsValue { get; } + [Export ("valueWithCGAffineTransform:")][Static] NSValue FromCGAffineTransform (XamCore.CoreGraphics.CGAffineTransform tran); [Export ("valueWithUIEdgeInsets:")][Static] NSValue FromUIEdgeInsets (UIKit.UIEdgeInsets insets); + [Watch (4,0), TV (11,0), iOS (11,0)] + [Static] + [Export ("valueWithDirectionalEdgeInsets:")] + NSValue FromDirectionalEdgeInsets (NSDirectionalEdgeInsets insets); + [Since (5,0)] [Export ("valueWithUIOffset:")][Static] NSValue FromUIOffset (UIKit.UIOffset insets); @@ -9449,27 +10484,27 @@ partial interface NSValue : NSSecureCoding, NSCopying { #region SceneKit Additions - [Mac (10,8), iOS (8,0)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Static, Export ("valueWithSCNVector3:")] NSValue FromVector (SCNVector3 vector); - [Mac (10,8), iOS (8,0)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Export ("SCNVector3Value")] SCNVector3 Vector3Value { get; } - [Mac (10,8), iOS (8,0)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Static, Export ("valueWithSCNVector4:")] NSValue FromVector (SCNVector4 vector); - [Mac (10,8), iOS (8,0)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Export ("SCNVector4Value")] SCNVector4 Vector4Value { get; } - [Mac (10,10), iOS (8,0)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Static, Export ("valueWithSCNMatrix4:")] NSValue FromSCNMatrix4 (SCNMatrix4 matrix); - [Mac (10,10), iOS (8,0)] + [iOS (8,0)][Mac (10,9, onlyOn64 : true)] [Export ("SCNMatrix4Value")] SCNMatrix4 SCNMatrix4Value { get; } @@ -10264,11 +11299,11 @@ interface NSProcessInfo { [Export ("hostName")] string HostName { get; } - [Availability (Deprecated = Platform.Mac_10_10 | Platform.iOS_8_0, Message="Use OperatingSystemVersion or IsOperatingSystemAtLeastVersion")] + [Availability (Deprecated = Platform.Mac_10_10 | Platform.iOS_8_0, Message="Use 'OperatingSystemVersion' or 'IsOperatingSystemAtLeastVersion' instead.")] [Export ("operatingSystem")] nint OperatingSystem { get; } - [Availability (Deprecated = Platform.Mac_10_10 | Platform.iOS_8_0, Message="Use OperatingSystemVersionString")] + [Availability (Deprecated = Platform.Mac_10_10 | Platform.iOS_8_0, Message="Use 'OperatingSystemVersionString' instead.")] [Export ("operatingSystemName")] string OperatingSystemName { get; } @@ -10339,16 +11374,20 @@ interface NSProcessInfo { NSString PowerStateDidChangeNotification { get; } #endif -#if MONOMAC [Mac (10,10,3)] + [Watch (4,0)] + [TV (11, 0)] + [iOS (11,0)] [Export ("thermalState")] NSProcessInfoThermalState ThermalState { get; } [Mac (10,10,3)] [Field ("NSProcessInfoThermalStateDidChangeNotification")] + [Watch (4,0)] + [TV (11, 0)] + [iOS (11,0)] [Notification] NSString ThermalStateDidChangeNotification { get; } -#endif } [NoWatch][NoTV][NoiOS] @@ -10520,6 +11559,45 @@ partial interface NSProgress { [Field ("NSProgressFileIconKey")] NSString FileIconKey { get; } #endif + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Async, Export ("performAsCurrentWithPendingUnitCount:usingBlock:")] + void PerformAsCurrent (long unitCount, Action work); + + [Export ("finished")] + bool Finished { [Bind ("isFinished")] get; } + + [Internal] + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("estimatedTimeRemaining", ArgumentSemantic.Copy)] + //[BindAs (typeof (nint?))] + NSNumber _EstimatedTimeRemaining { get; set; } + + [Internal] + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("throughput", ArgumentSemantic.Copy)] + //[BindAs (typeof (nint?))] + NSNumber _Throughput { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("fileOperationKind")] + string FileOperationKind { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("fileURL", ArgumentSemantic.Copy)] + NSUrl FileUrl { get; set; } + + [Internal] + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("fileTotalCount", ArgumentSemantic.Copy)] + //[BindAs (typeof (nint?))] + NSNumber _FileTotalCount { get; set; } + + [Internal] + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [NullAllowed, Export ("fileCompletedCount", ArgumentSemantic.Copy)] + //[BindAs (typeof (nint?))] + NSNumber _FileCompletedCount { get; set; } } interface INSProgressReporting {} @@ -10631,6 +11709,10 @@ interface NSFileCoordinator { [iOS (5,0)][Mac (10,7)] [Export ("purposeIdentifier")] string PurposeIdentifier { get; set; } + + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [Export ("itemAtURL:didChangeUbiquityAttributes:")] + void ItemUbiquityAttributesChanged (NSUrl url, NSSet attributes); } [iOS (8,0)][Mac (10,10)] @@ -10986,6 +12068,12 @@ partial interface NSFileManager { [Export ("unmountVolumeAtURL:options:completionHandler:")] void UnmountVolume (NSUrl url, NSFileManagerUnmountOptions mask, Action completionHandler); #endif + +#if !WATCH && !TVOS + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [Async, Export ("getFileProviderServicesForItemAtURL:completionHandler:")] + void GetFileProviderServices (NSUrl url, Action, NSError> completionHandler); +#endif } [BaseType(typeof(NSObject))] @@ -11124,6 +12212,14 @@ partial interface NSFilePresenter { [Export ("presentedSubitemAtURL:didResolveConflictVersion:")] void PresentedSubitemResolvedConflictVersion (NSUrl url, NSFileVersion version); + + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [Export ("presentedItemDidChangeUbiquityAttributes:")] + void PresentedItemChangedUbiquityAttributes (NSSet attributes); + + [NoWatch, NoTV, Mac (10, 13), iOS (11, 0)] + [Export ("observedPresentedItemUbiquityAttributes", ArgumentSemantic.Strong)] + NSSet PresentedItemObservedUbiquityAttributes { get; } } delegate void NSFileVersionNonlocalVersionsCompletionHandler ([NullAllowed] NSFileVersion[] nonlocalFileVersions, [NullAllowed] NSError error); @@ -11210,6 +12306,10 @@ interface NSFileVersion { [Static] [Export ("removeOtherVersionsOfItemAtURL:error:")] bool RemoveOtherVersions (NSUrl url, out NSError outError); + + [NoWatch, NoTV, Mac (10, 12), iOS (10, 0)] + [NullAllowed, Export ("originatorNameComponents", ArgumentSemantic.Copy)] + NSPersonNameComponents OriginatorNameComponents { get; } } [BaseType (typeof (NSObject))] @@ -11873,6 +12973,10 @@ interface NSTextCheckingResult : NSSecureCoding, NSCopying { [Wrap ("TransitInformationCheckingResult (range, components != null ? components.Dictionary : null)")] NSTextCheckingResult TransitInformationCheckingResult (NSRange range, NSTextCheckingTransitComponents components); + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("rangeWithName:")] + NSRange GetRange (string name); + } [StrongDictionary ("NSTextChecking")] @@ -12140,6 +13244,7 @@ interface NSDateInterval : NSCopying, NSSecureCoding { bool ContainsDate (NSDate date); } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSObject))] interface NSUnit : NSCopying, NSSecureCoding { @@ -12147,6 +13252,7 @@ interface NSUnit : NSCopying, NSSecureCoding { string Symbol { get; } [Export ("initWithSymbol:")] + [DesignatedInitializer] IntPtr Constructor (string symbol); } @@ -12183,6 +13289,11 @@ interface NSUnitConverterLinear : NSSecureCoding { [Abstract] // abstract subclass of NSUnit [DisableDefaultCtor] // there's a designated initializer interface NSDimension : NSSecureCoding { + // Inlined from base type + [Export ("initWithSymbol:")] + [DesignatedInitializer] + IntPtr Constructor (string symbol); + [Export ("converter", ArgumentSemantic.Copy)] NSUnitConverter Converter { get; } @@ -12225,13 +13336,25 @@ interface NSUnitTemperature : NSSecureCoding { NSDimension BaseUnit { get; } } -#if MONOMAC +#if !WATCH && !TVOS + [Mac (10,8), iOS (11,0), NoWatch, NoTV] partial interface NSFileManager { [MountainLion, Export ("trashItemAtURL:resultingItemURL:error:")] bool TrashItem (NSUrl url, out NSUrl resultingItemUrl, out NSError error); } + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface NSFileProviderService + { + [Export ("name")] + string Name { get; } + } +#endif + +#if MONOMAC partial interface NSFilePresenter { [MountainLion, Export ("primaryPresentedItemURL")] @@ -12434,6 +13557,7 @@ interface NSAffineTransform : NSSecureCoding, NSCopying { CGAffineTransform TransformStruct { get; set; } } + [Availability (Deprecated = Platform.Mac_10_13 | Platform.iOS_11_0 | Platform.Watch_2_0 | Platform.TV_11_0, Message = "Use 'NSXpcConnection' instead.")] [BaseType (typeof (NSObject))] [DisableDefaultCtor] interface NSConnection { @@ -12537,6 +13661,7 @@ interface NSConnection { NSConnectionDelegate Delegate { get; set; } } + [Availability (Deprecated = Platform.Mac_10_13 | Platform.iOS_11_0 | Platform.Watch_2_0 | Platform.TV_11_0, Message = "Use 'NSXpcConnection' instead.")] [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -12560,6 +13685,7 @@ interface NSConnectionDelegate { bool AllowNewConnection (NSConnection newConnection, NSConnection parentConnection); } + [Availability (Deprecated = Platform.Mac_10_13 | Platform.iOS_11_0 | Platform.Watch_2_0 | Platform.TV_11_0, Message = "Use 'NSXpcConnection' instead.")] [BaseType (typeof (NSObject))] [DisableDefaultCtor] interface NSDistantObjectRequest { @@ -12692,11 +13818,11 @@ interface NSAppleEventDescriptor : NSSecureCoding, NSCopying { IntPtr _InitRecordDescriptor (); #if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initListDescriptor")] NSObject InitListDescriptor (); - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initRecordDescriptor")] NSObject InitRecordDescriptor (); #endif @@ -13223,6 +14349,7 @@ interface NSUrlSessionTaskMetrics { nuint RedirectCount { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitAcceleration : NSSecureCoding { @@ -13245,6 +14372,7 @@ interface NSUnitAcceleration : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitAngle : NSSecureCoding { @@ -13283,6 +14411,7 @@ interface NSUnitAngle : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitArea : NSSecureCoding { @@ -13353,6 +14482,7 @@ interface NSUnitArea : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitConcentrationMass : NSSecureCoding { @@ -13379,6 +14509,7 @@ interface NSUnitConcentrationMass : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitDispersion : NSSecureCoding { @@ -13397,6 +14528,7 @@ interface NSUnitDispersion : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitDuration : NSSecureCoding { @@ -13423,6 +14555,7 @@ interface NSUnitDuration : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitElectricCharge : NSSecureCoding { @@ -13461,6 +14594,7 @@ interface NSUnitElectricCharge : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitElectricCurrent : NSSecureCoding { @@ -13495,6 +14629,7 @@ interface NSUnitElectricCurrent : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitElectricPotentialDifference : NSSecureCoding { @@ -13529,6 +14664,7 @@ interface NSUnitElectricPotentialDifference : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitElectricResistance : NSSecureCoding { @@ -13563,6 +14699,7 @@ interface NSUnitElectricResistance : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitEnergy : NSSecureCoding { @@ -13597,6 +14734,7 @@ interface NSUnitEnergy : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitFrequency : NSSecureCoding { @@ -13643,6 +14781,7 @@ interface NSUnitFrequency : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitFuelEfficiency : NSSecureCoding { @@ -13669,6 +14808,7 @@ interface NSUnitFuelEfficiency : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitLength : NSSecureCoding { @@ -13771,6 +14911,7 @@ interface NSUnitLength : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitIlluminance : NSSecureCoding { @@ -13789,6 +14930,7 @@ interface NSUnitIlluminance : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitMass : NSSecureCoding { @@ -13867,6 +15009,7 @@ interface NSUnitMass : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitPower : NSSecureCoding { @@ -13925,6 +15068,7 @@ interface NSUnitPower : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitPressure : NSSecureCoding { @@ -13979,6 +15123,7 @@ interface NSUnitPressure : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitSpeed : NSSecureCoding { @@ -14009,6 +15154,7 @@ interface NSUnitSpeed : NSSecureCoding { NSDimension BaseUnit { get; } } + [DisableDefaultCtor] // -init should never be called on NSUnit! [Watch (3,0)][TV (10,0)][Mac (10,12)][iOS (10,0)] [BaseType (typeof (NSDimension))] interface NSUnitVolume : NSSecureCoding { @@ -14206,4 +15352,10 @@ interface NSMeasurementFormatter : NSSecureCoding { string ToString (NSUnit unit); } + [iOS (6,0), Mac (10,8), Watch (2,0), TV (9,0)] + [BaseType (typeof (NSObject), Name = "NSXPCListenerEndpoint")] + [DisableDefaultCtor] + interface NSXpcListenerEndpoint : NSSecureCoding + { + } } diff --git a/src/frameworks.sources b/src/frameworks.sources index d438aa2e845a..197eb22ae657 100644 --- a/src/frameworks.sources +++ b/src/frameworks.sources @@ -101,6 +101,7 @@ APPKIT_SOURCES = \ AppKit/NSSharingServiceDelegate.cs \ AppKit/NSDocument.cs \ AppKit/NSEvent.cs \ + AppKit/NSFont.cs \ AppKit/NSGestureRecognizer.cs \ AppKit/NSGradient.cs \ AppKit/NSGraphics.cs \ @@ -150,6 +151,11 @@ APPKIT_SOURCES = \ AppKit/NSColorPickerTouchBarItem.cs \ AppKit/NSSliderTouchBarItem.cs +# ARKit + +ARKIT_SOURCES = \ + ARKit/ARPointCloud.cs \ + # AssetsLibrary ASSETSLIBRARY_API_SOURCES = \ @@ -242,6 +248,7 @@ AVFOUNDATION_SOURCES = \ AVFoundation/AVCaptureVideoDataOutput.cs \ AVFoundation/AVCaptureVideoPreviewLayer.cs \ AVFoundation/AVCompat.cs \ + AVFoundation/AVDepthData.cs \ AVFoundation/AVFragmentedAsset.cs \ AVFoundation/AVFragmentedAssetTrack.cs \ AVFoundation/AVLayerVideoGravity.cs \ @@ -256,6 +263,7 @@ AVFOUNDATION_SOURCES = \ AVFoundation/AVTextStyleRule.cs \ AVFoundation/DescriptionHelpers.cs \ AVFoundation/Events.cs \ + AVFoundation/AVPlayerLooper.cs \ # AVKit @@ -306,7 +314,6 @@ CONTACTS_SOURCES = \ Contacts/CNContactStore.cs \ Contacts/CNInstantMessageAddress.cs \ Contacts/CNObsolete.cs \ - Contacts/CNPostalAddress.cs \ Contacts/CNSocialProfile.cs \ # CoreAnimation (this is really Quartz.framework) @@ -401,6 +408,8 @@ COREGRAPHICS_CORE_SOURCES = \ CoreGraphics/CGLayer.cs \ CoreGraphics/CGPath.cs \ CoreGraphics/CGVector.cs \ + CoreGraphics/CGPDFDocument.cs \ + CoreGraphics/CGPDFPage-2.cs \ COREGRAPHICS_SOURCES = \ CoreGraphics/CGBitmapContext.cs \ @@ -419,10 +428,8 @@ COREGRAPHICS_SOURCES = \ CoreGraphics/CGPDFArray.cs \ CoreGraphics/CGPDFContentStream.cs \ CoreGraphics/CGPDFDictionary.cs \ - CoreGraphics/CGPDFDocument.cs \ CoreGraphics/CGPDFObject.cs \ CoreGraphics/CGPDFOperatorTable.cs \ - CoreGraphics/CGPDFPage-2.cs \ CoreGraphics/CGPDFPage.cs \ CoreGraphics/CGPDFScanner.cs \ CoreGraphics/CGPDFStream.cs \ @@ -483,6 +490,13 @@ COREMIDI_CORE_SOURCES = \ CoreMidi/MidiThruConnection.cs \ CoreMidi/MidiThruConnectionParams.cs \ +# CoreML + +COREML_SOURCES = \ + CoreML/MLDictionaryFeatureProvider.cs \ + CoreML/MLMultiArray.cs \ + CoreML/MLMultiArrayConstraint.cs \ + # CoreMotion COREMOTION_CORE_SOURCES = \ @@ -586,6 +600,9 @@ EVENTKIT_SOURCES = \ EVENTKITUI_CORE_SOURCES = \ EventKitUI/Defs.cs \ +EVENTKITUI_SOURCES = \ + EventKitUI/EKUIBundle.cs \ + # ExternalAccessory EXTERNALACCESSORY_API_SOURCES = \ @@ -620,6 +637,7 @@ FOUNDATION_CORE_SOURCES = \ Foundation/NSNumber.mac.cs \ Foundation/NSNumber2.cs \ Foundation/NSObject2.cs \ + Foundation/NSProgress.cs \ Foundation/NSRange.cs \ Foundation/NSString.cs \ Foundation/NSValue.cs \ @@ -694,6 +712,7 @@ FOUNDATION_SOURCES = \ Foundation/NSPortMessage.cs \ Foundation/NSPredicate.cs \ Foundation/NSPropertyListSerialization.cs \ + Foundation/NSProxy.cs \ Foundation/NSRunLoop.cs \ Foundation/NSScriptCommandDescription.cs \ Foundation/NSScriptCommandArgumentDescription.cs \ @@ -710,6 +729,7 @@ FOUNDATION_SOURCES = \ Foundation/NSTimeZone.cs \ Foundation/NSUbiquitousKeyValueStore.cs \ Foundation/NSUndoManager.cs \ + Foundation/NSUnit.cs \ Foundation/NSUrl.cs \ Foundation/NSUrlComponents.cs \ Foundation/NSUrlConnection.cs \ @@ -802,6 +822,8 @@ HOMEKIT_SOURCES = \ HomeKit/HMCharacteristicProperties.cs \ HomeKit/HMEventTrigger.cs \ HomeKit/HMHome.cs \ + HomeKit/HMSignificantTimeEvent.cs \ + HomeKit/HMMutableSignificantTimeEvent.cs \ HomeKit/HMService.cs \ # iAd @@ -830,19 +852,45 @@ IMAGEKIT_CORE_SOURCES = \ # Intents INTENTS_SOURCES = \ + Intents/INBillTypeResolutionResult.cs \ + Intents/INCallRecord.cs \ + Intents/INCallRecordTypeResolutionResult.cs \ + Intents/INCarAirCirculationModeResolutionResult.cs \ + Intents/INCarAudioSourceResolutionResult.cs \ + Intents/INCarDefrosterResolutionResult.cs \ + Intents/INCarSeatResolutionResult.cs \ + Intents/INCarSignalOptionsResolutionResult.cs \ Intents/INCompat.cs \ Intents/INGetCarLockStatusIntentResponse.cs \ Intents/INGetCarPowerLevelStatusIntentResponse.cs \ Intents/INIntentResolutionResult.cs \ + Intents/INInteraction.cs \ + Intents/INMessageAttributeOptionsResolutionResult.cs \ + Intents/INMessageAttributeResolutionResult.cs \ + Intents/INPaymentStatusResolutionResult.cs \ Intents/INPriceRange.cs \ + Intents/INRadioTypeResolutionResult.cs \ + Intents/INRelativeReferenceResolutionResult.cs \ + Intents/INRelativeSettingResolutionResult.cs \ Intents/INRideOption.cs \ + Intents/INSaveProfileInCarIntent.cs \ + Intents/INSearchCallHistoryIntent.cs \ Intents/INSetCarLockStatusIntent.cs \ Intents/INSetClimateSettingsInCarIntent.cs \ Intents/INSetDefrosterSettingsInCarIntent.cs \ Intents/INSetProfileInCarIntent.cs \ Intents/INSetSeatSettingsInCarIntent.cs \ + Intents/INSpeakableString.cs \ Intents/INStartWorkoutIntent.cs \ - Intents/INSaveProfileInCarIntent.cs \ + Intents/INWorkoutGoalUnitTypeResolutionResult.cs \ + Intents/INWorkoutLocationTypeResolutionResult.cs \ + +# IOSurface +IOSURFACE_CORE_SOURCES = \ + IOSurface/IODefs.cs + +IOSURFACE_SOURCES = \ + IOSurface/IOSurface.cs # JavaScriptCore @@ -866,6 +914,7 @@ MAPKIT_CORE_SOURCES = \ MAPKIT_SOURCES = \ MapKit/MKCircle.cs \ MapKit/MKDirections.cs \ + MapKit/MKFeatureDisplayPriority.cs \ MapKit/MKGeodesicPolyline.cs \ MapKit/MKLocalSearch.cs \ MapKit/MKMapItem.cs \ @@ -928,9 +977,12 @@ METAL_CORE_SOURCES = \ Metal/Defs.cs \ METAL_SOURCES = \ + Metal/MTLArgumentEncoder.cs \ Metal/MTLCompat.cs \ Metal/MTLDevice.cs \ Metal/MTLArrays.cs \ + Metal/MTLRenderCommandEncoder.cs \ + Metal/MTLRenderPassDescriptor.cs \ Metal/MTLVertexDescriptor.cs \ # MetalKit @@ -962,6 +1014,8 @@ MODELIO_CORE_SOURCES = \ MODELIO_SOURCES = \ ModelIO/MDLAsset.cs \ ModelIO/MDLNoiseTexture.cs \ + ModelIO/MDLTransform.cs \ + ModelIO/MDLTransformComponent.cs \ ModelIO/MDLVertexDescriptor.cs \ ModelIO/MDLMesh.cs \ @@ -1059,13 +1113,17 @@ OPENGLES_SOURCES = \ PASSKIT_API_SOURCES = \ PassKit/PKEnums.cs \ + +PASSKIT_SOURCES = \ + PassKit/PKPaymentRequest.cs \ # PdfKit -PDFKIT_CORE_SOURCES = \ +PDFKIT_API_SOURCES = \ PdfKit/Enums.cs \ PDFKIT_SOURCES = \ + PdfKit/PdfAnnotation.cs \ PdfKit/PdfKit.cs \ # Photos @@ -1210,7 +1268,7 @@ SOCIAL_SOURCES = \ # SpriteKit -SPRITEKIT_CORE_SOURCES = \ +SPRITEKIT_API_SOURCES = \ SpriteKit/Enums.cs \ SPRITEKIT_SOURCES = \ @@ -1307,6 +1365,7 @@ UIKIT_SOURCES = \ UIKit/UIDocumentInteractionController.cs \ UIKit/UIDocumentMenuViewController.cs \ UIKit/UIDocumentPickerViewController.cs \ + UIKit/UIDragDropSessionExtensions.cs \ UIKit/UIDynamicAnimator.cs \ UIKit/UIEnumsExtensions.cs \ UIKit/UIEvent.cs \ @@ -1383,6 +1442,15 @@ VIDEOTOOLBOX_SOURCES = \ VideoToolbox/VTUtilities.cs \ VideoToolbox/VTPixelTransferProperties.cs \ +# Vision + +VISION_SOURCES = \ + Vision/VNBarcodeSymbologyExtensions.cs \ + Vision/VNDetectBarcodesRequest.cs \ + Vision/VNFaceLandmarkRegion2D.cs \ + Vision/VNRequest.cs \ + Vision/VNUtils.cs \ + # WatchConnectivity WATCHCONNECTIVITY_CORE_SOURCES = \ @@ -1463,6 +1531,13 @@ SHARED_CORE_SOURCES = \ ObjCRuntime/Protocol.cs \ ObjCRuntime/Registrar.core.cs \ ObjCRuntime/Selector.cs \ + Simd/MatrixDouble4x4.cs \ + Simd/MatrixFloat2x2.cs \ + Simd/MatrixFloat3x3.cs \ + Simd/MatrixFloat4x3.cs \ + Simd/MatrixFloat4x4.cs \ + Simd/VectorDouble3.cs \ + Simd/VectorFloat3.cs \ SHARED_SOURCES = \ ../runtime/Delegates.generated.cs \ @@ -1517,7 +1592,10 @@ SHARED_SOURCES = \ COMMON_FRAMEWORKS = \ AVFoundation \ + CoreBluetooth \ CoreFoundation \ + CoreML \ + CoreVideo \ Foundation \ GameKit \ SceneKit \ @@ -1537,7 +1615,6 @@ MAC_FRAMEWORKS = \ ContactsUI \ CoreAnimation \ CoreAudioKit \ - CoreBluetooth \ CoreData \ CoreGraphics \ CoreImage \ @@ -1546,9 +1623,9 @@ MAC_FRAMEWORKS = \ CoreMidi \ CoreServices \ CoreText \ - CoreVideo \ CoreWlan \ EventKit \ + ExternalAccessory \ FinderSync \ GameController \ GameplayKit \ @@ -1556,6 +1633,7 @@ MAC_FRAMEWORKS = \ ImageIO \ ImageKit \ Intents \ + IOSurface \ JavaScriptCore \ LocalAuthentication \ MapKit \ @@ -1573,6 +1651,7 @@ MAC_FRAMEWORKS = \ OpenGL \ PdfKit \ Photos \ + PhotosUI \ PrintCore \ QTKit \ QuartzComposer \ @@ -1586,6 +1665,7 @@ MAC_FRAMEWORKS = \ StoreKit \ SystemConfiguration \ VideoToolbox \ + Vision \ WebKit \ WKWebKit \ @@ -1597,6 +1677,7 @@ IOS_FRAMEWORKS = \ AdSupport \ AddressBook \ AddressBookUI \ + ARKit \ AssetsLibrary \ AudioToolbox \ AudioUnit \ @@ -1607,7 +1688,6 @@ IOS_FRAMEWORKS = \ ContactsUI \ CoreAnimation \ CoreAudioKit \ - CoreBluetooth \ CoreData \ CoreGraphics \ CoreImage \ @@ -1615,22 +1695,27 @@ IOS_FRAMEWORKS = \ CoreMIDI \ CoreMedia \ CoreMotion \ + CoreNFC \ CoreSpotlight \ CoreTelephony \ CoreText \ - CoreVideo \ + DeviceCheck \ EventKit \ EventKitUI \ ExternalAccessory \ + FileProvider \ + FileProviderUI \ GLKit \ GameController \ GameplayKit \ HealthKit \ HealthKitUI \ HomeKit \ + IdentityLookup \ ImageIO \ Intents \ IntentsUI \ + IOSurface \ JavaScriptCore \ LocalAuthentication \ MapKit \ @@ -1650,6 +1735,7 @@ IOS_FRAMEWORKS = \ NotificationCenter \ OpenGLES \ PassKit \ + PdfKit \ Photos \ PhotosUI \ PushKit \ @@ -1667,6 +1753,7 @@ IOS_FRAMEWORKS = \ UserNotificationsUI \ VideoToolbox \ VideoSubscriberAccount \ + Vision \ WatchConnectivity \ WatchKit \ WKWebKit \ @@ -1706,7 +1793,6 @@ TVOS_FRAMEWORKS = \ CFNetwork \ CloudKit \ CoreAnimation \ - CoreBluetooth \ CoreData \ CoreGraphics \ CoreImage \ @@ -1714,13 +1800,14 @@ TVOS_FRAMEWORKS = \ CoreMedia \ CoreSpotlight \ CoreText \ - CoreVideo \ + DeviceCheck \ ExternalAccessory \ GLKit \ GameController \ GameplayKit \ HomeKit \ ImageIO \ + IOSurface \ JavaScriptCore \ MapKit \ MediaAccessibility \ @@ -1745,6 +1832,7 @@ TVOS_FRAMEWORKS = \ UserNotifications \ VideoSubscriberAccount \ VideoToolbox \ + Vision \ # # Compute the SOURCES variables. diff --git a/src/gamecontroller.cs b/src/gamecontroller.cs index 9a8a24028961..dcb936bdb95f 100644 --- a/src/gamecontroller.cs +++ b/src/gamecontroller.cs @@ -56,7 +56,7 @@ partial interface GCControllerAxisInput { partial interface GCControllerButtonInput { #if !XAMCORE_4_0 - [Obsolete ("Use the ValueChangedHandler property")] + [Obsolete ("Use the 'ValueChangedHandler' property.")] [Wrap ("ValueChangedHandler = handler;", IsVirtual = true)] void SetValueChangedHandler (GCControllerButtonValueChanged handler); #endif @@ -73,7 +73,7 @@ partial interface GCControllerButtonInput { #if !XAMCORE_4_0 [iOS (8,0), Mac (10,10)] - [Obsolete ("Use the PressedChangedHandler property")] + [Obsolete ("Use the 'PressedChangedHandler' property.")] [Wrap ("PressedChangedHandler = handler;", IsVirtual = true)] void SetPressedChangedHandler (GCControllerButtonValueChanged handler); #endif @@ -310,7 +310,7 @@ partial interface GCMotion { GCController Controller { get; } #if !XAMCORE_4_0 - [Obsolete ("Use the ValueChangedHandler property")] + [Obsolete ("Use the 'ValueChangedHandler' property.")] [Wrap ("ValueChangedHandler = handler;", IsVirtual = true)] void SetValueChangedHandler (Action handler); #endif @@ -325,13 +325,19 @@ partial interface GCMotion { [Export ("userAcceleration", ArgumentSemantic.Assign)] Vector3d UserAcceleration { get; } - [NoTV] // Xcode 7.2 + [TV (11,0)] [Export ("attitude", ArgumentSemantic.Assign)] Quaterniond Attitude { get; } - [NoTV] // Xcode 7.2 + [TV (11,0)] [Export ("rotationRate", ArgumentSemantic.Assign)] Vector3d RotationRate { get; } + + [TV (11,0)] + [iOS (11,0)] + [Mac (10,13, onlyOn64: true)] + [Export ("hasAttitudeAndRotationRate")] + bool HasAttitudeAndRotationRate { get; } } [NoMac] diff --git a/src/gamekit.cs b/src/gamekit.cs index 0a4af64874ae..fe635223c882 100644 --- a/src/gamekit.cs +++ b/src/gamekit.cs @@ -82,7 +82,7 @@ interface GKPeerPickerControllerDelegate { [NoWatch] [NoTV] [BaseType (typeof (NSObject))] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use MCBrowserViewController from the MultipeerConnectivity framework instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MCBrowserViewController' from the 'MultipeerConnectivity' framework instead.")] interface GKPeerPickerController { [Export ("connectionTypesMask", ArgumentSemantic.Assign)] GKPeerPickerConnectionType ConnectionTypesMask { get; set; } @@ -136,7 +136,7 @@ interface GKVoiceChatClient { [NoWatch] // deprecated in 2.0 (but framework not added before 3.0) [NoTV] [BaseType (typeof (NSObject))] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use GKVoiceChat instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use 'GKVoiceChat' instead.")] interface GKVoiceChatService { [Export ("defaultVoiceChatService")][Static] @@ -218,7 +218,7 @@ interface GKSessionDelegate { [NoTV] [NoWatch] // deprecated in 2.0 (but framework not added before 3.0) [BaseType (typeof (NSObject))] - [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use MultipeerConnectivity.MCSession instead")] + [Availability (Introduced = Platform.iOS_3_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'MultipeerConnectivity.MCSession' instead.")] interface GKSession { [Export ("initWithSessionID:displayName:sessionMode:")] [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10)] @@ -316,7 +316,7 @@ interface GKLeaderboard { [NoWatch] // deprecated in 2.0 (but framework not added before 3.0) [NoTV] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use Identifier instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'Identifier' instead.")] [NullAllowed] // by default this property is null [Export ("category", ArgumentSemantic.Copy)] string Category { get; set; } @@ -334,7 +334,7 @@ interface GKLeaderboard { GKScore LocalPlayerScore { get; } [NoWatch] // deprecated in 2.0 (but framework not added before 3.0) - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use ctor (GKPlayer [] players) instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'ctor (GKPlayer [] players)' instead.")] [Export ("initWithPlayerIDs:")] IntPtr Constructor ([NullAllowed] string [] players); @@ -344,7 +344,7 @@ interface GKLeaderboard { [NoTV] [NoWatch] // deprecated in 2.0 (but framework not added before 3.0) - [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_9, Message = "Use LoadLeaderboards instead")] + [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_9, Message = "Use 'LoadLeaderboards' instead.")] [Static] [Export ("loadCategoriesWithCompletionHandler:")] [Async (ResultTypeName = "GKCategoryResult")] @@ -354,7 +354,7 @@ interface GKLeaderboard { [NoWatch] // deprecated in 2.0 (but framework not added before 3.0) [Static] [Since (5,0)] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use SetDefaultLeaderboard on GKLocalPlayer instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'SetDefaultLeaderboard' on 'GKLocalPlayer' instead.")] [Export ("setDefaultLeaderboard:withCompletionHandler:")] [Async] #if XAMCORE_2_0 @@ -464,7 +464,7 @@ interface GKPlayer : NSSecureCoding { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use GKLocalPlayer.LoadFriendPlayers instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'GKLocalPlayer.LoadFriendPlayers' instead.")] [Export ("isFriend")] bool IsFriend { get; } @@ -504,7 +504,7 @@ interface GKPlayer : NSSecureCoding { [BaseType (typeof (NSObject))] interface GKScore : NSSecureCoding { [NoWatch] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use InitWithLeaderboardIdentifier instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'InitWithLeaderboardIdentifier' instead.")] [Internal][NullAllowed] [Export ("initWithCategory:")] IntPtr InitWithCategory ([NullAllowed] string category); @@ -554,19 +554,19 @@ interface GKScore : NSSecureCoding { [NoWatch] [NoTV] - [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use LeaderboardIdentifier instead")] + [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'LeaderboardIdentifier' instead.")] [NullAllowed] // by default this property is null [Export ("category", ArgumentSemantic.Copy)] #if XAMCORE_2_0 string Category { get; set; } #else - [Obsolete ("Use the Category property instead")] + [Obsolete ("Use the 'Category' property instead.")] string category { get; set; } #endif [NoWatch] [NoTV] - [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use ReportScores instead")] + [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'ReportScores' instead.")] [Export ("reportScoreWithCompletionHandler:")] [Async] #if XAMCORE_2_0 @@ -585,7 +585,7 @@ interface GKScore : NSSecureCoding { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Pass GKPlayers to ChallengeComposeController (GKPlayer [] players, string message, ... ) and present the view controller instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Pass 'GKPlayers' to 'ChallengeComposeController (GKPlayer [] players, string message, ... )' and present the view controller instead.")] [iOS (6,0), Mac (10,8)] [Export ("issueChallengeToPlayers:message:")] void IssueChallengeToPlayers ([NullAllowed] string[] playerIDs, [NullAllowed] string message); @@ -608,7 +608,7 @@ interface GKScore : NSSecureCoding { #if !MONOMAC [NoTV][NoWatch] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Pass GKPlayers to ChallengeComposeController (GKPlayer [] players, string message, ...) instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Pass 'GKPlayers' to 'ChallengeComposeController (GKPlayer [] players, string message, ...)' instead.")] [iOS (7,0)] [Export ("challengeComposeControllerWithPlayers:message:completionHandler:")] UIViewController ChallengeComposeController ([NullAllowed] string[] playerIDs, [NullAllowed] string message, [NullAllowed] GKChallengeComposeHandler completionHandler); @@ -631,7 +631,7 @@ interface GKScore : NSSecureCoding { [NoWatch] [NoTV] [Since (4,2)] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use GKGameCenterViewController instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'GKGameCenterViewController' instead.")] [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -645,7 +645,7 @@ interface GKLeaderboardViewControllerDelegate { } [NoTV][NoWatch] - [Availability (Introduced = Platform.iOS_4_2 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use GKGameCenterViewController instead")] + [Availability (Introduced = Platform.iOS_4_2 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'GKGameCenterViewController' instead.")] #if MONOMAC [BaseType (typeof (GKGameCenterViewController), Events=new Type [] { typeof (GKLeaderboardViewControllerDelegate)}, Delegates=new string [] {"WeakDelegate"})] interface GKLeaderboardViewController @@ -686,7 +686,7 @@ interface GKLocalPlayer { [NoWatch] [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use LoadFriendPlayers instead and collect the friends from the invoked callback")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'LoadFriendPlayers' instead and collect the friends from the invoked callback.")] [Export ("friends", ArgumentSemantic.Retain)] string [] Friends { get; } @@ -698,7 +698,7 @@ interface GKLocalPlayer { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "Set the AuthenticationHandler instead")] + [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_8, Message = "Set the 'AuthenticationHandler' instead.")] [Export ("authenticateWithCompletionHandler:")] [Async] #if XAMCORE_2_0 @@ -714,7 +714,7 @@ interface GKLocalPlayer { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use LoadRecentPlayers(..) instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'LoadRecentPlayers' instead.")] [Export ("loadFriendsWithCompletionHandler:")] [Async] void LoadFriends ([NullAllowed] GKFriendsHandler handler); @@ -748,7 +748,7 @@ interface GKLocalPlayer { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use LoadDefaultLeaderboardIdentifier(..) instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'LoadDefaultLeaderboardIdentifier' instead.")] [Since (6,0)] [Export ("loadDefaultLeaderboardCategoryIDWithCompletionHandler:")] [Async] @@ -756,7 +756,7 @@ interface GKLocalPlayer { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use SetDefaultLeaderboardIdentifier(..) instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'SetDefaultLeaderboardIdentifier' instead.")] [iOS (6,0), Mac (10,8)] [Export ("setDefaultLeaderboardCategoryID:completionHandler:")] [Async] @@ -853,7 +853,7 @@ interface GKSavedGameListener { [DisableDefaultCtor] interface GKMatch { [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use Players instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'Players' instead.")] [Export ("playerIDs")] string [] PlayersIDs { get; } @@ -868,7 +868,7 @@ interface GKMatch { nint ExpectedPlayerCount { get; } [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use SendDataToAllPlayers(NSData, GKPlayer[] players, GKMatchSendDataMode mode, NSError error) instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'SendDataToAllPlayers (NSData, GKPlayer[] players, GKMatchSendDataMode mode, NSError error)' instead.")] [Export ("sendData:toPlayers:withDataMode:error:")] // OOPS: bug we shipped with and can not realistically fix, but good news: this is deprecated (the NSError should have been an out) bool SendData (NSData data, string [] players, GKMatchSendDataMode mode, out NSError error); @@ -883,7 +883,7 @@ interface GKMatch { GKVoiceChat VoiceChatWithName (string name); [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use ChooseBestHostingPlayer instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'ChooseBestHostingPlayer' instead.")] [iOS (6,0), Mac (10,9)] [Export ("chooseBestHostPlayerWithCompletionHandler:")] [Async] @@ -916,19 +916,19 @@ interface GKMatch { interface GKMatchDelegate { [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use DataReceivedFromPlayer(GKMatch,NSData,GKPlayer) instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'DataReceivedFromPlayer (GKMatch,NSData,GKPlayer)' instead.")] [Export ("match:didReceiveData:fromPlayer:"), EventArgs ("GKData")] void DataReceived (GKMatch match, NSData data, string playerId); [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use StateChangedForPlayer(GKMatch,GKPlayer,GKPlayerConnectionState) instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'StateChangedForPlayer (GKMatch,GKPlayer,GKPlayerConnectionState)' instead.")] [Export ("match:player:didChangeState:"), EventArgs ("GKState")] void StateChanged (GKMatch match, string playerId, GKPlayerConnectionState state); #if MONOMAC #if !XAMCORE_4_0 // This API was removed or never existed. Can't cleanly remove due to EventsArgs/Delegate - [Obsolete ("No longer an OS X API - it will never be called")] + [Obsolete ("It will never be called.")] [Export ("xamarin:selector:removed:"), EventArgs ("GKPlayerError")] void ConnectionFailed (GKMatch match, string playerId, NSError error); #endif @@ -938,7 +938,7 @@ interface GKMatchDelegate { // so we fake a selector (that Apple won't check) and let the generator do it's job // note: not worth throwing an exception using a [PreSnippet] since the code already throws a // You_Should_Not_Call_base_In_This_Method (so it would not be generated) - [Obsolete ("No longer an iOS API - it will never be called")] + [Obsolete ("It will never be called.")] [Export ("xamarin:selector:removed:"), EventArgs ("GKPlayerError")] void ConnectionFailed (GKMatch match, string playerId, NSError error); #endif @@ -947,7 +947,7 @@ interface GKMatchDelegate { void Failed (GKMatch match, [NullAllowed] NSError error); [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use ShouldReinviteDisconnectedPlayer instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'ShouldReinviteDisconnectedPlayer' instead.")] [Since (5,0)] [Export ("match:shouldReinvitePlayer:"), DelegateName ("GKMatchReinvitation"), DefaultValue (true)] bool ShouldReinvitePlayer (GKMatch match, string playerId); @@ -991,7 +991,7 @@ interface GKVoiceChat { [NoTV] // the API was removed in iOS8 - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use SetMuteStatus instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'SetMuteStatus' instead.")] [Export ("setMute:forPlayer:")] void SetMute (bool isMuted, string playerID); @@ -1000,7 +1000,7 @@ interface GKVoiceChat { bool IsVoIPAllowed (); [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use SetPlayerVoiceChatStateChangeHandler instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'SetPlayerVoiceChatStateChangeHandler' instead.")] [NullAllowed] // by default this property is null [Export ("playerStateUpdateHandler", ArgumentSemantic.Copy)] GKPlayerStateUpdateHandler PlayerStateUpdateHandler { get; set; } @@ -1012,7 +1012,7 @@ interface GKVoiceChat { [NoTV] [Since (5,0)] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use Players instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'Players' instead.")] [Export ("playerIDs")] string [] PlayerIDs { get; } @@ -1057,7 +1057,7 @@ interface GKMatchRequest { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use RecipientResponseHandler instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'RecipientResponseHandler' instead.")] [Since (6,0)] [NullAllowed] // by default this property is null [Export ("inviteeResponseHandler", ArgumentSemantic.Copy)] @@ -1082,7 +1082,7 @@ interface GKMatchRequest { interface GKInvite { [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use Sender instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'Sender' instead.")] [Export ("inviter", ArgumentSemantic.Retain)] string Inviter { get; } @@ -1118,7 +1118,7 @@ interface GKMatchmaker { void FindMatch (GKMatchRequest request, [NullAllowed] GKNotificationMatch matchHandler); [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use FindPlayersForHostedRequest instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'FindPlayersForHostedRequest' instead.")] [Export ("findPlayersForHostedMatchRequest:withCompletionHandler:")] [Async] void FindPlayers (GKMatchRequest request, [NullAllowed] GKFriendsHandler playerHandler); @@ -1150,7 +1150,7 @@ interface GKMatchmaker { [NoTV] [Since (6,0)][Mac (10, 9)] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use CancelPendingInvite instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'CancelPendingInvite' instead.")] [Export ("cancelInviteToPlayer:")] void CancelInvite (string playerID); @@ -1160,7 +1160,7 @@ interface GKMatchmaker { [NoTV] [Since (6,0)][Mac (10,9)] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10)] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, message: "Use 'StartBrowsingForNearbyPlayers(Action handler)' instead.")] [Export ("startBrowsingForNearbyPlayersWithReachableHandler:")] void StartBrowsingForNearbyPlayers ([NullAllowed] Action reachableHandler); @@ -1215,7 +1215,7 @@ interface GKMatchmakerViewController { #if !MONOMAC [NoTV] - [Availability (Deprecated = Platform.iOS_5_0, Message = "Use SetHostedPlayerConnected instead")] + [Availability (Deprecated = Platform.iOS_5_0, Message = "Use 'SetHostedPlayerConnected' instead.")] [Export ("setHostedPlayerReady:")] void SetHostedPlayerReady (string playerID); #endif @@ -1231,7 +1231,7 @@ interface GKMatchmakerViewController { [NoTV] [Since (5,0)] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use SetHostedPlayerConnected(GKPlayer,bool) instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'SetHostedPlayerConnected (GKPlayer,bool)' instead.")] [Export ("setHostedPlayer:connected:")] void SetHostedPlayerConnected (string playerID, bool connected); @@ -1264,7 +1264,7 @@ interface GKMatchmakerViewControllerDelegate { [Abstract] #endif [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use DidFindHostedPlayers")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'DidFindHostedPlayers' instead.")] [Export ("matchmakerViewController:didFindPlayers:"), EventArgs ("GKPlayers")] void DidFindPlayers (GKMatchmakerViewController viewController, string [] playerIDs); @@ -1277,7 +1277,7 @@ interface GKMatchmakerViewControllerDelegate { [NoTV] [Since (5,0)] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use HostedPlayerDidAccept")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'HostedPlayerDidAccept' instead.")] [Export ("matchmakerViewController:didReceiveAcceptFromHostedPlayer:"), EventArgs ("GKPlayer")] void ReceivedAcceptFromHostedPlayer (GKMatchmakerViewController viewController, string playerID); @@ -1291,7 +1291,7 @@ interface GKMatchmakerViewControllerDelegate { [Watch (3,0)] interface GKAchievement : NSSecureCoding { [NoTV] - [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_10, Message = "Use IsHidden on the GKAchievementDescription class instead")] + [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_10, Message = "Use 'IsHidden' on the 'GKAchievementDescription' class instead.")] [Export ("hidden", ArgumentSemantic.Assign)] bool Hidden { [Bind ("isHidden")] get; } @@ -1327,7 +1327,7 @@ interface GKAchievement : NSSecureCoding { #if !MONOMAC [iOS (7,0)] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use ctor (string identifier, GKPlayer player) instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'ctor (string identifier, GKPlayer player)' instead.")] [Export ("initWithIdentifier:forPlayer:")] IntPtr Constructor ([NullAllowed] string identifier, string playerId); #endif @@ -1337,10 +1337,10 @@ interface GKAchievement : NSSecureCoding { #if XAMCORE_2_0 [NoWatch] [NoTV] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use ReportAchievements (GKAchievement[] achievements, Action completionHandler) instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use ReportAchievements '(GKAchievement[] achievements, Action completionHandler)' instead.")] void ReportAchievement ([NullAllowed] Action completionHandler); #else - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use ReportAchievements (GKAchievement[] achievements, GKNotificationHandler completionHandler) instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use ReportAchievements '(GKAchievement[] achievements, GKNotificationHandler completionHandler)' instead.")] void ReportAchievement ([NullAllowed] GKNotificationHandler completionHandler); #endif @@ -1360,7 +1360,7 @@ interface GKAchievement : NSSecureCoding { [NoTV] [NoWatch] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Pass GKPlayers to ChallengeComposeController(GKPlayer[] players, string message, ...) and present the view controller instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Pass 'GKPlayers' to 'ChallengeComposeController(GKPlayer[] players, string message, ...)' and present the view controller instead.")] [iOS (6,0), Mac (10,8)] [Export ("issueChallengeToPlayers:message:")] void IssueChallengeToPlayers ([NullAllowed] string[] playerIDs, [NullAllowed] string message); @@ -1368,7 +1368,7 @@ interface GKAchievement : NSSecureCoding { [NoTV] [NoWatch] [iOS (6,0), Mac (10,8)] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Pass GKPlayers to SelectChallengeablePlayers instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Pass 'GKPlayers' to 'SelectChallengeablePlayers' instead.")] [Export ("selectChallengeablePlayerIDs:withCompletionHandler:")] [Async] void SelectChallengeablePlayerIDs ([NullAllowed] string[] playerIDs, [NullAllowed] Action completionHandler); @@ -1376,7 +1376,7 @@ interface GKAchievement : NSSecureCoding { #if !MONOMAC [NoTV] [iOS (7,0)] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use Player instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'Player' instead.")] [Export ("playerID", ArgumentSemantic.Copy)] string PlayerID { get; @@ -1477,7 +1477,7 @@ interface GKAchievementDescription : NSSecureCoding { NSImage PlaceholderCompletedAchievementImage { get; } #else - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_8, Message = "Use LoadImage instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_8, Message = "Use 'LoadImage' instead.")] [Export ("image")] UIImage Image { get; } @@ -1503,7 +1503,7 @@ interface GKAchievementDescription : NSSecureCoding { [NoWatch] [NoTV] - [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use GKGameCenterViewController instead")] + [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'GKGameCenterViewController' instead.")] [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -1517,7 +1517,7 @@ interface GKAchievementViewControllerDelegate { } [NoTV][NoWatch] - [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use GKGameCenterViewController instead")] + [Availability (Introduced = Platform.iOS_4_1 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'GKGameCenterViewController' instead.")] #if MONOMAC [BaseType (typeof (GKGameCenterViewController), Events=new Type [] { typeof (GKAchievementViewControllerDelegate)}, Delegates=new string [] {"WeakDelegate"})] interface GKAchievementViewController @@ -1579,7 +1579,7 @@ interface GKFriendRequestComposeViewController : UIAppearance [Export ("maxNumberOfRecipients")][Static] nint MaxNumberOfRecipients { get; } - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use AddRecipientPlayers()")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'AddRecipientPlayers' instead.")] [Export ("addRecipientsWithEmailAddresses:")] void AddRecipientsFromEmails (string [] emailAddresses); @@ -1635,7 +1635,7 @@ interface GKTurnBasedParticipant { GKPlayer Player { get; } [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use Player")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'Player' instead.")] [Export ("playerID", ArgumentSemantic.Copy)] string PlayerID { get; } @@ -1657,12 +1657,12 @@ interface GKTurnBasedParticipant { [BaseType (typeof (NSObject))] [Model] [Protocol] - [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use GKLocalPlayer.RegisterListener with an object that implements IGKTurnBasedEventListener.")] + [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'GKLocalPlayer.RegisterListener' with an object that implements 'IGKTurnBasedEventListener'.")] [Watch (3,0)] interface GKTurnBasedEventHandlerDelegate { #if !XAMCORE_2_0 [Export ("handleInviteFromGameCenterDoNotUse:")] - [Obsolete ("Use HandleInviteFromGameCenter(NSString[])")] + [Obsolete ("Use HandleInviteFromGameCenter(NSString[]).")] void HandleInviteFromGameCenter (GKPlayer [] playersToInvite); #endif @@ -1673,7 +1673,7 @@ interface GKTurnBasedEventHandlerDelegate { [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10)] void HandleInviteFromGameCenter (NSString [] playersToInvite); - [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use HandleTurnEvent instead")] + [Availability (Introduced = Platform.iOS_5_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_9, Message = "Use 'HandleTurnEvent' instead.")] [Export ("handleTurnEventForMatch:")] void HandleTurnEventForMatch (GKTurnBasedMatch match); @@ -1765,7 +1765,7 @@ interface GKTurnBasedMatch { void LoadMatchData ([NullAllowed] GKTurnBasedMatchData onCompletion); [NoTV] - [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_9, Message = "Use EndTurn instead")] + [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_9, Message = "Use 'EndTurn' instead.")] [Export ("endTurnWithNextParticipant:matchData:completionHandler:")] [Async] #if XAMCORE_2_0 @@ -1775,7 +1775,7 @@ interface GKTurnBasedMatch { #endif [NoTV] - [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_9, Message = "Use ParticipantQuitInTurn (GKTurnBasedMatchOutcome, GKTurnBasedParticipant[], double, NSData, Action) instead")] + [Availability (Deprecated = Platform.iOS_6_0 | Platform.Mac_10_9, Message = "Use 'ParticipantQuitInTurn (GKTurnBasedMatchOutcome, GKTurnBasedParticipant[], double, NSData, Action)' instead.")] [Export ("participantQuitInTurnWithOutcome:nextParticipant:matchData:completionHandler:")] [Async] #if XAMCORE_2_0 @@ -1938,7 +1938,7 @@ interface GKTurnBasedMatchmakerViewControllerDelegate { [Abstract] #endif [NoTV] - [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use GKTurnBasedEventListener.ReceivedTurnEvent instead")] + [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use 'GKTurnBasedEventListener.ReceivedTurnEvent' instead.")] [Export ("turnBasedMatchmakerViewController:didFindMatch:")] void FoundMatch (GKTurnBasedMatchmakerViewController viewController, GKTurnBasedMatch match); @@ -1946,7 +1946,7 @@ interface GKTurnBasedMatchmakerViewControllerDelegate { [Abstract] #endif [NoTV] - [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use GKTurnBasedEventListener.WantsToQuitMatch instead")] + [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use 'GKTurnBasedEventListener.WantsToQuitMatch' instead.")] [Export ("turnBasedMatchmakerViewController:playerQuitForMatch:")] void PlayerQuitForMatch (GKTurnBasedMatchmakerViewController viewController, GKTurnBasedMatch match); } @@ -1956,12 +1956,12 @@ interface GKTurnBasedMatchmakerViewControllerDelegate { [BaseType (typeof (NSObject))] interface GKChallenge : NSSecureCoding { [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use IssuingPlayer instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'IssuingPlayer' instead.")] [Export ("issuingPlayerID", ArgumentSemantic.Copy)] string IssuingPlayerID { get; } [NoTV] - [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use ReceivingPlayer instead")] + [Availability (Deprecated = Platform.iOS_8_0 | Platform.Mac_10_10, Message = "Use 'ReceivingPlayer' instead.")] [Export ("receivingPlayerID", ArgumentSemantic.Copy)] string ReceivingPlayerID { get; } @@ -2037,13 +2037,13 @@ interface GKGameCenterViewController [NoTV] [Export ("leaderboardTimeScope", ArgumentSemantic.Assign)] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "This class no longer support Leaderboard Time Scopes, will always default to AllTime")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "This class no longer support 'LeaderboardTimeScope', will always default to 'AllTime'.")] GKLeaderboardTimeScope LeaderboardTimeScope { get; set; } [NoTV] [NullAllowed] // by default this property is null [Export ("leaderboardCategory", ArgumentSemantic.Retain)] - [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use LeaderboardIdentifier instead")] + [Availability (Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Use 'LeaderboardIdentifier' instead.")] string LeaderboardCategory { get; set; } [NoTV] @@ -2070,7 +2070,7 @@ interface GKGameCenterControllerDelegate #if !MONOMAC [NoWatch] [NoTV] - [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Implement the IGKChallengeListener interface and register a listener with GKLocalPlayer")] + [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Implement the 'IGKChallengeListener' interface and register a listener with 'GKLocalPlayer'.")] [BaseType (typeof (NSObject), Events=new[] { typeof (GKChallengeEventHandlerDelegate) }, Delegates=new[] { "WeakDelegate"})] [DisableDefaultCtor] [NoTV] @@ -2089,7 +2089,7 @@ interface GKChallengeEventHandler [NoWatch] [NoTV] - [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Implement the IGKChallengeListener interface and register a listener with GKLocalPlayer")] + [Availability (Introduced = Platform.iOS_6_0 | Platform.Mac_10_8, Deprecated = Platform.iOS_7_0 | Platform.Mac_10_10, Message = "Implement the 'IGKChallengeListener' interface and register a listener with 'GKLocalPlayer'.")] [Model] [BaseType (typeof (NSObject))] [Protocol] @@ -2233,7 +2233,7 @@ interface GKInviteEventListener #if !MONOMAC [NoTV] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use DidRequestMatch(GKPlayer player, GKPlayer[] recipientPlayers) instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'DidRequestMatch (GKPlayer player, GKPlayer[] recipientPlayers)' instead.")] [Export ("player:didRequestMatchWithPlayers:")] void DidRequestMatch (GKPlayer player, string[] playerIDs); #endif @@ -2249,7 +2249,7 @@ interface GKTurnBasedEventListener { [NoWatch] [NoTV] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use DidRequestMatchWithOtherPlayers instead")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'DidRequestMatchWithOtherPlayers' instead.")] [Export ("player:didRequestMatchWithPlayers:")] void DidRequestMatchWithPlayers (GKPlayer player, string[] playerIDsToInvite); diff --git a/src/gameplaykit.cs b/src/gameplaykit.cs index 3b4305f3dca7..10e5af0bc1b0 100644 --- a/src/gameplaykit.cs +++ b/src/gameplaykit.cs @@ -18,6 +18,7 @@ using Vector3 = global::OpenTK.Vector3; using Vector3d = global::OpenTK.Vector3d; using Matrix3 = global::OpenTK.Matrix3; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; #if MONOMAC using SKColor = XamCore.AppKit.NSColor; @@ -132,6 +133,8 @@ Vector3 Velocity { [Export ("rightHanded")] bool RightHanded { get; set; } +#if !XAMCORE_4_0 + [Obsolete ("Use 'Rotation3x3' instead.")] [Export ("rotation", ArgumentSemantic.Assign)] Matrix3 Rotation { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] @@ -139,6 +142,20 @@ Matrix3 Rotation { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } +#endif + + [Export ("rotation", ArgumentSemantic.Assign)] +#if XAMCORE_4_0 + MatrixFloat3x3 Rotation { +#else + [Sealed] + MatrixFloat3x3 Rotation3x3 { +#endif + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + set; + } [Export ("updateWithDeltaTime:")] void Update (double deltaTimeInSeconds); @@ -981,9 +998,9 @@ interface GKPath { [Wrap ("this (nodes: graphNodes, radius: radius)")] // Avoid breaking change IntPtr Constructor (GKGraphNode2D [] graphNodes, float radius); - [Deprecated (PlatformName.iOS, 10, 0, message: "Use GetVector2Point instead")] - [Deprecated (PlatformName.TvOS, 10, 0, message: "Use GetVector2Point instead")] - [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use GetVector2Point instead")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'GetVector2Point' instead.")] + [Deprecated (PlatformName.TvOS, 10, 0, message: "Use 'GetVector2Point' instead.")] + [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use 'GetVector2Point' instead.")] [Export ("pointAtIndex:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] Vector2 GetPoint (nuint index); diff --git a/src/generator-enums.cs b/src/generator-enums.cs index 940952ebb21f..8eba548a1cbe 100644 --- a/src/generator-enums.cs +++ b/src/generator-enums.cs @@ -11,6 +11,7 @@ #endif using XamCore.Foundation; using XamCore.ObjCRuntime; +using System.IO; public partial class Generator { @@ -108,13 +109,10 @@ void GenerateEnum (Type type) print ("static public partial class {0}Extensions {{", type.Name); indent++; - // note: not every binding namespace will start with ns.Prefix (e.g. MonoTouch.) - if (!String.IsNullOrEmpty (ns.Prefix) && library_name.StartsWith (ns.Prefix, StringComparison.Ordinal)) - library_name = library_name.Substring (ns.Prefix.Length + 1); + var field = fields.FirstOrDefault (); + var fieldAttr = field.Value; - // there might not be any other fields in the framework - if (!libraries.ContainsKey (library_name)) - libraries.Add (library_name, null); + ComputeLibraryName (fieldAttr, type, field.Key?.Name, out library_name, out string library_path); } if (error != null) { @@ -144,15 +142,21 @@ void GenerateEnum (Type type) var fa = kvp.Value; // the attributes (availability and field) are important for our tests PrintPlatformAttributes (f); - var libname = fa.LibraryName ?? library_name; - print ("[Field (\"{0}\", \"{1}\")]", fa.SymbolName, libname); + libraries.TryGetValue (library_name, out var libPath); + var libname = fa.LibraryName?.Replace ("+", string.Empty); + // We need to check for special cases inside FieldAttributes + // fa.LibraryName could contain a different framework i.e UITrackingRunLoopMode (UIKit) inside NSRunLoopMode enum (Foundation). + // libPath could have a custom path i.e. CoreImage which in macOS is inside Quartz + // library_name contains the Framework constant name the Field is inside of, used as fallback. + bool useFieldAttrLibName = libname != null && !string.Equals (libname, library_name, StringComparison.OrdinalIgnoreCase); + print ("[Field (\"{0}\", \"{1}\")]", fa.SymbolName, useFieldAttrLibName ? libname : libPath ?? library_name); print ("internal unsafe static IntPtr {0} {{", fa.SymbolName); indent++; print ("get {"); indent++; print ("fixed (IntPtr *storage = &values [{0}])", n++); indent++; - print ("return Dlfcn.CachePointer (Libraries.{0}.Handle, \"{1}\", storage);", libname, fa.SymbolName); + print ("return Dlfcn.CachePointer (Libraries.{0}.Handle, \"{1}\", storage);", useFieldAttrLibName ? libname : library_name, fa.SymbolName); indent--; indent--; print ("}"); diff --git a/src/generator-typemanager.cs b/src/generator-typemanager.cs index 5b89d0619e57..e259e65cf70f 100644 --- a/src/generator-typemanager.cs +++ b/src/generator-typemanager.cs @@ -62,6 +62,8 @@ public static class TypeManager { public static Type CGColor; public static Type CGColorSpace; public static Type CGContext; + public static Type CGPDFDocument; + public static Type CGPDFPage; public static Type CGGradient; public static Type CGImage; public static Type CGLayer; @@ -100,6 +102,7 @@ public static class TypeManager { public static Type SecTrust; public static Type UIEdgeInsets; public static Type UIOffset; + public static Type NSDirectionalEdgeInsets; public static Type CoreGraphics_CGPoint; public static Type CoreGraphics_CGRect; @@ -250,8 +253,9 @@ public static void Initialize (Assembly api, Assembly corlib, Assembly platform, ABPerson = Lookup (platform_assembly, "AddressBook", "ABPerson"); ABRecord = Lookup (platform_assembly, "AddressBook", "ABRecord"); } + // misplaced API, it's really in CoreAudio (now available everywhere) + AudioBuffers = Lookup (platform_assembly, "AudioToolbox", "AudioBuffers"); if (Frameworks.HaveAudioToolbox) { - AudioBuffers = Lookup (platform_assembly, "AudioToolbox", "AudioBuffers"); MusicSequence = Lookup (platform_assembly, "AudioToolbox", "MusicSequence", true /* may not be found */); } if (Frameworks.HaveAudioUnit) { @@ -268,6 +272,8 @@ public static void Initialize (Assembly api, Assembly corlib, Assembly platform, CGColor = Lookup (platform_assembly, "CoreGraphics", "CGColor"); CGColorSpace = Lookup (platform_assembly, "CoreGraphics", "CGColorSpace"); CGContext = Lookup (platform_assembly, "CoreGraphics", "CGContext"); + CGPDFDocument = Lookup (platform_assembly, "CoreGraphics", "CGPDFDocument"); + CGPDFPage = Lookup (platform_assembly, "CoreGraphics", "CGPDFPage"); CGGradient = Lookup (platform_assembly, "CoreGraphics", "CGGradient"); CGImage = Lookup (platform_assembly, "CoreGraphics", "CGImage"); CGLayer = Lookup (platform_assembly, "CoreGraphics", "CGLayer"); @@ -316,6 +322,7 @@ public static void Initialize (Assembly api, Assembly corlib, Assembly platform, if (Frameworks.HaveUIKit) { UIOffset = Lookup (platform_assembly, "UIKit", "UIOffset"); UIEdgeInsets = Lookup (platform_assembly, "UIKit", "UIEdgeInsets"); + NSDirectionalEdgeInsets = Lookup (platform_assembly, "UIKit", "NSDirectionalEdgeInsets"); } if (Generator.UnifiedAPI) { diff --git a/src/generator.cs b/src/generator.cs index 2e595078c5d8..a1c982d9e135 100644 --- a/src/generator.cs +++ b/src/generator.cs @@ -677,6 +677,8 @@ public NamespaceManager (string prefix, string customObjCRuntimeNS, bool skipSys if (Frameworks.HaveAudioUnit) ImplicitNamespaces.Add (Get ("AudioUnit")); + if (Frameworks.HaveContacts && Generator.UnifiedAPI) + ImplicitNamespaces.Add (Get ("Contacts")); if (Frameworks.HaveCoreAnimation) ImplicitNamespaces.Add (Get ("CoreAnimation")); if (Frameworks.HaveCoreLocation) @@ -687,7 +689,7 @@ public NamespaceManager (string prefix, string customObjCRuntimeNS, bool skipSys ImplicitNamespaces.Add (Get ("CoreMedia")); if (Frameworks.HaveSecurity && Generator.CurrentPlatform != PlatformName.WatchOS) ImplicitNamespaces.Add (Get ("Security")); - if (Frameworks.HaveAVFoundation && Generator.CurrentPlatform != PlatformName.WatchOS) + if (Frameworks.HaveAVFoundation) ImplicitNamespaces.Add (Get ("AVFoundation")); if (Frameworks.HaveOpenGL) ImplicitNamespaces.Add (Get ("OpenGL")); @@ -729,6 +731,8 @@ public NamespaceManager (string prefix, string customObjCRuntimeNS, bool skipSys ImplicitNamespaces.Add (Get ("GameplayKit")); if (Frameworks.HaveSpriteKit) ImplicitNamespaces.Add (Get ("SpriteKit")); + if (Frameworks.HaveFileProvider && Generator.UnifiedAPI) + ImplicitNamespaces.Add (Get ("FileProvider")); // These are both types and namespaces NamespacesThatConflictWithTypes = new HashSet { @@ -781,7 +785,7 @@ static bool GetValue (string framework) frameworks = macosframeworks; break; default: - throw new BindingException (1047, "Unsupported platform: {0}. Please file a bug report (http://bugzilla.xamarin.com) with a test case.", Generator.CurrentPlatform); + throw new BindingException (1047, "Unsupported platform: {0}. Please file a bug report (https://bugzilla.xamarin.com) with a test case.", Generator.CurrentPlatform); } } @@ -952,6 +956,19 @@ static string CoreServicesMap { } } + static string PDFKitMap { + get { + switch (CurrentPlatform) { + case PlatformName.iOS: + return "PDFKit"; + case PlatformName.MacOSX: + return "Quartz"; + default: + throw new BindingException (1047, "Unsupported platform: {0}. Please file a bug report (https://bugzilla.xamarin.com) with a test case.", CurrentPlatform); + } + } + } + // // We inject thread checks to MonoTouch.UIKit types, unless there is a [ThreadSafe] attribuet on the type. // Set on every call to Generate @@ -1345,6 +1362,7 @@ static Dictionary NSValueReturnMap { if (Frameworks.HaveUIKit) { nsvalue_return_map [TypeManager.UIEdgeInsets] = ".UIEdgeInsetsValue"; nsvalue_return_map [TypeManager.UIOffset] = ".UIOffsetValue"; + nsvalue_return_map [TypeManager.NSDirectionalEdgeInsets] = ".DirectionalEdgeInsetsValue"; } if (TypeManager.MKCoordinateSpan != null) @@ -1744,7 +1762,7 @@ public string MarshalParameter (MethodInfo mi, ParameterInfo pi, bool null_allow } // This means you need to add a new MarshalType in the method "Go" - throw new BindingException (1002, true, "Unknown kind {0} in method '{1}.{2}'", pi, mi.DeclaringType.FullName, mi.Name.GetSafeParamName ()); + throw new BindingException (1002, true, "Unknown kind {0} in method '{1}.{2}'", pi.ParameterType.FullName, mi.DeclaringType.FullName, mi.Name.GetSafeParamName ()); } public bool ParameterNeedsNullCheck (ParameterInfo pi, MethodInfo mi, PropertyInfo propInfo = null) @@ -2078,6 +2096,8 @@ public void Go () marshal_types.Add (TypeManager.CGPath); marshal_types.Add (TypeManager.CGGradient); marshal_types.Add (TypeManager.CGContext); + marshal_types.Add (TypeManager.CGPDFDocument); + marshal_types.Add (TypeManager.CGPDFPage); marshal_types.Add (TypeManager.CGImage); marshal_types.Add (TypeManager.Class); marshal_types.Add (TypeManager.CFRunLoop); @@ -2127,8 +2147,8 @@ public void Go () marshal_types.Add (TypeManager.SecIdentity); marshal_types.Add (TypeManager.SecTrust); marshal_types.Add (TypeManager.SecAccessControl); + marshal_types.Add (TypeManager.AudioBuffers); if (Frameworks.HaveAudioUnit) { - marshal_types.Add (TypeManager.AudioBuffers); marshal_types.Add (TypeManager.AURenderEventEnumerator); } @@ -3121,7 +3141,12 @@ public string FormatType (Type usedIn, Type type) return FormatTypeUsedIn (usedIn == null ? null : usedIn.Namespace, type); } - public string FormatTypeUsedIn (string usedInNamespace, Type type) + public string FormatType (Type usedIn, Type type, bool protocolized) + { + return FormatTypeUsedIn (usedIn?.Namespace, type, protocolized); + } + + public string FormatTypeUsedIn (string usedInNamespace, Type type, bool protocolized = false) { type = GetCorrectGenericType (type); @@ -3165,11 +3190,12 @@ public string FormatTypeUsedIn (string usedInNamespace, Type type) if (type.IsArray) return FormatTypeUsedIn (usedInNamespace, type.GetElementType ()) + "[" + new string (',', type.GetArrayRank () - 1) + "]"; + var interfaceTag = protocolized == true ? "I" : ""; string tname; if ((usedInNamespace != null && type.Namespace == usedInNamespace) || ns.StandardNamespaces.Contains (type.Namespace) || string.IsNullOrEmpty (type.FullName)) - tname = type.Name; + tname = interfaceTag + type.Name; else - tname = "global::" + type.FullName; + tname = $"global::{type.Namespace}.{interfaceTag}{type.Name}"; var targs = type.GetGenericArguments (); if (targs.Length > 0) { @@ -3340,18 +3366,19 @@ public void MakeSignatureFromParameterInfo (bool comma, StringBuilder sb, Member if (pari == parCount - 1 && parType.IsArray && (AttributeManager.HasAttribute (pi) || AttributeManager.HasAttribute (pi))) { sb.Append ("params "); } + var protocolized = false; if (!BindThirdPartyLibrary && Protocolize (pi)) { if (!AttributeManager.HasAttribute (parType)) { Console.WriteLine ("Protocolized attribute for type that does not have a [Protocol] for {0}'s parameter {1}", mi, pi); } - sb.Append ("I"); + protocolized = true; } var bindAsAtt = GetBindAsAttribute (pi); if (bindAsAtt != null) - sb.Append (FormatType (bindAsAtt.Type.DeclaringType, bindAsAtt.Type)); + sb.Append (FormatType (bindAsAtt.Type.DeclaringType, bindAsAtt.Type, protocolized)); else - sb.Append (FormatType (declaringType, parType)); + sb.Append (FormatType (declaringType, parType, protocolized)); sb.Append (" "); sb.Append (pi.Name.GetSafeParamName ()); @@ -3875,6 +3902,8 @@ void GenerateTypeLowering (MethodInfo mi, bool null_allowed_override, EnumMode e by_ref_processing.AppendLine(); if (mai.Type.GetElementType () == TypeManager.System_String){ by_ref_processing.AppendFormat("{0} = {0}Value != IntPtr.Zero ? NSString.FromHandle ({0}Value) : null;", pi.Name.GetSafeParamName ()); + } else if (pi.ParameterType.GetElementType ().IsArray) { + by_ref_processing.AppendFormat ("{0} = {0}Value != IntPtr.Zero ? NSArray.ArrayFromHandle<{1}> ({0}Value) : null;", pi.Name.GetSafeParamName (), RenderType (mai.Type.GetElementType ().GetElementType ())); } else if (isForced) { by_ref_processing.AppendFormat("{0} = {0}Value != IntPtr.Zero ? Runtime.GetINativeObject<{1}> ({0}Value, {2}) : null;", pi.Name.GetSafeParamName (), RenderType (mai.Type.GetElementType ()), isForcedOwns); } else { @@ -5516,6 +5545,52 @@ public void PrintAttributes (MemberInfo mi, bool platform = false, bool preserve PrintNotImplementedAttribute (mi); } + public void ComputeLibraryName (FieldAttribute fieldAttr, Type type, string propertyName, out string library_name, out string library_path) + { + library_path = null; + + if (fieldAttr != null && fieldAttr.LibraryName != null) { + // Remapped + library_name = fieldAttr.LibraryName; + if (library_name [0] == '+') { + switch (library_name) { + case "+CoreImage": + library_name = CoreImageMap; + break; + case "+CoreServices": + library_name = CoreServicesMap; + break; + case "+PDFKit": + library_name = "PdfKit"; + library_path = PDFKitMap; + break; + } + } else { + // we get something in LibraryName from FieldAttribute so we asume + // it is a path to a library, so we save the path and change library name + // to a valid identifier if needed + library_path = library_name; + library_name = Path.GetFileName (library_name); + if (library_name.Contains (".")) + library_name = library_name.Replace (".", string.Empty); + } + } else if (BindThirdPartyLibrary) { + // User should provide a LibraryName + throw new BindingException (1042, true, $"Missing '[Field (LibraryName=value)]' for {propertyName} (e.g.\"__Internal\")"); + } else { + library_name = type.Namespace; + + // note: not every binding namespace will start with ns.Prefix (e.g. MonoTouch.) + if (!String.IsNullOrEmpty (ns.Prefix) && library_name.StartsWith (ns.Prefix, StringComparison.Ordinal)) { + library_name = library_name.Substring (ns.Prefix.Length + 1); + library_name = library_name.Replace (".", string.Empty); // Remove dots from namespaces + } + } + + if (!libraries.ContainsKey (library_name)) + libraries.Add (library_name, library_path); + } + public static string GetSelector (MemberInfo mi) { object [] attr = AttributeManager.GetCustomAttributes (mi); @@ -5974,49 +6049,20 @@ public void Generate (Type type) if (field_exports.Count != 0){ foreach (var field_pi in field_exports.OrderBy (f => f.Name, StringComparer.Ordinal)) { var fieldAttr = AttributeManager.GetCustomAttribute (field_pi); - string library_name; - string library_path = null; - - if (fieldAttr.LibraryName != null){ - // Remapped - library_name = fieldAttr.LibraryName; - if (library_name [0] == '+'){ - switch (library_name){ - case "+CoreImage": - library_name = CoreImageMap; - break; - case "+CoreServices": - library_name = CoreServicesMap; - break; - } - } else { - // we get something in LibraryName from FieldAttribute so we asume - // it is a path to a library, so we save the path and change library name - // to a valid identifier if needed - library_path = library_name; - library_name = Path.GetFileName (library_name); - if (library_name.Contains (".")) - library_name = library_name.Replace (".", string.Empty); - } - } else if (BindThirdPartyLibrary) { - // User should provide a LibraryName - throw new BindingException (1042, true, $"Missing '[Field (LibraryName=value)]' for {field_pi.Name} (e.g.\"__Internal\")"); - } else { - library_name = type.Namespace; - // note: not every binding namespace will start with ns.Prefix (e.g. MonoTouch.) - if (!String.IsNullOrEmpty (ns.Prefix) && library_name.StartsWith (ns.Prefix, StringComparison.Ordinal)) { - library_name = library_name.Substring (ns.Prefix.Length + 1); - library_name = library_name.Replace (".", string.Empty); // Remove dots from namespaces - } - } - - if (!libraries.ContainsKey (library_name)) - libraries.Add (library_name, library_path); + ComputeLibraryName (fieldAttr, type, field_pi.Name, out string library_name, out string library_path); bool is_unified_internal = field_pi.IsUnifiedInternal (); - string fieldTypeName = FormatType (field_pi.DeclaringType, field_pi.PropertyType); + + string fieldTypeName; + string smartEnumTypeName = null; + if (IsSmartEnum (field_pi.PropertyType)) { + fieldTypeName = FormatType (TypeManager.NSString.DeclaringType, TypeManager.NSString); + smartEnumTypeName = FormatType (field_pi.DeclaringType, field_pi.PropertyType); + } else + fieldTypeName = FormatType (field_pi.DeclaringType, field_pi.PropertyType); + // Value types we dont cache for now, to avoid Nullable - if (!field_pi.PropertyType.IsValueType) { + if (!field_pi.PropertyType.IsValueType || smartEnumTypeName != null) { print ("[CompilerGenerated]"); PrintPreserveAttribute (field_pi); print ("static {0} _{1};", fieldTypeName, field_pi.Name); @@ -6031,10 +6077,11 @@ public void Generate (Type type) // Check if this is a notification and print Advice to use our Notification API if (AttributeManager.HasAttribute (field_pi)) print ($"[Advice (\"Use {type.Name}.Notifications.Observe{GetNotificationName (field_pi)} helper method instead.\")]"); - - print ("{0} static {1} {2}{3} {{", field_pi.IsInternal () ? "internal" : "public", fieldTypeName, - field_pi.Name, - is_unified_internal ? "_" : ""); + + print ("{0} static {1} {2}{3} {{", field_pi.IsInternal () ? "internal" : "public", + smartEnumTypeName ?? fieldTypeName, + field_pi.Name, + is_unified_internal ? "_" : ""); indent++; PrintAttributes (field_pi, platform:true); @@ -6055,6 +6102,8 @@ public void Generate (Type type) print ("return _{0};", field_pi.Name); } else if (field_pi.PropertyType == TypeManager.System_Int32){ print ("return Dlfcn.GetInt32 (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); + } else if (field_pi.PropertyType == TypeManager.System_UInt32) { + print ("return Dlfcn.GetUInt32 (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType == TypeManager.System_Double){ print ("return Dlfcn.GetDouble (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType == TypeManager.System_Float){ @@ -6065,6 +6114,8 @@ public void Generate (Type type) print ("return Dlfcn.GetSizeF (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType == TypeManager.System_Int64){ print ("return Dlfcn.GetInt64 (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); + } else if (field_pi.PropertyType == TypeManager.System_UInt64) { + print ("return Dlfcn.GetUInt64 (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); } else // // Handle various blittable value types here @@ -6081,6 +6132,33 @@ public void Generate (Type type) print ("return Dlfcn.GetNFloat (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (UnifiedAPI && field_pi.PropertyType == TypeManager.CoreGraphics_CGSize){ print ("return Dlfcn.GetCGSize (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); + } else if (field_pi.PropertyType.IsEnum) { + var btype = field_pi.PropertyType.GetEnumUnderlyingType (); + if (smartEnumTypeName != null) { + print ("if (_{0} == null)", field_pi.Name); + indent++; + print ("_{0} = Dlfcn.GetStringConstant (Libraries.{2}.Handle, \"{1}\");", field_pi.Name, fieldAttr.SymbolName, library_name); + indent--; + print ($"return {smartEnumTypeName}Extensions.GetValue (_{field_pi.Name});"); + } else if (UnifiedAPI && IsNativeEnum (field_pi.PropertyType)) { + if (btype == TypeManager.System_nint || btype == TypeManager.System_Int64) + print ($"return ({fieldTypeName}) (long) Dlfcn.GetNInt (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\");" ); + else if (btype == TypeManager.System_nuint || btype == TypeManager.System_UInt64) + print ($"return ({fieldTypeName}) (ulong) Dlfcn.GetNUInt (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\");"); + else + throw new BindingException (1014, true, "Unsupported type for Fields: {0}", fieldTypeName); + } else { + if (btype == TypeManager.System_Int32) + print ($"return ({fieldTypeName}) Dlfcn.GetInt32 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\");"); + else if (btype == TypeManager.System_UInt32) + print ($"return ({fieldTypeName}) Dlfcn.GetUInt32 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\");"); + else if (btype == TypeManager.System_Int64) + print ($"return ({fieldTypeName}) Dlfcn.GetInt64 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\");"); + else if (btype == TypeManager.System_UInt64) + print ($"return ({fieldTypeName}) Dlfcn.GetUInt64 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\");"); + else + throw new BindingException (1014, true, "Unsupported type for Fields: {0}", fieldTypeName); + } } else { if (field_pi.PropertyType == TypeManager.System_String) throw new BindingException (1013, true, "Unsupported type for Fields (string), you probably meant NSString"); @@ -6098,6 +6176,8 @@ public void Generate (Type type) indent++; if (field_pi.PropertyType == TypeManager.System_Int32) { print ("Dlfcn.SetInt32 (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); + } else if (field_pi.PropertyType == TypeManager.System_UInt32) { + print ("Dlfcn.SetUInt32 (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType == TypeManager.System_Double) { print ("Dlfcn.SetDouble (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType == TypeManager.System_Float) { @@ -6108,6 +6188,8 @@ public void Generate (Type type) print ("Dlfcn.SetSizeF (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType == TypeManager.System_Int64) { print ("Dlfcn.SetInt64 (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); + } else if (field_pi.PropertyType == TypeManager.System_UInt64) { + print ("Dlfcn.SetUInt64 (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType == TypeManager.NSString){ print ("Dlfcn.SetString (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (field_pi.PropertyType.Name == "NSArray"){ @@ -6120,6 +6202,29 @@ public void Generate (Type type) print ("Dlfcn.SetNFloat (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); } else if (UnifiedAPI && field_pi.PropertyType == TypeManager.CoreGraphics_CGSize) { print ("Dlfcn.SetCGSize (Libraries.{2}.Handle, \"{1}\", value);", field_pi.Name, fieldAttr.SymbolName, library_name); + } else if (field_pi.PropertyType.IsEnum) { + var btype = field_pi.PropertyType.GetEnumUnderlyingType (); + if (smartEnumTypeName != null) + print ($"Dlfcn.SetString (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\", value.GetConstant ());"); + else if (UnifiedAPI && IsNativeEnum (field_pi.PropertyType)) { + if (btype == TypeManager.System_nint || (BindThirdPartyLibrary && btype == TypeManager.System_Int64)) + print ($"Dlfcn.SetNInt (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\", (nint) (long) value);"); + else if (btype == TypeManager.System_nuint || (BindThirdPartyLibrary && btype == TypeManager.System_UInt64)) + print ($"Dlfcn.SetNUInt (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\", (nuint) (ulong) value);"); + else + throw new BindingException (1021, true, "Unsupported type for read/write Fields: {0} for {1}.{2}", fieldTypeName, field_pi.DeclaringType.FullName, field_pi.Name); + } else { + if (btype == TypeManager.System_Int32) + print ($"Dlfcn.SetInt32 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\", (int) value);"); + else if (btype == TypeManager.System_UInt32) + print ($"Dlfcn.SetUInt32 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\", (uint) value);"); + else if (btype == TypeManager.System_Int64) + print ($"Dlfcn.SetInt64 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\", (long) value);"); + else if (btype == TypeManager.System_UInt64) + print ($"Dlfcn.SetUInt64 (Libraries.{library_name}.Handle, \"{fieldAttr.SymbolName}\", (ulong) value);"); + else + throw new BindingException (1021, true, "Unsupported type for read/write Fields: {0} for {1}.{2}", fieldTypeName, field_pi.DeclaringType.FullName, field_pi.Name); + } } else throw new BindingException (1021, true, "Unsupported type for read/write Fields: {0} for {1}.{2}", fieldTypeName, field_pi.DeclaringType.FullName, field_pi.Name); indent--; diff --git a/src/healthkit.cs b/src/healthkit.cs index 5fe23d71e205..93b3db473ee9 100644 --- a/src/healthkit.cs +++ b/src/healthkit.cs @@ -393,8 +393,8 @@ interface HKHealthStore { void StopQuery (HKQuery query); // FIXME NS_EXTENSION_UNAVAILABLE("Not available to extensions") ; - [Deprecated (PlatformName.WatchOS, 3, 0, message: "Use GetDateOfBirthComponents instead")] - [Deprecated (PlatformName.iOS, 10, 0, message: "Use GetDateOfBirthComponents instead")] + [Deprecated (PlatformName.WatchOS, 3, 0, message: "Use 'GetDateOfBirthComponents' instead.")] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'GetDateOfBirthComponents' instead.")] [Export ("dateOfBirthWithError:")] NSDate GetDateOfBirth (out NSError error); @@ -727,7 +727,7 @@ interface HKObjectType : NSSecureCoding, NSCopying { #if XAMCORE_4_0 || WATCH [Internal] #else - [Obsolete ("Use HKQuantityType.Create (HKQuantityTypeIdentifier)")] + [Obsolete ("Use 'HKQuantityType.Create (HKQuantityTypeIdentifier)'.")] #endif [Static] [Export ("quantityTypeForIdentifier:")] @@ -737,7 +737,7 @@ interface HKObjectType : NSSecureCoding, NSCopying { #if XAMCORE_4_0 || WATCH [Internal] #else - [Obsolete ("Use HKCategoryType.Create (HKCategoryTypeIdentifier)")] + [Obsolete ("Use 'HKCategoryType.Create (HKCategoryTypeIdentifier)'.")] #endif [Static] [Export ("categoryTypeForIdentifier:")] @@ -747,7 +747,7 @@ interface HKObjectType : NSSecureCoding, NSCopying { #if XAMCORE_4_0 || WATCH [Internal] #else - [Obsolete ("Use HKCharacteristicType.Create (HKCharacteristicTypeIdentifier)")] + [Obsolete ("Use 'HKCharacteristicType.Create (HKCharacteristicTypeIdentifier)'.")] #endif [Static] [Export ("characteristicTypeForIdentifier:")] @@ -757,7 +757,7 @@ interface HKObjectType : NSSecureCoding, NSCopying { #if XAMCORE_4_0 || WATCH [Internal] #else - [Obsolete ("Use HKCorrelationType.Create (HKCorrelationTypeIdentifier)")] + [Obsolete ("Use 'HKCorrelationType.Create (HKCorrelationTypeIdentifier)'.")] #endif [Static, Export ("correlationTypeForIdentifier:")] [return: NullAllowed] @@ -909,8 +909,8 @@ interface HKQuery { [NullAllowed, Export ("objectType", ArgumentSemantic.Strong)] HKObjectType ObjectType { get; } - [Deprecated (PlatformName.WatchOS, 2,2, message: "Use ObjectType property")] - [Deprecated (PlatformName.iOS, 9,3, message: "Use ObjectType property")] + [Deprecated (PlatformName.WatchOS, 2,2, message: "Use 'ObjectType' property.")] + [Deprecated (PlatformName.iOS, 9,3, message: "Use 'ObjectType' property.")] [Watch (2,0)] [NullAllowed, Export ("sampleType", ArgumentSemantic.Strong)] HKSampleType SampleType { get; } diff --git a/src/homekit.cs b/src/homekit.cs index 2e4c8c508fa8..6a3d922f3921 100644 --- a/src/homekit.cs +++ b/src/homekit.cs @@ -125,9 +125,25 @@ partial interface HMAccessory { [Export ("services", ArgumentSemantic.Copy)] HMService [] Services { get; } + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("profiles", ArgumentSemantic.Copy)] + HMAccessoryProfile[] Profiles { get; } + [Export ("blocked")] bool Blocked { [Bind ("isBlocked")] get; } + [Watch (4, 0), TV (11, 0), iOS (11, 0)] + [NullAllowed, Export ("model")] + string Model { get; } + + [Watch (4, 0), TV (11, 0), iOS (11, 0)] + [NullAllowed, Export ("manufacturer")] + string Manufacturer { get; } + + [Watch (4, 0), TV (11, 0), iOS (11, 0)] + [NullAllowed, Export ("firmwareVersion")] + string FirmwareVersion { get; } + [NoTV] [NoWatch] [Async] @@ -167,11 +183,23 @@ partial interface HMAccessoryDelegate { [Export ("accessoryDidUpdateServices:")] void DidUpdateServices (HMAccessory accessory); + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("accessory:didAddProfile:"), EventArgs ("HMAccessoryProfile")] + void DidAddProfile (HMAccessory accessory, HMAccessoryProfile profile); + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("accessory:didRemoveProfile:"), EventArgs ("HMAccessoryProfile")] + void DidRemoveProfile (HMAccessory accessory, HMAccessoryProfile profile); + [Export ("accessoryDidUpdateReachability:")] void DidUpdateReachability (HMAccessory accessory); [Export ("accessory:service:didUpdateValueForCharacteristic:"), EventArgs ("HMAccessoryServiceUpdateCharacteristic")] void DidUpdateValueForCharacteristic (HMAccessory accessory, HMService service, HMCharacteristic characteristic); + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("accessory:didUpdateFirmwareVersion:"), EventArgs ("HMAccessoryFirmwareVersion")] + void DidUpdateFirmwareVersion (HMAccessory accessory, string firmwareVersion); } #if !WATCH @@ -281,6 +309,7 @@ partial interface HMActionSet { NSUuid UniqueIdentifier { get; } [Watch (3,0), iOS (10,0)] + [NullAllowed] [Export ("lastExecutionDate", ArgumentSemantic.Copy)] NSDate LastExecutionDate { get; } } @@ -517,6 +546,10 @@ partial interface HMHome { [Export ("primary")] bool Primary { [Bind ("isPrimary")] get; } + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("homeHubState")] + HMHomeHubState HomeHubState { get; } + [NoTV] [NoWatch] [Async] @@ -714,6 +747,10 @@ partial interface HMHomeDelegate { [Export ("homeDidUpdateName:")] void DidUpdateNameForHome (HMHome home); + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("homeDidUpdateAccessControlForCurrentUser:")] + void DidUpdateAccessControlForCurrentUser (HMHome home); + [Export ("home:didAddAccessory:"), EventArgs ("HMHomeAccessory")] void DidAddAccessory (HMHome home, HMAccessory accessory); @@ -797,6 +834,10 @@ partial interface HMHomeDelegate { [Export ("home:didEncounterError:forAccessory:"), EventArgs ("HMHomeErrorAccessory")] void DidEncounterError (HMHome home, NSError error, HMAccessory accessory); + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("home:didUpdateHomeHubState:"), EventArgs ("HMHomeHubState")] + void DidUpdateHomeHubState (HMHome home, HMHomeHubState homeHubState); } [TV (10,0)] @@ -1114,19 +1155,20 @@ interface HMAccessoryCategory { [iOS (9,0)] [BaseType (typeof (HMEvent))] [DisableDefaultCtor] - interface HMCharacteristicEvent { + interface HMCharacteristicEvent : NSMutableCopying { [NoTV] [NoWatch] [Export ("initWithCharacteristic:triggerValue:")] IntPtr Constructor (HMCharacteristic characteristic, [NullAllowed] INSCopying triggerValue); [Export ("characteristic", ArgumentSemantic.Strong)] - HMCharacteristic Characteristic { get; } + HMCharacteristic Characteristic { get; [NotImplemented] set; } [NullAllowed] [Export ("triggerValue", ArgumentSemantic.Copy)] - INSCopying TriggerValue { get; } + INSCopying TriggerValue { get; [NotImplemented] set; } + [Deprecated (PlatformName.iOS, 11, 0)] [NoTV] [NoWatch] [Async] @@ -1140,8 +1182,17 @@ interface HMCharacteristicEvent { interface HMEvent { [Export ("uniqueIdentifier", ArgumentSemantic.Copy)] NSUuid UniqueIdentifier { get; } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Static] + [Export ("isSupportedForHome:")] + bool IsSupported (HMHome home); } + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof (HMEvent))] + interface HMTimeEvent {} + [TV (10,0)] [iOS (9,0)] [BaseType (typeof (HMTrigger))] @@ -1152,20 +1203,57 @@ interface HMEventTrigger { [Export ("initWithName:events:predicate:")] IntPtr Constructor (string name, HMEvent[] events, [NullAllowed] NSPredicate predicate); + [NoTV] + [NoWatch] + [iOS (11,0)] + [Export ("initWithName:events:endEvents:recurrences:predicate:")] + IntPtr Constructor (string name, HMEvent[] events, [NullAllowed] HMEvent[] endEvents, [NullAllowed] NSDateComponents[] recurrences, [NullAllowed] NSPredicate predicate); + [Export ("events", ArgumentSemantic.Copy)] HMEvent[] Events { get; } + [Watch (4, 0), TV (11, 0), iOS (11, 0)] + [Export ("endEvents", ArgumentSemantic.Copy)] + HMEvent[] EndEvents { get; } + [NullAllowed, Export ("predicate", ArgumentSemantic.Copy)] NSPredicate Predicate { get; } + [Watch (4, 0), TV (11, 0), iOS (11, 0)] + [NullAllowed, Export ("recurrences", ArgumentSemantic.Copy)] + NSDateComponents[] Recurrences { get; } + + [Watch (4, 0), TV (11, 0), iOS (11, 0)] + [Export ("executeOnce")] + bool ExecuteOnce { get; } + + [Watch (4, 0), TV (11, 0), iOS (11, 0)] + [Export ("triggerActivationState", ArgumentSemantic.Assign)] + HMEventTriggerActivationState TriggerActivationState { get; } + [Static][Internal] [Export ("predicateForEvaluatingTriggerOccurringBeforeSignificantEvent:applyingOffset:")] NSPredicate CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (NSString significantEvent, [NullAllowed] NSDateComponents offset); + [Watch (4,0), TV (11,0), iOS (11,0)] + [Static] + [Export ("predicateForEvaluatingTriggerOccurringBeforeSignificantEvent:")] + NSPredicate CreatePredicateForEvaluatingTriggerOccurringBeforeSignificantEvent (HMSignificantTimeEvent significantEvent); + [Static][Internal] [Export ("predicateForEvaluatingTriggerOccurringAfterSignificantEvent:applyingOffset:")] NSPredicate CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (NSString significantEvent, [NullAllowed] NSDateComponents offset); + [Watch (4,0), TV (11,0), iOS (11,0)] + [Static] + [Export ("predicateForEvaluatingTriggerOccurringAfterSignificantEvent:")] + NSPredicate CreatePredicateForEvaluatingTriggerOccurringAfterSignificantEvent (HMSignificantTimeEvent significantEvent); + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Static] + [Export ("predicateForEvaluatingTriggerOccurringBetweenSignificantEvent:secondSignificantEvent:")] + NSPredicate CreatePredicateForEvaluatingTriggerOccurringBetweenSignificantEvent (HMSignificantTimeEvent firstSignificantEvent, HMSignificantTimeEvent secondSignificantEvent); + [Static] [Export ("predicateForEvaluatingTriggerOccurringBeforeDateWithComponents:")] NSPredicate CreatePredicateForEvaluatingTriggerOccurringBeforeDate (NSDateComponents dateComponents); @@ -1178,40 +1266,67 @@ interface HMEventTrigger { [Export ("predicateForEvaluatingTriggerOccurringAfterDateWithComponents:")] NSPredicate CreatePredicateForEvaluatingTriggerOccurringAfterDate (NSDateComponents dateComponents); + [Watch (4,0), TV (11,0), iOS (11,0)] + [Static] + [Export ("predicateForEvaluatingTriggerOccurringBetweenDateWithComponents:secondDateWithComponents:")] + NSPredicate CreatePredicateForEvaluatingTriggerOccurringBetweenDates (NSDateComponents firstDateComponents, NSDateComponents secondDateComponents); + [Static] [Export ("predicateForEvaluatingTriggerWithCharacteristic:relatedBy:toValue:")] NSPredicate CreatePredicateForEvaluatingTrigger (HMCharacteristic characteristic, NSPredicateOperatorType operatorType, NSObject value); + [Watch (4,0), TV (11,0), iOS (11,0)] + [Static] + [Export ("predicateForEvaluatingTriggerWithPresence:")] + NSPredicate CreatePredicateForEvaluatingTrigger (HMPresenceEvent presenceEvent); + [NoTV] [NoWatch] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'UpdateEvents' instead.")] [Async] [Export ("addEvent:completionHandler:")] void AddEvent (HMEvent @event, Action completion); [NoTV] [NoWatch] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'UpdateEvents' instead.")] [Async] [Export ("removeEvent:completionHandler:")] void RemoveEvent (HMEvent @event, Action completion); + [NoTV] + [NoWatch] + [iOS (11,0)] + [Async] + [Export ("updateEvents:completionHandler:")] + void UpdateEvents (HMEvent[] events, Action completion); + + [NoTV] + [NoWatch] + [iOS (11,0)] + [Async] + [Export ("updateEndEvents:completionHandler:")] + void UpdateEndEvents (HMEvent[] endEvents, Action completion); + [NoTV] [NoWatch] [Async] [Export ("updatePredicate:completionHandler:")] void UpdatePredicate ([NullAllowed] NSPredicate predicate, Action completion); - } - [Static] - [Internal] - [iOS (9,0)] - [TV (10,0)] - partial interface HMSignificantEventInternal { - - [Field ("HMSignificantEventSunrise")] - NSString Sunrise { get; } + [NoTV] + [NoWatch] + [iOS (11,0)] + [Async] + [Export ("updateRecurrences:completionHandler:")] + void UpdateRecurrences ([NullAllowed] NSDateComponents[] recurrences, Action completion); - [Field ("HMSignificantEventSunset")] - NSString Sunset { get; } + [NoTV] + [NoWatch] + [iOS (11,0)] + [Async] + [Export ("updateExecuteOnce:completionHandler:")] + void UpdateExecuteOnce (bool executeOnce, Action completion); } [iOS (9,0)] @@ -1227,22 +1342,36 @@ interface HMHomeAccessControl { [TV (10,0)] [BaseType (typeof (HMEvent))] [DisableDefaultCtor] - interface HMLocationEvent { + interface HMLocationEvent : NSMutableCopying { [NoTV] [NoWatch] [Export ("initWithRegion:")] IntPtr Constructor (CLRegion region); [NullAllowed, Export ("region", ArgumentSemantic.Strong)] - CLRegion Region { get; } + CLRegion Region { get; [NotImplemented] set; } [NoTV] [NoWatch] + [Deprecated (PlatformName.iOS, 11, 0)] [Async] [Export ("updateRegion:completionHandler:")] void UpdateRegion (CLRegion region, Action completion); } + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMLocationEvent))] + [DisableDefaultCtor] + interface HMMutableLocationEvent { + + [Export ("initWithRegion:")] + IntPtr Constructor (CLRegion region); + + [Override] + [NullAllowed, Export ("region", ArgumentSemantic.Strong)] + CLRegion Region { get; set; } + } + [NoWatch] [TV (10,0), iOS (10,0)] [BaseType (typeof(UIView))] @@ -1416,4 +1545,207 @@ interface HMCameraAudioControl [NullAllowed, Export ("volume", ArgumentSemantic.Strong)] HMCharacteristic Volume { get; } } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMTimeEvent))] + [DisableDefaultCtor] + interface HMCalendarEvent : NSMutableCopying { + + [Export ("initWithFireDateComponents:")] + IntPtr Constructor (NSDateComponents fireDateComponents); + + [Export ("fireDateComponents", ArgumentSemantic.Strong)] + NSDateComponents FireDateComponents { get; [NotImplemented] set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMCalendarEvent))] + [DisableDefaultCtor] + interface HMMutableCalendarEvent { + + [Export ("initWithFireDateComponents:")] + IntPtr Constructor (NSDateComponents fireDateComponents); + + [Override] + [Export ("fireDateComponents", ArgumentSemantic.Strong)] + NSDateComponents FireDateComponents { get; set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMCharacteristicEvent))] + [DisableDefaultCtor] + interface HMMutableCharacteristicEvent : NSMutableCopying { + + [Export ("initWithCharacteristic:triggerValue:")] + IntPtr Constructor (HMCharacteristic characteristic, [NullAllowed] INSCopying triggerValue); + + [Override] + [Export ("characteristic", ArgumentSemantic.Strong)] + HMCharacteristic Characteristic { get; set; } + + [Override] + [NullAllowed, Export ("triggerValue", ArgumentSemantic.Copy)] + INSCopying TriggerValue { get; set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMEvent))] + [DisableDefaultCtor] + interface HMCharacteristicThresholdRangeEvent : NSMutableCopying { + + [Export ("initWithCharacteristic:thresholdRange:")] + IntPtr Constructor (HMCharacteristic characteristic, HMNumberRange thresholdRange); + + [Export ("characteristic", ArgumentSemantic.Strong)] + HMCharacteristic Characteristic { get; [NotImplemented] set; } + + [Export ("thresholdRange", ArgumentSemantic.Copy)] + HMNumberRange ThresholdRange { get; [NotImplemented] set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMCharacteristicThresholdRangeEvent))] + [DisableDefaultCtor] + interface HMMutableCharacteristicThresholdRangeEvent { + + [Export ("initWithCharacteristic:thresholdRange:")] + IntPtr Constructor (HMCharacteristic characteristic, HMNumberRange thresholdRange); + + [Override] + [Export ("characteristic", ArgumentSemantic.Strong)] + HMCharacteristic Characteristic { get; set; } + + [Override] + [Export ("thresholdRange", ArgumentSemantic.Copy)] + HMNumberRange ThresholdRange { get; set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMTimeEvent))] + [DisableDefaultCtor] + interface HMDurationEvent : NSMutableCopying { + + [Export ("initWithDuration:")] + IntPtr Constructor (double duration); + + [Export ("duration")] + double Duration { get; [NotImplemented] set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMDurationEvent))] + [DisableDefaultCtor] + interface HMMutableDurationEvent { + + [Export ("initWithDuration:")] + IntPtr Constructor (double duration); + + [Override] + [Export ("duration")] + double Duration { get; set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface HMNumberRange { + + [Static] + [Export ("numberRangeWithMinValue:maxValue:")] + HMNumberRange FromRange (NSNumber minValue, NSNumber maxValue); + + [Static] + [Export ("numberRangeWithMinValue:")] + HMNumberRange FromMin (NSNumber minValue); + + [Static] + [Export ("numberRangeWithMaxValue:")] + HMNumberRange FromMax (NSNumber maxValue); + + [NullAllowed, Export ("minValue", ArgumentSemantic.Strong)] + NSNumber Min { get; } + + [NullAllowed, Export ("maxValue", ArgumentSemantic.Strong)] + NSNumber Max { get; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMEvent))] + [DisableDefaultCtor] + interface HMPresenceEvent : NSMutableCopying { + + [Export ("initWithPresenceEventType:presenceUserType:")] + IntPtr Constructor (HMPresenceEventType presenceEventType, HMPresenceEventUserType presenceUserType); + + [Export ("presenceEventType")] + HMPresenceEventType PresenceEventType { get; [NotImplemented] set; } + + [Export ("presenceUserType")] + HMPresenceEventUserType PresenceUserType { get; [NotImplemented] set; } + + [Field ("HMPresenceKeyPath")] + NSString KeyPath { get; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMPresenceEvent))] + [DisableDefaultCtor] + interface HMMutablePresenceEvent { + + [Export ("presenceEventType", ArgumentSemantic.Assign)] + HMPresenceEventType PresenceEventType { get; /* Radar 33883958: https://trello.com/c/TIlzWzrL*/ [NotImplemented] set; } + + [Export ("presenceUserType", ArgumentSemantic.Assign)] + HMPresenceEventUserType PresenceUserType { get; /* Radar 33883958: https://trello.com/c/TIlzWzrL*/ [NotImplemented] set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMTimeEvent))] + [DisableDefaultCtor] + interface HMSignificantTimeEvent : NSMutableCopying { + + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Export ("initWithSignificantEvent:offset:")] + IntPtr Constructor (NSString significantEvent, [NullAllowed] NSDateComponents offset); + + [Wrap ("this (HMSignificantEventExtensions.GetConstant (significantEvent), offset)")] + IntPtr Constructor (HMSignificantEvent significantEvent, [NullAllowed] NSDateComponents offset); + + [Internal] + [Export ("significantEvent", ArgumentSemantic.Strong)] + NSString _SignificantEvent { get; [NotImplemented] set; } + + // FIXME: Bug https://bugzilla.xamarin.com/show_bug.cgi?id=57870 + // [Wrap ("HMSignificantEventExtensions.GetValue (_SignificantEvent)")] + // HMSignificantEvent SignificantEvent { get; [NotImplemented] set; } + + [NullAllowed, Export ("offset", ArgumentSemantic.Strong)] + NSDateComponents Offset { get; [NotImplemented] set; } + } + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(HMSignificantTimeEvent))] + interface HMMutableSignificantTimeEvent { + + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Export ("initWithSignificantEvent:offset:")] + IntPtr Constructor (NSString significantEvent, [NullAllowed] NSDateComponents offset); + + [Wrap ("this (HMSignificantEventExtensions.GetConstant (significantEvent), offset)")] + IntPtr Constructor (HMSignificantEvent significantEvent, [NullAllowed] NSDateComponents offset); + + [Internal] + [Override] + [Export ("significantEvent", ArgumentSemantic.Strong)] + NSString _SignificantEvent { get; set; } + + // FIXME: Bug https://bugzilla.xamarin.com/show_bug.cgi?id=57870 + // [Override] + // [Wrap ("HMSignificantEventExtensions.GetValue (_SignificantEvent)")] + // HMSignificantEvent SignificantEvent { get; set; } + + [Override] + [Export ("offset", ArgumentSemantic.Strong)] + NSDateComponents Offset { get; set; } + } } diff --git a/src/iad.cs b/src/iad.cs index 72b3ef824455..9a8480d22c56 100644 --- a/src/iad.cs +++ b/src/iad.cs @@ -132,7 +132,7 @@ interface ADInterstitialAd { bool PresentInView (UIView containerView); [Export ("presentFromViewController:")] - [Availability (Introduced = Platform.iOS_4_3, Deprecated = Platform.iOS_7_0, Message = "Use extension method UIViewController.RequestInterstitialAdPresentation instead")] + [Availability (Introduced = Platform.iOS_4_3, Deprecated = Platform.iOS_7_0, Message = "Use extension method 'UIViewController.RequestInterstitialAdPresentation' instead.")] void PresentFromViewController (UIViewController viewController); } @@ -225,6 +225,7 @@ partial interface IAdAdditions { void SetCanDisplayBannerAds (bool value); [Since (7,0), Export ("originalContentView")] + [NullAllowed] UIView GetOriginalContentView (); [Since (7,0), Export ("isPresentingFullScreenAd")] @@ -250,11 +251,11 @@ interface ADClient { [Export ("sharedClient")] ADClient SharedClient { get; } - [Availability (Introduced = Platform.iOS_7_1, Deprecated = Platform.iOS_9_0, Message = "Replaced by RequestAttributionDetails")] + [Availability (Introduced = Platform.iOS_7_1, Deprecated = Platform.iOS_9_0, Message = "Replaced by 'RequestAttributionDetails'.")] [Export ("determineAppInstallationAttributionWithCompletionHandler:")] void DetermineAppInstallationAttribution (AttributedToiAdCompletionHandler completionHandler); - [Availability (Introduced = Platform.iOS_8_0, Deprecated = Platform.iOS_9_0, Message = "Replaced by RequestAttributionDetails")] + [Availability (Introduced = Platform.iOS_8_0, Deprecated = Platform.iOS_9_0, Message = "Replaced by 'RequestAttributionDetails'.")] [Export ("lookupAdConversionDetails:")] [Async (ResultTypeName="ADClientConversionDetailsResult")] void LookupAdConversionDetails (ADConversionDetails onCompleted); diff --git a/src/identitylookup.cs b/src/identitylookup.cs new file mode 100644 index 000000000000..e1766c1b8fa3 --- /dev/null +++ b/src/identitylookup.cs @@ -0,0 +1,96 @@ +// +// IdentityLookup C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 +using System; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.IdentityLookup { + + [iOS (11,0)] + [Native] + public enum ILMessageFilterAction : nint { + None = 0, + Allow = 1, + Filter = 2, + } + + [iOS (11,0)] + [ErrorDomain ("ILMessageFilterErrorDomain")] + [Native] + public enum ILMessageFilterError : nint { + System = 1, + InvalidNetworkUrl = 2, + NetworkUrlUnauthorized = 3, + NetworkRequestFailed = 4, + RedundantNetworkDeferral = 5, + } + + [iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface ILMessageFilterExtension { + } + + [iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSExtensionContext))] + interface ILMessageFilterExtensionContext { + + [Export ("deferQueryRequestToNetworkWithCompletion:")] + [Async] + void DeferQueryRequestToNetwork (Action completion); + } + + interface IILMessageFilterQueryHandling { } + + [iOS (11,0)] + [Protocol] + interface ILMessageFilterQueryHandling { + + [Abstract] + [Export ("handleQueryRequest:context:completion:")] + void HandleQueryRequest (ILMessageFilterQueryRequest queryRequest, ILMessageFilterExtensionContext context, Action completion); + } + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ILMessageFilterQueryRequest : NSSecureCoding { + + [NullAllowed, Export ("sender")] + string Sender { get; } + + [NullAllowed, Export ("messageBody")] + string MessageBody { get; } + } + + [iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface ILMessageFilterQueryResponse : NSSecureCoding { + + [Export ("action", ArgumentSemantic.Assign)] + ILMessageFilterAction Action { get; set; } + } + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface ILNetworkResponse : NSSecureCoding { + + [Export ("urlResponse")] + NSHttpUrlResponse UrlResponse { get; } + + [Export ("data")] + NSData Data { get; } + } +} +#endif diff --git a/src/imageio.cs b/src/imageio.cs index 6f4ee0134ede..b25acf3791f4 100644 --- a/src/imageio.cs +++ b/src/imageio.cs @@ -857,6 +857,50 @@ interface CGImageProperties { [Field ("kCGImagePropertyMakerAppleDictionary")] NSString MakerAppleDictionary { get; } #endif + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyImageCount")] + NSString ImageCount { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyWidth")] + NSString Width { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyHeight")] + NSString Height { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyBytesPerRow")] + NSString BytesPerRow { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyNamedColorSpace")] + NSString NamedColorSpace { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyPixelFormat")] + NSString PixelFormat { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyImages")] + NSString Images { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyThumbnailImages")] + NSString ThumbnailImages { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyAuxiliaryData")] + NSString AuxiliaryData { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyAuxiliaryDataType")] + NSString AuxiliaryDataType { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyFileContentsDictionary")] + NSString FileContentsDictionary { get; } } [Since (7,0), MountainLion] @@ -1169,4 +1213,35 @@ interface CGCopyImageSourceOptions { IntPtr kOrientation { get; } } #endif + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + enum CGImageAuxiliaryDataType { + [Field ("kCGImageAuxiliaryDataTypeDepth")] + Depth, + + [Field ("kCGImageAuxiliaryDataTypeDisparity")] + Disparity, + } + + [Mac (10,13), iOS (11,0), TV (11,0), Watch (4,0)] + [Static] + [Internal] + interface CGImageAuxiliaryDataInfoKeys { + [Field ("kCGImageAuxiliaryDataInfoData")] + NSString DataKey { get; } + + [Field ("kCGImageAuxiliaryDataInfoDataDescription")] + NSString DataDescriptionKey { get; } + + [Field ("kCGImageAuxiliaryDataInfoMetadata")] + NSString MetadataKey { get; } + } + + [Mac (10,13), iOS (11,0), TV (11,0), Watch (4,0)] + [StrongDictionary ("CGImageAuxiliaryDataInfoKeys")] + interface CGImageAuxiliaryDataInfo { + + NSData Data { get; set; } + NSDictionary DataDescription { get; set; } + } } diff --git a/src/intents.cs b/src/intents.cs index 9c22c35a9d07..bd26563e3ea2 100644 --- a/src/intents.cs +++ b/src/intents.cs @@ -15,6 +15,7 @@ using XamCore.ObjCRuntime; using XamCore.CoreLocation; using XamCore.Contacts; +using XamCore.EventKit; #if MONOMAC using UIImage = XamCore.Foundation.NSObject; @@ -55,7 +56,11 @@ public enum INCallRecordType : nint { Unknown = 0, Outgoing, Missed, - Received + Received, + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + Latest, + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + Voicemail, } [Introduced (PlatformName.iOS, 10, 0)] @@ -65,10 +70,15 @@ public enum INCallRecordType : nint { public enum INCancelWorkoutIntentResponseCode : nint { Unspecified = 0, Ready, + [Deprecated (PlatformName.iOS, 11, 0, message:"Use 'HandleInApp' instead.")] // yup just iOS ContinueInApp, Failure, FailureRequiringAppLaunch, - FailureNoMatchingWorkout + FailureNoMatchingWorkout, + [NoWatch, iOS (11,0)] + Success, + [NoWatch, iOS (11,0)] + HandleInApp, } [Introduced (PlatformName.iOS, 10, 0)] @@ -142,10 +152,15 @@ public enum INConditionalOperator : nint { public enum INEndWorkoutIntentResponseCode : nint { Unspecified = 0, Ready, + [Deprecated (PlatformName.iOS, 11, 0, message:"Use 'HandleInApp' instead.")] // yup just iOS ContinueInApp, Failure, FailureRequiringAppLaunch, - FailureNoMatchingWorkout + FailureNoMatchingWorkout, + [NoWatch, iOS (11,0)] + Success, + [NoWatch, iOS (11,0)] + HandleInApp, } [Introduced (PlatformName.iOS, 10, 0)] @@ -182,6 +197,8 @@ public enum INGetRestaurantGuestIntentResponseCode : nint { public enum INGetRideStatusIntentResponseCode : nint { Unspecified = 0, Ready, + [Deprecated (PlatformName.iOS, 11, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0)] InProgress, Success, Failure, @@ -251,6 +268,8 @@ public enum INInteractionDirection : nint { public enum INListRideOptionsIntentResponseCode : nint { Unspecified = 0, Ready, + [Deprecated (PlatformName.iOS, 11, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0)] InProgress, Success, Failure, @@ -258,7 +277,9 @@ public enum INListRideOptionsIntentResponseCode : nint { FailureRequiringAppLaunchMustVerifyCredentials, FailureRequiringAppLaunchNoServiceInArea, FailureRequiringAppLaunchServiceTemporarilyUnavailable, - FailureRequiringAppLaunchPreviousRideNeedsCompletion + FailureRequiringAppLaunchPreviousRideNeedsCompletion, + [iOS (11,0), Watch (4,0)] + FailurePreviousRideNeedsFeedback, } [Introduced (PlatformName.iOS, 10, 0)] @@ -270,7 +291,9 @@ public enum INMessageAttribute : nint { Read, Unread, Flagged, - Unflagged + Unflagged, + [iOS (11,0), Mac (10,13, onlyOn64:true), Watch (4,0)] + Played, } [Introduced (PlatformName.iOS, 10, 0)] @@ -282,7 +305,9 @@ public enum INMessageAttributeOptions : nuint { Read = (1 << 0), Unread = (1 << 1), Flagged = (1 << 2), - Unflagged = (1 << 3) + Unflagged = (1 << 3), + [iOS (11,0), Mac (10,13, onlyOn64:true), Watch (4,0)] + Played = (1UL << 4), } [Introduced (PlatformName.iOS, 10, 0)] @@ -292,10 +317,15 @@ public enum INMessageAttributeOptions : nuint { public enum INPauseWorkoutIntentResponseCode : nint { Unspecified = 0, Ready, + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'HandleInApp' instead.")] // yup just iOS ContinueInApp, Failure, FailureRequiringAppLaunch, - FailureNoMatchingWorkout + FailureNoMatchingWorkout, + [NoWatch, iOS (11,0)] + Success, + [NoWatch, iOS (11,0)] + HandleInApp, } [Introduced (PlatformName.iOS, 10, 0)] @@ -412,7 +442,9 @@ public enum INRequestPaymentIntentResponseCode : nint { FailurePaymentsAmountBelowMinimum, FailurePaymentsAmountAboveMaximum, FailurePaymentsCurrencyUnsupported, - FailureNoBankAccount + FailureNoBankAccount, + [iOS (11,0), Watch (4,0)] + FailureNotEligible, } [Introduced (PlatformName.iOS, 10, 0)] @@ -422,6 +454,8 @@ public enum INRequestPaymentIntentResponseCode : nint { public enum INRequestRideIntentResponseCode : nint { Unspecified = 0, Ready, + [Deprecated (PlatformName.iOS, 11, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0)] InProgress, Success, Failure, @@ -448,10 +482,15 @@ public enum INRestaurantReservationUserBookingStatus : nuint { public enum INResumeWorkoutIntentResponseCode : nint { Unspecified = 0, Ready, + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'HandleInApp' instead.")] // yup just iOS ContinueInApp, Failure, FailureRequiringAppLaunch, - FailureNoMatchingWorkout + FailureNoMatchingWorkout, + [NoWatch, iOS (11,0)] + Success, + [NoWatch, iOS (11,0)] + HandleInApp, } [Introduced (PlatformName.iOS, 10, 0)] @@ -494,6 +533,10 @@ public enum INSearchCallHistoryIntentResponseCode : nint { [Introduced (PlatformName.iOS, 10, 2)] [Introduced (PlatformName.MacOSX, 10, 12, 2, PlatformArchitecture.Arch64)] FailureAppConfigurationRequired, + [iOS (11,0), Mac (10,13, onlyOn64:true), Watch (4,0)] + InProgress, + [iOS (11,0), Mac (10,13, onlyOn64:true), Watch (4,0)] + Success, } [Introduced (PlatformName.iOS, 10, 0)] @@ -507,7 +550,9 @@ public enum INSearchForMessagesIntentResponseCode : nint { Success, Failure, FailureRequiringAppLaunch, - FailureMessageServiceNotAvailable + FailureMessageServiceNotAvailable, + [iOS (11,0), Mac (10,13, onlyOn64:true), Watch (4,0)] + FailureMessageTooManyResults, } [Introduced (PlatformName.iOS, 10, 0)] @@ -555,7 +600,10 @@ public enum INSendPaymentIntentResponseCode : nint { FailurePaymentsAmountAboveMaximum, FailurePaymentsCurrencyUnsupported, FailureInsufficientFunds, - FailureNoBankAccount + FailureNoBankAccount, + [Introduced (PlatformName.iOS, 11, 0)] + [Introduced (PlatformName.MacOSX, 10, 13, PlatformArchitecture.Arch64)] + FailureNotEligible, } [Introduced (PlatformName.iOS, 10, 0)] @@ -679,6 +727,10 @@ public enum INStartAudioCallIntentResponseCode : nint { [Introduced (PlatformName.iOS, 10, 2)] [Introduced (PlatformName.MacOSX, 10, 12, 2, PlatformArchitecture.Arch64)] FailureCallingServiceNotAvailable, + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + FailureContactNotSupportedByApp, + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + FailureNoValidNumber, } [Introduced (PlatformName.iOS, 10, 0)] @@ -711,6 +763,10 @@ public enum INStartVideoCallIntentResponseCode : nint { [Introduced (PlatformName.iOS, 10, 2)] [Introduced (PlatformName.MacOSX, 10, 12, 2, PlatformArchitecture.Arch64)] FailureCallingServiceNotAvailable, + [Watch (4,0), iOS (11,0)] + FailureContactNotSupportedByApp, + [Watch (4,0), iOS (11,0)] + FailureInvalidNumber, } [Introduced (PlatformName.iOS, 10, 0)] @@ -724,7 +780,11 @@ public enum INStartWorkoutIntentResponseCode : nint { Failure, FailureRequiringAppLaunch, FailureOngoingWorkout, - FailureNoMatchingWorkout + FailureNoMatchingWorkout, + [Watch (4,0), iOS (11,0)] + Success, + [Watch (4,0), iOS (11,0)] + HandleInApp, } [Introduced (PlatformName.iOS, 10, 0)] @@ -744,6 +804,10 @@ public enum INVocabularyStringType : nint { PaymentsOrganizationName = 400, [Introduced (PlatformName.iOS, 10, 3)] PaymentsAccountNickname, + [iOS (11,0)] + NotebookItemTitle = 500, + [iOS (11,0)] + NotebookItemGroupName, } [Introduced (PlatformName.iOS, 10, 0)] @@ -821,6 +885,12 @@ public enum INAmountType : nint { MinimumDue, AmountDue, CurrentBalance, + [iOS (11,0), Watch (4,0)] + MaximumTransferAmount, + [iOS (11,0), Watch (4,0)] + MinimumTransferAmount, + [iOS (11,0), Watch (4,0)] + StatementBalance, } [Introduced (PlatformName.iOS, 10, 3)] @@ -932,6 +1002,324 @@ public enum INSetCarLockStatusIntentResponseCode : nint { FailureRequiringAppLaunch, } + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INAddTasksIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INAppendToNoteIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + FailureCannotUpdatePasswordProtectedNote, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INBalanceType : nint { + Unknown = 0, + Money, + Points, + Miles, + } + + [Watch (3,2), Mac (10,12, onlyOn64:true), iOS (10,0)] + [Native] + public enum INCallCapability : nint { + Unknown = 0, + AudioCall, + VideoCall, + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Native] + public enum INCallDestinationType : nint { + Unknown = 0, + Normal, + Emergency, + Voicemail, + Redial, + } + + [Watch (3,2), Mac (10,12, onlyOn64:true), iOS (10,0)] + [Native] + [Flags] + public enum INCallRecordTypeOptions : nuint { + Outgoing = (1 << 0), + Missed = (1 << 1), + Received = (1 << 2), + Latest = (1 << 3), + Voicemail = (1 << 4), + } + + [NoWatch, NoMac, iOS (11,0)] + [Native] + public enum INCancelRideIntentResponseCode : nint { + Unspecified = 0, + Ready, + Success, + Failure, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INCreateNoteIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INCreateTaskListIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INDateSearchType : nint { + Unknown = 0, + ByDueDate, + ByModifiedDate, + ByCreatedDate, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INGetVisualCodeIntentResponseCode : nint { + Unspecified = 0, + Ready, + ContinueInApp, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + FailureAppConfigurationRequired, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INLocationSearchType : nint { + Unknown = 0, + ByLocationTrigger, + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Native] + public enum INMessageType : nint { + Unspecified = 0, + Text, + Audio, + DigitalTouch, + Handwriting, + Sticker, + TapbackLiked, + TapbackDisliked, + TapbackEmphasized, + TapbackLoved, + TapbackQuestioned, + TapbackLaughed, + MediaCalendar, + MediaLocation, + MediaAddressCard, + MediaImage, + MediaVideo, + MediaPass, + MediaAudio, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INNoteContentType : nint { + Unknown = 0, + Text, + Image, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INNotebookItemType : nint { + Unknown = 0, + Note, + TaskList, + Task, + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Native] + public enum INRecurrenceFrequency : nint { + Unknown = 0, + Minute, + Hourly, + Daily, + Weekly, + Monthly, + Yearly, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INRequestPaymentCurrencyAmountUnsupportedReason : nint { + AmountBelowMinimum = 1, + AmountAboveMaximum, + CurrencyUnsupported, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INRequestPaymentPayerUnsupportedReason : nint { + CredentialsUnverified = 1, + NoAccount, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INRideFeedbackTypeOptions : nuint { + Rate = (1 << 0), + Tip = (1 << 1), + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INSearchForAccountsIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + FailureCredentialsUnverified, + FailureAccountNotFound, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INSearchForNotebookItemsIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Native] + public enum INSendMessageRecipientUnsupportedReason : nint { + NoAccount = 1, + Offline, + MessagingServiceNotEnabledForRecipient, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INSendPaymentCurrencyAmountUnsupportedReason : nint { + AmountBelowMinimum = 1, + AmountAboveMaximum, + CurrencyUnsupported, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INSendPaymentPayeeUnsupportedReason : nint { + CredentialsUnverified = 1, + InsufficientFunds, + NoAccount, + } + + [NoWatch, NoMac, iOS (11,0)] + [Native] + public enum INSendRideFeedbackIntentResponseCode : nint { + Unspecified = 0, + Ready, + Success, + Failure, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INSetTaskAttributeIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INSortType : nint { + Unknown = 0, + AsIs, + ByDate, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INSpatialEvent : nint { + Unknown = 0, + Arrive, + Depart, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INTaskStatus : nint { + Unknown = 0, + NotCompleted, + Completed, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INTaskType : nint { + Unknown = 0, + NotCompletable, + Completable, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INTransferMoneyIntentResponseCode : nint { + Unspecified = 0, + Ready, + InProgress, + Success, + Failure, + FailureRequiringAppLaunch, + FailureCredentialsUnverified, + FailureInsufficientFunds, + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Native] + public enum INVisualCodeType : nint { + Unknown = 0, + Contact, + RequestPayment, + SendPayment, + } + [Introduced (PlatformName.iOS, 10, 0)] [Introduced (PlatformName.MacOSX, 10, 12, PlatformArchitecture.Arch64)] [Introduced (PlatformName.WatchOS, 3, 2)] @@ -1202,6 +1590,10 @@ interface CLPlacemark_INIntentsAdditions { [BaseType (typeof (INIntent))] interface INBookRestaurantReservationIntent : NSCopying { + [iOS (11,0)] + [Export ("initWithRestaurant:bookingDateComponents:partySize:bookingIdentifier:guest:selectedOffer:guestProvidedSpecialRequestText:")] + IntPtr Constructor (INRestaurant restaurant, NSDateComponents bookingDateComponents, nuint partySize, [NullAllowed] string bookingIdentifier, [NullAllowed] INRestaurantGuest guest, [NullAllowed] INRestaurantOffer selectedOffer, [NullAllowed] string guestProvidedSpecialRequestText); + [Export ("restaurant", ArgumentSemantic.Copy)] INRestaurant Restaurant { get; set; } @@ -1235,7 +1627,13 @@ interface INBookRestaurantReservationIntentHandling { void HandleBookRestaurantReservation (INBookRestaurantReservationIntent intent, Action completion); [Export ("confirmBookRestaurantReservation:completion:")] - void ConfirmBookRestaurantReservation (INBookRestaurantReservationIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmBookRestaurantReservation +#endif + (INBookRestaurantReservationIntent intent, Action completion); [Export ("resolveRestaurantForBookRestaurantReservation:withCompletion:")] void ResolveRestaurant (INBookRestaurantReservationIntent intent, Action completion); @@ -1310,13 +1708,33 @@ interface INBooleanResolutionResult { [DisableDefaultCtor] interface INCallRecordTypeResolutionResult { + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedCallRecordType:")] + INCallRecordTypeResolutionResult SuccessWithResolvedCallRecordType (INCallRecordType resolvedCallRecordType); + + [Internal] + [Deprecated (PlatformName.MacOSX, 10, 13)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INCallRecordTypeResolutionResult GetSuccess (INCallRecordType resolvedValue); + INCallRecordTypeResolutionResult SuccessWithResolvedValue (INCallRecordType resolvedValue); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithCallRecordTypeToConfirm:")] + INCallRecordTypeResolutionResult ConfirmationRequiredWithCallRecordTypeToConfirm (INCallRecordType callRecordTypeToConfirm); + [Internal] + [Deprecated (PlatformName.MacOSX, 10, 13)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INCallRecordTypeResolutionResult GetConfirmationRequired (INCallRecordType valueToConfirm); + INCallRecordTypeResolutionResult ConfirmationRequiredWithValueToConfirm (INCallRecordType valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -1362,7 +1780,13 @@ interface INCancelWorkoutIntentHandling { void HandleCancelWorkout (INCancelWorkoutIntent intent, Action completion); [Export ("confirmCancelWorkout:completion:")] - void ConfirmCancelWorkout (INCancelWorkoutIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmCancelWorkout +#endif + (INCancelWorkoutIntent intent, Action completion); [Export ("resolveWorkoutNameForCancelWorkout:withCompletion:")] void ResolveWorkoutName (INCancelWorkoutIntent intent, Action completion); @@ -1389,13 +1813,28 @@ interface INCancelWorkoutIntentResponse { [DisableDefaultCtor] interface INCarAirCirculationModeResolutionResult { + [iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedCarAirCirculationMode:")] + INCarAirCirculationModeResolutionResult SuccessWithResolvedCarAirCirculationMode (INCarAirCirculationMode resolvedCarAirCirculationMode); + + [Deprecated (PlatformName.iOS, 11, 0)] + [Internal] [Static] [Export ("successWithResolvedValue:")] - INCarAirCirculationModeResolutionResult GetSuccess (INCarAirCirculationMode resolvedValue); + INCarAirCirculationModeResolutionResult SuccessWithResolvedValue (INCarAirCirculationMode resolvedValue); + + [iOS (11,0)] + [Static] + [Export ("confirmationRequiredWithCarAirCirculationModeToConfirm:")] + INCarAirCirculationModeResolutionResult ConfirmationRequiredWithCarAirCirculationModeToConfirm (INCarAirCirculationMode carAirCirculationModeToConfirm); + [Deprecated (PlatformName.iOS, 11, 0)] + [Internal] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INCarAirCirculationModeResolutionResult GetConfirmationRequired (INCarAirCirculationMode valueToConfirm); + INCarAirCirculationModeResolutionResult ConfirmationRequiredWithValueToConfirm (INCarAirCirculationMode valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -1422,13 +1861,29 @@ interface INCarAirCirculationModeResolutionResult { [DisableDefaultCtor] interface INCarAudioSourceResolutionResult { + [iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedCarAudioSource:")] + INCarAudioSourceResolutionResult SuccessWithResolvedCarAudioSource (INCarAudioSource resolvedCarAudioSource); + + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INCarAudioSourceResolutionResult GetSuccess (INCarAudioSource resolvedValue); + INCarAudioSourceResolutionResult SuccessWithResolvedValue (INCarAudioSource resolvedValue); + + [iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithCarAudioSourceToConfirm:")] + INCarAudioSourceResolutionResult ConfirmationRequiredWithCarAudioSourceToConfirm (INCarAudioSource carAudioSourceToConfirm); + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INCarAudioSourceResolutionResult GetConfirmationRequired (INCarAudioSource valueToConfirm); + INCarAudioSourceResolutionResult ConfirmationRequiredWithValueToConfirm (INCarAudioSource valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -1455,13 +1910,29 @@ interface INCarAudioSourceResolutionResult { [DisableDefaultCtor] interface INCarDefrosterResolutionResult { + [iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedCarDefroster:")] + INCarDefrosterResolutionResult SuccessWithResolvedCarDefroster (INCarDefroster resolvedCarDefroster); + + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INCarDefrosterResolutionResult GetSuccess (INCarDefroster resolvedValue); + INCarDefrosterResolutionResult SuccessWithResolvedValue (INCarDefroster resolvedValue); + + [iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithCarDefrosterToConfirm:")] + INCarDefrosterResolutionResult ConfirmationRequiredWithCarDefrosterToConfirm (INCarDefroster carDefrosterToConfirm); + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INCarDefrosterResolutionResult GetConfirmationRequired (INCarDefroster valueToConfirm); + INCarDefrosterResolutionResult ConfirmationRequiredWithValueToConfirm (INCarDefroster valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -1488,13 +1959,29 @@ interface INCarDefrosterResolutionResult { [DisableDefaultCtor] interface INCarSeatResolutionResult { + [iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedCarSeat:")] + INCarSeatResolutionResult SuccessWithResolvedCarSeat (INCarSeat resolvedCarSeat); + + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INCarSeatResolutionResult GetSuccess (INCarSeat resolvedValue); + INCarSeatResolutionResult SuccessWithResolvedValue (INCarSeat resolvedValue); + + [iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithCarSeatToConfirm:")] + INCarSeatResolutionResult ConfirmationRequiredWithCarSeatToConfirm (INCarSeat carSeatToConfirm); + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INCarSeatResolutionResult GetConfirmationRequired (INCarSeat valueToConfirm); + INCarSeatResolutionResult ConfirmationRequiredWithValueToConfirm (INCarSeat valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -1579,14 +2066,31 @@ interface INCurrencyAmountResolutionResult { interface INDateComponentsRange : NSCopying, NSSecureCoding { [Export ("initWithStartDateComponents:endDateComponents:")] - [DesignatedInitializer] IntPtr Constructor ([NullAllowed] NSDateComponents startDateComponents, [NullAllowed] NSDateComponents endDateComponents); + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithEKRecurrenceRule:")] + IntPtr Constructor (EKRecurrenceRule recurrenceRule); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithStartDateComponents:endDateComponents:recurrenceRule:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] NSDateComponents startDateComponents, [NullAllowed] NSDateComponents endDateComponents, [NullAllowed] INRecurrenceRule recurrenceRule); + [NullAllowed, Export ("startDateComponents", ArgumentSemantic.Copy)] NSDateComponents StartDateComponents { get; } [NullAllowed, Export ("endDateComponents", ArgumentSemantic.Copy)] NSDateComponents EndDateComponents { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("recurrenceRule", ArgumentSemantic.Copy)] + INRecurrenceRule RecurrenceRule { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("EKRecurrenceRule")] + [NullAllowed] + EKRecurrenceRule EKRecurrenceRule { get; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -1683,7 +2187,11 @@ interface INMessagesDomainHandling : INSendMessageIntentHandling, INSearchForMes [Introduced (PlatformName.WatchOS, 3, 2)] [Unavailable (PlatformName.MacOSX)] [Protocol] - interface INPaymentsDomainHandling : INSendPaymentIntentHandling, INRequestPaymentIntentHandling, INPayBillIntentHandling, INSearchForBillsIntentHandling { + interface INPaymentsDomainHandling : INSendPaymentIntentHandling, INRequestPaymentIntentHandling, INPayBillIntentHandling, INSearchForBillsIntentHandling +#if XAMCORE_4_0 // Added in iOS 11 -> #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000 + , INSearchForAccountsIntentHandling, INTransferMoneyIntentHandling +#endif + { } [Introduced (PlatformName.iOS, 10, 0)] @@ -1697,7 +2205,21 @@ interface INPhotosDomainHandling : INSearchForPhotosIntentHandling, INStartPhoto [Introduced (PlatformName.WatchOS, 3, 2)] [Unavailable (PlatformName.MacOSX)] [Protocol] - interface INRidesharingDomainHandling : INListRideOptionsIntentHandling, INRequestRideIntentHandling, INGetRideStatusIntentHandling { + interface INRidesharingDomainHandling : INListRideOptionsIntentHandling, INRequestRideIntentHandling, INGetRideStatusIntentHandling +#if XAMCORE_4_0 // Added in iOS 11 -> #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000 + , INCancelRideIntentHandling, INSendRideFeedbackIntentHandling +#endif + { + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INNotebookDomainHandling : INCreateNoteIntentHandling, INAppendToNoteIntentHandling, INAddTasksIntentHandling, INCreateTaskListIntentHandling, INSetTaskAttributeIntentHandling, INSearchForNotebookItemsIntentHandling { + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INVisualCodeDomainHandling : INGetVisualCodeIntentHandling { } [Introduced (PlatformName.iOS, 10, 0)] @@ -1797,7 +2319,13 @@ interface INEndWorkoutIntentHandling { void HandleEndWorkout (INEndWorkoutIntent intent, Action completion); [Export ("confirmEndWorkout:completion:")] - void ConfirmEndWorkout (INEndWorkoutIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmEndWorkout +#endif + (INEndWorkoutIntent intent, Action completion); [Export ("resolveWorkoutNameForEndWorkout:withCompletion:")] void ResolveWorkoutName (INEndWorkoutIntent intent, Action completion); @@ -1842,6 +2370,10 @@ interface INExtension : INIntentHandlerProviding { [BaseType (typeof (INIntent))] interface INGetAvailableRestaurantReservationBookingDefaultsIntent { + [iOS (11,0)] + [Export ("initWithRestaurant:")] + IntPtr Constructor ([NullAllowed] INRestaurant restaurant); + [NullAllowed, Export ("restaurant", ArgumentSemantic.Copy)] INRestaurant Restaurant { get; set; } } @@ -1857,7 +2389,13 @@ interface INGetAvailableRestaurantReservationBookingDefaultsIntentHandling { void HandleAvailableRestaurantReservationBookingDefaults (INGetAvailableRestaurantReservationBookingDefaultsIntent intent, Action completion); [Export ("confirmGetAvailableRestaurantReservationBookingDefaults:completion:")] - void ConfirmAvailableRestaurantReservationBookingDefaults (INGetAvailableRestaurantReservationBookingDefaultsIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmAvailableRestaurantReservationBookingDefaults +#endif + (INGetAvailableRestaurantReservationBookingDefaultsIntent intent, Action completion); [Export ("resolveRestaurantForGetAvailableRestaurantReservationBookingDefaults:withCompletion:")] void ResolveAvailableRestaurantReservationBookingDefaults (INGetAvailableRestaurantReservationBookingDefaultsIntent intent, Action completion); @@ -1898,6 +2436,10 @@ interface INGetAvailableRestaurantReservationBookingDefaultsIntentResponse { [BaseType (typeof (INIntent))] interface INGetAvailableRestaurantReservationBookingsIntent : NSCopying { + [iOS (11,0)] + [Export ("initWithRestaurant:partySize:preferredBookingDateComponents:maximumNumberOfResults:earliestBookingDateForResults:latestBookingDateForResults:")] + IntPtr Constructor (INRestaurant restaurant, nuint partySize, [NullAllowed] NSDateComponents preferredBookingDateComponents, [NullAllowed] NSNumber maximumNumberOfResults, [NullAllowed] NSDate earliestBookingDateForResults, [NullAllowed] NSDate latestBookingDateForResults); + [Export ("restaurant", ArgumentSemantic.Copy)] INRestaurant Restaurant { get; set; } @@ -1928,7 +2470,13 @@ interface INGetAvailableRestaurantReservationBookingsIntentHandling { void HandleAvailableRestaurantReservationBookings (INGetAvailableRestaurantReservationBookingsIntent intent, Action completion); [Export ("confirmGetAvailableRestaurantReservationBookings:completion:")] - void ConfirmAvailableRestaurantReservationBookings (INGetAvailableRestaurantReservationBookingsIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmAvailableRestaurantReservationBookings +#endif + (INGetAvailableRestaurantReservationBookingsIntent intent, Action completion); [Export ("resolveRestaurantForGetAvailableRestaurantReservationBookings:withCompletion:")] void ResolveAvailableRestaurantReservationBookings (INGetAvailableRestaurantReservationBookingsIntent intent, Action completion); @@ -1984,7 +2532,13 @@ interface INGetRestaurantGuestIntentHandling { void HandleRestaurantGuest (INGetRestaurantGuestIntent intent, Action completion); [Export ("confirmGetRestaurantGuest:completion:")] - void ConfirmRestaurantGuest (INGetRestaurantGuestIntent guestIntent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmRestaurantGuest +#endif + (INGetRestaurantGuestIntent guestIntent, Action completion); } [Introduced (PlatformName.iOS, 10, 0)] @@ -2011,7 +2565,12 @@ interface INGetRestaurantGuestIntentResponse { [Introduced (PlatformName.WatchOS, 3, 2)] [Unavailable (PlatformName.MacOSX)] [BaseType (typeof (INIntent))] + [DisableDefaultCtor] // DesignatedInitializer below interface INGetRideStatusIntent { + + [DesignatedInitializer] + [Export ("init")] + IntPtr Constructor (); } [Introduced (PlatformName.iOS, 10, 0)] @@ -2033,7 +2592,13 @@ interface INGetRideStatusIntentHandling { void StopSendingUpdates (INGetRideStatusIntent intent); [Export ("confirmGetRideStatus:completion:")] - void ConfirmRideStatus (INGetRideStatusIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmRideStatus +#endif + (INGetRideStatusIntent intent, Action completion); } interface IINGetRideStatusIntentResponseObserver { } @@ -2073,6 +2638,14 @@ interface INGetRideStatusIntentResponse { [BaseType (typeof (INIntent))] interface INGetUserCurrentRestaurantReservationBookingsIntent : NSCopying { + [iOS (11,0)] + [Export ("initWithRestaurant:reservationIdentifier:maximumNumberOfResults:earliestBookingDateForResults:")] + IntPtr Constructor ([NullAllowed] INRestaurant restaurant, [NullAllowed] string reservationIdentifier, [NullAllowed] NSNumber maximumNumberOfResults, [NullAllowed] NSDate earliestBookingDateForResults); + + [iOS (11,0)] + [Wrap ("this (restaurant, reservationIdentifier, NSNumber.FromNInt (maximumNumberOfResults), earliestBookingDateForResults)")] + IntPtr Constructor ([NullAllowed] INRestaurant restaurant, [NullAllowed] string reservationIdentifier, nint maximumNumberOfResults, [NullAllowed] NSDate earliestBookingDateForResults); + [NullAllowed, Export ("restaurant", ArgumentSemantic.Copy)] INRestaurant Restaurant { get; set; } @@ -2097,7 +2670,13 @@ interface INGetUserCurrentRestaurantReservationBookingsIntentHandling { void HandleUserCurrentRestaurantReservationBookings (INGetUserCurrentRestaurantReservationBookingsIntent intent, Action completion); [Export ("confirmGetUserCurrentRestaurantReservationBookings:completion:")] - void ConfirmUserCurrentRestaurantReservationBookings (INGetUserCurrentRestaurantReservationBookingsIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmUserCurrentRestaurantReservationBookings +#endif + (INGetUserCurrentRestaurantReservationBookingsIntent intent, Action completion); [Export ("resolveRestaurantForGetUserCurrentRestaurantReservationBookings:withCompletion:")] void ResolveUserCurrentRestaurantReservationBookings (INGetUserCurrentRestaurantReservationBookingsIntent intent, Action completion); @@ -2140,6 +2719,12 @@ interface INImage : NSCopying, NSSecureCoding { [Export ("imageWithURL:")] INImage FromUrl (NSUrl url); + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Static] + [Export ("imageWithURL:width:height:")] + [return: NullAllowed] + INImage FromUrl (NSUrl url, double width, double height); + // INImage_IntentsUI (IntentsUI) [NoMac, NoWatch] @@ -2156,6 +2741,11 @@ interface INImage : NSCopying, NSSecureCoding { [Static] [Export ("imageSizeForIntentResponse:")] CGSize GetImageSize (INIntentResponse response); + + [NoMac, NoWatch, iOS (11,0)] + [Async] + [Export ("fetchUIImageWithCompletion:")] + void FetchImage (Action completion); } [Introduced (PlatformName.iOS, 10, 0)] @@ -2205,6 +2795,10 @@ interface INIntent : NSCopying, NSSecureCoding { [Unavailable (PlatformName.MacOSX)] [Wrap ("INIntentIdentifierExtensions.GetValue (IdentifierString)")] INIntentIdentifier? Identifier { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("intentDescription")] + string IntentDescription { get; } } interface INIntentResolutionResult : INIntentResolutionResult { } @@ -2294,6 +2888,13 @@ interface INInteraction : NSSecureCoding, NSCopying { [NullAllowed, Export ("groupIdentifier")] string GroupIdentifier { get; set; } + + // From INParameter.h INInteraction () + + [Internal] + [iOS (11,0), Watch (4,0), NoMac] + [Export ("parameterValueForParameter:")] + IntPtr _GetParameterValue (INParameter parameter); } [Introduced (PlatformName.iOS, 10, 0)] @@ -2324,7 +2925,13 @@ interface INListRideOptionsIntentHandling { void HandleListRideOptions (INListRideOptionsIntent intent, Action completion); [Export ("confirmListRideOptions:completion:")] - void ConfirmListRideOptions (INListRideOptionsIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmListRideOptions +#endif + (INListRideOptionsIntent intent, Action completion); [Export ("resolvePickupLocationForListRideOptions:withCompletion:")] void ResolvePickupLocation (INListRideOptionsIntent intent, Action completion); @@ -2364,13 +2971,25 @@ interface INListRideOptionsIntentResponse { [DisableDefaultCtor] interface INMessage : NSCopying, NSSecureCoding { - [Export ("initWithIdentifier:content:dateSent:sender:recipients:")] + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithIdentifier:conversationIdentifier:content:dateSent:sender:recipients:groupName:messageType:")] [DesignatedInitializer] + IntPtr Constructor (string identifier, [NullAllowed] string conversationIdentifier, [NullAllowed] string content, [NullAllowed] NSDate dateSent, [NullAllowed] INPerson sender, [NullAllowed] INPerson [] recipients, [NullAllowed] INSpeakableString groupName, INMessageType messageType); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithIdentifier:conversationIdentifier:content:dateSent:sender:recipients:messageType:")] + IntPtr Constructor (string identifier, [NullAllowed] string conversationIdentifier, [NullAllowed] string content, [NullAllowed] NSDate dateSent, [NullAllowed] INPerson sender, [NullAllowed] INPerson [] recipients, INMessageType messageType); + + [Export ("initWithIdentifier:content:dateSent:sender:recipients:")] IntPtr Constructor (string identifier, [NullAllowed] string content, [NullAllowed] NSDate dateSent, [NullAllowed] INPerson sender, [NullAllowed] INPerson [] recipients); [Export ("identifier")] string Identifier { get; } + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("conversationIdentifier")] + string ConversationIdentifier { get; } + [NullAllowed, Export ("content")] string Content { get; } @@ -2382,6 +3001,14 @@ interface INMessage : NSCopying, NSSecureCoding { [NullAllowed, Export ("recipients", ArgumentSemantic.Copy)] INPerson [] Recipients { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("groupName", ArgumentSemantic.Copy)] + INSpeakableString GroupName { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("messageType")] + INMessageType MessageType { get; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -2391,13 +3018,33 @@ interface INMessage : NSCopying, NSSecureCoding { [DisableDefaultCtor] interface INMessageAttributeOptionsResolutionResult { + [Watch (4,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedMessageAttributeOptions:")] + INMessageAttributeOptionsResolutionResult SuccessWithResolvedMessageAttributeOptions (INMessageAttributeOptions resolvedMessageAttributeOptions); + + [Internal] + [Deprecated (PlatformName.MacOSX, 10, 13)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INMessageAttributeOptionsResolutionResult GetSuccess (INMessageAttributeOptions resolvedValue); + INMessageAttributeOptionsResolutionResult SuccessWithResolvedValue (INMessageAttributeOptions resolvedValue); + + [Watch (4,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithMessageAttributeOptionsToConfirm:")] + INMessageAttributeOptionsResolutionResult ConfirmationRequiredWithMessageAttributeOptionsToConfirm (INMessageAttributeOptions messageAttributeOptionsToConfirm); + [Internal] + [Deprecated (PlatformName.MacOSX, 10, 13)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INMessageAttributeOptionsResolutionResult GetConfirmationRequired (INMessageAttributeOptions valueToConfirm); + INMessageAttributeOptionsResolutionResult ConfirmationRequiredWithValueToConfirm (INMessageAttributeOptions valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -2425,13 +3072,33 @@ interface INMessageAttributeOptionsResolutionResult { [DisableDefaultCtor] interface INMessageAttributeResolutionResult { + [Watch (4,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedMessageAttribute:")] + INMessageAttributeResolutionResult SuccessWithResolvedMessageAttribute (INMessageAttribute resolvedMessageAttribute); + + [Internal] + [Introduced (PlatformName.MacOSX, 10, 12)] + [Introduced (PlatformName.WatchOS, 3, 2)] + [Introduced (PlatformName.iOS, 10, 0)] [Static] [Export ("successWithResolvedValue:")] - INMessageAttributeResolutionResult GetSuccess (INMessageAttribute resolvedValue); + INMessageAttributeResolutionResult SuccessWithResolvedValue (INMessageAttribute resolvedValue); + [Watch (4,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithMessageAttributeToConfirm:")] + INMessageAttributeResolutionResult ConfirmationRequiredWithMessageAttributeToConfirm (INMessageAttribute messageAttributeToConfirm); + + [Internal] + [Deprecated (PlatformName.MacOSX, 10, 13)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INMessageAttributeResolutionResult GetConfirmationRequired (INMessageAttribute valueToConfirm); + INMessageAttributeResolutionResult ConfirmationRequiredWithValueToConfirm (INMessageAttribute valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -2477,7 +3144,13 @@ interface INPauseWorkoutIntentHandling { void HandlePauseWorkout (INPauseWorkoutIntent intent, Action completion); [Export ("confirmPauseWorkout:completion:")] - void ConfirmPauseWorkout (INPauseWorkoutIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmPauseWorkout +#endif + (INPauseWorkoutIntent intent, Action completion); [Export ("resolveWorkoutNameForPauseWorkout:withCompletion:")] void ResolveWorkoutName (INPauseWorkoutIntent intent, Action completion); @@ -2618,6 +3291,10 @@ interface INPerson : NSCopying, NSSecureCoding, INSpeakable { [Unavailable (PlatformName.MacOSX)] [Export ("siriMatches", ArgumentSemantic.Copy), NullAllowed] INPerson [] SiriMatches { get; } + + [Mac (10,13, onlyOn64:true), iOS (11,0), Watch (4,0)] + [Export ("isMe")] + bool IsMe { get; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -2627,7 +3304,7 @@ interface INPerson : NSCopying, NSSecureCoding, INSpeakable { [DisableDefaultCtor] interface INPersonHandle : NSCopying, NSSecureCoding { - [Export ("value")] + [Export ("value"), NullAllowed] string Value { get; } [Export ("type")] @@ -2652,10 +3329,10 @@ interface INPersonHandle : NSCopying, NSSecureCoding { [Introduced (PlatformName.iOS, 10, 2)] [Introduced (PlatformName.MacOSX, 10, 12, 2, PlatformArchitecture.Arch64)] [Export ("initWithValue:type:label:"), Protected] - IntPtr Constructor (string value, INPersonHandleType type, [NullAllowed] NSString stringLabel); + IntPtr Constructor ([NullAllowed] string value, INPersonHandleType type, [NullAllowed] NSString stringLabel); [Export ("initWithValue:type:")] - IntPtr Constructor (string value, INPersonHandleType type); + IntPtr Constructor ([NullAllowed] string value, INPersonHandleType type); } [Introduced (PlatformName.iOS, 10, 0)] @@ -2797,13 +3474,29 @@ interface INPriceRange : NSCopying, NSSecureCoding { [DisableDefaultCtor] interface INRadioTypeResolutionResult { + [iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedRadioType:")] + INRadioTypeResolutionResult SuccessWithResolvedRadioType (INRadioType resolvedRadioType); + + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INRadioTypeResolutionResult GetSuccess (INRadioType resolvedValue); + INRadioTypeResolutionResult SuccessWithResolvedValue (INRadioType resolvedValue); + + [iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithRadioTypeToConfirm:")] + INRadioTypeResolutionResult ConfirmationRequiredWithRadioTypeToConfirm (INRadioType radioTypeToConfirm); + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INRadioTypeResolutionResult GetConfirmationRequired (INRadioType valueToConfirm); + INRadioTypeResolutionResult ConfirmationRequiredWithValueToConfirm (INRadioType valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -2830,13 +3523,29 @@ interface INRadioTypeResolutionResult { [DisableDefaultCtor] interface INRelativeReferenceResolutionResult { + [iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedRelativeReference:")] + INRelativeReferenceResolutionResult SuccessWithResolvedRelativeReference (INRelativeReference resolvedRelativeReference); + + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INRelativeReferenceResolutionResult GetSuccess (INRelativeReference resolvedValue); + INRelativeReferenceResolutionResult SuccessWithResolvedValue (INRelativeReference resolvedValue); + + [iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithRelativeReferenceToConfirm:")] + INRelativeReferenceResolutionResult ConfirmationRequiredWithRelativeReferenceToConfirm (INRelativeReference relativeReferenceToConfirm); + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INRelativeReferenceResolutionResult GetConfirmationRequired (INRelativeReference valueToConfirm); + INRelativeReferenceResolutionResult ConfirmationRequiredWithValueToConfirm (INRelativeReference valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -2863,13 +3572,29 @@ interface INRelativeReferenceResolutionResult { [DisableDefaultCtor] interface INRelativeSettingResolutionResult { + [iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedRelativeSetting:")] + INRelativeSettingResolutionResult SuccessWithResolvedRelativeSetting (INRelativeSetting resolvedRelativeSetting); + + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INRelativeSettingResolutionResult GetSuccess (INRelativeSetting resolvedValue); + INRelativeSettingResolutionResult SuccessWithResolvedValue (INRelativeSetting resolvedValue); + + [iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithRelativeSettingToConfirm:")] + INRelativeSettingResolutionResult ConfirmationRequiredWithRelativeSettingToConfirm (INRelativeSetting relativeSettingToConfirm); + [Internal] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INRelativeSettingResolutionResult GetConfirmationRequired (INRelativeSetting valueToConfirm); + INRelativeSettingResolutionResult ConfirmationRequiredWithValueToConfirm (INRelativeSetting valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -2921,14 +3646,32 @@ interface INRequestPaymentIntentHandling { void HandleRequestPayment (INRequestPaymentIntent intent, Action completion); [Export ("confirmRequestPayment:completion:")] - void ConfirmRequestPayment (INRequestPaymentIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmRequestPayment +#endif + (INRequestPaymentIntent intent, Action completion); + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolvePayer (INRequestPaymentIntent, Action)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolvePayer (INRequestPaymentIntent, Action)' instead.")] [Export ("resolvePayerForRequestPayment:withCompletion:")] void ResolvePayer (INRequestPaymentIntent intent, Action completion); + [Watch (4,0), iOS (11,0)] + [Export ("resolvePayerForRequestPayment:completion:")] + void ResolvePayer (INRequestPaymentIntent intent, Action completion); + + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolveCurrencyAmount (INRequestPaymentIntent, Action)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolveCurrencyAmount (INRequestPaymentIntent, Action)' instead.")] [Export ("resolveCurrencyAmountForRequestPayment:withCompletion:")] void ResolveCurrencyAmount (INRequestPaymentIntent intent, Action completion); + [Watch (4,0), iOS (11,0)] + [Export ("resolveCurrencyAmountForRequestPayment:completion:")] + void ResolveCurrencyAmount (INRequestPaymentIntent intent, Action completion); + [Export ("resolveNoteForRequestPayment:withCompletion:")] void ResolveNote (INRequestPaymentIntent intent, Action completion); } @@ -2998,7 +3741,13 @@ interface INRequestRideIntentHandling { void HandleRequestRide (INRequestRideIntent intent, Action completion); [Export ("confirmRequestRide:completion:")] - void ConfirmRequestRide (INRequestRideIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmRequestRide +#endif + (INRequestRideIntent intent, Action completion); [Export ("resolvePickupLocationForRequestRide:withCompletion:")] void ResolvePickupLocation (INRequestRideIntent intent, Action completion); @@ -3062,6 +3811,7 @@ interface INRestaurant : NSSecureCoding, NSCopying { [Unavailable (PlatformName.MacOSX)] [Unavailable (PlatformName.WatchOS)] [BaseType (typeof (INPerson))] + [DisableDefaultCtor] // The base type, INPerson, has no default ctor. interface INRestaurantGuest { [Export ("initWithNameComponents:phoneNumber:emailAddress:")] @@ -3299,7 +4049,13 @@ interface INResumeWorkoutIntentHandling { void HandleResumeWorkout (INResumeWorkoutIntent intent, Action completion); [Export ("confirmResumeWorkout:completion:")] - void ConfirmResumeWorkout (INResumeWorkoutIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmResumeWorkout +#endif + (INResumeWorkoutIntent intent, Action completion); [Export ("resolveWorkoutNameForResumeWorkout:withCompletion:")] void ResolveWorkoutName (INResumeWorkoutIntent intent, Action completion); @@ -3339,6 +4095,11 @@ interface INRideCompletionStatus : NSCopying, NSSecureCoding { [Export ("completedWithOutstandingPaymentAmount:")] INRideCompletionStatus GetOutstandingPaymentAmount (INCurrencyAmount outstandingPaymentAmount); + [Watch (4,0), iOS (11,0)] + [Static] + [Export ("completedWithOutstandingFeedbackType:")] + INRideCompletionStatus GetCompleted (INRideFeedbackTypeOptions feedbackType); + [Static] [Export ("canceledByService")] INRideCompletionStatus GetCanceledByService (); @@ -3366,8 +4127,16 @@ interface INRideCompletionStatus : NSCopying, NSSecureCoding { [NullAllowed, Export ("paymentAmount", ArgumentSemantic.Strong)] INCurrencyAmount PaymentAmount { get; } + [Watch (4,0), iOS (11,0)] + [Export ("feedbackType", ArgumentSemantic.Assign)] + INRideFeedbackTypeOptions FeedbackType { get; } + [Export ("outstanding")] bool Outstanding { [Bind ("isOutstanding")] get; } + + [Watch (4,0), iOS (11,0)] + [NullAllowed, Export ("defaultTippingOptions", ArgumentSemantic.Strong)] + NSSet DefaultTippingOptions { get; set; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -3576,7 +4345,7 @@ interface INSaveProfileInCarIntent { [NullAllowed, Export ("profileNumber", ArgumentSemantic.Copy)] NSNumber ProfileNumber { get; } - [Deprecated (PlatformName.iOS, 10,2, message:"Use ProfileName instead")] + [Deprecated (PlatformName.iOS, 10,2, message:"Use 'ProfileName' instead.")] [NullAllowed, Export ("profileLabel")] string ProfileLabel { get; } @@ -3596,7 +4365,13 @@ interface INSaveProfileInCarIntentHandling { void HandleSaveProfileInCar (INSaveProfileInCarIntent intent, Action completion); [Export ("confirmSaveProfileInCar:completion:")] - void ConfirmSaveProfileInCar (INSaveProfileInCarIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSaveProfileInCar +#endif + (INSaveProfileInCarIntent intent, Action completion); [Export ("resolveProfileNumberForSaveProfileInCar:withCompletion:")] void ResolveProfileNumber (INSaveProfileInCarIntent intent, Action completion); @@ -3627,10 +4402,24 @@ interface INSaveProfileInCarIntentResponse { [BaseType (typeof (INIntent))] interface INSearchCallHistoryIntent { - [Export ("initWithCallType:dateCreated:recipient:callCapabilities:")] + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithDateCreated:recipient:callCapabilities:callTypes:unseen:")] [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INDateComponentsRange dateCreated, [NullAllowed] INPerson recipient, INCallCapabilityOptions callCapabilities, INCallRecordTypeOptions callTypes, [NullAllowed] NSNumber unseen); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Wrap ("this (dateCreated, recipient, callCapabilities, callTypes, new NSNumber (unseen))")] + IntPtr Constructor ([NullAllowed] INDateComponentsRange dateCreated, [NullAllowed] INPerson recipient, INCallCapabilityOptions callCapabilities, INCallRecordTypeOptions callTypes, bool unseen); + + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use '.ctor (INDateComponentsRange, INPerson, INCallCapabilityOptions, INCallRecordTypeOptions, NSNumber)' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use '.ctor (INDateComponentsRange, INPerson, INCallCapabilityOptions, INCallRecordTypeOptions, NSNumber)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use '.ctor (INDateComponentsRange, INPerson, INCallCapabilityOptions, INCallRecordTypeOptions, NSNumber)' instead.")] + [Export ("initWithCallType:dateCreated:recipient:callCapabilities:")] IntPtr Constructor (INCallRecordType callType, [NullAllowed] INDateComponentsRange dateCreated, [NullAllowed] INPerson recipient, INCallCapabilityOptions callCapabilities); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'CallTypes' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'CallTypes' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'CallTypes' instead.")] [Export ("callType", ArgumentSemantic.Assign)] INCallRecordType CallType { get; } @@ -3642,6 +4431,15 @@ interface INSearchCallHistoryIntent { [Export ("callCapabilities", ArgumentSemantic.Assign)] INCallCapabilityOptions CallCapabilities { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("callTypes", ArgumentSemantic.Assign)] + INCallRecordTypeOptions CallTypes { get; } + + [Protected] + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("unseen", ArgumentSemantic.Copy)] + NSNumber WeakUnseen { get; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -3655,8 +4453,17 @@ interface INSearchCallHistoryIntentHandling { void HandleSearchCallHistory (INSearchCallHistoryIntent intent, Action completion); [Export ("confirmSearchCallHistory:completion:")] - void ConfirmSearchCallHistory (INSearchCallHistoryIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSearchCallHistory +#endif + (INSearchCallHistoryIntent intent, Action completion); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'ResolveCallTypes' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolveCallTypes' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolveCallTypes' instead.")] [Export ("resolveCallTypeForSearchCallHistory:withCompletion:")] void ResolveCallType (INSearchCallHistoryIntent intent, Action completion); @@ -3665,6 +4472,14 @@ interface INSearchCallHistoryIntentHandling { [Export ("resolveRecipientForSearchCallHistory:withCompletion:")] void ResolveRecipient (INSearchCallHistoryIntent intent, Action completion); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("resolveCallTypesForSearchCallHistory:withCompletion:")] + void ResolveCallTypes (INSearchCallHistoryIntent intent, Action completion); + + [Watch (4,0), NoMac, iOS (11,0)] + [Export ("resolveUnseenForSearchCallHistory:withCompletion:")] + void ResolveUnseen (INSearchCallHistoryIntent intent, Action completion); } [Introduced (PlatformName.iOS, 10, 0)] @@ -3680,6 +4495,10 @@ interface INSearchCallHistoryIntentResponse { [Export ("code")] INSearchCallHistoryIntentResponseCode Code { get; } + + [Mac (10,13, onlyOn64:true), iOS (11,0), Watch (4,0)] + [NullAllowed, Export ("callRecords", ArgumentSemantic.Copy)] + INCallRecord [] CallRecords { get; set; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -3688,8 +4507,15 @@ interface INSearchCallHistoryIntentResponse { [BaseType (typeof (INIntent))] interface INSearchForMessagesIntent { - [Export ("initWithRecipients:senders:searchTerms:attributes:dateTimeRange:identifiers:notificationIdentifiers:groupNames:")] + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithRecipients:senders:searchTerms:attributes:dateTimeRange:identifiers:notificationIdentifiers:speakableGroupNames:")] [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INPerson [] recipients, [NullAllowed] INPerson [] senders, [NullAllowed] string [] searchTerms, INMessageAttributeOptions attributes, [NullAllowed] INDateComponentsRange dateTimeRange, [NullAllowed] string [] identifiers, [NullAllowed] string [] notificationIdentifiers, [NullAllowed] INSpeakableString [] speakableGroupNames); + + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use '.ctor (INPerson [], INPerson [], string [], INMessageAttributeOptions, INDateComponentsRange, string [], string [], INSpeakableString [])' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use '.ctor (INPerson [], INPerson [], string [], INMessageAttributeOptions, INDateComponentsRange, string [], string [], INSpeakableString [])' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use '.ctor (INPerson [], INPerson [], string [], INMessageAttributeOptions, INDateComponentsRange, string [], string [], INSpeakableString [])' instead.")] + [Export ("initWithRecipients:senders:searchTerms:attributes:dateTimeRange:identifiers:notificationIdentifiers:groupNames:")] IntPtr Constructor ([NullAllowed] INPerson [] recipients, [NullAllowed] INPerson [] senders, [NullAllowed] string [] searchTerms, INMessageAttributeOptions attributes, [NullAllowed] INDateComponentsRange dateTimeRange, [NullAllowed] string [] identifiers, [NullAllowed] string [] notificationIdentifiers, [NullAllowed] string [] groupNames); [NullAllowed, Export ("recipients", ArgumentSemantic.Copy)] @@ -3728,11 +4554,25 @@ interface INSearchForMessagesIntent { [Export ("notificationIdentifiersOperator", ArgumentSemantic.Assign)] INConditionalOperator NotificationIdentifiersOperator { get; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'SpeakableGroupNames' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'SpeakableGroupNames' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'SpeakableGroupNames' instead.")] [NullAllowed, Export ("groupNames", ArgumentSemantic.Copy)] string [] GroupNames { get; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'SpeakableGroupNamesOperator' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'SpeakableGroupNamesOperator' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'SpeakableGroupNamesOperator' instead.")] [Export ("groupNamesOperator", ArgumentSemantic.Assign)] INConditionalOperator GroupNamesOperator { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("speakableGroupNames", ArgumentSemantic.Copy)] + INSpeakableString [] SpeakableGroupNames { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("speakableGroupNamesOperator", ArgumentSemantic.Assign)] + INConditionalOperator SpeakableGroupNamesOperator { get; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -3746,7 +4586,13 @@ interface INSearchForMessagesIntentHandling { void HandleSearchForMessages (INSearchForMessagesIntent intent, Action completion); [Export ("confirmSearchForMessages:completion:")] - void ConfirmSearchForMessages (INSearchForMessagesIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSearchForMessages +#endif + (INSearchForMessagesIntent intent, Action completion); [Export ("resolveRecipientsForSearchForMessages:withCompletion:")] void ResolveRecipients (INSearchForMessagesIntent intent, Action completion); @@ -3760,8 +4606,15 @@ interface INSearchForMessagesIntentHandling { [Export ("resolveDateTimeRangeForSearchForMessages:withCompletion:")] void ResolveDateTimeRange (INSearchForMessagesIntent intent, Action completion); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'ResolveSpeakableGroupNames' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolveSpeakableGroupNames' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolveSpeakableGroupNames' instead.")] [Export ("resolveGroupNamesForSearchForMessages:withCompletion:")] void ResolveGroupNames (INSearchForMessagesIntent intent, Action completion); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("resolveSpeakableGroupNamesForSearchForMessages:withCompletion:")] + void ResolveSpeakableGroupNames (INSearchForMessagesIntent intent, Action completion); } [Introduced (PlatformName.iOS, 10, 0)] @@ -3831,7 +4684,13 @@ interface INSearchForPhotosIntentHandling { void HandleSearchForPhotos (INSearchForPhotosIntent intent, Action completion); [Export ("confirmSearchForPhotos:completion:")] - void ConfirmSearchForPhotos (INSearchForPhotosIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSearchForPhotos +#endif + (INSearchForPhotosIntent intent, Action completion); [Export ("resolveDateCreatedForSearchForPhotos:withCompletion:")] void ResolveDateCreated (INSearchForPhotosIntent intent, Action completion); @@ -3842,6 +4701,10 @@ interface INSearchForPhotosIntentHandling { [Export ("resolveAlbumNameForSearchForPhotos:withCompletion:")] void ResolveAlbumName (INSearchForPhotosIntent intent, Action completion); + [Watch (4,0), iOS (11,0)] + [Export ("resolveSearchTermsForSearchForPhotos:withCompletion:")] + void ResolveSearchTerms (INSearchForPhotosIntent intent, Action completion); + [Export ("resolvePeopleInPhotoForSearchForPhotos:withCompletion:")] void ResolvePeopleInPhoto (INSearchForPhotosIntent intent, Action completion); } @@ -3870,8 +4733,15 @@ interface INSearchForPhotosIntentResponse { [BaseType (typeof (INIntent))] interface INSendMessageIntent { - [Export ("initWithRecipients:content:groupName:serviceName:sender:")] + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithRecipients:content:speakableGroupName:conversationIdentifier:serviceName:sender:")] [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INPerson [] recipients, [NullAllowed] string content, [NullAllowed] INSpeakableString speakableGroupName, [NullAllowed] string conversationIdentifier, [NullAllowed] string serviceName, [NullAllowed] INPerson sender); + + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use '.ctor (INPerson [], string, INSpeakableString, string, string, INPerson)' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use '.ctor (INPerson [], string, INSpeakableString, string, string, INPerson)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use '.ctor (INPerson [], string, INSpeakableString, string, string, INPerson)' instead.")] + [Export ("initWithRecipients:content:groupName:serviceName:sender:")] IntPtr Constructor ([NullAllowed] INPerson [] recipients, [NullAllowed] string content, [NullAllowed] string groupName, [NullAllowed] string serviceName, [NullAllowed] INPerson sender); [NullAllowed, Export ("recipients", ArgumentSemantic.Copy)] @@ -3880,6 +4750,17 @@ interface INSendMessageIntent { [NullAllowed, Export ("content")] string Content { get; } + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("speakableGroupName", ArgumentSemantic.Copy)] + INSpeakableString SpeakableGroupName { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [NullAllowed, Export ("conversationIdentifier")] + string ConversationIdentifier { get; } + + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'SpeakableGroupNames' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'SpeakableGroupNames' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'SpeakableGroupNames' instead.")] [NullAllowed, Export ("groupName")] string GroupName { get; } @@ -3901,16 +4782,36 @@ interface INSendMessageIntentHandling { void HandleSendMessage (INSendMessageIntent intent, Action completion); [Export ("confirmSendMessage:completion:")] - void ConfirmSendMessage (INSendMessageIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSendMessage +#endif + (INSendMessageIntent intent, Action completion); + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolveRecipients (INSendMessageIntent, Action)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolveRecipients (INSendMessageIntent, Action)' instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'ResolveRecipients (INSendMessageIntent, Action)' instead.")] [Export ("resolveRecipientsForSendMessage:withCompletion:")] void ResolveRecipients (INSendMessageIntent intent, Action completion); + [Watch (4,0), iOS (11,0), Mac (10,13, onlyOn64:true)] + [Export ("resolveRecipientsForSendMessage:completion:")] + void ResolveRecipients (INSendMessageIntent intent, Action completion); + [Export ("resolveContentForSendMessage:withCompletion:")] void ResolveContent (INSendMessageIntent intent, Action completion); + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'ResolveSpeakableGroupName' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolveSpeakableGroupName' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolveSpeakableGroupName' instead.")] [Export ("resolveGroupNameForSendMessage:withCompletion:")] void ResolveGroupName (INSendMessageIntent intent, Action completion); + + [Watch (4,0), iOS (11,0), Mac (10,13, onlyOn64:true)] + [Export ("resolveSpeakableGroupNameForSendMessage:withCompletion:")] + void ResolveSpeakableGroupName (INSendMessageIntent intent, Action completion); } [Introduced (PlatformName.iOS, 10, 0)] @@ -3926,6 +4827,10 @@ interface INSendMessageIntentResponse { [Export ("code")] INSendMessageIntentResponseCode Code { get; } + + [Watch (4,0), iOS (11,0), Mac (10,13, onlyOn64:true)] + [NullAllowed, Export ("sentMessage", ArgumentSemantic.Copy)] + INMessage SentMessage { get; set; } } [Introduced (PlatformName.iOS, 10, 0)] @@ -3959,14 +4864,32 @@ interface INSendPaymentIntentHandling { void HandleSendPayment (INSendPaymentIntent intent, Action completion); [Export ("confirmSendPayment:completion:")] - void ConfirmSendPayment (INSendPaymentIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSendPayment +#endif + (INSendPaymentIntent intent, Action completion); + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolvePayee (INSendPaymentIntent, Action)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolvePayee (INSendPaymentIntent, Action)' instead.")] [Export ("resolvePayeeForSendPayment:withCompletion:")] void ResolvePayee (INSendPaymentIntent intent, Action completion); + [Watch (4,0), iOS (11,0)] + [Export ("resolvePayeeForSendPayment:completion:")] + void ResolvePayee (INSendPaymentIntent intent, Action completion); + + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'ResolveCurrencyAmount (INSendPaymentIntent, Action)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'ResolveCurrencyAmount (INSendPaymentIntent, Action)' instead.")] [Export ("resolveCurrencyAmountForSendPayment:withCompletion:")] void ResolveCurrencyAmount (INSendPaymentIntent intent, Action completion); + [Watch (4,0), iOS (11,0)] + [Export ("resolveCurrencyAmountForSendPayment:completion:")] + void ResolveCurrencyAmount (INSendPaymentIntent intent, Action completion); + [Export ("resolveNoteForSendPayment:withCompletion:")] void ResolveNote (INSendPaymentIntent intent, Action completion); } @@ -4017,7 +4940,13 @@ interface INSetAudioSourceInCarIntentHandling { void HandleSetAudioSourceInCar (INSetAudioSourceInCarIntent intent, Action completion); [Export ("confirmSetAudioSourceInCar:completion:")] - void ConfirmSetAudioSourceInCar (INSetAudioSourceInCarIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetAudioSourceInCar +#endif + (INSetAudioSourceInCarIntent intent, Action completion); [Export ("resolveAudioSourceForSetAudioSourceInCar:withCompletion:")] void ResolveAudioSource (INSetAudioSourceInCarIntent intent, Action completion); @@ -4105,7 +5034,13 @@ interface INSetClimateSettingsInCarIntentHandling { void HandleSetClimateSettingsInCar (INSetClimateSettingsInCarIntent intent, Action completion); [Export ("confirmSetClimateSettingsInCar:completion:")] - void ConfirmSetClimateSettingsInCar (INSetClimateSettingsInCarIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetClimateSettingsInCar +#endif + (INSetClimateSettingsInCarIntent intent, Action completion); [Export ("resolveEnableFanForSetClimateSettingsInCar:withCompletion:")] void ResolveEnableFan (INSetClimateSettingsInCarIntent intent, Action completion); @@ -4186,7 +5121,13 @@ interface INSetDefrosterSettingsInCarIntentHandling { void HandleSetDefrosterSettingsInCar (INSetDefrosterSettingsInCarIntent intent, Action completion); [Export ("confirmSetDefrosterSettingsInCar:completion:")] - void ConfirmSetDefrosterSettingsInCar (INSetDefrosterSettingsInCarIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetDefrosterSettingsInCar +#endif + (INSetDefrosterSettingsInCarIntent intent, Action completion); [Export ("resolveEnableForSetDefrosterSettingsInCar:withCompletion:")] void ResolveEnable (INSetDefrosterSettingsInCarIntent intent, Action completion); @@ -4238,7 +5179,13 @@ interface INSetMessageAttributeIntentHandling { void HandleSetMessageAttribute (INSetMessageAttributeIntent intent, Action completion); [Export ("confirmSetMessageAttribute:completion:")] - void ConfirmSetMessageAttribute (INSetMessageAttributeIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetMessageAttribute +#endif + (INSetMessageAttributeIntent intent, Action completion); [Export ("resolveAttributeForSetMessageAttribute:withCompletion:")] void ResolveAttribute (INSetMessageAttributeIntent intent, Action completion); @@ -4276,7 +5223,7 @@ interface INSetProfileInCarIntent { [NullAllowed, Export ("profileNumber", ArgumentSemantic.Copy)] NSNumber ProfileNumber { get; } - [Deprecated (PlatformName.iOS, 10, 2, message: "Use ProfileName instead")] + [Deprecated (PlatformName.iOS, 10, 2, message: "Use 'ProfileName' instead.")] [NullAllowed, Export ("profileLabel")] string ProfileLabel { get; } @@ -4300,11 +5247,18 @@ interface INSetProfileInCarIntentHandling { void HandleSetProfileInCar (INSetProfileInCarIntent intent, Action completion); [Export ("confirmSetProfileInCar:completion:")] - void ConfirmSetProfileInCar (INSetProfileInCarIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetProfileInCar +#endif + (INSetProfileInCarIntent intent, Action completion); [Export ("resolveProfileNumberForSetProfileInCar:withCompletion:")] void ResolveProfileNumber (INSetProfileInCarIntent intent, Action completion); + [Deprecated (PlatformName.iOS, 11, 0, message: "The property doesn't need to be resolved.")] [Export ("resolveDefaultProfileForSetProfileInCar:withCompletion:")] void ResolveDefaultProfile (INSetProfileInCarIntent intent, Action completion); @@ -4365,7 +5319,13 @@ interface INSetRadioStationIntentHandling { void HandleSetRadioStation (INSetRadioStationIntent intent, Action completion); [Export ("confirmSetRadioStation:completion:")] - void ConfirmSetRadioStation (INSetRadioStationIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetRadioStation +#endif + (INSetRadioStationIntent intent, Action completion); [Export ("resolveRadioTypeForSetRadioStation:withCompletion:")] void ResolveRadioType (INSetRadioStationIntent intent, Action completion); @@ -4442,7 +5402,13 @@ interface INSetSeatSettingsInCarIntentHandling { void HandleSetSeatSettingsInCar (INSetSeatSettingsInCarIntent intent, Action completion); [Export ("confirmSetSeatSettingsInCar:completion:")] - void ConfirmSetSeatSettingsInCar (INSetSeatSettingsInCarIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetSeatSettingsInCar +#endif + (INSetSeatSettingsInCarIntent intent, Action completion); [Export ("resolveEnableHeatingForSetSeatSettingsInCar:withCompletion:")] void ResolveEnableHeating (INSetSeatSettingsInCarIntent intent, Action completion); @@ -4478,6 +5444,8 @@ interface INSetSeatSettingsInCarIntentResponse { INSetSeatSettingsInCarIntentResponseCode Code { get; } } + interface IINSpeakable { } + [Introduced (PlatformName.iOS, 10, 0)] [Introduced (PlatformName.MacOSX, 10, 12, PlatformArchitecture.Arch64)] [Introduced (PlatformName.WatchOS, 3, 2)] @@ -4492,7 +5460,26 @@ interface INSpeakable { [NullAllowed, Export ("pronunciationHint")] string PronunciationHint { get; } + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] +#if XAMCORE_4_0 + [Abstract] +#endif + [NullAllowed, Export ("vocabularyIdentifier")] + string VocabularyIdentifier { get; } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] +#if XAMCORE_4_0 + [Abstract] +#endif + [NullAllowed, Export ("alternativeSpeakableMatches")] + IINSpeakable [] AlternativeSpeakableMatches { get; } + + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'VocabularyIdentifier' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'VocabularyIdentifier' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'VocabularyIdentifier' instead.")] +#if !XAMCORE_4_0 // Apple made this @optional in iOS 11 [Abstract] +#endif [NullAllowed, Export ("identifier")] string Identifier { get; } } @@ -4504,9 +5491,14 @@ interface INSpeakable { [DisableDefaultCtor] interface INSpeakableString : INSpeakable { + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Internal] + [Export ("initWithVocabularyIdentifier:spokenPhrase:pronunciationHint:")] + IntPtr InitWithVocabularyIdentifier (string vocabularyIdentifier, string spokenPhrase, [NullAllowed] string pronunciationHint); + + [Internal] [Export ("initWithIdentifier:spokenPhrase:pronunciationHint:")] - [DesignatedInitializer] - IntPtr Constructor (string identifier, string spokenPhrase, [NullAllowed] string pronunciationHint); + IntPtr InitWithIdentifier (string identifier, string spokenPhrase, [NullAllowed] string pronunciationHint); [Introduced (PlatformName.iOS, 10, 2)] [Introduced (PlatformName.MacOSX, 10, 12, 2, PlatformArchitecture.Arch64)] @@ -4558,10 +5550,21 @@ interface INSpeakableStringResolutionResult { [BaseType (typeof (INIntent))] interface INStartAudioCallIntent { + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use '.ctor (INCallDestinationType, INPerson [])' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use '.ctor (INCallDestinationType, INPerson [])' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use '.ctor (INCallDestinationType, INPerson [])' instead.")] [Export ("initWithContacts:")] - [DesignatedInitializer] IntPtr Constructor ([NullAllowed] INPerson [] contacts); + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("initWithDestinationType:contacts:")] + [DesignatedInitializer] + IntPtr Constructor (INCallDestinationType destinationType, [NullAllowed] INPerson [] contacts); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("destinationType", ArgumentSemantic.Assign)] + INCallDestinationType DestinationType { get; } + [NullAllowed, Export ("contacts", ArgumentSemantic.Copy)] INPerson [] Contacts { get; } } @@ -4577,7 +5580,17 @@ interface INStartAudioCallIntentHandling { void HandleStartAudioCall (INStartAudioCallIntent intent, Action completion); [Export ("confirmStartAudioCall:completion:")] - void ConfirmStartAudioCall (INStartAudioCallIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmStartAudioCall +#endif + (INStartAudioCallIntent intent, Action completion); + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [Export ("resolveDestinationTypeForStartAudioCall:withCompletion:")] + void ResolveDestinationType (INStartAudioCallIntent intent, Action completion); [Export ("resolveContactsForStartAudioCall:withCompletion:")] void ResolveContacts (INStartAudioCallIntent intent, Action completion); @@ -4647,7 +5660,13 @@ interface INStartPhotoPlaybackIntentHandling { void HandleStartPhotoPlayback (INStartPhotoPlaybackIntent intent, Action completion); [Export ("confirmStartPhotoPlayback:completion:")] - void ConfirmStartPhotoPlayback (INStartPhotoPlaybackIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmStartPhotoPlayback +#endif + (INStartPhotoPlaybackIntent intent, Action completion); [Export ("resolveDateCreatedForStartPhotoPlayback:withCompletion:")] void ResolveDateCreated (INStartPhotoPlaybackIntent intent, Action completion); @@ -4705,7 +5724,13 @@ interface INStartVideoCallIntentHandling { void HandleStartVideoCall (INStartVideoCallIntent intent, Action completion); [Export ("confirmStartVideoCall:completion:")] - void ConfirmStartVideoCall (INStartVideoCallIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmStartVideoCall +#endif + (INStartVideoCallIntent intent, Action completion); [Export ("resolveContactsForStartVideoCall:withCompletion:")] void ResolveContacts (INStartVideoCallIntent intent, Action completion); @@ -4765,7 +5790,13 @@ interface INStartWorkoutIntentHandling { void HandleStartWorkout (INStartWorkoutIntent intent, Action completion); [Export ("confirmStartWorkout:completion:")] - void ConfirmStartWorkout (INStartWorkoutIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmStartWorkout +#endif + (INStartWorkoutIntent intent, Action completion); [Export ("resolveWorkoutNameForStartWorkout:withCompletion:")] void ResolveWorkoutName (INStartWorkoutIntent intent, Action completion); @@ -4905,11 +5936,16 @@ interface INVocabulary { [Export ("sharedVocabulary")] INVocabulary SharedVocabulary { get; } - [Advice ("This API is not allowed in extensions")] + [Advice ("This API is not allowed in extensions.")] [Export ("setVocabularyStrings:ofType:")] void SetVocabularyStrings (NSOrderedSet vocabulary, INVocabularyStringType type); - [Advice ("This API is not allowed in extensions")] + [Advice ("This API is not allowed in extensions.")] + [iOS (11,0)] + [Export ("setVocabulary:ofType:")] + void SetVocabulary (NSOrderedSet vocabulary, INVocabularyStringType type); + + [Advice ("This API is not allowed in extensions.")] [Export ("removeAllVocabularyStrings")] void RemoveAllVocabularyStrings (); } @@ -4921,13 +5957,31 @@ interface INVocabulary { [BaseType (typeof (INIntentResolutionResult))] interface INWorkoutGoalUnitTypeResolutionResult { + [Watch (4,0), iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedWorkoutGoalUnitType:")] + INWorkoutGoalUnitTypeResolutionResult SuccessWithResolvedWorkoutGoalUnitType (INWorkoutGoalUnitType resolvedWorkoutGoalUnitType); + + [Internal] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INWorkoutGoalUnitTypeResolutionResult GetSuccess (INWorkoutGoalUnitType resolvedValue); + INWorkoutGoalUnitTypeResolutionResult SuccessWithResolvedValue (INWorkoutGoalUnitType resolvedValue); + [Watch (4,0), iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithWorkoutGoalUnitTypeToConfirm:")] + INWorkoutGoalUnitTypeResolutionResult ConfirmationRequiredWithWorkoutGoalUnitTypeToConfirm (INWorkoutGoalUnitType workoutGoalUnitTypeToConfirm); + + [Internal] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INWorkoutGoalUnitTypeResolutionResult GetConfirmationRequired (INWorkoutGoalUnitType valueToConfirm); + INWorkoutGoalUnitTypeResolutionResult ConfirmationRequiredWithValueToConfirm (INWorkoutGoalUnitType valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -4955,13 +6009,31 @@ interface INWorkoutGoalUnitTypeResolutionResult { [BaseType (typeof (INIntentResolutionResult))] interface INWorkoutLocationTypeResolutionResult { + [Watch (4,0), iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedWorkoutLocationType:")] + INWorkoutLocationTypeResolutionResult SuccessWithResolvedWorkoutLocationType (INWorkoutLocationType resolvedWorkoutLocationType); + + [Internal] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INWorkoutLocationTypeResolutionResult GetSuccess (INWorkoutLocationType resolvedValue); + INWorkoutLocationTypeResolutionResult SuccessWithResolvedValue (INWorkoutLocationType resolvedValue); + [Watch (4,0), iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithWorkoutLocationTypeToConfirm:")] + INWorkoutLocationTypeResolutionResult ConfirmationRequiredWithWorkoutLocationTypeToConfirm (INWorkoutLocationType workoutLocationTypeToConfirm); + + [Internal] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INWorkoutLocationTypeResolutionResult GetConfirmationRequired (INWorkoutLocationType valueToConfirm); + INWorkoutLocationTypeResolutionResult ConfirmationRequiredWithValueToConfirm (INWorkoutLocationType valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -5022,7 +6094,13 @@ interface INActivateCarSignalIntentHandling { void HandleActivateCarSignal (INActivateCarSignalIntent intent, Action completion); [Export ("confirmActivateCarSignal:completion:")] - void ConfirmActivateCarSignal (INActivateCarSignalIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmActivateCarSignal +#endif + (INActivateCarSignalIntent intent, Action completion); [Export ("resolveCarNameForActivateCarSignal:withCompletion:")] void ResolveCarName (INActivateCarSignalIntent intent, Action completion); @@ -5133,13 +6211,31 @@ interface INBillPayeeResolutionResult { [DisableDefaultCtor] interface INBillTypeResolutionResult { + [Deprecated (PlatformName.iOS, 11, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Internal] [Static] [Export ("successWithResolvedValue:")] - INBillTypeResolutionResult GetSuccess (INBillType resolvedValue); + INBillTypeResolutionResult SuccessWithResolvedValue (INBillType resolvedValue); + + [iOS (11,0), Watch (4,0)] + [Internal] + [Static] + [Export ("successWithResolvedBillType:")] + INBillTypeResolutionResult SuccessWithResolvedBillType (INBillType resolvedBillType); + [Deprecated (PlatformName.iOS, 11, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Internal] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INBillTypeResolutionResult GetConfirmationRequired (INBillType valueToConfirm); + INBillTypeResolutionResult ConfirmationRequiredWithValueToConfirm (INBillType valueToConfirm); + + [iOS (11,0), Watch (4,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithBillTypeToConfirm:")] + INBillTypeResolutionResult ConfirmationRequiredWithBillTypeToConfirm (INBillType billTypeToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -5167,13 +6263,31 @@ interface INBillTypeResolutionResult { [DisableDefaultCtor] interface INCarSignalOptionsResolutionResult { + [iOS (11,0), Watch (4,0)] + [Internal] + [Static] + [Export ("successWithResolvedCarSignalOptions:")] + INCarSignalOptionsResolutionResult SuccessWithResolvedCarSignalOptions (INCarSignalOptions resolvedCarSignalOptions); + + [Deprecated (PlatformName.iOS, 11, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Internal] [Static] [Export ("successWithResolvedValue:")] - INCarSignalOptionsResolutionResult GetSuccess (INCarSignalOptions resolvedValue); + INCarSignalOptionsResolutionResult SuccessWithResolvedValue (INCarSignalOptions resolvedValue); + + [iOS (11,0), Watch (4,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithCarSignalOptionsToConfirm:")] + INCarSignalOptionsResolutionResult ConfirmationRequiredWithCarSignalOptionsToConfirm (INCarSignalOptions carSignalOptionsToConfirm); + [Deprecated (PlatformName.iOS, 11, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Internal] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INCarSignalOptionsResolutionResult GetConfirmationRequired (INCarSignalOptions valueToConfirm); + INCarSignalOptionsResolutionResult ConfirmationRequiredWithValueToConfirm (INCarSignalOptions valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -5220,7 +6334,13 @@ interface INGetCarLockStatusIntentHandling { void HandleGetCarLockStatus (INGetCarLockStatusIntent intent, Action completion); [Export ("confirmGetCarLockStatus:completion:")] - void ConfirmGetCarLockStatus (INGetCarLockStatusIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmGetCarLockStatus +#endif + (INGetCarLockStatusIntent intent, Action completion); [Export ("resolveCarNameForGetCarLockStatus:withCompletion:")] void ResolveCarName (INGetCarLockStatusIntent intent, Action completion); @@ -5274,7 +6394,13 @@ interface INGetCarPowerLevelStatusIntentHandling { void HandleGetCarPowerLevelStatus (INGetCarPowerLevelStatusIntent intent, Action completion); [Export ("confirmGetCarPowerLevelStatus:completion:")] - void ConfirmGetCarPowerLevelStatus (INGetCarPowerLevelStatusIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmGetCarPowerLevelStatus +#endif + (INGetCarPowerLevelStatusIntent intent, Action completion); [Export ("resolveCarNameForGetCarPowerLevelStatus:withCompletion:")] void ResolveCarName (INGetCarPowerLevelStatusIntent intent, Action completion); @@ -5361,7 +6487,13 @@ interface INPayBillIntentHandling { void HandlePayBill (INPayBillIntent intent, Action completion); [Export ("confirmPayBill:completion:")] - void ConfirmPayBill (INPayBillIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmPayBill +#endif + (INPayBillIntent intent, Action completion); [Export ("resolveBillPayeeForPayBill:withCompletion:")] void ResolveBillPayee (INPayBillIntent intent, Action completion); @@ -5422,10 +6554,16 @@ interface INPayBillIntentResponse { [BaseType (typeof (NSObject))] interface INPaymentAccount : NSCopying, NSSecureCoding { - [DesignatedInitializer] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Please use '.ctor (INSpeakableString, string, INAccountType, INSpeakableString, INBalanceAmount, INBalanceAmount)' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Please use '.ctor (INSpeakableString, string, INAccountType, INSpeakableString, INBalanceAmount, INBalanceAmount)' instead.")] [Export ("initWithNickname:number:accountType:organizationName:")] IntPtr Constructor (INSpeakableString nickname, [NullAllowed] string accountNumber, INAccountType accountType, [NullAllowed] INSpeakableString organizationName); + [Watch (4,0), iOS (11,0)] + [Export ("initWithNickname:number:accountType:organizationName:balance:secondaryBalance:")] + [DesignatedInitializer] + IntPtr Constructor (INSpeakableString nickname, [NullAllowed] string accountNumber, INAccountType accountType, [NullAllowed] INSpeakableString organizationName, [NullAllowed] INBalanceAmount balance, [NullAllowed] INBalanceAmount secondaryBalance); + [Export ("nickname", ArgumentSemantic.Copy), NullAllowed] INSpeakableString Nickname { get; } @@ -5437,6 +6575,14 @@ interface INPaymentAccount : NSCopying, NSSecureCoding { [Export ("organizationName", ArgumentSemantic.Copy), NullAllowed] INSpeakableString OrganizationName { get; } + + [Watch (4,0), iOS (11,0)] + [NullAllowed, Export ("balance", ArgumentSemantic.Copy)] + INBalanceAmount Balance { get; } + + [Watch (4,0), iOS (11,0)] + [NullAllowed, Export ("secondaryBalance", ArgumentSemantic.Copy)] + INBalanceAmount SecondaryBalance { get; } } [Introduced (PlatformName.iOS, 10, 3)] @@ -5540,13 +6686,31 @@ interface INPaymentAmountResolutionResult { [DisableDefaultCtor] interface INPaymentStatusResolutionResult { + [Watch (4,0), iOS (11,0)] + [Internal] + [Static] + [Export ("successWithResolvedPaymentStatus:")] + INPaymentStatusResolutionResult SuccessWithResolvedPaymentStatus (INPaymentStatus resolvedPaymentStatus); + + [Internal] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("successWithResolvedValue:")] - INPaymentStatusResolutionResult GetSuccess (INPaymentStatus resolvedValue); + INPaymentStatusResolutionResult SuccessWithResolvedValue (INPaymentStatus resolvedValue); + + [Watch (4,0), iOS (11,0)] + [Internal] + [Static] + [Export ("confirmationRequiredWithPaymentStatusToConfirm:")] + INPaymentStatusResolutionResult ConfirmationRequiredWithPaymentStatusToConfirm (INPaymentStatus paymentStatusToConfirm); + [Internal] + [Deprecated (PlatformName.WatchOS, 4, 0)] + [Deprecated (PlatformName.iOS, 11, 0)] [Static] [Export ("confirmationRequiredWithValueToConfirm:")] - INPaymentStatusResolutionResult GetConfirmationRequired (INPaymentStatus valueToConfirm); + INPaymentStatusResolutionResult ConfirmationRequiredWithValueToConfirm (INPaymentStatus valueToConfirm); // Fixes bug 43205. We need to return the inherited type not the base type // because users won't be able to downcast easily @@ -5607,7 +6771,13 @@ interface INSearchForBillsIntentHandling { void HandleSearch (INSearchForBillsIntent intent, Action completion); [Export ("confirmSearchForBills:completion:")] - void ConfirmSearch (INSearchForBillsIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSearch +#endif + (INSearchForBillsIntent intent, Action completion); [Export ("resolveBillPayeeForSearchForBills:withCompletion:")] void ResolveBillPayee (INSearchForBillsIntent intent, Action completion); @@ -5677,7 +6847,13 @@ interface INSetCarLockStatusIntentHandling { void HandleSetCarLockStatus (INSetCarLockStatusIntent intent, Action completion); [Export ("confirmSetCarLockStatus:completion:")] - void ConfirmSetCarLockStatus (INSetCarLockStatusIntent intent, Action completion); + void +#if XAMCORE_4_0 // Follow Swift's naming, fixes bug https://bugzilla.xamarin.com/show_bug.cgi?id=59164 + Confirm +#else + ConfirmSetCarLockStatus +#endif + (INSetCarLockStatusIntent intent, Action completion); [Export ("resolveLockedForSetCarLockStatus:withCompletion:")] void ResolveLocked (INSetCarLockStatusIntent intent, Action completion); @@ -5718,5 +6894,1598 @@ interface INActivateCarSignalIntentResponse { [Export ("signals")] INCarSignalOptions Signals { get; set; } } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INAccountTypeResolutionResult { + + [Static] + [Export ("successWithResolvedAccountType:")] + INAccountTypeResolutionResult GetSuccess (INAccountType resolvedAccountType); + + [Static] + [Export ("confirmationRequiredWithAccountTypeToConfirm:")] + INAccountTypeResolutionResult GetConfirmationRequired (INAccountType accountTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INAccountTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INAccountTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INAccountTypeResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + interface INAddTasksIntent { + + [Export ("initWithTargetTaskList:taskTitles:spatialEventTrigger:temporalEventTrigger:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INTaskList targetTaskList, [NullAllowed] INSpeakableString[] taskTitles, [NullAllowed] INSpatialEventTrigger spatialEventTrigger, [NullAllowed] INTemporalEventTrigger temporalEventTrigger); + + [NullAllowed, Export ("targetTaskList", ArgumentSemantic.Copy)] + INTaskList TargetTaskList { get; } + + [NullAllowed, Export ("taskTitles", ArgumentSemantic.Copy)] + INSpeakableString [] TaskTitles { get; } + + [NullAllowed, Export ("spatialEventTrigger", ArgumentSemantic.Copy)] + INSpatialEventTrigger SpatialEventTrigger { get; } + + [NullAllowed, Export ("temporalEventTrigger", ArgumentSemantic.Copy)] + INTemporalEventTrigger TemporalEventTrigger { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INAddTasksIntentHandling { + + [Abstract] + [Export ("handleAddTasks:completion:")] + void HandleAddTasks (INAddTasksIntent intent, Action completion); + + [Export ("confirmAddTasks:completion:")] + void Confirm (INAddTasksIntent intent, Action completion); + + [Export ("resolveTargetTaskListForAddTasks:withCompletion:")] + void ResolveTargetTaskList (INAddTasksIntent intent, Action completion); + + [Export ("resolveTaskTitlesForAddTasks:withCompletion:")] + void ResolveTaskTitles (INAddTasksIntent intent, Action completion); + + [Export ("resolveSpatialEventTriggerForAddTasks:withCompletion:")] + void ResolveSpatialEventTrigger (INAddTasksIntent intent, Action completion); + + [Export ("resolveTemporalEventTriggerForAddTasks:withCompletion:")] + void ResolveTemporalEventTrigger (INAddTasksIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INAddTasksIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INAddTasksIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INAddTasksIntentResponseCode Code { get; } + + [NullAllowed, Export ("modifiedTaskList", ArgumentSemantic.Copy)] + INTaskList ModifiedTaskList { get; set; } + + [NullAllowed, Export ("addedTasks", ArgumentSemantic.Copy)] + INTask [] AddedTasks { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + interface INAppendToNoteIntent { + + [Export ("initWithTargetNote:content:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INNote targetNote, [NullAllowed] INNoteContent content); + + [NullAllowed, Export ("targetNote", ArgumentSemantic.Copy)] + INNote TargetNote { get; } + + [NullAllowed, Export ("content", ArgumentSemantic.Copy)] + INNoteContent Content { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INAppendToNoteIntentHandling { + + [Abstract] + [Export ("handleAppendToNote:completion:")] + void HandleAppendToNote (INAppendToNoteIntent intent, Action completion); + + [Export ("confirmAppendToNote:completion:")] + void Confirm (INAppendToNoteIntent intent, Action completion); + + [Export ("resolveTargetNoteForAppendToNote:withCompletion:")] + void ResolveTargetNoteForAppend (INAppendToNoteIntent intent, Action completion); + + [Export ("resolveContentForAppendToNote:withCompletion:")] + void ResolveContentForAppend (INAppendToNoteIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INAppendToNoteIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INAppendToNoteIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INAppendToNoteIntentResponseCode Code { get; } + + [NullAllowed, Export ("note", ArgumentSemantic.Copy)] + INNote Note { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INBalanceAmount : NSCopying, NSSecureCoding { + + [Export ("initWithAmount:balanceType:")] + [DesignatedInitializer] + IntPtr Constructor (NSDecimalNumber amount, INBalanceType balanceType); + + [Export ("initWithAmount:currencyCode:")] + [DesignatedInitializer] + IntPtr Constructor (NSDecimalNumber amount, string currencyCode); + + [NullAllowed, Export ("amount", ArgumentSemantic.Copy)] + NSDecimalNumber Amount { get; } + + [Export ("balanceType", ArgumentSemantic.Assign)] + INBalanceType BalanceType { get; } + + [NullAllowed, Export ("currencyCode")] + string CurrencyCode { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INBalanceTypeResolutionResult { + + [Static] + [Export ("successWithResolvedBalanceType:")] + INBalanceTypeResolutionResult GetSuccess (INBalanceType resolvedBalanceType); + + [Static] + [Export ("confirmationRequiredWithBalanceTypeToConfirm:")] + INBalanceTypeResolutionResult GetConfirmationRequired (INBalanceType balanceTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INBalanceTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INBalanceTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INBalanceTypeResolutionResult Unsupported { get; } + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INCallDestinationTypeResolutionResult { + + [Static] + [Export ("successWithResolvedCallDestinationType:")] + INCallDestinationTypeResolutionResult GetSuccess (INCallDestinationType resolvedCallDestinationType); + + [Static] + [Export ("confirmationRequiredWithCallDestinationTypeToConfirm:")] + INCallDestinationTypeResolutionResult GetConfirmationRequired (INCallDestinationType callDestinationTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INCallDestinationTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INCallDestinationTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INCallDestinationTypeResolutionResult Unsupported { get; } + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INCallRecord : NSCopying, NSSecureCoding { + + [Export ("initWithIdentifier:dateCreated:caller:callRecordType:callCapability:callDuration:unseen:")] + [DesignatedInitializer] + IntPtr Constructor (string identifier, [NullAllowed] NSDate dateCreated, [NullAllowed] INPerson caller, INCallRecordType callRecordType, INCallCapability callCapability, [NullAllowed] NSNumber callDuration, [NullAllowed] NSNumber unseen); + + [Export ("identifier")] + string Identifier { get; } + + [NullAllowed, Export ("dateCreated", ArgumentSemantic.Copy)] + NSDate DateCreated { get; } + + [NullAllowed, Export ("caller", ArgumentSemantic.Copy)] + INPerson Caller { get; } + + [Export ("callRecordType")] + INCallRecordType CallRecordType { get; } + + [Export ("callCapability")] + INCallCapability CallCapability { get; } + + [Protected] + [NullAllowed, Export ("callDuration", ArgumentSemantic.Copy)] + NSNumber WeakCallDuration { get; } + + [Protected] + [NullAllowed, Export ("unseen", ArgumentSemantic.Copy)] + NSNumber WeakUnseen { get; } + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INCallRecordTypeOptionsResolutionResult { + + [Static] + [Export ("successWithResolvedCallRecordTypeOptions:")] + INCallRecordTypeOptionsResolutionResult GetSuccess (INCallRecordTypeOptions resolvedCallRecordTypeOptions); + + [Static] + [Export ("confirmationRequiredWithCallRecordTypeOptionsToConfirm:")] + INCallRecordTypeOptionsResolutionResult GetConfirmationRequired (INCallRecordTypeOptions callRecordTypeOptionsToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INCallRecordTypeOptionsResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INCallRecordTypeOptionsResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INCallRecordTypeOptionsResolutionResult Unsupported { get; } + } + + [NoWatch, NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + [DisableDefaultCtor] + interface INCancelRideIntent { + + [Export ("initWithRideIdentifier:")] + [DesignatedInitializer] + IntPtr Constructor (string rideIdentifier); + + [Export ("rideIdentifier")] + string RideIdentifier { get; } + } + + [NoWatch, NoMac, iOS (11,0)] + [Protocol] + interface INCancelRideIntentHandling { + + [Abstract] + [Export ("handleCancelRide:completion:")] + void HandleCancelRide (INCancelRideIntent intent, Action completion); + + [Export ("confirmCancelRide:completion:")] + void Confirm (INCancelRideIntent intent, Action completion); + } + + [NoWatch, NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INCancelRideIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INCancelRideIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INCancelRideIntentResponseCode Code { get; } + + [NullAllowed, Export ("cancellationFee", ArgumentSemantic.Assign)] + INCurrencyAmount CancellationFee { get; set; } + + [NullAllowed, Export ("cancellationFeeThreshold", ArgumentSemantic.Assign)] + NSDateComponents CancellationFeeThreshold { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + [DisableDefaultCtor] + interface INCreateNoteIntent { + + [Export ("initWithTitle:content:groupName:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INSpeakableString title, [NullAllowed] INNoteContent content, [NullAllowed] INSpeakableString groupName); + + [NullAllowed, Export ("title", ArgumentSemantic.Copy)] + INSpeakableString Title { get; } + + [NullAllowed, Export ("content", ArgumentSemantic.Copy)] + INNoteContent Content { get; } + + [NullAllowed, Export ("groupName", ArgumentSemantic.Copy)] + INSpeakableString GroupName { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INCreateNoteIntentHandling { + + [Abstract] + [Export ("handleCreateNote:completion:")] + void HandleCreateNote (INCreateNoteIntent intent, Action completion); + + [Export ("confirmCreateNote:completion:")] + void Confirm (INCreateNoteIntent intent, Action completion); + + [Export ("resolveTitleForCreateNote:withCompletion:")] + void ResolveTitle (INCreateNoteIntent intent, Action completion); + + [Export ("resolveContentForCreateNote:withCompletion:")] + void ResolveContent (INCreateNoteIntent intent, Action completion); + + [Export ("resolveGroupNameForCreateNote:withCompletion:")] + void ResolveGroupName (INCreateNoteIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INCreateNoteIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INCreateNoteIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INCreateNoteIntentResponseCode Code { get; } + + [NullAllowed, Export ("createdNote", ArgumentSemantic.Copy)] + INNote CreatedNote { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + [DisableDefaultCtor] + interface INCreateTaskListIntent { + + [Export ("initWithTitle:taskTitles:groupName:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INSpeakableString title, [NullAllowed] INSpeakableString [] taskTitles, [NullAllowed] INSpeakableString groupName); + + [NullAllowed, Export ("title", ArgumentSemantic.Copy)] + INSpeakableString Title { get; } + + [NullAllowed, Export ("taskTitles", ArgumentSemantic.Copy)] + INSpeakableString [] TaskTitles { get; } + + [NullAllowed, Export ("groupName", ArgumentSemantic.Copy)] + INSpeakableString GroupName { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INCreateTaskListIntentHandling { + + [Abstract] + [Export ("handleCreateTaskList:completion:")] + void HandleCreateTaskList (INCreateTaskListIntent intent, Action completion); + + [Export ("confirmCreateTaskList:completion:")] + void Confirm (INCreateTaskListIntent intent, Action completion); + + [Export ("resolveTitleForCreateTaskList:withCompletion:")] + void ResolveTitle (INCreateTaskListIntent intent, Action completion); + + [Export ("resolveTaskTitlesForCreateTaskList:withCompletion:")] + void ResolveTaskTitles (INCreateTaskListIntent intent, Action completion); + + [Export ("resolveGroupNameForCreateTaskList:withCompletion:")] + void ResolveGroupName (INCreateTaskListIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INCreateTaskListIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INCreateTaskListIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INCreateTaskListIntentResponseCode Code { get; } + + [NullAllowed, Export ("createdTaskList", ArgumentSemantic.Copy)] + INTaskList CreatedTaskList { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INDateSearchTypeResolutionResult { + + [Static] + [Export ("successWithResolvedDateSearchType:")] + INDateSearchTypeResolutionResult GetSuccess (INDateSearchType resolvedDateSearchType); + + [Static] + [Export ("confirmationRequiredWithDateSearchTypeToConfirm:")] + INDateSearchTypeResolutionResult GetConfirmationRequired (INDateSearchType dateSearchTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INDateSearchTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INDateSearchTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INDateSearchTypeResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + [DisableDefaultCtor] + interface INGetVisualCodeIntent { + + [Export ("initWithVisualCodeType:")] + [DesignatedInitializer] + IntPtr Constructor (INVisualCodeType visualCodeType); + + [Export ("visualCodeType", ArgumentSemantic.Assign)] + INVisualCodeType VisualCodeType { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INGetVisualCodeIntentHandling { + + [Abstract] + [Export ("handleGetVisualCode:completion:")] + void HandleGetVisualCode (INGetVisualCodeIntent intent, Action completion); + + [Export ("confirmGetVisualCode:completion:")] + void Confirm (INGetVisualCodeIntent intent, Action completion); + + [Export ("resolveVisualCodeTypeForGetVisualCode:withCompletion:")] + void ResolveVisualCodeType (INGetVisualCodeIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INGetVisualCodeIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INGetVisualCodeIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INGetVisualCodeIntentResponseCode Code { get; } + + [NullAllowed, Export ("visualCodeImage", ArgumentSemantic.Copy)] + INImage VisualCodeImage { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INNoteContent))] + interface INImageNoteContent : NSSecureCoding, NSCopying { + + [Export ("initWithImage:")] + IntPtr Constructor (INImage image); + + [NullAllowed, Export ("image", ArgumentSemantic.Copy)] + INImage Image { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INLocationSearchTypeResolutionResult { + + [Static] + [Export ("successWithResolvedLocationSearchType:")] + INLocationSearchTypeResolutionResult GetSuccess (INLocationSearchType resolvedLocationSearchType); + + [Static] + [Export ("confirmationRequiredWithLocationSearchTypeToConfirm:")] + INLocationSearchTypeResolutionResult GetConfirmationRequired (INLocationSearchType locationSearchTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INLocationSearchTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INLocationSearchTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INLocationSearchTypeResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + interface INNote : NSCopying, NSSecureCoding { + + [Export ("initWithTitle:contents:groupName:createdDateComponents:modifiedDateComponents:identifier:")] + IntPtr Constructor (INSpeakableString title, INNoteContent [] contents, [NullAllowed] INSpeakableString groupName, [NullAllowed] NSDateComponents createdDateComponents, [NullAllowed] NSDateComponents modifiedDateComponents, [NullAllowed] string identifier); + + [Export ("title", ArgumentSemantic.Copy)] + INSpeakableString Title { get; } + + [Export ("contents", ArgumentSemantic.Copy)] + INNoteContent [] Contents { get; } + + [NullAllowed, Export ("groupName", ArgumentSemantic.Copy)] + INSpeakableString GroupName { get; } + + [NullAllowed, Export ("createdDateComponents", ArgumentSemantic.Copy)] + NSDateComponents CreatedDateComponents { get; } + + [NullAllowed, Export ("modifiedDateComponents", ArgumentSemantic.Copy)] + NSDateComponents ModifiedDateComponents { get; } + + [NullAllowed, Export ("identifier")] + string Identifier { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + interface INNoteContent : NSSecureCoding, NSCopying { + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INNoteContentResolutionResult { + + [Static] + [Export ("successWithResolvedNoteContent:")] + INNoteContentResolutionResult GetSuccess (INNoteContent resolvedNoteContent); + + [Static] + [Export ("disambiguationWithNoteContentsToDisambiguate:")] + INNoteContentResolutionResult GetDisambiguation (INNoteContent [] noteContentsToDisambiguate); + + [Static] + [Export ("confirmationRequiredWithNoteContentToConfirm:")] + INNoteContentResolutionResult GetConfirmationRequired ([NullAllowed] INNoteContent noteContentToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INNoteContentResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INNoteContentResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INNoteContentResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + interface INNoteContentTypeResolutionResult { + + [Static] + [Export ("successWithResolvedNoteContentType:")] + INNoteContentTypeResolutionResult GetSuccess (INNoteContentType resolvedNoteContentType); + + [Static] + [Export ("confirmationRequiredWithNoteContentTypeToConfirm:")] + INNoteContentTypeResolutionResult GetConfirmationRequired (INNoteContentType noteContentTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INNoteContentTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INNoteContentTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INNoteContentTypeResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + interface INNoteResolutionResult { + + [Static] + [Export ("successWithResolvedNote:")] + INNoteResolutionResult GetSuccess (INNote resolvedNote); + + [Static] + [Export ("disambiguationWithNotesToDisambiguate:")] + INNoteResolutionResult GetDisambiguation (INNote [] notesToDisambiguate); + + [Static] + [Export ("confirmationRequiredWithNoteToConfirm:")] + INNoteResolutionResult GetConfirmationRequired ([NullAllowed] INNote noteToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INNoteResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INNoteResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INNoteResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + interface INNotebookItemTypeResolutionResult { + + [Static] + [Export ("successWithResolvedNotebookItemType:")] + INNotebookItemTypeResolutionResult GetSuccess (INNotebookItemType resolvedNotebookItemType); + + [Static] + [Export ("disambiguationWithNotebookItemTypesToDisambiguate:")] + INNotebookItemTypeResolutionResult GetDisambiguation (NSNumber[] notebookItemTypesToDisambiguate); + + [Static] + [Export ("confirmationRequiredWithNotebookItemTypeToConfirm:")] + INNotebookItemTypeResolutionResult GetConfirmationRequired (INNotebookItemType notebookItemTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INNotebookItemTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INNotebookItemTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INNotebookItemTypeResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INParameter : NSSecureCoding { + + [Static] + [Export ("parameterForClass:keyPath:")] + INParameter GetParameter (Class aClass, string keyPath); + + [Static] + [Wrap ("GetParameter (new Class (type), keyPath)")] + INParameter GetParameter (Type type, string keyPath); + + [Export ("parameterClass")] + Class ParameterClass { get; } + + [Wrap ("Class.Lookup (ParameterClass)")] + Type ParameterType { get; } + + [Export ("parameterKeyPath")] + string ParameterKeyPath { get; } + + [Export ("isEqualToParameter:")] + bool IsEqualTo (INParameter parameter); + + [Export ("setIndex:forSubKeyPath:")] + void SetIndex (nuint index, string subKeyPath); + + [Export ("indexForSubKeyPath:")] + nuint GetIndex (string subKeyPath); + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INRecurrenceRule : NSCopying, NSSecureCoding { + + [Export ("initWithInterval:frequency:")] + IntPtr Constructor (nuint interval, INRecurrenceFrequency frequency); + + [Export ("interval")] + nuint Interval { get; } + + [Export ("frequency")] + INRecurrenceFrequency Frequency { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INCurrencyAmountResolutionResult))] + [DisableDefaultCtor] + interface INRequestPaymentCurrencyAmountResolutionResult { + + [Static] + [Export ("unsupportedForReason:")] + INRequestPaymentCurrencyAmountResolutionResult GetUnsupported (INRequestPaymentCurrencyAmountUnsupportedReason reason); + + [Export ("initWithCurrencyAmountResolutionResult:")] + IntPtr Constructor (INCurrencyAmountResolutionResult currencyAmountResolutionResult); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INRequestPaymentCurrencyAmountResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INRequestPaymentCurrencyAmountResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INRequestPaymentCurrencyAmountResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INPersonResolutionResult))] + [DisableDefaultCtor] + interface INRequestPaymentPayerResolutionResult { + + [Static] + [Export ("unsupportedForReason:")] + INRequestPaymentPayerResolutionResult GetUnsupported (INRequestPaymentPayerUnsupportedReason reason); + + [Export ("initWithPersonResolutionResult:")] + IntPtr Constructor (INPersonResolutionResult personResolutionResult); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INRequestPaymentPayerResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INRequestPaymentPayerResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INRequestPaymentPayerResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + interface INSearchForAccountsIntent { + + [Export ("initWithAccountNickname:accountType:organizationName:requestedBalanceType:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INSpeakableString accountNickname, INAccountType accountType, [NullAllowed] INSpeakableString organizationName, INBalanceType requestedBalanceType); + + [NullAllowed, Export ("accountNickname", ArgumentSemantic.Copy)] + INSpeakableString AccountNickname { get; } + + [Export ("accountType", ArgumentSemantic.Assign)] + INAccountType AccountType { get; } + + [NullAllowed, Export ("organizationName", ArgumentSemantic.Copy)] + INSpeakableString OrganizationName { get; } + + [Export ("requestedBalanceType", ArgumentSemantic.Assign)] + INBalanceType RequestedBalanceType { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INSearchForAccountsIntentHandling { + + [Abstract] + [Export ("handleSearchForAccounts:completion:")] + void HandleSearchForAccounts (INSearchForAccountsIntent intent, Action completion); + + [Export ("confirmSearchForAccounts:completion:")] + void Confirm (INSearchForAccountsIntent intent, Action completion); + + [Export ("resolveAccountNicknameForSearchForAccounts:withCompletion:")] + void ResolveAccountNickname (INSearchForAccountsIntent intent, Action completion); + + [Export ("resolveAccountTypeForSearchForAccounts:withCompletion:")] + void ResolveAccountType (INSearchForAccountsIntent intent, Action completion); + + [Export ("resolveOrganizationNameForSearchForAccounts:withCompletion:")] + void ResolveOrganizationName (INSearchForAccountsIntent intent, Action completion); + + [Export ("resolveRequestedBalanceTypeForSearchForAccounts:withCompletion:")] + void ResolveRequestedBalanceType (INSearchForAccountsIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INSearchForAccountsIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INSearchForAccountsIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INSearchForAccountsIntentResponseCode Code { get; } + + [NullAllowed, Export ("accounts", ArgumentSemantic.Copy)] + INPaymentAccount [] Accounts { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + interface INSearchForNotebookItemsIntent { + + [Export ("initWithTitle:content:itemType:status:location:locationSearchType:dateTime:dateSearchType:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INSpeakableString title, [NullAllowed] string content, INNotebookItemType itemType, INTaskStatus status, [NullAllowed] CLPlacemark location, INLocationSearchType locationSearchType, [NullAllowed] INDateComponentsRange dateTime, INDateSearchType dateSearchType); + + [NullAllowed, Export ("title", ArgumentSemantic.Copy)] + INSpeakableString Title { get; } + + [NullAllowed, Export ("content")] + string Content { get; } + + [Export ("itemType", ArgumentSemantic.Assign)] + INNotebookItemType ItemType { get; } + + [Export ("status", ArgumentSemantic.Assign)] + INTaskStatus Status { get; } + + [NullAllowed, Export ("location", ArgumentSemantic.Copy)] + CLPlacemark Location { get; } + + [Export ("locationSearchType", ArgumentSemantic.Assign)] + INLocationSearchType LocationSearchType { get; } + + [NullAllowed, Export ("dateTime", ArgumentSemantic.Copy)] + INDateComponentsRange DateTime { get; } + + [Export ("dateSearchType", ArgumentSemantic.Assign)] + INDateSearchType DateSearchType { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INSearchForNotebookItemsIntentHandling { + + [Abstract] + [Export ("handleSearchForNotebookItems:completion:")] + void HandleSearchForNotebookItems (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("confirmSearchForNotebookItems:completion:")] + void Confirm (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveTitleForSearchForNotebookItems:withCompletion:")] + void ResolveTitle (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveContentForSearchForNotebookItems:withCompletion:")] + void ResolveContent (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveItemTypeForSearchForNotebookItems:withCompletion:")] + void ResolveItemType (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveStatusForSearchForNotebookItems:withCompletion:")] + void ResolveStatus (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveLocationForSearchForNotebookItems:withCompletion:")] + void ResolveLocation (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveLocationSearchTypeForSearchForNotebookItems:withCompletion:")] + void ResolveLocationSearchType (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveDateTimeForSearchForNotebookItems:withCompletion:")] + void ResolveDateTime (INSearchForNotebookItemsIntent intent, Action completion); + + [Export ("resolveDateSearchTypeForSearchForNotebookItems:withCompletion:")] + void ResolveDateSearchType (INSearchForNotebookItemsIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INSearchForNotebookItemsIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INSearchForNotebookItemsIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INSearchForNotebookItemsIntentResponseCode Code { get; } + + [NullAllowed, Export ("notes", ArgumentSemantic.Copy)] + INNote [] Notes { get; set; } + + [NullAllowed, Export ("taskLists", ArgumentSemantic.Copy)] + INTaskList [] TaskLists { get; set; } + + [NullAllowed, Export ("tasks", ArgumentSemantic.Copy)] + INTask [] Tasks { get; set; } + + [Export ("sortType", ArgumentSemantic.Assign)] + INSortType SortType { get; set; } + } + + [Watch (4,0), Mac (10,13, onlyOn64:true), iOS (11,0)] + [BaseType (typeof (INPersonResolutionResult))] + [DisableDefaultCtor] + interface INSendMessageRecipientResolutionResult { + + [Static] + [Export ("unsupportedForReason:")] + INSendMessageRecipientResolutionResult GetUnsupported (INSendMessageRecipientUnsupportedReason reason); + + [Export ("initWithPersonResolutionResult:")] + IntPtr Constructor (INPersonResolutionResult personResolutionResult); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INSendMessageRecipientResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INSendMessageRecipientResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INSendMessageRecipientResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INCurrencyAmountResolutionResult))] + [DisableDefaultCtor] + interface INSendPaymentCurrencyAmountResolutionResult { + + [Static] + [Export ("unsupportedForReason:")] + INSendPaymentCurrencyAmountResolutionResult GetUnsupported (INSendPaymentCurrencyAmountUnsupportedReason reason); + + [Export ("initWithCurrencyAmountResolutionResult:")] + IntPtr Constructor (INCurrencyAmountResolutionResult currencyAmountResolutionResult); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INSendPaymentCurrencyAmountResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INSendPaymentCurrencyAmountResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INSendPaymentCurrencyAmountResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INPersonResolutionResult))] + [DisableDefaultCtor] + interface INSendPaymentPayeeResolutionResult { + + [Static] + [Export ("unsupportedForReason:")] + INSendPaymentPayeeResolutionResult GetUnsupported (INSendPaymentPayeeUnsupportedReason reason); + + [Export ("initWithPersonResolutionResult:")] + IntPtr Constructor (INPersonResolutionResult personResolutionResult); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INSendPaymentPayeeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INSendPaymentPayeeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INSendPaymentPayeeResolutionResult Unsupported { get; } + } + + [NoWatch, NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + [DisableDefaultCtor] + interface INSendRideFeedbackIntent { + + [Export ("initWithRideIdentifier:")] + [DesignatedInitializer] + IntPtr Constructor (string rideIdentifier); + + [Export ("rideIdentifier")] + string RideIdentifier { get; } + + [NullAllowed, Export ("rating", ArgumentSemantic.Copy)] + NSNumber Rating { get; set; } + + [NullAllowed, Export ("tip", ArgumentSemantic.Copy)] + INCurrencyAmount Tip { get; set; } + } + + [NoWatch, NoMac, iOS (11,0)] + [Protocol] + interface INSendRideFeedbackIntentHandling { + + [Abstract] + [Export ("handleSendRideFeedback:completion:")] + void HandleSendRideFeedback (INSendRideFeedbackIntent sendRideFeedbackintent, Action completion); + + [Export ("confirmSendRideFeedback:completion:")] + void Confirm (INSendRideFeedbackIntent sendRideFeedbackIntent, Action completion); + } + + [NoWatch, NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INSendRideFeedbackIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INSendRideFeedbackIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INSendRideFeedbackIntentResponseCode Code { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + interface INSetTaskAttributeIntent { + + [Export ("initWithTargetTask:status:spatialEventTrigger:temporalEventTrigger:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INTask targetTask, INTaskStatus status, [NullAllowed] INSpatialEventTrigger spatialEventTrigger, [NullAllowed] INTemporalEventTrigger temporalEventTrigger); + + [NullAllowed, Export ("targetTask", ArgumentSemantic.Copy)] + INTask TargetTask { get; } + + [Export ("status", ArgumentSemantic.Assign)] + INTaskStatus Status { get; } + + [NullAllowed, Export ("spatialEventTrigger", ArgumentSemantic.Copy)] + INSpatialEventTrigger SpatialEventTrigger { get; } + + [NullAllowed, Export ("temporalEventTrigger", ArgumentSemantic.Copy)] + INTemporalEventTrigger TemporalEventTrigger { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INSetTaskAttributeIntentHandling { + + [Abstract] + [Export ("handleSetTaskAttribute:completion:")] + void HandleSetTaskAttribute (INSetTaskAttributeIntent intent, Action completion); + + [Export ("confirmSetTaskAttribute:completion:")] + void Confirm (INSetTaskAttributeIntent intent, Action completion); + + [Export ("resolveTargetTaskForSetTaskAttribute:withCompletion:")] + void ResolveTargetTask (INSetTaskAttributeIntent intent, Action completion); + + [Export ("resolveStatusForSetTaskAttribute:withCompletion:")] + void ResolveStatus (INSetTaskAttributeIntent intent, Action completion); + + [Export ("resolveSpatialEventTriggerForSetTaskAttribute:withCompletion:")] + void ResolveSpatialEventTrigger (INSetTaskAttributeIntent intent, Action completion); + + [Export ("resolveTemporalEventTriggerForSetTaskAttribute:withCompletion:")] + void ResolveTemporalEventTrigger (INSetTaskAttributeIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INSetTaskAttributeIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INSetTaskAttributeIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INSetTaskAttributeIntentResponseCode Code { get; } + + [NullAllowed, Export ("modifiedTask", ArgumentSemantic.Copy)] + INTask ModifiedTask { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INSpatialEventTrigger { + + [Export ("initWithPlacemark:event:")] + IntPtr Constructor (CLPlacemark placemark, INSpatialEvent @event); + + [Export ("placemark")] + CLPlacemark Placemark { get; } + + [Export ("event")] + INSpatialEvent Event { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INSpatialEventTriggerResolutionResult { + + [Static] + [Export ("successWithResolvedSpatialEventTrigger:")] + INSpatialEventTriggerResolutionResult GetSuccess (INSpatialEventTrigger resolvedSpatialEventTrigger); + + [Static] + [Export ("disambiguationWithSpatialEventTriggersToDisambiguate:")] + INSpatialEventTriggerResolutionResult GetDisambiguation (INSpatialEventTrigger [] spatialEventTriggersToDisambiguate); + + [Static] + [Export ("confirmationRequiredWithSpatialEventTriggerToConfirm:")] + INSpatialEventTriggerResolutionResult GetConfirmationRequired ([NullAllowed] INSpatialEventTrigger spatialEventTriggerToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INSpatialEventTriggerResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INSpatialEventTriggerResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INSpatialEventTriggerResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INTask : NSCopying, NSSecureCoding { + + [Export ("initWithTitle:status:taskType:spatialEventTrigger:temporalEventTrigger:createdDateComponents:modifiedDateComponents:identifier:")] + IntPtr Constructor (INSpeakableString title, INTaskStatus status, INTaskType taskType, [NullAllowed] INSpatialEventTrigger spatialEventTrigger, [NullAllowed] INTemporalEventTrigger temporalEventTrigger, [NullAllowed] NSDateComponents createdDateComponents, [NullAllowed] NSDateComponents modifiedDateComponents, [NullAllowed] string identifier); + + [Export ("title", ArgumentSemantic.Copy)] + INSpeakableString Title { get; } + + [Export ("status")] + INTaskStatus Status { get; } + + [Export ("taskType")] + INTaskType TaskType { get; } + + [NullAllowed, Export ("spatialEventTrigger", ArgumentSemantic.Copy)] + INSpatialEventTrigger SpatialEventTrigger { get; } + + [NullAllowed, Export ("temporalEventTrigger", ArgumentSemantic.Copy)] + INTemporalEventTrigger TemporalEventTrigger { get; } + + [NullAllowed, Export ("createdDateComponents", ArgumentSemantic.Copy)] + NSDateComponents CreatedDateComponents { get; } + + [NullAllowed, Export ("modifiedDateComponents", ArgumentSemantic.Copy)] + NSDateComponents ModifiedDateComponents { get; } + + [NullAllowed, Export ("identifier")] + string Identifier { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INTaskList : NSCopying, NSSecureCoding { + + [Export ("initWithTitle:tasks:groupName:createdDateComponents:modifiedDateComponents:identifier:")] + IntPtr Constructor (INSpeakableString title, INTask [] tasks, [NullAllowed] INSpeakableString groupName, [NullAllowed] NSDateComponents createdDateComponents, [NullAllowed] NSDateComponents modifiedDateComponents, [NullAllowed] string identifier); + + [Export ("title", ArgumentSemantic.Copy)] + INSpeakableString Title { get; } + + [Export ("tasks", ArgumentSemantic.Copy)] + INTask [] Tasks { get; } + + [NullAllowed, Export ("groupName", ArgumentSemantic.Copy)] + INSpeakableString GroupName { get; } + + [NullAllowed, Export ("createdDateComponents", ArgumentSemantic.Copy)] + NSDateComponents CreatedDateComponents { get; } + + [NullAllowed, Export ("modifiedDateComponents", ArgumentSemantic.Copy)] + NSDateComponents ModifiedDateComponents { get; } + + [NullAllowed, Export ("identifier")] + string Identifier { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INTaskListResolutionResult { + + [Static] + [Export ("successWithResolvedTaskList:")] + INTaskListResolutionResult GetSuccess (INTaskList resolvedTaskList); + + [Static] + [Export ("disambiguationWithTaskListsToDisambiguate:")] + INTaskListResolutionResult GetDisambiguation (INTaskList [] taskListsToDisambiguate); + + [Static] + [Export ("confirmationRequiredWithTaskListToConfirm:")] + INTaskListResolutionResult GetConfirmationRequired ([NullAllowed] INTaskList taskListToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INTaskListResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INTaskListResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INTaskListResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INTaskResolutionResult { + + [Static] + [Export ("successWithResolvedTask:")] + INTaskResolutionResult GetSuccess (INTask resolvedTask); + + [Static] + [Export ("disambiguationWithTasksToDisambiguate:")] + INTaskResolutionResult GetDisambiguation (INTask [] tasksToDisambiguate); + + [Static] + [Export ("confirmationRequiredWithTaskToConfirm:")] + INTaskResolutionResult GetConfirmationRequired ([NullAllowed] INTask taskToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INTaskResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INTaskResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INTaskResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INTaskStatusResolutionResult { + + [Static] + [Export ("successWithResolvedTaskStatus:")] + INTaskStatusResolutionResult GetSuccess (INTaskStatus resolvedTaskStatus); + + [Static] + [Export ("confirmationRequiredWithTaskStatusToConfirm:")] + INTaskStatusResolutionResult GetConfirmationRequired (INTaskStatus taskStatusToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INTaskStatusResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INTaskStatusResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INTaskStatusResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface INTemporalEventTrigger : NSCopying, NSSecureCoding { + + [Export ("initWithDateComponentsRange:")] + IntPtr Constructor (INDateComponentsRange dateComponentsRange); + + [Export ("dateComponentsRange")] + INDateComponentsRange DateComponentsRange { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INTemporalEventTriggerResolutionResult { + + [Static] + [Export ("successWithResolvedTemporalEventTrigger:")] + INTemporalEventTriggerResolutionResult GetSuccess (INTemporalEventTrigger resolvedTemporalEventTrigger); + + [Static] + [Export ("disambiguationWithTemporalEventTriggersToDisambiguate:")] + INTemporalEventTriggerResolutionResult GetDisambiguation (INTemporalEventTrigger [] temporalEventTriggersToDisambiguate); + + [Static] + [Export ("confirmationRequiredWithTemporalEventTriggerToConfirm:")] + INTemporalEventTriggerResolutionResult GetConfirmationRequired ([NullAllowed] INTemporalEventTrigger temporalEventTriggerToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INTemporalEventTriggerResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INTemporalEventTriggerResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INTemporalEventTriggerResolutionResult Unsupported { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INNoteContent))] + [DisableDefaultCtor] + interface INTextNoteContent : NSSecureCoding, NSCopying { + + [Export ("initWithText:")] + IntPtr Constructor (string text); + + [NullAllowed, Export ("text")] + string Text { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntent))] + [DisableDefaultCtor] + interface INTransferMoneyIntent { + + [Export ("initWithFromAccount:toAccount:transactionAmount:transactionScheduledDate:transactionNote:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] INPaymentAccount fromAccount, [NullAllowed] INPaymentAccount toAccount, [NullAllowed] INPaymentAmount transactionAmount, [NullAllowed] INDateComponentsRange transactionScheduledDate, [NullAllowed] string transactionNote); + + [NullAllowed, Export ("fromAccount", ArgumentSemantic.Copy)] + INPaymentAccount FromAccount { get; } + + [NullAllowed, Export ("toAccount", ArgumentSemantic.Copy)] + INPaymentAccount ToAccount { get; } + + [NullAllowed, Export ("transactionAmount", ArgumentSemantic.Copy)] + INPaymentAmount TransactionAmount { get; } + + [NullAllowed, Export ("transactionScheduledDate", ArgumentSemantic.Copy)] + INDateComponentsRange TransactionScheduledDate { get; } + + [NullAllowed, Export ("transactionNote")] + string TransactionNote { get; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [Protocol] + interface INTransferMoneyIntentHandling { + + [Abstract] + [Export ("handleTransferMoney:completion:")] + void HandleTransferMoney (INTransferMoneyIntent intent, Action completion); + + [Export ("confirmTransferMoney:completion:")] + void Confirm (INTransferMoneyIntent intent, Action completion); + + [Export ("resolveFromAccountForTransferMoney:withCompletion:")] + void ResolveFromAccount (INTransferMoneyIntent intent, Action completion); + + [Export ("resolveToAccountForTransferMoney:withCompletion:")] + void ResolveToAccount (INTransferMoneyIntent intent, Action completion); + + [Export ("resolveTransactionAmountForTransferMoney:withCompletion:")] + void ResolveTransactionAmount (INTransferMoneyIntent intent, Action completion); + + [Export ("resolveTransactionScheduledDateForTransferMoney:withCompletion:")] + void ResolveTransactionScheduledDate (INTransferMoneyIntent intent, Action completion); + + [Export ("resolveTransactionNoteForTransferMoney:withCompletion:")] + void ResolveTransactionNote (INTransferMoneyIntent intent, Action completion); + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResponse))] + [DisableDefaultCtor] + interface INTransferMoneyIntentResponse { + + [Export ("initWithCode:userActivity:")] + [DesignatedInitializer] + IntPtr Constructor (INTransferMoneyIntentResponseCode code, [NullAllowed] NSUserActivity userActivity); + + [Export ("code")] + INTransferMoneyIntentResponseCode Code { get; } + + [NullAllowed, Export ("fromAccount", ArgumentSemantic.Copy)] + INPaymentAccount FromAccount { get; set; } + + [NullAllowed, Export ("toAccount", ArgumentSemantic.Copy)] + INPaymentAccount ToAccount { get; set; } + + [NullAllowed, Export ("transactionAmount", ArgumentSemantic.Copy)] + INPaymentAmount TransactionAmount { get; set; } + + [NullAllowed, Export ("transactionScheduledDate", ArgumentSemantic.Copy)] + INDateComponentsRange TransactionScheduledDate { get; set; } + + [NullAllowed, Export ("transactionNote")] + string TransactionNote { get; set; } + + [NullAllowed, Export ("transferFee", ArgumentSemantic.Copy)] + INCurrencyAmount TransferFee { get; set; } + } + + [Watch (4,0), NoMac, iOS (11,0)] + [BaseType (typeof (INIntentResolutionResult))] + [DisableDefaultCtor] + interface INVisualCodeTypeResolutionResult { + + [Static] + [Export ("successWithResolvedVisualCodeType:")] + INVisualCodeTypeResolutionResult GetSuccess (INVisualCodeType resolvedVisualCodeType); + + [Static] + [Export ("confirmationRequiredWithVisualCodeTypeToConfirm:")] + INVisualCodeTypeResolutionResult GetConfirmationRequired (INVisualCodeType visualCodeTypeToConfirm); + + // Fixes bug 43205. We need to return the inherited type not the base type + // because users won't be able to downcast easily + + [New] + [Static] + [Export ("needsValue")] + INVisualCodeTypeResolutionResult NeedsValue { get; } + + [New] + [Static] + [Export ("notRequired")] + INVisualCodeTypeResolutionResult NotRequired { get; } + + [New] + [Static] + [Export ("unsupported")] + INVisualCodeTypeResolutionResult Unsupported { get; } + } + } #endif // XAMCORE_2_0 diff --git a/src/intentsui.cs b/src/intentsui.cs index a8483214668a..0bf8c4b8ab59 100644 --- a/src/intentsui.cs +++ b/src/intentsui.cs @@ -25,13 +25,31 @@ public enum INUIHostedViewContext : nuint { MapsCard } + [iOS (11,0)] + [Native] + public enum INUIInteractiveBehavior : nuint { + None, + NextView, + Launch, + GenericAction, + } + + [iOS (11,0)] + delegate void INUIHostedViewControllingConfigureViewHandler (bool success, NSSet configuredParameters, CGSize desiredSize); + [Introduced (PlatformName.iOS, 10, 0)] [Protocol] interface INUIHostedViewControlling { +#if !XAMCORE_4_0 // Apple made this member optional in iOS 11 [Abstract] +#endif [Export ("configureWithInteraction:context:completion:")] void Configure (INInteraction interaction, INUIHostedViewContext context, Action completion); + + [iOS (11,0)] + [Export ("configureViewForParameters:ofInteraction:interactiveBehavior:context:completion:")] + void ConfigureView (NSSet parameters, INInteraction interaction, INUIInteractiveBehavior interactiveBehavior, INUIHostedViewContext context, INUIHostedViewControllingConfigureViewHandler completionHandler); } [Introduced (PlatformName.iOS, 10, 0)] @@ -44,6 +62,10 @@ interface NSExtensionContext_INUIHostedViewControlling { [Export ("hostedViewMaximumAllowedSize")] CGSize GetHostedViewMaximumAllowedSize (); + + [iOS (11,0)] + [Export ("interfaceParametersDescription")] + string GetInterfaceParametersDescription (); } [Introduced (PlatformName.iOS, 10, 0)] diff --git a/src/iosurface.cs b/src/iosurface.cs new file mode 100644 index 000000000000..ac4647d9b73b --- /dev/null +++ b/src/iosurface.cs @@ -0,0 +1,220 @@ +// +// IOSurface bindings +// +// Authors: +// Miguel de Icaza +// +// Copyright 2017 Microsoft Inc. All rights reserved. +// + +using System; +using XamCore.CoreFoundation; +using XamCore.Foundation; +using XamCore.ObjCRuntime; + +namespace XamCore.IOSurface { + + [Static] + [Internal] + // See bug #59201 [iOS (10,0)] + [iOS (11, 0)] + [TV (11,0)] + [Mac (10, 12)] + interface IOSurfacePropertyKey { + [Field ("IOSurfacePropertyAllocSizeKey")] + NSString AllocSizeKey { get; } + + [Field ("IOSurfacePropertyKeyWidth")] + NSString WidthKey { get; } + + [Field ("IOSurfacePropertyKeyHeight")] + NSString HeightKey { get; } + + [Field ("IOSurfacePropertyKeyBytesPerRow")] + NSString BytesPerRowKey { get; } + + [Field ("IOSurfacePropertyKeyBytesPerElement")] + NSString BytesPerElementKey { get; } + + [Field ("IOSurfacePropertyKeyElementWidth")] + NSString ElementWidthKey { get; } + + [Field ("IOSurfacePropertyKeyElementHeight")] + NSString ElementHeightKey { get; } + + [Field ("IOSurfacePropertyKeyOffset")] + NSString OffsetKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneInfo")] + NSString PlaneInfoKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneWidth")] + NSString PlaneWidthKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneHeight")] + NSString PlaneHeightKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneBytesPerRow")] + NSString PlaneBytesPerRowKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneOffset")] + NSString PlaneOffsetKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneSize")] + NSString PlaneSizeKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneBase")] + NSString PlaneBaseKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneBytesPerElement")] + NSString PlaneBytesPerElementKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneElementWidth")] + NSString PlaneElementWidthKey { get; } + + [Field ("IOSurfacePropertyKeyPlaneElementHeight")] + NSString PlaneElementHeightKey { get; } + + [Field ("IOSurfacePropertyKeyCacheMode")] + NSString CacheModeKey { get; } + + [Field ("IOSurfacePropertyKeyPixelFormat")] + NSString PixelFormatKey { get; } + + [Field ("IOSurfacePropertyKeyPixelSizeCastingAllowed")] + NSString PixelSizeCastingAllowedKey { get; } + } + + [StrongDictionary ("IOSurfacePropertyKey")] + partial interface IOSurfaceOptions { + nint AllocSize { get; set; } + nint Width { get; set; } + nint Height { get; set; } + nint BytesPerRow { get; set; } + nint BytesPerElement { get; set; } + nint ElementWidth { get; set; } + nint ElementHeight { get; set; } + nint Offset { get; set; } + NSDictionary [] PlaneInfo { get; set; } + nint PlaneWidth { get; set; } + nint PlaneHeight { get; set; } + nint PlaneBytesPerRow { get; set; } + nint PlaneOffset { get; set; } + nint PlaneSize { get; set; } + nint PlaneBase { get; set; } + nint PlaneBytesPerElement { get; set; } + nint PlaneElementWidth { get; set; } + nint PlaneElementHeight { get; set; } + IOSurfaceMemoryMap CacheMode { get; set; } + uint PixelFormat { get; set; } + bool PixelSizeCastingAllowed { get; set; } + } + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,12)] + [BaseType (typeof(NSObject))] + interface IOSurface : NSSecureCoding + { + [Internal, Export ("initWithProperties:")] + IntPtr Constructor (NSDictionary properties); + + [Wrap ("this (properties == null ? null : properties.Dictionary)")] + IntPtr Constructor (IOSurfaceOptions properties); + + [Internal, Export ("lockWithOptions:seed:")] + int _Lock (IOSurfaceLockOptions options, IntPtr seedPtr); + + [Internal, Export ("unlockWithOptions:seed:")] + int _Unlock (IOSurfaceLockOptions options, IntPtr seed); + + [Export ("allocationSize")] + nint AllocationSize { get; } + + [Export ("width")] + nint Width { get; } + + [Export ("height")] + nint Height { get; } + + [Export ("baseAddress")] + IntPtr BaseAddress { get; } + + [Export ("pixelFormat")] + uint PixelFormat { get; } + + [Export ("bytesPerRow")] + nint BytesPerRow { get; } + + [Export ("bytesPerElement")] + nint BytesPerElement { get; } + + [Export ("elementWidth")] + nint ElementWidth { get; } + + [Export ("elementHeight")] + nint ElementHeight { get; } + + [Export ("seed")] + uint Seed { get; } + + [Export ("planeCount")] + nuint PlaneCount { get; } + + [Export ("widthOfPlaneAtIndex:")] + nint GetWidth (nuint planeIndex); + + [Export ("heightOfPlaneAtIndex:")] + nint GetHeight (nuint planeIndex); + + [Export ("bytesPerRowOfPlaneAtIndex:")] + nint GetBytesPerRow (nuint planeIndex); + + [Export ("bytesPerElementOfPlaneAtIndex:")] + nint GetBytesPerElement (nuint planeIndex); + + [Export ("elementWidthOfPlaneAtIndex:")] + nint GetElementWidth (nuint planeIndex); + + [Export ("elementHeightOfPlaneAtIndex:")] + nint GetElementHeight (nuint planeIndex); + + [Export ("baseAddressOfPlaneAtIndex:")] + IntPtr GetBaseAddress (nuint planeIndex); + + [Export ("setAttachment:forKey:")] + void SetAttachment (NSObject anObject, NSString key); + + [Export ("attachmentForKey:")] + [return: NullAllowed] + NSObject GetAttachment (NSString key); + + [Export ("removeAttachmentForKey:")] + void RemoveAttachment (NSString key); + + [NullAllowed, Export ("allAttachments")] + NSDictionary AllAttachments { get; set; } + + [Export ("removeAllAttachments")] + void RemoveAllAttachments (); + + [Export ("inUse")] + bool InUse { [Bind ("isInUse")] get; } + + [Export ("incrementUseCount")] + void IncrementUseCount (); + + [Export ("decrementUseCount")] + void DecrementUseCount (); + + [Export ("localUseCount")] + int LocalUseCount { get; } + + [Export ("allowsPixelSizeCasting")] + bool AllowsPixelSizeCasting { get; } + + [iOS (11,0)][Mac (10,13)] + [Internal, Export ("setPurgeable:oldState:")] + int _SetPurgeable (IOSurfacePurgeabilityState newState, IntPtr oldStatePtr); + } +} diff --git a/src/localauthentication.cs b/src/localauthentication.cs index 7ce605842b16..22dcb5885399 100644 --- a/src/localauthentication.cs +++ b/src/localauthentication.cs @@ -5,6 +5,14 @@ namespace XamCore.LocalAuthentication { + [iOS (11,0), NoMac] + [Native] + public enum LABiometryType : nint { + None, + TouchId, + TypeFaceId, + } + [iOS (8,0), Mac (10,10)] delegate void LAContextReplyHandler (bool success, NSError error); @@ -70,5 +78,16 @@ interface LAContext { [Export ("maxBiometryFailures")] NSNumber MaxBiometryFailures { get; set; } #endif + [NoWatch, NoTV, Mac (10, 13), iOS (11, 0)] + [Export ("localizedReason")] + string LocalizedReason { get; set; } + + [NoWatch, NoTV, Mac (10, 13), iOS (11, 0)] + [Export ("interactionNotAllowed")] + bool InteractionNotAllowed { get; set; } + + [NoMac, iOS (11,0)] + [Export ("biometryType")] + LABiometryType BiometryType { get; } } } diff --git a/src/mapkit.cs b/src/mapkit.cs index 14711003b0fb..72f174acaabd 100644 --- a/src/mapkit.cs +++ b/src/mapkit.cs @@ -28,9 +28,14 @@ using UIEdgeInsets=XamCore.AppKit.NSEdgeInsets; using UIColor=XamCore.AppKit.NSColor; #endif +#if WATCH +// helper for [NoWatch] +using MKMapView=XamCore.Foundation.NSObject; +using MKAnnotationView=XamCore.Foundation.NSObject; +#endif namespace XamCore.MapKit { - + [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -175,7 +180,27 @@ interface MKAnnotationView { [Export ("rightCalloutOffset")] CGPoint RightCallpoutOffset { get; set; } #endif - + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [NullAllowed, Export ("clusteringIdentifier")] + string ClusteringIdentifier { get; set; } + + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [NullAllowed, Export ("clusterAnnotationView", ArgumentSemantic.Weak)] + MKAnnotationView ClusterAnnotationView { get; } + + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Advice ("Pre-defined constants are available from 'MKFeatureDisplayPriority'.")] + [Export ("displayPriority")] + float DisplayPriority { get; set; } + + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Export ("collisionMode", ArgumentSemantic.Assign)] + MKAnnotationViewCollisionMode CollisionMode { get; set; } + + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Export ("prepareForDisplay")] + [Advice ("You must call the base method when overriding.")] // [RequiresSuper] + void PrepareForDisplay (); } [ThreadSafe] @@ -204,7 +229,7 @@ interface MKCircle : MKOverlay { #if !MONOMAC && !TVOS [BaseType (typeof (MKOverlayPathView))] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use MKCircleRenderer instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MKCircleRenderer' instead.")] interface MKCircleView { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frame); @@ -258,7 +283,11 @@ interface MKDirectionsRequest { [Since (6,0)] [TV (9,2)] [Mac (10,9, onlyOn64 : true)] - interface MKMapItem { + interface MKMapItem +#if IOS // #if TARGET_OS_IOS + : NSItemProviderReading, NSItemProviderWriting +#endif + { [Export ("placemark", ArgumentSemantic.Retain)] MKPlacemark Placemark { get; } @@ -343,6 +372,10 @@ interface MKMapItem { [iOS (9,0), Mac(10,11)] [NullAllowed] NSTimeZone TimeZone { get; set; } + + [iOS (11,0), Mac (10,13), Watch (4,0), TV (11,0)] + [Field ("MKMapItemTypeIdentifier")] + NSString TypeIdentifier { get; } } #if !WATCH @@ -452,8 +485,21 @@ interface MKMapView { #endif [Export ("dequeueReusableAnnotationViewWithIdentifier:")] + [return: NullAllowed] MKAnnotationView DequeueReusableAnnotation (string withViewIdentifier); + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Export ("dequeueReusableAnnotationViewWithIdentifier:forAnnotation:")] + MKAnnotationView DequeueReusableAnnotation (string identifier, IMKAnnotation annotation); + + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Export ("registerClass:forAnnotationViewWithReuseIdentifier:")] + void Register ([NullAllowed] Class viewClass, string identifier); + + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Wrap ("Register (viewType == null ? null : new Class (viewType), identifier)")] + void Register ([NullAllowed] Type viewType, string identifier); + [Export ("selectAnnotation:animated:")] [PostGet ("SelectedAnnotations")] #if XAMCORE_2_0 @@ -567,7 +613,7 @@ interface MKMapView { #if !MONOMAC && !TVOS [Export ("viewForOverlay:")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use MKOverlayRenderer.RendererForOverlay instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MKOverlayRenderer.RendererForOverlay' instead.")] #if XAMCORE_2_0 MKOverlayView ViewForOverlay (IMKOverlay overlay); #else @@ -664,6 +710,17 @@ interface MKMapView { #endif } + [Static] + [TV (11,0)][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [NoWatch] + interface MKMapViewDefault { + [Field ("MKMapViewDefaultAnnotationViewReuseIdentifier")] + NSString AnnotationViewReuseIdentifier { get; } + + [Field ("MKMapViewDefaultClusterAnnotationViewReuseIdentifier")] + NSString ClusterAnnotationViewReuseIdentifier { get; } + } + [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -707,7 +764,7 @@ interface MKMapViewDelegate { #if !MONOMAC && !TVOS [Export ("mapView:viewForOverlay:"), DelegateName ("MKMapViewOverlay"), DefaultValue (null)] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use MKOverlayRenderer.RendererForOverlay instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MKOverlayRenderer.RendererForOverlay' instead.")] #if XAMCORE_2_0 MKOverlayView GetViewForOverlay (MKMapView mapView, IMKOverlay overlay); #else @@ -715,7 +772,7 @@ interface MKMapViewDelegate { #endif // XAMCORE_2_0 [Export ("mapView:didAddOverlayViews:"), EventArgs ("MKOverlayViews")] - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use DidAddOverlayRenderers instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'DidAddOverlayRenderers' instead.")] void DidAddOverlayViews (MKMapView mapView, MKOverlayView overlayViews); #endif // !MONOMAC && !TVOS @@ -764,6 +821,10 @@ interface MKMapViewDelegate { [Since (7,0), Export ("mapViewDidFinishRenderingMap:fullyRendered:"), EventArgs ("MKDidFinishRenderingMap")] void DidFinishRenderingMap (MKMapView mapView, bool fullyRendered); + + [TV (11,0)][NoWatch][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [Export ("mapView:clusterAnnotationForMemberAnnotations:"), DelegateName ("MKCreateClusterAnnotation"), DefaultValue (null)] + MKClusterAnnotation CreateClusterAnnotation (MKMapView mapView, IMKAnnotation[] memberAnnotations); } [BaseType (typeof (MKAnnotationView))] @@ -784,7 +845,7 @@ interface MKPinAnnotationView { [NoTV] [Export ("pinColor")] - [Availability (Deprecated = Platform.iOS_9_0, Message = "Use PinTintColor instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'PinTintColor' instead.")] MKPinAnnotationColor PinColor { get; set; } [Export ("animatesDrop")] @@ -845,13 +906,14 @@ interface MKPlacemark : MKAnnotation, NSCopying { #endif // !MONOMAC && !WATCH [Watch (3,0)][TV (10,0)][iOS (10,0)] - [NoMac] + [Mac (10,12, onlyOn64 : true)] [Export ("initWithCoordinate:")] IntPtr Constructor (CLLocationCoordinate2D coordinate); -#if !TVOS && !MONOMAC && XAMCORE_2_0 +#if !TVOS && XAMCORE_2_0 [Watch (3,0)][iOS (10,0)] - [NoTV][NoMac] + [Mac (10,12, onlyOn64 : true)] + [NoTV] [Export ("initWithCoordinate:postalAddress:")] IntPtr Constructor (CLLocationCoordinate2D coordinate, CNPostalAddress postalAddress); #endif @@ -862,7 +924,7 @@ interface MKPlacemark : MKAnnotation, NSCopying { #if IOS [BaseType (typeof (NSObject))] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_5_0, Message = "Use CoreLocation.CLGeocoder instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_5_0, Message = "Use 'CoreLocation.CLGeocoder' instead.")] // crash (at least) at Dispose time when instance is created by 'init' [DisableDefaultCtor] interface MKReverseGeocoder { @@ -908,7 +970,7 @@ interface MKReverseGeocoderDelegate { } #pragma warning restore 618 - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use MKOverlayRenderer instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MKOverlayRenderer' instead.")] [BaseType (typeof (UIView))] interface MKOverlayView { [Export ("overlay")] @@ -959,7 +1021,7 @@ interface MKOverlayView { void SetNeedsDisplay (MKMapRect mapRect, /* MKZoomScale */ nfloat zoomScale); } - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use MKOverlayPathRenderer instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MKOverlayPathRenderer' instead.")] [BaseType (typeof (MKOverlayView))] interface MKOverlayPathView { [Export ("initWithOverlay:")] @@ -1060,7 +1122,7 @@ interface MKPointAnnotation { } #if !MONOMAC && !TVOS - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use MKPolygonRenderer instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MKPolygonRenderer' instead.")] [BaseType (typeof (MKOverlayPathView))] interface MKPolygonView { [Export ("initWithFrame:")] @@ -1136,7 +1198,7 @@ interface MKPolyline : MKOverlay { } #if !MONOMAC && !TVOS - [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use MKPolylineRenderer instead")] + [Availability (Introduced = Platform.iOS_4_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MKPolylineRenderer' instead.")] [BaseType (typeof (MKOverlayPathView))] interface MKPolylineView { [Export ("initWithFrame:")] @@ -1828,5 +1890,108 @@ interface NSUserActivity_MKMapItem { [Export ("setMapItem:")] void SetMapItem (MKMapItem item); } + +[TV (11,0)][NoWatch][iOS (11,0)][Mac (10,13, onlyOn64: true)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface MKClusterAnnotation : MKAnnotation { + [NullAllowed, Export ("title")] + new string Title { get; set; } + + [NullAllowed, Export ("subtitle")] + new string Subtitle { get; set; } + + [Export ("memberAnnotations")] + IMKAnnotation[] MemberAnnotations { get; } + + [Export ("initWithMemberAnnotations:")] + [DesignatedInitializer] + IntPtr Constructor (IMKAnnotation[] memberAnnotations); + } + + [NoTV][iOS (11,0)][NoMac][NoWatch] + [BaseType (typeof (UIView))] + [DisableDefaultCtor] + interface MKCompassButton { + [Static] + [Export ("compassButtonWithMapView:")] + MKCompassButton FromMapView ([NullAllowed] MKMapView mapView); + + [NullAllowed, Export ("mapView", ArgumentSemantic.Weak)] + MKMapView MapView { get; set; } + + [Export ("compassVisibility", ArgumentSemantic.Assign)] + MKFeatureVisibility CompassVisibility { get; set; } + } + + [TV (11,0)][NoWatch][iOS (11,0)][NoMac] + [BaseType (typeof (MKAnnotationView))] + interface MKMarkerAnnotationView { + + // inlined from base type + [Export ("initWithAnnotation:reuseIdentifier:")] + [PostGet ("Annotation")] + IntPtr Constructor (IMKAnnotation annotation, [NullAllowed] string reuseIdentifier); + + [Export ("titleVisibility", ArgumentSemantic.Assign)] + MKFeatureVisibility TitleVisibility { get; set; } + + [Export ("subtitleVisibility", ArgumentSemantic.Assign)] + MKFeatureVisibility SubtitleVisibility { get; set; } + + [Appearance] + [NullAllowed, Export ("markerTintColor", ArgumentSemantic.Copy)] + UIColor MarkerTintColor { get; set; } + + [Appearance] + [NullAllowed, Export ("glyphTintColor", ArgumentSemantic.Copy)] + UIColor GlyphTintColor { get; set; } + + [Appearance] + [NullAllowed, Export ("glyphText")] + string GlyphText { get; set; } + + [Appearance] + [NullAllowed, Export ("glyphImage", ArgumentSemantic.Copy)] + UIImage GlyphImage { get; set; } + + [Appearance] + [NullAllowed, Export ("selectedGlyphImage", ArgumentSemantic.Copy)] + UIImage SelectedGlyphImage { get; set; } + + [Export ("animatesWhenAdded")] + bool AnimatesWhenAdded { get; set; } + } + + [TV (11,0)][NoWatch][iOS (11,0)][NoMac] + [BaseType (typeof (UIView))] + [DisableDefaultCtor] + interface MKScaleView { + + [Static] + [Export ("scaleViewWithMapView:")] + MKScaleView FromMapView ([NullAllowed] MKMapView mapView); + + [NullAllowed, Export ("mapView", ArgumentSemantic.Weak)] + MKMapView MapView { get; set; } + + [Export ("scaleVisibility", ArgumentSemantic.Assign)] + MKFeatureVisibility ScaleVisibility { get; set; } + + [Export ("legendAlignment", ArgumentSemantic.Assign)] + MKScaleViewAlignment LegendAlignment { get; set; } + } + + [NoTV][iOS (11,0)][NoWatch][NoMac] + [BaseType (typeof (UIView))] + [DisableDefaultCtor] + interface MKUserTrackingButton { + [Static] + [Export ("userTrackingButtonWithMapView:")] + MKUserTrackingButton FromMapView ([NullAllowed] MKMapView mapView); + + [NullAllowed, Export ("mapView", ArgumentSemantic.Weak)] + MKMapView MapView { get; set; } + } } #endif // XAMCORE_2_0 || !MONOMAC diff --git a/src/medialibrary.cs b/src/medialibrary.cs index a64bb31a90d8..1f00309ec41a 100644 --- a/src/medialibrary.cs +++ b/src/medialibrary.cs @@ -156,6 +156,18 @@ interface MediaLibraryTypeIdentifierKey { [Field ("MLPhotosFrontCameraGroupTypeIdentifier")] NSString PhotosFrontCameraGroupTypeIdentifier { get; } + [Mac (10,13, onlyOn64 : true)] + [Field ("MLPhotosLivePhotosGroupTypeIdentifier")] + NSString PhotosLivePhotosGroupTypeIdentifier { get; } + + [Mac (10,13, onlyOn64 : true)] + [Field ("MLPhotosLongExposureGroupTypeIdentifier")] + NSString PhotosLongExposureGroupTypeIdentifier { get; } + + [Mac (10,13, onlyOn64 : true)] + [Field ("MLPhotosAnimatedGroupTypeIdentifier")] + NSString PhotosAnimatedGroupTypeIdentifier { get; } + [Mac (10,10, onlyOn64 : true)] [Field ("MLPhotosPanoramasGroupTypeIdentifier")] NSString PhotosPanoramasGroupTypeIdentifier { get; } diff --git a/src/mediaplayer.cs b/src/mediaplayer.cs index 299529ee9902..e12c4e3814b1 100644 --- a/src/mediaplayer.cs +++ b/src/mediaplayer.cs @@ -22,10 +22,9 @@ namespace XamCore.MediaPlayer { #if XAMCORE_2_0 || !MONOMAC - [NoMac] - [NoTV] + [Mac (10,12,2, onlyOn64: true)] // type exists only to expose fields [BaseType (typeof (NSObject))] -#if XAMCORE_2_0 +#if XAMCORE_2_0 && IOS // introduced in 4.2 interface MPMediaEntity : NSSecureCoding { #else @@ -49,7 +48,7 @@ interface MPMediaItem : NSSecureCoding { [Field ("MPMediaEntityPropertyPersistentID")] NSString PropertyPersistentID { get; } -#if XAMCORE_2_0 +#if XAMCORE_2_0 && IOS } #if MONOMAC || TVOS [Mac (10,12,2, onlyOn64: true)] @@ -59,20 +58,20 @@ interface MPMediaItem : NSSecureCoding { #endif interface MPMediaItem { #endif - -#if !MONOMAC + [NoMac][NoTV] [Since (4,2)] [NoMac] [NoTV] [Export ("persistentIDPropertyForGroupingType:")][Static] string GetPersistentIDProperty (MPMediaGrouping groupingType); + [NoMac][NoTV] [Since (4,2)] [NoMac] [NoTV] [Export ("titlePropertyForGroupingType:")][Static] string GetTitleProperty (MPMediaGrouping groupingType); -#endif + [Since (3,0)] [Field ("MPMediaItemPropertyPersistentID")] [EditorBrowsable (EditorBrowsableState.Advanced)] @@ -305,13 +304,13 @@ interface MPMediaItemArtwork { [NoTV] // Objective-C exception thrown. Name: MPMediaItemCollectionInitException Reason: -init is not supported, use -initWithItems: [DisableDefaultCtor] -#if XAMCORE_2_0 +#if XAMCORE_2_0 && IOS // introduced in 4.2 - but the type was never added to classic [BaseType (typeof (MPMediaEntity))] #else [BaseType (typeof (NSObject))] #endif -#if XAMCORE_3_0 || !XAMCORE_2_0 +#if XAMCORE_3_0 || !XAMCORE_2_0 || !IOS interface MPMediaItemCollection : NSSecureCoding { #else // part of the bug is that we inlined MPMediaEntity needlessly @@ -372,7 +371,7 @@ interface MPMediaLibrary : NSSecureCoding { [iOS (9,3)] [Export ("addItemWithProductID:completionHandler:")] [Async] -#if XAMCORE_2_0 +#if XAMCORE_2_0 && IOS // MPMediaEntity was not part of classic void AddItem (string productID, [NullAllowed] Action completionHandler); #else @@ -821,7 +820,7 @@ interface MPMediaPlayback { #if !MONOMAC [NoTV] - [Availability (Deprecated = Platform.iOS_9_0)] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [BaseType (typeof (NSObject))] interface MPMoviePlayerController : MPMediaPlayback { [DesignatedInitializer] @@ -830,14 +829,14 @@ interface MPMoviePlayerController : MPMediaPlayback { [Export ("backgroundColor", ArgumentSemantic.Retain)] // You should avoid using this property. It is available only when you use the initWithContentURL: method to initialize the movie player controller object. - [Availability (Introduced = Platform.iOS_2_0, Deprecated = Platform.iOS_3_2, Obsoleted = Platform.iOS_8_0, Message = "Do not use; this API was removed in iOS 8.0 and is not always available")] + [Availability (Introduced = Platform.iOS_2_0, Deprecated = Platform.iOS_3_2, Obsoleted = Platform.iOS_8_0, Message = "Do not use; this API was removed and is not always available.")] UIColor BackgroundColor { get; set; } [Export ("scalingMode")] MPMovieScalingMode ScalingMode { get; set; } [Export ("movieControlMode")] - [Availability (Introduced = Platform.iOS_2_0, Deprecated = Platform.iOS_3_2, Obsoleted = Platform.iOS_8_0, Message = "Do not use; this API was removed in iOS 8.0")] + [Availability (Introduced = Platform.iOS_2_0, Deprecated = Platform.iOS_3_2, Obsoleted = Platform.iOS_8_0, Message = "Do not use; this API was removed.")] MPMovieControlMode MovieControlMode { get; set; } [Since (3,2)] @@ -878,7 +877,7 @@ interface MPMoviePlayerController : MPMediaPlayback { bool ShouldAutoplay { get; set; } [Export ("useApplicationAudioSession")] - [Availability (Introduced = Platform.iOS_3_2, Deprecated = Platform.iOS_6_0)] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] bool UseApplicationAudioSession { get; set; } [Since (3,2)] @@ -897,10 +896,12 @@ interface MPMoviePlayerController : MPMediaPlayback { [Export ("airPlayVideoActive")] bool AirPlayVideoActive { [Bind ("isAirPlayVideoActive")] get; } + [Availability (Deprecated = Platform.iOS_9_0)] [Since (4,3)] [Export ("accessLog")] MPMovieAccessLog AccessLog { get; } + [Availability (Deprecated = Platform.iOS_9_0)] [Since (4,3)] [Export ("errorLog")] MPMovieErrorLog ErrorLog { get; } @@ -908,7 +909,7 @@ interface MPMoviePlayerController : MPMediaPlayback { // Brought it from the MPMediaPlayback.h [Export ("thumbnailImageAtTime:timeOption:")] - [Availability (Introduced = Platform.iOS_3_2, Deprecated = Platform.iOS_7_0, Message = "Use RequestThumbnails instead")] + [Availability (Introduced = Platform.iOS_3_2, Deprecated = Platform.iOS_7_0, Message = "Use 'RequestThumbnails' instead.")] UIImage ThumbnailImageAt (double time, MPMovieTimeOption timeOption); [Since (3,2)] @@ -950,128 +951,156 @@ interface MPMoviePlayerController : MPMediaPlayback { [Export ("timedMetadata")] MPTimedMetadata [] TimedMetadata { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Field ("MPMoviePlayerScalingModeDidChangeNotification")] [Notification] NSString ScalingModeDidChangeNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Field ("MPMoviePlayerPlaybackDidFinishNotification")] [Notification (typeof (MPMoviePlayerFinishedEventArgs))] NSString PlaybackDidFinishNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerPlaybackDidFinishReasonUserInfoKey")] // NSNumber (MPMovieFinishReason) NSString PlaybackDidFinishReasonUserInfoKey { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerPlaybackStateDidChangeNotification")] [Notification] NSString PlaybackStateDidChangeNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerLoadStateDidChangeNotification")] [Notification] NSString LoadStateDidChangeNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerNowPlayingMovieDidChangeNotification")] [Notification] NSString NowPlayingMovieDidChangeNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerWillEnterFullscreenNotification")] [Notification (typeof (MPMoviePlayerFullScreenEventArgs))] [Notification] NSString WillEnterFullscreenNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerDidEnterFullscreenNotification")] [Notification] NSString DidEnterFullscreenNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerWillExitFullscreenNotification")] [Notification (typeof (MPMoviePlayerFullScreenEventArgs))] NSString WillExitFullscreenNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerDidExitFullscreenNotification")] [Notification] NSString DidExitFullscreenNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerFullscreenAnimationDurationUserInfoKey")] NSString FullscreenAnimationDurationUserInfoKey { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerFullscreenAnimationCurveUserInfoKey")] NSString FullscreenAnimationCurveUserInfoKey { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMovieMediaTypesAvailableNotification")] [Notification] NSString TypesAvailableNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMovieSourceTypeAvailableNotification")] [Notification] NSString SourceTypeAvailableNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMovieDurationAvailableNotification")] [Notification] NSString DurationAvailableNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMovieNaturalSizeAvailableNotification")] [Notification] NSString NaturalSizeAvailableNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerThumbnailImageRequestDidFinishNotification")] [Notification (typeof (MPMoviePlayerThumbnailEventArgs))] NSString ThumbnailImageRequestDidFinishNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerThumbnailImageKey")] NSString ThumbnailImageKey { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerThumbnailTimeKey")] NSString ThumbnailTimeKey { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (3,2)] [Field ("MPMoviePlayerThumbnailErrorKey")] NSString ThumbnailErrorKey { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (4,0)] [Field ("MPMoviePlayerTimedMetadataUpdatedNotification")] [Notification (typeof (MPMoviePlayerTimedMetadataEventArgs))] NSString TimedMetadataUpdatedNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (4,0)] [Field ("MPMoviePlayerTimedMetadataUserInfoKey")] NSString TimedMetadataUserInfoKey { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (4,0)] [Field ("MPMoviePlayerTimedMetadataKeyName")] NSString TimedMetadataKeyName { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (4,0)] [Field ("MPMoviePlayerTimedMetadataKeyInfo")] NSString TimedMetadataKeyInfo { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (4,0)] [Field ("MPMoviePlayerTimedMetadataKeyMIMEType")] NSString TimedMetadataKeyMIMEType { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (4,0)] [Field ("MPMoviePlayerTimedMetadataKeyDataType")] NSString TimedMetadataKeyDataType { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (4,0)] [Field ("MPMoviePlayerTimedMetadataKeyLanguageCode")] NSString TimedMetadataKeyLanguageCode { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Field ("MPMediaPlaybackIsPreparedToPlayDidChangeNotification")] [Notification] NSString MediaPlaybackIsPreparedToPlayDidChangeNotification { get; } @@ -1080,11 +1109,13 @@ interface MPMoviePlayerController : MPMediaPlayback { [Export ("readyForDisplay")] bool ReadyForDisplay { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Since (6,0)] [Field ("MPMoviePlayerReadyForDisplayDidChangeNotification")] [Notification] NSString MoviePlayerReadyForDisplayDidChangeNotification { get; } + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [iOS (5,0)] [Field ("MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification")] [Notification] @@ -1122,7 +1153,7 @@ interface MPTimedMetadata { #if !MONOMAC [NoTV] [BaseType (typeof (UIViewController))] - [Availability (Introduced = Platform.iOS_3_2, Deprecated = Platform.iOS_9_0)] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] interface MPMoviePlayerViewController { [DesignatedInitializer] [Export ("initWithContentURL:")] @@ -1132,7 +1163,7 @@ interface MPMoviePlayerViewController { MPMoviePlayerController MoviePlayer { get; } // Directly removed, shows up in iOS 6.1 SDK, but not any later SDKs. - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_7_0, Message = "Do not use; this API was removed in iOS 7.0")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Obsoleted = Platform.iOS_7_0, Message = "Do not use; this API was removed.")] [Export ("shouldAutorotateToInterfaceOrientation:")] bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation orientation); } @@ -1151,7 +1182,7 @@ interface MPMusicPlayerController : MPMediaPlayback { MPMusicPlayerApplicationController ApplicationQueuePlayer { get; } [Static, Export ("iPodMusicPlayer")] - [Availability (Deprecated = Platform.iOS_8_0, Message="Use SystemMusicPlayer starting with iOS 8.0")] + [Availability (Deprecated = Platform.iOS_8_0, Message="Use 'SystemMusicPlayer' instead.")] MPMusicPlayerController iPodMusicPlayer { get; } [iOS (8,0)] @@ -1167,7 +1198,7 @@ interface MPMusicPlayerController : MPMediaPlayback { [Export ("shuffleMode")] MPMusicShuffleMode ShuffleMode { get; set; } - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use MPVolumeView for volume control instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use 'MPVolumeView' for volume control instead.")] [Export ("volume")] float Volume { get; set; } // nfloat, not CGFloat @@ -1402,6 +1433,12 @@ interface MPNowPlayingInfoCenter { [Field ("MPNowPlayingInfoPropertyExternalUserProfileIdentifier")] NSString PropertyExternalUserProfileIdentifier { get; } + [iOS (11,0)] + [TV (11,0)] + [Mac (10,13, onlyOn64: true)] + [Field ("MPNowPlayingInfoPropertyServiceIdentifier")] + NSString PropertyServiceIdentifier { get; } + [iOS (10,0)] [TV (10,0)] [Field ("MPNowPlayingInfoPropertyPlaybackProgress")] @@ -1419,6 +1456,7 @@ interface MPNowPlayingInfoCenter { [iOS (10,3)] [TV (10,2)] + [Mac (10,12,3, onlyOn64: true)] [Field ("MPNowPlayingInfoPropertyAssetURL")] NSString PropertyAssetUrl { get; } } @@ -1448,13 +1486,11 @@ interface MPContentItem { [Export ("title")] string Title { get; set; } - [NoMac] [iOS (10,0)] [TV (10,0)] [Export ("streamingContent")] bool StreamingContent { [Bind ("isStreamingContent")] get; set; } - [NoMac] [iOS (10,0)] [TV (10,0)] [Export ("explicitContent")] @@ -1522,7 +1558,7 @@ interface MPPlayableContentDelegate { void ContextUpdated (MPPlayableContentManager contentManager, MPPlayableContentManagerContext context); [iOS (9,0)] - [Deprecated (PlatformName.iOS, 9, 3, message: "Use InitializePlaybackQueue (MPPlayableContentManager, MPContentItem[], Action) instead")] + [Deprecated (PlatformName.iOS, 9, 3, message: "Use 'InitializePlaybackQueue (MPPlayableContentManager, MPContentItem[], Action)' instead.")] [Export ("playableContentManager:initializePlaybackQueueWithCompletionHandler:")] void InitializePlaybackQueue (MPPlayableContentManager contentManager, Action completionHandler); @@ -1590,7 +1626,7 @@ interface MPPlayableContentManagerContext { [Export ("contentLimitsEnforced")] bool ContentLimitsEnforced { get; } - [Availability (Introduced = Platform.iOS_8_4, Deprecated = Platform.iOS_9_0, Message = "Replaced by ContentLimitsEnforced")] + [Availability (Introduced = Platform.iOS_8_4, Deprecated = Platform.iOS_9_0, Message = "Replaced by 'ContentLimitsEnforced'.")] [Export ("contentLimitsEnabled")] bool ContentLimitsEnabled { get; } @@ -1662,7 +1698,6 @@ interface MPFeedbackCommand { [Export ("localizedTitle")] string LocalizedTitle { get; set; } - [NoMac] [iOS (8,2)] // added in 8.2, shown as NS_AVAILABLE_IOS(8_0) [Export ("localizedShortTitle")] string LocalizedShortTitle { get; set; } @@ -2094,5 +2129,61 @@ interface MPMusicPlayerApplicationController [Export ("performQueueTransaction:completionHandler:")] void Perform (Action queueTransaction, Action completionHandler); } + + [NoTV][NoMac] + [iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface MPMusicPlayerPlayParameters : NSSecureCoding { + [Export ("initWithDictionary:")] + IntPtr Constructor (NSDictionary dictionary); + + [Export ("dictionary", ArgumentSemantic.Copy)] + NSDictionary Dictionary { get; } + } + + [NoTV][NoMac] + [iOS (11,0)] + [BaseType (typeof (MPMusicPlayerQueueDescriptor))] + [DisableDefaultCtor] + interface MPMusicPlayerPlayParametersQueueDescriptor { + [Export ("initWithPlayParametersQueue:")] + IntPtr Constructor (MPMusicPlayerPlayParameters[] playParametersQueue); + + [Export ("playParametersQueue", ArgumentSemantic.Copy)] + MPMusicPlayerPlayParameters[] PlayParametersQueue { get; set; } + + [NullAllowed, Export ("startItemPlayParameters", ArgumentSemantic.Strong)] + MPMusicPlayerPlayParameters StartItemPlayParameters { get; set; } + + [Export ("setStartTime:forItemWithPlayParameters:")] + void SetStartTime (/* NSTimeInterval */ double startTime, MPMusicPlayerPlayParameters playParameters); + + [Export ("setEndTime:forItemWithPlayParameters:")] + void SetEndTime (/* NSTimeInterval */ double endTime, MPMusicPlayerPlayParameters playParameters); + } + + interface IMPSystemMusicPlayerController {} + + [NoTV][NoMac] + [iOS (11,0)] + [Protocol] + interface MPSystemMusicPlayerController { + [Abstract] + [Export ("openToPlayQueueDescriptor:")] + void OpenToPlay (MPMusicPlayerQueueDescriptor queueDescriptor); + } + + [Category] + [BaseType (typeof (NSUserActivity))] + [TV (10,0,1)][iOS (10,1)] + [NoWatch][NoMac] + interface NSUserActivity_MediaPlayerAdditions { + [NullAllowed, Export ("externalMediaContentIdentifier")] + NSString GetExternalMediaContentIdentifier (); + + [NullAllowed, Export ("setExternalMediaContentIdentifier:")] + void SetExternalMediaContentIdentifier (NSString identifier); + } #endif } diff --git a/src/messages.cs b/src/messages.cs index 1f2c10b9bf1f..ea2058432c63 100644 --- a/src/messages.cs +++ b/src/messages.cs @@ -22,7 +22,8 @@ namespace XamCore.Messages { public enum MSMessagesAppPresentationStyle : nuint { Compact, - Expanded + Expanded, + Transcript, } [iOS (10,0)] @@ -38,6 +39,7 @@ public enum MSStickerSize : nint [ErrorDomain ("MSMessagesErrorDomain")] public enum MSMessageErrorCode : nint { + Unknown = -1, FileNotFound = 1, FileUnreadable, ImproperFileType, @@ -46,11 +48,23 @@ public enum MSMessageErrorCode : nint StickerFileImproperFileSize, StickerFileImproperFileFormat, UrlExceedsMaxSize, + SendWithoutRecentInteraction, + SendWhileNotVisible, + } + + [iOS (11,0)] + [Protocol] + interface MSMessagesAppTranscriptPresentation + { + [iOS (11,0)] + [Abstract] + [Export ("contentSizeThatFits:")] + CGSize GetContentSizeThatFits (CGSize size); } [iOS (10,0)] [BaseType (typeof(UIViewController))] - interface MSMessagesAppViewController + interface MSMessagesAppViewController : MSMessagesAppTranscriptPresentation { // inlined ctor [Export ("initWithNibName:bundle:")] @@ -130,6 +144,26 @@ interface MSConversation [Export ("insertAttachment:withAlternateFilename:completionHandler:")] [Async] void InsertAttachment (NSUrl url, [NullAllowed] string filename, [NullAllowed] Action completionHandler); + + [iOS (11,0)] + [Export ("sendMessage:completionHandler:")] + [Async] + void SendMessage (MSMessage message, [NullAllowed] Action completionHandler); + + [iOS (11,0)] + [Export ("sendSticker:completionHandler:")] + [Async] + void SendSticker (MSSticker sticker, [NullAllowed] Action completionHandler); + + [iOS (11,0)] + [Export ("sendText:completionHandler:")] + [Async] + void SendText (string text, [NullAllowed] Action completionHandler); + + [iOS (11,0)] + [Export ("sendAttachment:withAlternateFilename:completionHandler:")] + [Async] + void SendAttachment (NSUrl url, [NullAllowed] string filename, [NullAllowed] Action completionHandler); } [iOS (10,0)] @@ -144,6 +178,10 @@ interface MSMessage : NSCopying, NSSecureCoding [NullAllowed, Export ("session")] MSSession Session { get; } + [iOS (11,0)] + [Export ("pending")] + bool Pending { [Bind ("isPending")] get; } + [Export ("senderParticipantIdentifier")] NSUuid SenderParticipantIdentifier { get; } @@ -309,5 +347,18 @@ interface MSStickerBrowserViewController : MSStickerBrowserViewDataSource [Export ("stickerSize")] MSStickerSize StickerSize { get; } } + + [iOS (11,0)] + [BaseType (typeof(MSMessageLayout))] + [DisableDefaultCtor] + interface MSMessageLiveLayout + { + [Export ("initWithAlternateLayout:")] + [DesignatedInitializer] + IntPtr Constructor (MSMessageTemplateLayout alternateLayout); + + [Export ("alternateLayout")] + MSMessageTemplateLayout AlternateLayout { get; } + } } #endif // !MONOMAC diff --git a/src/messageui.cs b/src/messageui.cs index adf00e9680dd..9b391d206f78 100644 --- a/src/messageui.cs +++ b/src/messageui.cs @@ -46,6 +46,10 @@ interface MFMailComposeViewController : UIAppearance { [Export ("addAttachmentData:mimeType:fileName:")] void AddAttachmentData (NSData attachment, string mimeType, string fileName); + + [iOS (11,0)] + [Export ("setPreferredSendingEmailAddress:")] + void SetPreferredSendingEmailAddress (string emailAddress); } #if XAMCORE_3_0 diff --git a/src/metal.cs b/src/metal.cs index 7a41af66efe3..6ce8f7226603 100644 --- a/src/metal.cs +++ b/src/metal.cs @@ -24,11 +24,14 @@ using XamCore.ObjCRuntime; namespace XamCore.Metal { - delegate void MTLDeallocator (IntPtr pointer, nuint length); delegate void MTLNewComputePipelineStateWithReflectionCompletionHandler (IMTLComputePipelineState computePipelineState, MTLComputePipelineReflection reflection, NSError error); - + + delegate void MTLDrawablePresentedHandler (IMTLDrawable drawable); + + delegate void MTLNewRenderPipelineStateWithReflectionCompletionHandler (IMTLRenderPipelineState renderPipelineState, MTLRenderPipelineReflection reflection, NSError error); + interface IMTLCommandEncoder {} [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -77,13 +80,17 @@ interface MTLArgument { [Export ("isDepthTexture")] bool IsDepthTexture { get; } - [iOS (10, 0), TV (10,0), NoWatch, NoMac] + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] [Export ("arrayLength")] nuint ArrayLength { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] + [NullAllowed, Export ("bufferPointerType")] + MTLPointerType BufferPointerType { get; } } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] - [BaseType (typeof (NSObject))] + [BaseType (typeof (MTLType))] interface MTLArrayType { [Export ("arrayLength")] nuint Length { get; } @@ -99,6 +106,18 @@ interface MTLArrayType { [Export ("elementArrayType")] MTLArrayType ElementArrayType (); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Export ("argumentIndexStride")] + nuint ArgumentIndexStride { get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [NullAllowed, Export ("elementTextureReferenceType")] + MTLTextureReferenceType ElementTextureReferenceType { get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [NullAllowed, Export ("elementPointerType")] + MTLPointerType ElementPointerType { get; } } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -136,10 +155,11 @@ partial interface MTLBuffer : MTLResource { #if MONOMAC [Abstract, Export ("didModifyRange:")] void DidModify (NSRange range); -#else +#endif + [Mac (10,13, onlyOn64: true)] + [return: NullAllowed] [Abstract, Export ("newTextureWithDescriptor:offset:bytesPerRow:")] IMTLTexture CreateTexture (MTLTextureDescriptor descriptor, nuint offset, nuint bytesPerRow); -#endif [iOS (10,0), TV (10,0), NoWatch, Mac (10,12)] #if XAMCORE_4_0 @@ -239,6 +259,7 @@ partial interface MTLCommandBuffer { [Abstract] #endif [Export ("parallelRenderCommandEncoderWithDescriptor:")] + [return: NullAllowed] IMTLParallelRenderCommandEncoder CreateParallelRenderCommandEncoder (MTLRenderPassDescriptor renderPassDescriptor); #if XAMCORE_2_0 @@ -293,6 +314,20 @@ partial interface MTLCommandBuffer { [iOS (10,3)][TV (10,2)][Mac (10,12,4, onlyOn64 : true)] [Export ("GPUEndTime")] double /* CFTimeInterval */ GpuEndTime { get; } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] // @required but we can't add abstract members in C# and keep binary compatibility +#endif + [Export ("pushDebugGroup:")] + void PushDebugGroup (string @string); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] // @required but we can't add abstract members in C# and keep binary compatibility +#endif + [Export ("popDebugGroup")] + void PopDebugGroup (); } interface IMTLCommandQueue {} @@ -309,12 +344,15 @@ partial interface MTLCommandQueue { [Abstract, Export ("commandBuffer")] [Autorelease] + [return: NullAllowed] IMTLCommandBuffer CommandBuffer (); [Abstract, Export ("commandBufferWithUnretainedReferences")] [Autorelease] + [return: NullAllowed] IMTLCommandBuffer CommandBufferWithUnretainedReferences (); + [Availability (Deprecated = Platform.iOS_11_0 | Platform.Mac_10_13, Message = "Use 'MTLCaptureScope' instead.")] [Abstract, Export ("insertDebugCaptureBoundary")] void InsertDebugCaptureBoundary (); } @@ -397,19 +435,62 @@ partial interface MTLComputeCommandEncoder : MTLCommandEncoder { [Export ("setStageInRegion:")] void SetStage (MTLRegion region); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] #if XAMCORE_4_0 [Abstract] #endif [Export ("updateFence:")] void Update (IMTLFence fence); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] #if XAMCORE_4_0 [Abstract] #endif [Export ("waitForFence:")] void Wait (IMTLFence fence); + + [Mac (10,13, onlyOn64: true)] + [iOS (11,0), NoTV] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("dispatchThreads:threadsPerThreadgroup:")] + void DispatchThreads (MTLSize threadsPerGrid, MTLSize threadsPerThreadgroup); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useResource:usage:")] + void UseResource (IMTLResource resource, MTLResourceUsage usage); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useResources:count:usage:")] + void UseResources (IMTLResource[] resources, nuint count, MTLResourceUsage usage); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useHeap:")] + void UseHeap (IMTLHeap heap); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useHeaps:count:")] + void UseHeaps (IMTLHeap[] heaps, nuint count); + + [iOS (11,0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setImageblockWidth:height:")] + void SetImageblock (nuint width, nuint height); } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -435,6 +516,27 @@ partial interface MTLComputePipelineState { [Abstract, Export ("threadExecutionWidth")] nuint ThreadExecutionWidth { get; } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [NullAllowed, Export ("label")] + string Label { get; } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("staticThreadgroupMemoryLength")] + nuint StaticThreadgroupMemoryLength { get; } + + [iOS (11,0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("imageblockMemoryLengthForDimensions:")] + nuint GetImageblockMemoryLength (MTLSize imageblockDimensions); } interface IMTLBlitCommandEncoder {} @@ -485,14 +587,14 @@ partial interface MTLBlitCommandEncoder : MTLCommandEncoder { [Abstract, Export ("copyFromBuffer:sourceOffset:toBuffer:destinationOffset:size:")] void CopyFromBuffer (IMTLBuffer sourceBuffer, nuint sourceOffset, IMTLBuffer destinationBuffer, nuint destinationOffset, nuint size); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] #if XAMCORE_4_0 [Abstract] #endif [Export ("updateFence:")] void Update (IMTLFence fence); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] #if XAMCORE_4_0 [Abstract] #endif @@ -502,7 +604,7 @@ partial interface MTLBlitCommandEncoder : MTLCommandEncoder { interface IMTLFence {} - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] [Protocol] // From Apple Docs: Your app does not define classes that implement this protocol. Model is not needed interface MTLFence { @@ -562,49 +664,66 @@ partial interface MTLDevice { [Export ("depth24Stencil8PixelFormatSupported")] bool Depth24Stencil8PixelFormatSupported { [Bind ("isDepth24Stencil8PixelFormatSupported")] get; } - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13)] #if XAMCORE_4_0 [Abstract] #endif [Export ("heapTextureSizeAndAlignWithDescriptor:")] MTLSizeAndAlign GetHeapTextureSizeAndAlign (MTLTextureDescriptor desc); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10, 13)] #if XAMCORE_4_0 [Abstract] #endif [Export ("heapBufferSizeAndAlignWithLength:options:")] MTLSizeAndAlign GetHeapBufferSizeAndAlignWithLength (nuint length, MTLResourceOptions options); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10, 13)] #if XAMCORE_4_0 [Abstract] #endif [Export ("newHeapWithDescriptor:")] + [return: NullAllowed] IMTLHeap CreateHeap (MTLHeapDescriptor descriptor); [Abstract, Export ("newCommandQueue")] + [return: NullAllowed] IMTLCommandQueue CreateCommandQueue (); [Abstract, Export ("newCommandQueueWithMaxCommandBufferCount:")] + [return: NullAllowed] IMTLCommandQueue CreateCommandQueue (nuint maxCommandBufferCount); [Abstract, Export ("newBufferWithLength:options:")] + [return: NullAllowed] IMTLBuffer CreateBuffer (nuint length, MTLResourceOptions options); [Abstract, Export ("newBufferWithBytes:length:options:")] + [return: NullAllowed] IMTLBuffer CreateBuffer (IntPtr pointer, nuint length, MTLResourceOptions options); [Abstract, Export ("newBufferWithBytesNoCopy:length:options:deallocator:")] + [return: NullAllowed] IMTLBuffer CreateBufferNoCopy (IntPtr pointer, nuint length, MTLResourceOptions options, MTLDeallocator deallocator); [Abstract, Export ("newDepthStencilStateWithDescriptor:")] + [return: NullAllowed] IMTLDepthStencilState CreateDepthStencilState (MTLDepthStencilDescriptor descriptor); [Abstract, Export ("newTextureWithDescriptor:")] + [return: NullAllowed] IMTLTexture CreateTexture (MTLTextureDescriptor descriptor); +#if XAMCORE_4_0 + [Abstract] +#endif + [iOS (11,0), TV (11,0), NoWatch, Mac (10,11)] + [return: NullAllowed] + [Export ("newTextureWithDescriptor:iosurface:plane:")] + IMTLTexture CreateTexture (MTLTextureDescriptor descriptor, XamCore.IOSurface.IOSurface iosurface, nuint plane); + [Abstract, Export ("newSamplerStateWithDescriptor:")] + [return: NullAllowed] IMTLSamplerState CreateSamplerState (MTLSamplerDescriptor descriptor); [Abstract, Export ("newDefaultLibrary")] @@ -682,7 +801,7 @@ partial interface MTLDevice { [Export ("newComputePipelineStateWithDescriptor:options:completionHandler:")] void CreateComputePipelineState (MTLComputePipelineDescriptor descriptor, MTLPipelineOption options, MTLNewComputePipelineStateWithReflectionCompletionHandler completionHandler); - [iOS (10, 0), TV (10,0), NoWatch, NoMac] + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13)] #if XAMCORE_4_0 [Abstract] #endif @@ -699,6 +818,124 @@ partial interface MTLDevice { #endif [Export ("supportsTextureSampleCount:")] bool SupportsTextureSampleCount (nuint sampleCount); + + [Mac (10, 13), NoiOS, NoWatch, NoTV] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("removable")] + bool Removable { [Bind ("isRemovable")] get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("readWriteTextureSupport")] + MTLReadWriteTextureTier ReadWriteTextureSupport { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("argumentBuffersSupport")] + MTLArgumentBuffersTier ArgumentBuffersSupport { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("rasterOrderGroupsSupported")] + bool RasterOrderGroupsSupported { [Bind ("areRasterOrderGroupsSupported")] get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("newLibraryWithURL:error:")] + [return: NullAllowed] + IMTLLibrary CreateLibrary (NSUrl url, [NullAllowed] out NSError error); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("minimumLinearTextureAlignmentForPixelFormat:")] + nuint GetMinimumLinearTextureAlignment (MTLPixelFormat format); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("maxThreadgroupMemoryLength")] + nuint MaxThreadgroupMemoryLength { get; } + +[Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("programmableSamplePositionsSupported")] + bool ProgrammableSamplePositionsSupported { [Bind ("areProgrammableSamplePositionsSupported")] get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("getDefaultSamplePositions:count:")] + void GetDefaultSamplePositions (IntPtr positions, nuint count); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("newArgumentEncoderWithArguments:")] + [return: NullAllowed] + IMTLArgumentEncoder CreateArgumentEncoder (MTLArgumentDescriptor[] arguments); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("registryID")] + ulong RegistryId { get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("currentAllocatedSize")] + nuint CurrentAllocatedSize { get; } + +#if false // https://bugzilla.xamarin.com/show_bug.cgi?id=59342 + [Mac (10,13, onlyOn64: true), NoiOS, NoTV, NoWatch] + [Notification] + [Field ("MTLDeviceWasAddedNotification")] + NSString DeviceWasAdded { get; } + + [Mac (10,13, onlyOn64: true), NoiOS, NoTV, NoWatch] + [Notification] + [Field ("MTLDeviceRemovalRequestedNotification")] + NSString DeviceRemovalRequested { get; } + + [Mac (10,13, onlyOn64: true), NoiOS, NoTV, NoWatch] + [Notification] + [Field ("MTLDeviceWasRemovedNotification")] + NSString DeviceWasRemoved { get; } +#endif + + [iOS (11,0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("newRenderPipelineStateWithTileDescriptor:options:reflection:error:")] + [return: NullAllowed] + IMTLRenderPipelineState CreateRenderPipelineState (MTLTileRenderPipelineDescriptor descriptor, MTLPipelineOption options, [NullAllowed] out MTLRenderPipelineReflection reflection, [NullAllowed] out NSError error); + + [iOS (11,0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("newRenderPipelineStateWithTileDescriptor:options:completionHandler:")] + void CreateRenderPipelineState (MTLTileRenderPipelineDescriptor descriptor, MTLPipelineOption options, MTLNewRenderPipelineStateWithReflectionCompletionHandler completionHandler); } interface IMTLDrawable {} @@ -824,6 +1061,7 @@ partial interface MTLTexture : MTLResource { bool FramebufferOnly { [Bind ("isFramebufferOnly")] get; } [Abstract, Export ("newTextureViewWithPixelFormat:")] + [return: NullAllowed] IMTLTexture CreateTextureView (MTLPixelFormat pixelFormat); #if XAMCORE_4_0 @@ -836,6 +1074,7 @@ partial interface MTLTexture : MTLResource { [Abstract] #endif [Export ("newTextureViewWithPixelFormat:textureType:levels:slices:")] + [return: NullAllowed] IMTLTexture CreateTextureView (MTLPixelFormat pixelFormat, MTLTextureType textureType, NSRange levelRange, NSRange sliceRange); #if XAMCORE_2_0 @@ -861,6 +1100,20 @@ partial interface MTLTexture : MTLResource { #endif [Export ("replaceRegion:mipmapLevel:withBytes:bytesPerRow:")] void ReplaceRegion (MTLRegion region, nuint level, IntPtr pixelBytes, nuint bytesPerRow); + + [Mac (10, 11), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [NullAllowed, Export ("iosurface")] + XamCore.IOSurface.IOSurface IOSurface { get; } + + [Mac (10, 11), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("iosurfacePlane")] + nuint IOSurfacePlane { get; } } @@ -966,6 +1219,10 @@ partial interface MTLSamplerDescriptor : NSCopying { // /SourceCache/AcceleratorKit/AcceleratorKit-14.9/Framework/MTLSampler.m:240: failed assertion `label must not be nil.' [Export ("label")] string Label { get; set; } + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] + [Export ("supportArgumentBuffers")] + bool SupportArgumentBuffers { get; set; } } interface IMTLSamplerState {} @@ -1055,6 +1312,18 @@ partial interface MTLRenderPipelineDescriptor : NSCopying { [iOS (10, 0), TV (10,0), NoWatch, Mac (10,12)] [Export ("tessellationOutputWindingOrder", ArgumentSemantic.Assign)] MTLWinding TessellationOutputWindingOrder { get; set; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Export ("vertexBuffers")] + MTLPipelineBufferDescriptorArray VertexBuffers { get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Export ("fragmentBuffers")] + MTLPipelineBufferDescriptorArray FragmentBuffers { get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Export ("rasterSampleCount")] + nuint RasterSampleCount { get; set; } } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -1079,6 +1348,35 @@ partial interface MTLRenderPipelineState { [Abstract, Export ("device")] IMTLDevice Device { get; } + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("maxTotalThreadsPerThreadgroup")] + nuint MaxTotalThreadsPerThreadgroup { get; } + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("threadgroupSizeMatchesTileSize")] + bool ThreadgroupSizeMatchesTileSize { get; } + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("imageblockSampleLength")] + nuint ImageblockSampleLength { get; } + + [iOS (11,0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("imageblockMemoryLengthForDimensions:")] + nuint GetImageblockMemoryLength (MTLSize imageblockDimensions); + } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -1304,6 +1602,20 @@ partial interface MTLFunction { #endif [Export ("functionConstantsDictionary")] NSDictionary FunctionConstants { get; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("newArgumentEncoderWithBufferIndex:")] + IMTLArgumentEncoder CreateArgumentEncoder (nuint bufferIndex); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("newArgumentEncoderWithBufferIndex:reflection:")] + IMTLArgumentEncoder CreateArgumentEncoder (nuint bufferIndex, [NullAllowed] out MTLArgument reflection); } interface IMTLLibrary {} @@ -1406,10 +1718,22 @@ interface MTLStructMember { [Export ("arrayType")] MTLArrayType ArrayType (); #endif + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] + [Export ("argumentIndex")] + nuint ArgumentIndex { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] + [NullAllowed, Export ("textureReferenceType")] + MTLTextureReferenceType TextureReferenceType { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] + [NullAllowed, Export ("pointerType")] + MTLPointerType PointerType { get; } } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] - [BaseType (typeof (NSObject))] + [BaseType (typeof (MTLType))] interface MTLStructType { [Export ("members")] MTLStructMember [] Members { get; } @@ -1466,6 +1790,7 @@ interface MTLParallelRenderCommandEncoder : MTLCommandEncoder { [Abstract] [Export ("renderCommandEncoder")] [Autorelease] + [return: NullAllowed] IMTLRenderCommandEncoder CreateRenderCommandEncoder (); [iOS (10,0), TV (10,0), NoWatch, Mac (10,12)] @@ -1488,6 +1813,27 @@ interface MTLParallelRenderCommandEncoder : MTLCommandEncoder { #endif [Export ("setStencilStoreAction:")] void SetStencilStoreAction (MTLStoreAction storeAction); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setColorStoreActionOptions:atIndex:")] + void SetColorStoreActionOptions (MTLStoreActionOptions storeActionOptions, nuint colorAttachmentIndex); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setDepthStoreActionOptions:")] + void SetDepthStoreActionOptions (MTLStoreActionOptions storeActionOptions); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setStencilStoreActionOptions:")] + void SetStencilStoreActionOptions (MTLStoreActionOptions storeActionOptions); } interface IMTLRenderCommandEncoder {} @@ -1520,9 +1866,7 @@ partial interface MTLRenderCommandEncoder : MTLCommandEncoder { [Abstract, Export ("setCullMode:")] void SetCullMode (MTLCullMode cullMode); - [Mac (10,11, onlyOn64 : true)] - [NoTV] - [NoiOS] // it was [iOS (9,0)] but now it's marked as not available on iOS in Xcode 8 + [Mac (10,11, onlyOn64 : true), TV (11,0), iOS (11,0), NoWatch] #if XAMCORE_4_0 // Apple added a new required member in iOS 9, but that breaks our binary compat, so we can't do that in our existing code. [Abstract] @@ -1686,14 +2030,14 @@ partial interface MTLRenderCommandEncoder : MTLCommandEncoder { [Export ("textureBarrier")] void TextureBarrier (); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13)] #if XAMCORE_4_0 [Abstract] #endif [Export ("updateFence:afterStages:")] void Update (IMTLFence fence, MTLRenderStages stages); - [iOS (10,0), TV (10,0), NoWatch, NoMac] + [iOS (10,0), TV (10,0), NoWatch, Mac (10,13)] #if XAMCORE_4_0 [Abstract] #endif @@ -1741,6 +2085,167 @@ partial interface MTLRenderCommandEncoder : MTLCommandEncoder { #endif [Export ("drawIndexedPatches:patchIndexBuffer:patchIndexBufferOffset:controlPointIndexBuffer:controlPointIndexBufferOffset:indirectBuffer:indirectBufferOffset:")] void DrawIndexedPatches (nuint numberOfPatchControlPoints, [NullAllowed] IMTLBuffer patchIndexBuffer, nuint patchIndexBufferOffset, IMTLBuffer controlPointIndexBuffer, nuint controlPointIndexBufferOffset, IMTLBuffer indirectBuffer, nuint indirectBufferOffset); + + [Mac (10,13), NoiOS, NoTV, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setViewports:count:")] + void SetViewports (IntPtr viewports, nuint count); + + [Mac (10,13), NoiOS, NoTV, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setScissorRects:count:")] + void SetScissorRects (IntPtr scissorRects, nuint count); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setColorStoreActionOptions:atIndex:")] + void SetColorStoreActionOptions (MTLStoreActionOptions storeActionOptions, nuint colorAttachmentIndex); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setDepthStoreActionOptions:")] + void SetDepthStoreActionOptions (MTLStoreActionOptions storeActionOptions); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setStencilStoreActionOptions:")] + void SetStencilStoreActionOptions (MTLStoreActionOptions storeActionOptions); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useResource:usage:")] + void UseResource (IMTLResource resource, MTLResourceUsage usage); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useResources:count:usage:")] + void UseResources (IMTLResource[] resources, nuint count, MTLResourceUsage usage); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useHeap:")] + void UseHeap (IMTLHeap heap); + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("useHeaps:count:")] + void UseHeaps (IMTLHeap[] heaps, nuint count); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("tileWidth")] + nuint TileWidth { get; } + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("tileHeight")] + nuint TileHeight { get; } + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileBytes:length:atIndex:")] + void SetTileBytes (IntPtr /* void* */ bytes, nuint length, nuint index); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileBuffer:offset:atIndex:")] + void SetTileBuffer ([NullAllowed] IMTLBuffer buffer, nuint offset, nuint index); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileBufferOffset:atIndex:")] + void SetTileBufferOffset (nuint offset, nuint index); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileBuffers:offsets:withRange:")] + void SetTileBuffers (IMTLBuffer[] buffers, IntPtr offsets, NSRange range); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileTexture:atIndex:")] + void SetTileTexture ([NullAllowed] IMTLTexture texture, nuint index); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileTextures:withRange:")] + void SetTileTextures (IMTLTexture[] textures, NSRange range); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileSamplerState:atIndex:")] + void SetTileSamplerState ([NullAllowed] IMTLSamplerState sampler, nuint index); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileSamplerStates:withRange:")] + void SetTileSamplerStates (IMTLSamplerState[] samplers, NSRange range); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileSamplerState:lodMinClamp:lodMaxClamp:atIndex:")] + void SetTileSamplerState ([NullAllowed] IMTLSamplerState sampler, float lodMinClamp, float lodMaxClamp, nuint index); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setTileSamplerStates:lodMinClamps:lodMaxClamps:withRange:")] + void SetTileSamplerStates (IMTLSamplerState[] samplers, IntPtr /* float[] */ lodMinClamps, IntPtr /* float[] */ lodMaxClamps, NSRange range); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("dispatchThreadsPerTile:")] + void DispatchThreadsPerTile (MTLSize threadsPerTile); + + [iOS (11, 0), NoTV, NoMac, NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("setThreadgroupMemoryLength:offset:atIndex:")] + void SetThreadgroupMemoryLength (nuint length, nuint offset, nuint index); } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -1791,6 +2296,10 @@ interface MTLRenderPipelineReflection { #else NSObject [] FragmentArguments { get; } #endif + + [iOS (11, 0), NoTV, NoMac, NoWatch] + [NullAllowed, Export ("tileArguments")] + MTLArgument[] TileArguments { get; } } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -1828,6 +2337,10 @@ interface MTLRenderPassAttachmentDescriptor : NSCopying { [Export ("storeAction")] MTLStoreAction StoreAction { get; set; } + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] + [Export ("storeActionOptions", ArgumentSemantic.Assign)] + MTLStoreActionOptions StoreActionOptions { get; set; } } [iOS (8,0)][Mac (10,11, onlyOn64 : true)] @@ -1893,10 +2406,46 @@ interface MTLRenderPassDescriptor : NSCopying { [NoTV] [Export ("renderTargetArrayLength")] nuint RenderTargetArrayLength { get; set; } + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Export ("setSamplePositions:count:")] + unsafe void SetSamplePositions ([NullAllowed] IntPtr positions, nuint count); + + [Mac (10,13), iOS (11,0), TV (11,0), NoWatch] + [Export ("getSamplePositions:count:")] + nuint GetSamplePositions ([NullAllowed] IntPtr positions, nuint count); + + [iOS (11, 0), NoTV, NoWatch, NoMac] + [Export ("imageblockSampleLength")] + nuint ImageblockSampleLength { get; set; } + + [iOS (11, 0), NoTV, NoWatch, NoMac] + [Export ("threadgroupMemoryLength")] + nuint ThreadgroupMemoryLength { get; set; } + + [iOS (11, 0), NoTV, NoWatch, NoMac] + [Export ("tileWidth")] + nuint TileWidth { get; set; } + + [iOS (11, 0), NoTV, NoWatch, NoMac] + [Export ("tileHeight")] + nuint TileHeight { get; set; } + + [iOS (11, 0), NoTV, NoWatch, NoMac] + [Export ("defaultRasterSampleCount")] + nuint DefaultRasterSampleCount { get; set; } + + [iOS (11, 0), NoTV, NoWatch, NoMac] + [Export ("renderTargetWidth")] + nuint RenderTargetWidth { get; set; } + + [iOS (11, 0), NoTV, NoWatch, NoMac] + [Export ("renderTargetHeight")] + nuint RenderTargetHeight { get; set; } } - [iOS (10, 0), TV (10,0), NoWatch, NoMac] + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] [BaseType (typeof(NSObject))] // note: type works only on devices, symbol is missing on the simulator interface MTLHeapDescriptor : NSCopying @@ -1911,7 +2460,7 @@ interface MTLHeapDescriptor : NSCopying MTLCpuCacheMode CpuCacheMode { get; set; } } - [iOS (10, 0), TV (10,0), NoWatch, NoMac] + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13, onlyOn64: true)] [Protocol] // From Apple Docs: Your app does not define classes that implement this protocol. Model is not needed interface MTLHeap { @@ -1954,6 +2503,13 @@ interface MTLHeap [Abstract] [Export ("setPurgeableState:")] MTLPurgeableState SetPurgeableState (MTLPurgeableState state); + + [Mac (10, 13), iOS (11,0), TV (11,0), NoWatch] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("currentAllocatedSize")] + nuint CurrentAllocatedSize { get; } } interface IMTLResource {} @@ -1981,26 +2537,33 @@ partial interface MTLResource { [Abstract, Export ("setPurgeableState:")] MTLPurgeableState SetPurgeableState (MTLPurgeableState state); - [iOS (10, 0), TV (10,0), NoWatch, NoMac] + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13)] #if XAMCORE_4_0 [Abstract] #endif [NullAllowed, Export ("heap")] IMTLHeap Heap { get; } - [iOS (10, 0), TV (10,0), NoWatch, NoMac] + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13)] #if XAMCORE_4_0 [Abstract] #endif [Export ("makeAliasable")] void MakeAliasable (); - [iOS (10, 0), TV (10,0), NoWatch, NoMac] + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13)] #if XAMCORE_4_0 [Abstract] #endif [Export ("isAliasable")] bool IsAliasable { get; } + + [iOS (10, 0), TV (10,0), NoWatch, Mac (10,13)] +#if XAMCORE_4_0 + [Abstract] +#endif + [Export ("allocatedSize")] + nuint AllocatedSize { get; } } [iOS (9,0)][Mac (10,11, onlyOn64: true)] @@ -2025,6 +2588,10 @@ interface MTLComputePipelineDescriptor : NSCopying { [iOS (10, 0), TV (10,0), NoWatch, Mac (10,12)] [NullAllowed, Export ("stageInputDescriptor", ArgumentSemantic.Copy)] MTLStageInputOutputDescriptor StageInputDescriptor { get; set; } + + [Mac (10, 13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [Export ("buffers")] + MTLPipelineBufferDescriptorArray Buffers { get; } } [iOS (10,0), TV (10,0), NoWatch, Mac (10,12, onlyOn64 : true)] @@ -2050,5 +2617,277 @@ interface MTLStageInputOutputDescriptor : NSCopying [Export ("reset")] void Reset (); } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [BaseType (typeof(NSObject))] + interface MTLType + { + [Export ("dataType")] + MTLDataType DataType { get; } + } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [BaseType (typeof(MTLType))] + interface MTLPointerType + { + [Export ("elementType")] + MTLDataType ElementType { get; } + + [Export ("access")] + MTLArgumentAccess Access { get; } + + [Export ("alignment")] + nuint Alignment { get; } + + [Export ("dataSize")] + nuint DataSize { get; } + + [Export ("elementIsArgumentBuffer")] + bool ElementIsArgumentBuffer { get; } + + [NullAllowed, Export ("elementStructType")] + MTLStructType ElementStructType { get; } + + [NullAllowed, Export ("elementArrayType")] + MTLArrayType ElementArrayType { get; } + } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [BaseType (typeof(MTLType))] + interface MTLTextureReferenceType + { + [Export ("textureDataType")] + MTLDataType TextureDataType { get; } + + [Export ("textureType")] + MTLTextureType TextureType { get; } + + [Export ("access")] + MTLArgumentAccess Access { get; } + + [Export ("isDepthTexture")] + bool IsDepthTexture { get; } + } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + interface IMTLCaptureScope { } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface MTLCaptureScope + { + [Abstract] + [Export ("beginScope")] + void BeginScope (); + + [Abstract] + [Export ("endScope")] + void EndScope (); + + [Abstract] + [NullAllowed, Export ("label")] + string Label { get; set; } + + [Abstract] + [Export ("device")] + IMTLDevice Device { get; } + + [Abstract] + [NullAllowed, Export ("commandQueue")] + IMTLCommandQueue CommandQueue { get; } + } + + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface MTLCaptureManager + { + [Static] + [Export ("sharedCaptureManager")] + MTLCaptureManager Shared { get; } + + [Export ("newCaptureScopeWithDevice:")] + IMTLCaptureScope CreateNewCaptureScope (IMTLDevice device); + + [Export ("newCaptureScopeWithCommandQueue:")] + IMTLCaptureScope CreateNewCaptureScope (IMTLCommandQueue commandQueue); + + [Export ("startCaptureWithDevice:")] + void StartCapture (IMTLDevice device); + + [Export ("startCaptureWithCommandQueue:")] + void StartCapture (IMTLCommandQueue commandQueue); + + [Export ("startCaptureWithScope:")] + void StartCapture (IMTLCaptureScope captureScope); + + [Export ("stopCapture")] + void StopCapture (); + + [NullAllowed, Export ("defaultCaptureScope", ArgumentSemantic.Strong)] + IMTLCaptureScope DefaultCaptureScope { get; set; } + + [Export ("isCapturing")] + bool IsCapturing { get; } + } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [BaseType (typeof(NSObject))] + interface MTLPipelineBufferDescriptor : NSCopying + { + [Export ("mutability", ArgumentSemantic.Assign)] + MTLMutability Mutability { get; set; } + } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [BaseType (typeof(NSObject))] + interface MTLPipelineBufferDescriptorArray + { + [Internal] + [Export ("objectAtIndexedSubscript:")] + MTLPipelineBufferDescriptor GetObject (nuint bufferIndex); + + [Internal] + [Export ("setObject:atIndexedSubscript:")] + void SetObject ([NullAllowed] MTLPipelineBufferDescriptor buffer, nuint bufferIndex); + } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [BaseType (typeof(NSObject))] + interface MTLArgumentDescriptor : NSCopying + { + [Static] + [Export ("argumentDescriptor")] + MTLArgumentDescriptor Create (); + + [Export ("dataType", ArgumentSemantic.Assign)] + MTLDataType DataType { get; set; } + + [Export ("index")] + nuint Index { get; set; } + + [Export ("arrayLength")] + nuint ArrayLength { get; set; } + + [Export ("access", ArgumentSemantic.Assign)] + MTLArgumentAccess Access { get; set; } + + [Export ("textureType", ArgumentSemantic.Assign)] + MTLTextureType TextureType { get; set; } + + [Export ("constantBlockAlignment")] + nuint ConstantBlockAlignment { get; set; } + } + + interface IMTLArgumentEncoder { } + + [Mac (10,13, onlyOn64: true), iOS (11,0), TV (11,0), NoWatch] + [Protocol] + interface MTLArgumentEncoder + { + [Abstract] + [Export ("device")] + IMTLDevice Device { get; } + + [Abstract] + [NullAllowed, Export ("label")] + string Label { get; set; } + + [Abstract] + [Export ("encodedLength")] + nuint EncodedLength { get; } + + [Abstract] + [Export ("alignment")] + nuint Alignment { get; } + + [Abstract] + [Export ("setArgumentBuffer:offset:")] + void SetArgumentBuffer (IMTLBuffer argumentBuffer, nuint offset); + + [Abstract] + [Export ("setArgumentBuffer:startOffset:arrayElement:")] + void SetArgumentBuffer ([NullAllowed] IMTLBuffer argumentBuffer, nuint startOffset, nuint arrayElement); + + [Abstract] + [Export ("setBuffer:offset:atIndex:")] + void SetBuffer ([NullAllowed] IMTLBuffer buffer, nuint offset, nuint index); + + [Abstract] + [Export ("setBuffers:offsets:withRange:")] + void SetBuffers (IMTLBuffer[] buffers, IntPtr offsets, NSRange range); + + [Abstract] + [Export ("setTexture:atIndex:")] + void SetTexture ([NullAllowed] IMTLTexture texture, nuint index); + + [Abstract] + [Export ("setTextures:withRange:")] + void SetTextures (IMTLTexture[] textures, NSRange range); + + [Abstract] + [Export ("setSamplerState:atIndex:")] + void SetSamplerState ([NullAllowed] IMTLSamplerState sampler, nuint index); + + [Abstract] + [Export ("setSamplerStates:withRange:")] + void SetSamplerStates (IMTLSamplerState[] samplers, NSRange range); + + [Abstract] + [Export ("constantDataAtIndex:")] + IntPtr GetConstantData (nuint index); + + [NoTV][NoiOS] + [Abstract] + [Export ("newArgumentEncoderForBufferAtIndex:")] + [return: NullAllowed] + IMTLArgumentEncoder CreateArgumentEncoder (nuint index); + } + + [iOS (11, 0), NoTV, NoMac, NoWatch] + [BaseType (typeof (NSObject))] + interface MTLTileRenderPipelineColorAttachmentDescriptor : NSCopying { + [Export ("pixelFormat", ArgumentSemantic.Assign)] + MTLPixelFormat PixelFormat { get; set; } + } + + [iOS (11, 0), NoTV, NoMac, NoWatch] + [BaseType (typeof (NSObject))] + interface MTLTileRenderPipelineColorAttachmentDescriptorArray { + [Internal] + [Export ("objectAtIndexedSubscript:")] + MTLTileRenderPipelineColorAttachmentDescriptor GetObject (nuint attachmentIndex); + + [Internal] + [Export ("setObject:atIndexedSubscript:")] + void SetObject (MTLTileRenderPipelineColorAttachmentDescriptor attachment, nuint attachmentIndex); + } + + [iOS (11, 0), NoTV, NoMac, NoWatch] + [BaseType (typeof (NSObject))] + interface MTLTileRenderPipelineDescriptor : NSCopying { + [Export ("label")] + string Label { get; set; } + + [Export ("tileFunction", ArgumentSemantic.Strong)] + IMTLFunction TileFunction { get; set; } + + [Export ("rasterSampleCount")] + nuint RasterSampleCount { get; set; } + + [Export ("colorAttachments")] + MTLTileRenderPipelineColorAttachmentDescriptorArray ColorAttachments { get; } + + [Export ("threadgroupSizeMatchesTileSize")] + bool ThreadgroupSizeMatchesTileSize { get; set; } + + [Export ("tileBuffers")] + MTLPipelineBufferDescriptorArray TileBuffers { get; } + + [Export ("reset")] + void Reset (); + } } #endif diff --git a/src/metalperformanceshaders.cs b/src/metalperformanceshaders.cs index eda684e25943..3b3c6669be76 100644 --- a/src/metalperformanceshaders.cs +++ b/src/metalperformanceshaders.cs @@ -157,7 +157,9 @@ interface MPSImageHistogram { bool ZeroHistogram { get; set; } [Export ("histogramInfo")] - MPSImageHistogramInfo HistogramInfo { get; } + MPSImageHistogramInfo HistogramInfo { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + } // Could not initialize an instance of the type 'MetalPerformanceShaders.MPSImageHistogram': the native 'initWithDevice:' method returned nil. // [Export ("initWithDevice:")] @@ -165,6 +167,7 @@ interface MPSImageHistogram { [Export ("initWithDevice:histogramInfo:")] [DesignatedInitializer] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] IntPtr Constructor (IMTLDevice device, ref MPSImageHistogramInfo histogramInfo); [Export ("encodeToCommandBuffer:sourceTexture:histogram:histogramOffset:")] @@ -180,10 +183,13 @@ interface MPSImageHistogram { interface MPSImageHistogramEqualization { [Export ("initWithDevice:histogramInfo:")] [DesignatedInitializer] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] IntPtr Constructor (IMTLDevice device, ref MPSImageHistogramInfo histogramInfo); [Export ("histogramInfo")] - MPSImageHistogramInfo HistogramInfo { get; } + MPSImageHistogramInfo HistogramInfo { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + } [Export ("encodeTransformToCommandBuffer:sourceTexture:histogram:histogramOffset:")] void EncodeTransformToCommandBuffer (IMTLCommandBuffer commandBuffer, IMTLTexture source, IMTLBuffer histogram, nuint histogramOffset); @@ -195,10 +201,13 @@ interface MPSImageHistogramEqualization { interface MPSImageHistogramSpecification { [Export ("initWithDevice:histogramInfo:")] [DesignatedInitializer] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] IntPtr Constructor (IMTLDevice device, ref MPSImageHistogramInfo histogramInfo); [Export ("histogramInfo")] - MPSImageHistogramInfo HistogramInfo { get; } + MPSImageHistogramInfo HistogramInfo { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + } [Export ("encodeTransformToCommandBuffer:sourceTexture:sourceHistogram:sourceHistogramOffset:desiredHistogram:desiredHistogramOffset:")] void EncodeTransformToCommandBuffer (IMTLCommandBuffer commandBuffer, IMTLTexture source, IMTLBuffer sourceHistogram, nuint sourceHistogramOffset, IMTLBuffer desiredHistogram, nuint desiredHistogramOffset); @@ -510,7 +519,7 @@ interface MPSImageThresholdToZeroInverse { [iOS (9,0)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] - interface MPSKernel : NSCopying { + interface MPSKernel : NSCopying, NSSecureCoding { [Export ("options", ArgumentSemantic.Assign)] MPSKernelOptions Options { get; set; } @@ -657,7 +666,7 @@ interface MPSCnnNeuronAbsolute { [iOS (10,0)][TV (10,0)] [BaseType (typeof (NSObject), Name = "MPSCNNConvolutionDescriptor")] [DisableDefaultCtor] - interface MPSCnnConvolutionDescriptor : NSCopying { + interface MPSCnnConvolutionDescriptor : NSCopying, NSSecureCoding { [Export ("kernelWidth")] nuint KernelWidth { get; set; } diff --git a/src/modelio.cs b/src/modelio.cs index b24d398891d3..3fcdf404f98e 100644 --- a/src/modelio.cs +++ b/src/modelio.cs @@ -22,9 +22,18 @@ using Vector3i = global::OpenTK.Vector3i; using Vector4 = global::OpenTK.Vector4; using Vector4i = global::OpenTK.Vector4i; +#if XAMCORE_4_0 +using Matrix2 = global::OpenTK.NMatrix2; +using Matrix3 = global::OpenTK.NMatrix3; +using Matrix4 = global::OpenTK.NMatrix4; +#else using Matrix2 = global::OpenTK.Matrix2; using Matrix3 = global::OpenTK.Matrix3; using Matrix4 = global::OpenTK.Matrix4; +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +#endif using Quaternion = global::OpenTK.Quaternion; using MathHelper = global::OpenTK.MathHelper; #if MONOMAC @@ -124,7 +133,10 @@ interface MDLAsset : NSCopying MDLAxisAlignedBoundingBox GetBoundingBox (double atTime); [Export ("boundingBox")] - MDLAxisAlignedBoundingBox BoundingBox { get; } + MDLAxisAlignedBoundingBox BoundingBox { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } [Export ("frameInterval")] double FrameInterval { get; set; } @@ -209,10 +221,21 @@ interface MDLLightProbeIrradianceDataSource interface MDLCamera { [Export ("projectionMatrix")] +#if !XAMCORE_4_0 + [Obsolete ("Use 'ProjectionMatrix4x4' instead.")] +#endif Matrix4 ProjectionMatrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } +#if !XAMCORE_4_0 + [Sealed] + [Export ("projectionMatrix")] + MatrixFloat4x4 ProjectionMatrix4x4 { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + } +#endif + [iOS (10,0)] [Mac (10,12)] [TV (10,0)] @@ -512,8 +535,19 @@ interface MDLMaterialProperty : MDLNamed, NSCopying [Export ("initWithName:semantic:matrix4x4:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] +#if !XAMCORE_4_0 + [Obsolete ("Use the '(string, MDLMaterialSemantic, MatrixFloat4x4)' overload instead.")] +#endif IntPtr Constructor (string name, MDLMaterialSemantic semantic, Matrix4 value); + +#if !XAMCORE_4_0 + [Sealed] + [Export ("initWithName:semantic:matrix4x4:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (string name, MDLMaterialSemantic semantic, MatrixFloat4x4 value); +#endif + [Export ("initWithName:semantic:URL:")] IntPtr Constructor (string name, MDLMaterialSemantic semantic, [NullAllowed] NSUrl url); @@ -569,12 +603,24 @@ Vector4 Float4Value { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } +#if !XAMCORE_4_0 + [Obsolete ("Use 'MatrixFloat4x4' instead.")] +#endif [Export ("matrix4x4", ArgumentSemantic.Assign)] Matrix4 Matrix4x4 { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } +#if !XAMCORE_4_0 + [Sealed] + [Export ("matrix4x4", ArgumentSemantic.Assign)] + MatrixFloat4x4 MatrixFloat4x4 { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; + } +#endif + [iOS (10,0)] [Mac (10,12)] [TV (10,0)] @@ -1053,7 +1099,7 @@ interface MDLObject : MDLNamed #if XAMCORE_4_0 [Internal] #endif - [Obsolete ("Use GetComponent (Type type)")] + [Obsolete ("Use 'GetComponent (Type type)'.")] [Export ("componentConformingToProtocol:")] [return: NullAllowed] IMDLComponent IsComponentConforming (Protocol protocol); @@ -1359,29 +1405,77 @@ interface MDLStereoscopicCamera [Export ("overlap")] float Overlap { get; set; } +#if !XAMCORE_4_0 + [Obsolete ("Use 'LeftViewMatrix4x4' instead.")] +#endif [Export ("leftViewMatrix")] Matrix4 LeftViewMatrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } +#if !XAMCORE_4_0 + [Sealed] + [Export ("leftViewMatrix")] + MatrixFloat4x4 LeftViewMatrix4x4 { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } +#endif + +#if !XAMCORE_4_0 + [Obsolete ("Use 'RightViewMatrix4x4' instead.")] +#endif [Export ("rightViewMatrix")] Matrix4 RightViewMatrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } +#if !XAMCORE_4_0 + [Sealed] + [Export ("rightViewMatrix")] + MatrixFloat4x4 RightViewMatrix4x4 { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } +#endif + +#if !XAMCORE_4_0 + [Obsolete ("Use 'LeftProjectionMatrix4x4' instead.")] +#endif [Export ("leftProjectionMatrix")] Matrix4 LeftProjectionMatrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } +#if !XAMCORE_4_0 + [Sealed] + [Export ("leftProjectionMatrix")] + MatrixFloat4x4 LeftProjectionMatrix4x4 { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } +#endif + +#if !XAMCORE_4_0 + [Obsolete ("Use 'RightProjectionMatrix4x4' instead.")] +#endif [Export ("rightProjectionMatrix")] Matrix4 RightProjectionMatrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; } + +#if !XAMCORE_4_0 + [Sealed] + [Export ("rightProjectionMatrix")] + MatrixFloat4x4 RightProjectionMatrix4x4 { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } +#endif } [iOS (9,0), Mac(10,11, onlyOn64 : true)] @@ -1573,10 +1667,23 @@ interface MDLTransform : MDLTransformComponent, NSCopying { [Export ("initWithTransformComponent:resetsTransform:")] IntPtr Constructor (IMDLTransformComponent component, bool resetsTransform); +#if !XAMCORE_4_0 + [Obsolete ("Use the '(MatrixFloat4x4)' overload instead.")] +#endif [Export ("initWithMatrix:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] IntPtr Constructor (Matrix4 matrix); +#if !XAMCORE_4_0 + [Sealed] + [Export ("initWithMatrix:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (MatrixFloat4x4 matrix); +#endif + +#if !XAMCORE_4_0 + [Obsolete ("Use the '(MatrixFloat4x4, bool)' overload instead.")] +#endif [iOS (10,0)] [Mac (10,12)] [TV (10,0)] @@ -1584,6 +1691,14 @@ interface MDLTransform : MDLTransformComponent, NSCopying { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] IntPtr Constructor (Matrix4 matrix, bool resetsTransform); +#if !XAMCORE_4_0 + [Sealed] + [iOS (10,0), Mac (10,12), TV (10,0)] + [Export ("initWithMatrix:resetsTransform:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (MatrixFloat4x4 matrix, bool resetsTransform); +#endif + [Export ("setIdentity")] void SetIdentity (); @@ -1603,10 +1718,20 @@ interface MDLTransform : MDLTransformComponent, NSCopying { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] Vector3 GetRotation (double atTime); +#if !XAMCORE_4_0 + [Obsolete ("Use 'GetRotationMatrix4x4' instead.")] +#endif [Export ("rotationMatrixAtTime:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] Matrix4 GetRotationMatrix (double atTime); +#if !XAMCORE_4_0 + [Sealed] + [Export ("rotationMatrixAtTime:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + MatrixFloat4x4 GetRotationMatrix4x4 (double atTime); +#endif + [Export ("setShear:forTime:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] void SetShear (Vector3 scale, double time); @@ -1626,8 +1751,19 @@ interface MDLTransform : MDLTransformComponent, NSCopying { [iOS (10,3), TV (10,2), Mac (10,12,4)] [Export ("setMatrix:forTime:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] +#if !XAMCORE_4_0 + [Obsolete ("Use 'SetMatrix4x4' instead.")] +#endif void SetMatrix (Matrix4 matrix, double time); +#if !XAMCORE_4_0 + [Sealed] + [iOS (10,3), TV (10,2), Mac (10,12,4)] + [Export ("setMatrix:forTime:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + void SetMatrix4x4 (MatrixFloat4x4 matrix, double time); +#endif + [Export ("shear", ArgumentSemantic.Assign)] Vector3 Shear { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] @@ -1710,6 +1846,9 @@ Matrix4 Matrix { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] Matrix4 GetLocalTransform (double atTime); +#if !XAMCORE_4_0 + [Obsolete ("Use 'CreateGlobalTransform4x4' instead.")] +#endif [Static] [Export ("globalTransformWithObject:atTime:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] @@ -1861,6 +2000,7 @@ interface MDLVoxelArray IntPtr Constructor (MDLAsset asset, int divisions, float patchRadius); [Export ("initWithData:boundingBox:voxelExtent:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] IntPtr Constructor (NSData voxelData, MDLAxisAlignedBoundingBox boundingBox, float voxelExtent); [Export ("meshUsingAllocator:")] @@ -1881,20 +2021,31 @@ interface MDLVoxelArray [Export ("setVoxelsForMesh:divisions:patchRadius:")] void SetVoxels (MDLMesh mesh, int divisions, float patchRadius); - [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use SetVoxels (MDLMesh, int, float)")] - [Obsoleted (PlatformName.iOS, 10, 0, message: "Use SetVoxels (MDLMesh, int, float)")] + [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use 'SetVoxels (MDLMesh, int, float)' instead.")] + [Obsoleted (PlatformName.iOS, 10, 0, message: "Use 'SetVoxels (MDLMesh, int, float)' instead.")] [Export ("setVoxelsForMesh:divisions:interiorShells:exteriorShells:patchRadius:")] void SetVoxels (MDLMesh mesh, int divisions, int interiorShells, int exteriorShells, float patchRadius); - [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use SetVoxels (MDLMesh, int, float)")] - [Obsoleted (PlatformName.iOS, 10, 0, message: "Use SetVoxels (MDLMesh, int, float)")] + [Deprecated (PlatformName.MacOSX, 10, 12, message: "Use 'SetVoxels (MDLMesh, int, float)' instead.")] + [Obsoleted (PlatformName.iOS, 10, 0, message: "Use 'SetVoxels (MDLMesh, int, float)' instead.")] [Export ("setVoxelsForMesh:divisions:interiorNBWidth:exteriorNBWidth:patchRadius:")] void SetVoxels (MDLMesh mesh, int divisions, float interiorNBWidth, float exteriorNBWidth, float patchRadius); +#if !XAMCORE_4_0 + [Obsolete ("Use 'GetVoxels (MDLVoxelIndexExtent2)' instead.")] +#endif [Export ("voxelsWithinExtent:")] [return: NullAllowed] NSData GetVoxels (MDLVoxelIndexExtent withinExtent); +#if !XAMCORE_4_0 + [Sealed] + [Export ("voxelsWithinExtent:")] + [return: NullAllowed] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + NSData GetVoxels (MDLVoxelIndexExtent2 withinExtent); +#endif + [Export ("voxelIndices")] [return: NullAllowed] NSData GetVoxelIndices (); @@ -1923,11 +2074,26 @@ interface MDLVoxelArray [Export ("count")] nuint Count { get; } +#if !XAMCORE_4_0 + [Obsolete ("Use 'VoxelIndexExtent2' instead.")] +#endif [Export ("voxelIndexExtent")] MDLVoxelIndexExtent VoxelIndexExtent { get; } +#if !XAMCORE_4_0 + [Export ("voxelIndexExtent")] + [Sealed] + MDLVoxelIndexExtent2 VoxelIndexExtent2 { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } +#endif + [Export ("boundingBox")] - MDLAxisAlignedBoundingBox BoundingBox { get; } + MDLAxisAlignedBoundingBox BoundingBox { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + } [iOS (10,0)] [Mac (10,12)] diff --git a/src/multipeerconnectivity.cs b/src/multipeerconnectivity.cs index c15b7f14a42a..dc3c9c06178a 100644 --- a/src/multipeerconnectivity.cs +++ b/src/multipeerconnectivity.cs @@ -124,7 +124,7 @@ partial interface MCSessionDelegate { [Abstract] [Export ("session:didFinishReceivingResourceWithName:fromPeer:atURL:withError:")] - void DidFinishReceivingResource (MCSession session, string resourceName, MCPeerID fromPeer, NSUrl localUrl, NSError error); + void DidFinishReceivingResource (MCSession session, string resourceName, MCPeerID fromPeer, [NullAllowed] NSUrl localUrl, [NullAllowed] NSError error); [Abstract] [Export ("session:didReceiveStream:withName:fromPeer:")] diff --git a/src/networkextension.cs b/src/networkextension.cs index c6ee3da67607..c673f922ecbb 100644 --- a/src/networkextension.cs +++ b/src/networkextension.cs @@ -773,7 +773,7 @@ interface NEVpnManager { [NullAllowed] [Export ("protocol", ArgumentSemantic.Retain)] - [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use ProtocolConfiguration instead")] + [Availability (Deprecated = Platform.iOS_9_0 | Platform.Mac_10_11, Message = "Use 'ProtocolConfiguration' instead.")] NEVpnProtocol Protocol { get; set; } [iOS (9,0)][Mac (10,11, onlyOn64 : true)] diff --git a/src/notificationcenter.cs b/src/notificationcenter.cs index 936b34089cbc..1c242481ffd9 100644 --- a/src/notificationcenter.cs +++ b/src/notificationcenter.cs @@ -35,7 +35,7 @@ interface NCWidgetProviding { [Export ("widgetMarginInsetsForProposedMarginInsets:"), DelegateName ("NCWidgetProvidingMarginInsets"), DefaultValueFromArgument ("defaultMarginInsets")] #if !MONOMAC - [Deprecated (PlatformName.iOS, 10,0, message: "Never called on iOS10+")] + [Deprecated (PlatformName.iOS, 10,0)] UIEdgeInsets GetWidgetMarginInsets (UIEdgeInsets defaultMarginInsets); #else NSEdgeInsets GetWidgetMarginInsets (NSEdgeInsets defaultMarginInsets); diff --git a/src/opengles.cs b/src/opengles.cs index d245a83dfc86..106a0f1573db 100644 --- a/src/opengles.cs +++ b/src/opengles.cs @@ -24,6 +24,7 @@ interface EAGLSharegroup { [iOS (6,0)] [Export ("debugLabel")] + [NullAllowed] string DebugLabel { get; set; } } @@ -41,6 +42,7 @@ interface EAGLContext { bool SetCurrentContext([NullAllowed] EAGLContext context); [Static, Export("currentContext")] + [NullAllowed] EAGLContext CurrentContext { get; } [Export("API")] @@ -51,6 +53,7 @@ interface EAGLContext { [iOS (6,0)] [Export ("debugLabel")] + [NullAllowed] string DebugLabel { get; set; } // @@ -63,10 +66,12 @@ interface EAGLContext { [Export ("presentRenderbuffer:")] bool PresentRenderBuffer (nuint target); + [iOS (10,0)][TV (10,0)] [Internal] [Export ("presentRenderbuffer:atTime:")] bool _PresentRenderbufferAtTime (nuint target, double presentationTime); + [iOS (10,3)][TV (10,2)] [Internal] [Export ("presentRenderbuffer:afterMinimumDuration:")] bool _PresentRenderbufferAfterMinimumDuration (nuint target, double duration); @@ -74,6 +79,13 @@ interface EAGLContext { [Since (7,1)] [Export ("multiThreaded")] bool IsMultiThreaded { [Bind ("isMultiThreaded")] get; set; } + + // IOSurface (EAGLContext) + + [iOS (11,0)] + [TV (11,0)] + [Export ("texImageIOSurface:target:internalFormat:width:height:format:type:plane:")] + bool TexImage (IOSurface.IOSurface ioSurface, nuint target, nuint internalFormat, uint width, uint height, nuint format, nuint type, uint plane); } [Protocol] diff --git a/src/passkit.cs b/src/passkit.cs index df1e71c3b72d..57b4dba64594 100644 --- a/src/passkit.cs +++ b/src/passkit.cs @@ -8,6 +8,7 @@ // using System; +using System.ComponentModel; using XamCore.Contacts; using XamCore.ObjCRuntime; using XamCore.Foundation; @@ -42,8 +43,8 @@ interface PKContact : NSSecureCoding #endif // XAMCORE_2_0 [iOS (9,2)] - [Deprecated (PlatformName.iOS, 10,3, message:"Use SubLocality and SubAdministrativeArea on PostalAddress instead")] - [Deprecated (PlatformName.WatchOS, 3,2, message:"Use SubLocality and SubAdministrativeArea on PostalAddress instead")] + [Deprecated (PlatformName.iOS, 10,3, message:"Use 'SubLocality' and 'SubAdministrativeArea' on 'PostalAddress' instead.")] + [Deprecated (PlatformName.WatchOS, 3,2, message:"Use 'SubLocality' and 'SubAdministrativeArea' on 'PostalAddress' instead.")] [NullAllowed, Export ("supplementarySubLocality", ArgumentSemantic.Strong)] string SupplementarySubLocality { get; set; } } @@ -89,7 +90,7 @@ interface PKPassLibrary { [iOS (8,0)] [Static,Export ("isPaymentPassActivationAvailable")] - [Availability (Deprecated = Platform.iOS_9_0, Message = "On iOS 9 and higher, use the library's instance IsLibraryPaymentPassActivationAvailable property instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use the library's instance 'IsLibraryPaymentPassActivationAvailable' property instead.")] bool IsPaymentPassActivationAvailable { get; } [iOS (9,0)] @@ -179,12 +180,12 @@ interface PKPayment { [NoWatch] [Export ("billingAddress", ArgumentSemantic.Assign)] - [Availability (Deprecated = Platform.iOS_9_0, Message = "On iOS 9 and higher, use BillingContact instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'BillingContact' instead.")] ABRecord BillingAddress { get; } [NoWatch] [Export ("shippingAddress", ArgumentSemantic.Assign)] - [Availability (Deprecated = Platform.iOS_9_0, Message = "On iOS 9 and higher, use ShippingContact instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'ShippingContact' instead.")] ABRecord ShippingAddress { get; } [Export ("shippingMethod", ArgumentSemantic.Strong)] @@ -211,9 +212,13 @@ interface PKPayment { [Protocol, Model] [BaseType (typeof (NSObject))] interface PKPaymentAuthorizationViewControllerDelegate { + + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidAuthorizePayment2' instead.")] [Export ("paymentAuthorizationViewController:didAuthorizePayment:completion:")] [EventArgs ("PKPaymentAuthorization")] +#if !XAMCORE_4_0 [Abstract] +#endif void DidAuthorizePayment (PKPaymentAuthorizationViewController controller, PKPayment payment, #if XAMCORE_2_0 Action completion); @@ -221,14 +226,25 @@ void DidAuthorizePayment (PKPaymentAuthorizationViewController controller, PKPay PKPaymentAuthorizationHandler completion); #endif + [iOS (11,0)] + [Export ("paymentAuthorizationViewController:didAuthorizePayment:handler:")] + [EventArgs ("PKPaymentAuthorizationResult")] + void DidAuthorizePayment2 (PKPaymentAuthorizationViewController controller, PKPayment payment, Action completion); + [Export ("paymentAuthorizationViewControllerDidFinish:")] [Abstract] void PaymentAuthorizationViewControllerDidFinish (PKPaymentAuthorizationViewController controller); + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidSelectShippingMethod2' instead.")] [Export ("paymentAuthorizationViewController:didSelectShippingMethod:completion:")] [EventArgs ("PKPaymentShippingMethodSelected")] void DidSelectShippingMethod (PKPaymentAuthorizationViewController controller, PKShippingMethod shippingMethod, PKPaymentShippingMethodSelected completion); + [iOS (11,0)] + [Export ("paymentAuthorizationViewController:didSelectShippingMethod:handler:")] + [EventArgs ("PKPaymentRequestShippingMethodUpdate")] + void DidSelectShippingMethod2 (PKPaymentAuthorizationViewController controller, PKShippingMethod shippingMethod, Action completion); + [Export ("paymentAuthorizationViewController:didSelectShippingAddress:completion:")] [EventArgs ("PKPaymentShippingAddressSelected")] void DidSelectShippingAddress (PKPaymentAuthorizationViewController controller, ABRecord address, PKPaymentShippingAddressSelected completion); @@ -241,14 +257,26 @@ void DidAuthorizePayment (PKPaymentAuthorizationViewController controller, PKPay void WillAuthorizePayment (PKPaymentAuthorizationViewController controller); [iOS (9,0)] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidSelectShippingContact' instead.")] [Export ("paymentAuthorizationViewController:didSelectShippingContact:completion:")] [EventArgs ("PKPaymentSelectedContact")] void DidSelectShippingContact (PKPaymentAuthorizationViewController controller, PKContact contact, PKPaymentShippingAddressSelected completion); + [iOS (11,0)] + [Export ("paymentAuthorizationViewController:didSelectShippingContact:handler:")] + [EventArgs ("PKPaymentRequestShippingContactUpdate")] + void DidSelectShippingContact2 (PKPaymentAuthorizationViewController controller, PKContact contact, Action completion); + [iOS (9,0)] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidSelectPaymentMethod2' instead.")] [Export ("paymentAuthorizationViewController:didSelectPaymentMethod:completion:")] [EventArgs ("PKPaymentMethodSelected")] void DidSelectPaymentMethod (PKPaymentAuthorizationViewController controller, PKPaymentMethod paymentMethod, Action completion); + + [iOS (11,0)] + [Export ("paymentAuthorizationViewController:didSelectPaymentMethod:handler:")] + [EventArgs ("PKPaymentRequestPaymentMethodUpdate")] + void DidSelectPaymentMethod2 (PKPaymentAuthorizationViewController controller, PKPaymentMethod paymentMethod, Action completion); } [iOS (8,0)] @@ -345,22 +373,26 @@ interface PKPaymentRequest { [Export ("currencyCode")] string CurrencyCode { get; set; } + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'RequiredBillingContactFields' instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'RequiredBillingContactFields' instead.")] [Export ("requiredBillingAddressFields", ArgumentSemantic.UnsafeUnretained)] PKAddressField RequiredBillingAddressFields { get; set; } [NoWatch] [NullAllowed] // by default this property is null [Export ("billingAddress", ArgumentSemantic.Assign)] - [Availability (Deprecated = Platform.iOS_9_0, Message = "On iOS 9 and higher, use BillingContact instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'BillingContact' instead.")] ABRecord BillingAddress { get; set; } + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'RequiredShippingContactFields' instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'RequiredShippingContactFields' instead.")] [Export ("requiredShippingAddressFields", ArgumentSemantic.UnsafeUnretained)] PKAddressField RequiredShippingAddressFields { get; set; } [NoWatch] [NullAllowed] // by default this property is null [Export ("shippingAddress", ArgumentSemantic.Assign)] - [Availability (Deprecated = Platform.iOS_9_0, Message = "On iOS 9 and higher, use ShippingContact instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'ShippingContact' instead.")] ABRecord ShippingAddress { get; set; } [NullAllowed] // by default this property is null @@ -387,6 +419,81 @@ interface PKPaymentRequest { [Static] [Export ("availableNetworks")] NSString[] AvailableNetworks { get; } + + [Watch (4,0)][iOS (11,0)] + [Export ("requiredBillingContactFields", ArgumentSemantic.Strong)] + NSSet WeakRequiredBillingContactFields { get; set; } + + [Watch (4,0)][iOS (11,0)] + [Export ("requiredShippingContactFields", ArgumentSemantic.Strong)] + NSSet WeakRequiredShippingContactFields { get; set; } + + [Watch (4,0)][iOS (11,0)] + [NullAllowed, Export ("supportedCountries", ArgumentSemantic.Copy)] + NSSet SupportedCountries { get; set; } + + [Watch (4,0)][iOS (11,0)] + [Static] + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Export ("paymentContactInvalidErrorWithContactField:localizedDescription:")] + NSError CreatePaymentContactInvalidError (NSString field, [NullAllowed] string localizedDescription); + + [Watch (4,0)][iOS (11,0)] + [Static] + [Wrap ("CreatePaymentContactInvalidError (contactField.GetConstant (), localizedDescription)")] + NSError CreatePaymentContactInvalidError (PKContactFields contactField, [NullAllowed] string localizedDescription); + + [Watch (4,0)][iOS (11,0)] + [Static] + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Export ("paymentShippingAddressInvalidErrorWithKey:localizedDescription:")] + NSError CreatePaymentShippingAddressInvalidError (NSString postalAddressKey, [NullAllowed] string localizedDescription); + +#if XAMCORE_2_0 + [Watch (4,0)][iOS (11,0)] + [Static] + [Wrap ("CreatePaymentShippingAddressInvalidError (postalAddress.GetConstant (), localizedDescription)")] + NSError CreatePaymentShippingAddressInvalidError (CNPostalAddressKeyOption postalAddress, [NullAllowed] string localizedDescription); +#endif + + [Watch (4,0)][iOS (11,0)] + [Static] + [EditorBrowsable (EditorBrowsableState.Advanced)] + [Export ("paymentBillingAddressInvalidErrorWithKey:localizedDescription:")] + NSError CreatePaymentBillingAddressInvalidError (NSString postalAddressKey, [NullAllowed] string localizedDescription); + +#if XAMCORE_2_0 + [Watch (4,0)][iOS (11,0)] + [Static] + [Wrap ("CreatePaymentBillingAddressInvalidError (postalAddress.GetConstant (), localizedDescription)")] + NSError CreatePaymentBillingAddressInvalidError (CNPostalAddressKeyOption postalAddress, [NullAllowed] string localizedDescription); +#endif + + [Watch (4,0)][iOS (11,0)] + [Static] + [Export ("paymentShippingAddressUnserviceableErrorWithLocalizedDescription:")] + NSError CreatePaymentShippingAddressUnserviceableError ([NullAllowed] string localizedDescription); + } + + [Watch (4,0)][iOS (11,0)] + [Flags] + enum PKContactFields { + None = 0, + + [Field ("PKContactFieldPostalAddress")] + PostalAddress = 1 << 0, + + [Field ("PKContactFieldEmailAddress")] + EmailAddress = 1 << 1, + + [Field ("PKContactFieldPhoneNumber")] + PhoneNumber = 1 << 2, + + [Field ("PKContactFieldName")] + Name = 1 << 3, + + [Field ("PKContactFieldPhoneticName")] + PhoneticName = 1 << 4, } [Watch (3,0)] @@ -396,12 +503,12 @@ interface PKPaymentToken { [NoWatch] [Export ("paymentInstrumentName", ArgumentSemantic.Copy)] - [Availability (Deprecated = Platform.iOS_9_0, Message = "On iOS 9 and higher, use PaymentMethod instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'PaymentMethod' instead.")] string PaymentInstrumentName { get; } [NoWatch] [Export ("paymentNetwork")] - [Availability (Deprecated = Platform.iOS_9_0, Message = "On iOS 9 and higher, use PaymentMethod instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'PaymentMethod' instead.")] string PaymentNetwork { get; } [Export ("transactionIdentifier")] @@ -594,8 +701,10 @@ interface PKPass : NSSecureCoding, NSCopying { [Export ("localizedValueForFieldKey:")] NSObject GetLocalizedValue (NSString key); // TODO: Should be enum for PKPassLibraryUserInfoKey +#if !XAMCORE_4_0 [Field ("PKPassKitErrorDomain")] NSString ErrorDomain { get; } +#endif [Since (7,0)] [Export ("userInfo", ArgumentSemantic.Copy)] @@ -670,9 +779,15 @@ interface PKPaymentNetwork { NSString Amex { get; } [iOS (10,3), Watch (3,2)] + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'CarteBancaires' instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'CarteBancaires' instead.")] [Field ("PKPaymentNetworkCarteBancaire")] NSString CarteBancaire { get; } + [iOS (11,0)][Watch (4,0)] + [Field ("PKPaymentNetworkCarteBancaires")] + NSString CarteBancaires { get; } + [iOS (9,2)] [Watch (2,2)] [Field ("PKPaymentNetworkChinaUnionPay")] @@ -801,10 +916,16 @@ interface IPKPaymentAuthorizationControllerDelegate {} [BaseType (typeof (NSObject))] interface PKPaymentAuthorizationControllerDelegate { + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'DidAuthorizePayment' overload with the 'Action' parameter instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidAuthorizePayment' overload with the 'Action' parameter instead.")] [Abstract] [Export ("paymentAuthorizationController:didAuthorizePayment:completion:")] void DidAuthorizePayment (PKPaymentAuthorizationController controller, PKPayment payment, Action completion); + [Watch (4,0)][iOS (11,0)] + [Export ("paymentAuthorizationController:didAuthorizePayment:handler:")] + void DidAuthorizePayment (PKPaymentAuthorizationController controller, PKPayment payment, Action completion); + [Abstract] [Export ("paymentAuthorizationControllerDidFinish:")] void DidFinish (PKPaymentAuthorizationController controller); @@ -812,14 +933,32 @@ interface PKPaymentAuthorizationControllerDelegate { [Export ("paymentAuthorizationControllerWillAuthorizePayment:")] void WillAuthorizePayment (PKPaymentAuthorizationController controller); + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'DidSelectShippingMethod' overload with the 'Action' parameter instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidSelectShippingMethod' overload with the 'Action' parameter instead.")] [Export ("paymentAuthorizationController:didSelectShippingMethod:completion:")] void DidSelectShippingMethod (PKPaymentAuthorizationController controller, PKShippingMethod shippingMethod, Action completion); + [Watch (4,0)][iOS (11,0)] + [Export ("paymentAuthorizationController:didSelectShippingMethod:handler:")] + void DidSelectShippingMethod (PKPaymentAuthorizationController controller, PKPaymentMethod paymentMethod, Action completion); + + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'DidSelectShippingContact' overload with the 'Action' parameter instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidSelectShippingContact' overload with the 'Action' parameter instead.")] [Export ("paymentAuthorizationController:didSelectShippingContact:completion:")] void DidSelectShippingContact (PKPaymentAuthorizationController controller, PKContact contact, Action completion); + [Watch (4,0)][iOS (11,0)] + [Export ("paymentAuthorizationController:didSelectShippingContact:handler:")] + void DidSelectShippingContact (PKPaymentAuthorizationController controller, PKContact contact, Action completion); + + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'DidSelectPaymentMethod' overload with the 'Action' parameter instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidSelectPaymentMethod' overload with the 'Action' parameter instead.")] [Export ("paymentAuthorizationController:didSelectPaymentMethod:completion:")] void DidSelectPaymentMethod (PKPaymentAuthorizationController controller, PKPaymentMethod paymentMethod, Action completion); + + [Watch (4,0)][iOS (11,0)] + [Export ("paymentAuthorizationController:didSelectPaymentMethod:handler:")] + void DidSelectPaymentMethod (PKPaymentAuthorizationController controller, PKPaymentMethod paymentMethod, Action completion); } [iOS (10,1)] @@ -866,4 +1005,85 @@ interface PKSuicaPassProperties [Export ("blacklisted")] bool Blacklisted { [Bind ("isBlacklisted")] get; } } + + [Watch (4,0)][iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PKPaymentAuthorizationResult { + [Export ("initWithStatus:errors:")] + [DesignatedInitializer] + IntPtr Constructor (PKPaymentAuthorizationStatus status, [NullAllowed] NSError[] errors); + + [Export ("status", ArgumentSemantic.Assign)] + PKPaymentAuthorizationStatus Status { get; set; } + + [Export ("errors", ArgumentSemantic.Copy)] + NSError[] Errors { get; set; } + } + + [Watch (4,0)][iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface PKPaymentRequestUpdate { + + [Export ("initWithPaymentSummaryItems:")] + [DesignatedInitializer] + IntPtr Constructor (PKPaymentSummaryItem[] paymentSummaryItems); + + [Export ("status", ArgumentSemantic.Assign)] + PKPaymentAuthorizationStatus Status { get; set; } + + [Export ("paymentSummaryItems", ArgumentSemantic.Copy)] + PKPaymentSummaryItem[] PaymentSummaryItems { get; set; } + } + + [Watch (4,0)][iOS (11,0)] + [BaseType (typeof (PKPaymentRequestUpdate))] + [DisableDefaultCtor] + interface PKPaymentRequestShippingContactUpdate { + + [Export ("initWithErrors:paymentSummaryItems:shippingMethods:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] NSError[] errors, PKPaymentSummaryItem[] paymentSummaryItems, PKShippingMethod[] shippingMethods); + + [Export ("shippingMethods", ArgumentSemantic.Copy)] + PKShippingMethod[] ShippingMethods { get; set; } + + [Export ("errors", ArgumentSemantic.Copy)] + NSError[] Errors { get; set; } + } + + [Watch (4,0)][iOS (11,0)] + [BaseType (typeof (PKPaymentRequestUpdate))] + [DisableDefaultCtor] + interface PKPaymentRequestShippingMethodUpdate { + + // inlined + [Export ("initWithPaymentSummaryItems:")] + [DesignatedInitializer] + IntPtr Constructor (PKPaymentSummaryItem[] paymentSummaryItems); + } + + [Watch (4,0)][iOS (11,0)] + [BaseType (typeof (PKPaymentRequestUpdate))] + [DisableDefaultCtor] + interface PKPaymentRequestPaymentMethodUpdate { + + // inlined + [Export ("initWithPaymentSummaryItems:")] + [DesignatedInitializer] + IntPtr Constructor (PKPaymentSummaryItem[] paymentSummaryItems); + } + + [Static] // not to enum'ify - exposed as NSString inside NSError + interface PKPaymentErrorKeys { + + [Watch (4,0)][iOS (11,0)] + [Field ("PKPaymentErrorContactFieldUserInfoKey")] + NSString ContactFieldUserInfoKey { get; } + + [Watch (4,0)][iOS (11,0)] + [Field ("PKPaymentErrorPostalAddressUserInfoKey")] + NSString PostalAddressUserInfoKey { get; } + } } diff --git a/src/pdfkit.cs b/src/pdfkit.cs index 28a31b531d31..736a56b320b2 100644 --- a/src/pdfkit.cs +++ b/src/pdfkit.cs @@ -26,8 +26,26 @@ // // PdfKit.cs: Bindings for the PdfKit API // +#if MONOMAC || (IOS && XAMCORE_2_0) + using System; +#if MONOMAC using XamCore.AppKit; +#else +using XamCore.UIKit; +using NSColor = XamCore.UIKit.UIColor; +using NSFont = XamCore.UIKit.UIFont; +using NSImage = XamCore.UIKit.UIImage; +using NSView = XamCore.UIKit.UIView; +using NSEdgeInsets = XamCore.UIKit.UIEdgeInsets; +using NSEvent = XamCore.UIKit.UIEvent; +using NSBezierPath = XamCore.UIKit.UIBezierPath; +using NSTextAlignment = XamCore.UIKit.UITextAlignment; +// HACK: to make intermediate dll build, since we use these +// types in a few [NoiOS] members (this way we avoid numerous #ifdefs later) +using NSPrintInfo = XamCore.Foundation.NSObject; +using NSPrintOperation = XamCore.Foundation.NSObject; +#endif using XamCore.Foundation; using XamCore.ObjCRuntime; using XamCore.CoreGraphics; @@ -40,7 +58,401 @@ namespace XamCore.PdfKit { - [BaseType (typeof (NSObject), Name="PDFAction")] + [Mac (10,13)] + [iOS (11,0)] + enum PdfAnnotationKey { + + [Field ("PDFAnnotationKeyAppearanceDictionary", "+PDFKit")] + AppearanceDictionary, + + [Field ("PDFAnnotationKeyAppearanceState", "+PDFKit")] + AppearanceState, + + [Field ("PDFAnnotationKeyBorder", "+PDFKit")] + Border, + + [Field ("PDFAnnotationKeyColor", "+PDFKit")] + Color, + + [Field ("PDFAnnotationKeyContents", "+PDFKit")] + Contents, + + [Field ("PDFAnnotationKeyFlags", "+PDFKit")] + Flags, + + [Field ("PDFAnnotationKeyDate", "+PDFKit")] + Date, + + [Field ("PDFAnnotationKeyName", "+PDFKit")] + Name, + + [Field ("PDFAnnotationKeyPage", "+PDFKit")] + Page, + + [Field ("PDFAnnotationKeyRect", "+PDFKit")] + Rect, + + [Field ("PDFAnnotationKeySubtype", "+PDFKit")] + Subtype, + + [Field ("PDFAnnotationKeyAction", "+PDFKit")] + Action, + + [Field ("PDFAnnotationKeyAdditionalActions", "+PDFKit")] + AdditionalActions, + + [Field ("PDFAnnotationKeyBorderStyle", "+PDFKit")] + BorderStyle, + + [Field ("PDFAnnotationKeyDefaultAppearance", "+PDFKit")] + DefaultAppearance, + + [Field ("PDFAnnotationKeyDestination", "+PDFKit")] + Destination, + + [Field ("PDFAnnotationKeyHighlightingMode", "+PDFKit")] + HighlightingMode, + + [Field ("PDFAnnotationKeyInklist", "+PDFKit")] + Inklist, + + [Field ("PDFAnnotationKeyInteriorColor", "+PDFKit")] + InteriorColor, + + [Field ("PDFAnnotationKeyLinePoints", "+PDFKit")] + LinePoints, + + [Field ("PDFAnnotationKeyLineEndingStyles", "+PDFKit")] + LineEndingStyles, + + [Field ("PDFAnnotationKeyIconName", "+PDFKit")] + IconName, + + [Field ("PDFAnnotationKeyOpen", "+PDFKit")] + Open, + + [Field ("PDFAnnotationKeyParent", "+PDFKit")] + Parent, + + [Field ("PDFAnnotationKeyPopup")] + Popup, + + [Field ("PDFAnnotationKeyQuadding", "+PDFKit")] + Quadding, + + [Field ("PDFAnnotationKeyQuadPoints", "+PDFKit")] + QuadPoints, + + [Field ("PDFAnnotationKeyTextLabel", "+PDFKit")] + TextLabel, + + [Field ("PDFAnnotationKeyWidgetDownCaption", "+PDFKit")] + WidgetDownCaption, + + [Field ("PDFAnnotationKeyWidgetBorderColor", "+PDFKit")] + WidgetBorderColor, + + [Field ("PDFAnnotationKeyWidgetBackgroundColor", "+PDFKit")] + WidgetBackgroundColor, + + [Field ("PDFAnnotationKeyWidgetCaption", "+PDFKit")] + WidgetCaption, + + [Field ("PDFAnnotationKeyWidgetDefaultValue", "+PDFKit")] + WidgetDefaultValue, + + [Field ("PDFAnnotationKeyWidgetFieldFlags", "+PDFKit")] + WidgetFieldFlags, + + [Field ("PDFAnnotationKeyWidgetFieldType", "+PDFKit")] + WidgetFieldType, + + [Field ("PDFAnnotationKeyWidgetAppearanceDictionary", "+PDFKit")] + WidgetAppearanceDictionary, + + [Field ("PDFAnnotationKeyWidgetMaxLen", "+PDFKit")] + WidgetMaxLen, + + [Field ("PDFAnnotationKeyWidgetOptions", "+PDFKit")] + WidgetOptions, + + [Field ("PDFAnnotationKeyWidgetRotation", "+PDFKit")] + WidgetRotation, + + [Field ("PDFAnnotationKeyWidgetRolloverCaption", "+PDFKit")] + WidgetRolloverCaption, + + [Field ("PDFAnnotationKeyWidgetTextLabelUI", "+PDFKit")] + WidgetTextLabelUI, + + [Field ("PDFAnnotationKeyWidgetValue", "+PDFKit")] + WidgetValue, + } + + [Mac (10,13)] + [iOS (11,0)] + enum PdfAnnotationSubtype { + + [Field ("PDFAnnotationSubtypeText", "+PDFKit")] + Text, + + [Field ("PDFAnnotationSubtypeLink", "+PDFKit")] + Link, + + [Field ("PDFAnnotationSubtypeFreeText", "+PDFKit")] + FreeText, + + [Field ("PDFAnnotationSubtypeLine", "+PDFKit")] + Line, + + [Field ("PDFAnnotationSubtypeSquare", "+PDFKit")] + Square, + + [Field ("PDFAnnotationSubtypeCircle", "+PDFKit")] + Circle, + + [Field ("PDFAnnotationSubtypeHighlight", "+PDFKit")] + Highlight, + + [Field ("PDFAnnotationSubtypeUnderline", "+PDFKit")] + Underline, + + [Field ("PDFAnnotationSubtypeStrikeOut", "+PDFKit")] + StrikeOut, + + [Field ("PDFAnnotationSubtypeInk", "+PDFKit")] + Ink, + + [Field ("PDFAnnotationSubtypeStamp", "+PDFKit")] + Stamp, + + [Field ("PDFAnnotationSubtypePopup", "+PDFKit")] + Popup, + + [Field ("PDFAnnotationSubtypeWidget", "+PDFKit")] + Widget, + } + + [Mac (10,13)] + [iOS (11,0)] + enum PdfAnnotationWidgetSubtype { + + [Field ("PDFAnnotationWidgetSubtypeButton", "+PDFKit")] + Button, + + [Field ("PDFAnnotationWidgetSubtypeChoice", "+PDFKit")] + Choice, + + [Field ("PDFAnnotationWidgetSubtypeSignature", "+PDFKit")] + Signature, + + [Field ("PDFAnnotationWidgetSubtypeText", "+PDFKit")] + Text, + } + + [Mac (10,13)] + [iOS (11,0)] + enum PdfAnnotationLineEndingStyle { + + [Field ("PDFAnnotationLineEndingStyleNone", "+PDFKit")] + None, + + [Field ("PDFAnnotationLineEndingStyleSquare", "+PDFKit")] + Square, + + [Field ("PDFAnnotationLineEndingStyleCircle", "+PDFKit")] + Circle, + + [Field ("PDFAnnotationLineEndingStyleDiamond", "+PDFKit")] + Diamond, + + [Field ("PDFAnnotationLineEndingStyleOpenArrow", "+PDFKit")] + OpenArrow, + + [Field ("PDFAnnotationLineEndingStyleClosedArrow", "+PDFKit")] + ClosedArrow, + } + + [Mac (10,13)] + [iOS (11,0)] + enum PdfAnnotationTextIconType { + + [Field ("PDFAnnotationTextIconTypeComment", "+PDFKit")] + Comment, + + [Field ("PDFAnnotationTextIconTypeKey", "+PDFKit")] + Key, + + [Field ("PDFAnnotationTextIconTypeNote", "+PDFKit")] + Note, + + [Field ("PDFAnnotationTextIconTypeHelp", "+PDFKit")] + Help, + + [Field ("PDFAnnotationTextIconTypeNewParagraph", "+PDFKit")] + NewParagraph, + + [Field ("PDFAnnotationTextIconTypeParagraph", "+PDFKit")] + Paragraph, + + [Field ("PDFAnnotationTextIconTypeInsert", "+PDFKit")] + Insert, + } + + [Mac (10,13)] + [iOS (11,0)] + enum PdfAnnotationHighlightingMode { + + [Field ("PDFAnnotationHighlightingModeNone", "+PDFKit")] + None, + + [Field ("PDFAnnotationHighlightingModeInvert", "+PDFKit")] + Invert, + + [Field ("PDFAnnotationHighlightingModeOutline", "+PDFKit")] + Outline, + + [Field ("PDFAnnotationHighlightingModePush", "+PDFKit")] + Push, + } + + [Mac (10,13)] + [iOS (11,0)] + [Static] + interface PdfAppearanceCharacteristicsKeys { + + [Field ("PDFAppearanceCharacteristicsKeyBackgroundColor", "+PDFKit")] + NSString BackgroundColorKey { get; } + + [Field ("PDFAppearanceCharacteristicsKeyBorderColor", "+PDFKit")] + NSString BorderColorKey { get; } + + [Field ("PDFAppearanceCharacteristicsKeyRotation", "+PDFKit")] + NSString RotationKey { get; } + + [Field ("PDFAppearanceCharacteristicsKeyCaption", "+PDFKit")] + NSString CaptionKey { get; } + + [Field ("PDFAppearanceCharacteristicsKeyRolloverCaption", "+PDFKit")] + NSString RolloverCaptionKey { get; } + + [Field ("PDFAppearanceCharacteristicsKeyDownCaption", "+PDFKit")] + NSString DownCaptionKey { get; } + } + + [Mac (10,13)] + [iOS (11,0)] + [Static] + interface PdfBorderKeys { + + [Field ("PDFBorderKeyLineWidth", "+PDFKit")] + NSString LineWidthKey { get; } + + [Field ("PDFBorderKeyStyle", "+PDFKit")] + NSString StyleKey { get; } + + [Field ("PDFBorderKeyDashPattern", "+PDFKit")] + NSString DashPatternKey { get; } + } + + [iOS (11,0)] + [Internal] + [Static] + interface PdfDocumentAttributeKeys { + + [Field ("PDFDocumentTitleAttribute", "+PDFKit")] + NSString TitleKey { get; } + + [Field ("PDFDocumentAuthorAttribute", "+PDFKit")] + NSString AuthorKey { get; } + + [Field ("PDFDocumentSubjectAttribute", "+PDFKit")] + NSString SubjectKey { get; } + + [Field ("PDFDocumentCreatorAttribute", "+PDFKit")] + NSString CreatorKey { get; } + + [Field ("PDFDocumentProducerAttribute", "+PDFKit")] + NSString ProducerKey { get; } + + [Field ("PDFDocumentCreationDateAttribute", "+PDFKit")] + NSString CreationDateKey { get; } + + [Field ("PDFDocumentModificationDateAttribute", "+PDFKit")] + NSString ModificationDateKey { get; } + + [Field ("PDFDocumentKeywordsAttribute", "+PDFKit")] + NSString KeywordsKey { get; } + } + + [iOS (11,0)] + [StrongDictionary ("PdfDocumentAttributeKeys")] + interface PdfDocumentAttributes { + + string Title { get; set; } + string Author { get; set; } + string Subject { get; set; } + string Creator { get; set; } + string Producer { get; set; } + NSDate CreationDate { get; set; } + NSDate ModificationDate { get; set; } + string [] Keywords { get; set; } + } + + [Mac (10,13)] + [iOS (11,0)] + [Internal] + [Static] + interface PdfDocumentWriteOptionKeys { + + [Field ("PDFDocumentOwnerPasswordOption", "+PDFKit")] + NSString OwnerPasswordKey { get; } + + [Field ("PDFDocumentUserPasswordOption", "+PDFKit")] + NSString UserPasswordKey { get; } + } + + [Mac (10,13)] + [iOS (11,0)] + [StrongDictionary ("PdfDocumentWriteOptionKeys")] + interface PdfDocumentWriteOptions { + + string OwnerPassword { get; set; } + string UserPassword { get; set; } + } + + [Mac (10,13)] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFAppearanceCharacteristics")] + interface PdfAppearanceCharacteristics : NSCopying { + + [Export ("controlType", ArgumentSemantic.Assign)] + PdfWidgetControlType ControlType { get; set; } + + [NullAllowed, Export ("backgroundColor", ArgumentSemantic.Copy)] + NSColor BackgroundColor { get; set; } + + [NullAllowed, Export ("borderColor", ArgumentSemantic.Copy)] + NSColor BorderColor { get; set; } + + [Export ("rotation")] + nint Rotation { get; set; } + + [NullAllowed, Export ("caption")] + string Caption { get; set; } + + [NullAllowed, Export ("rolloverCaption")] + string RolloverCaption { get; set; } + + [NullAllowed, Export ("downCaption")] + string DownCaption { get; set; } + + [Export ("appearanceCharacteristicsKeyValues", ArgumentSemantic.Copy)] + NSDictionary WeakAppearanceCharacteristicsKeyValues { get; } + } + + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFAction")] #if XAMCORE_2_0 [Abstract] #endif @@ -53,8 +465,11 @@ interface PdfAction : NSCopying { string Type { get; } } + [iOS (11,0)] [BaseType (typeof (PdfAction), Name="PDFActionGoTo")] interface PdfActionGoTo { + + [DesignatedInitializer] [Export ("initWithDestination:")] IntPtr Constructor (PdfDestination destination); @@ -62,8 +477,11 @@ interface PdfActionGoTo { PdfDestination Destination { get; set; } } - [BaseType (typeof (PdfAction), Name="PDFActionNamed")] + [iOS (11,0)] + [BaseType (typeof (PdfAction), Name = "PDFActionNamed")] interface PdfActionNamed { + + [DesignatedInitializer] [Export ("initWithName:")] IntPtr Constructor (PdfActionNamedName name); @@ -71,8 +489,11 @@ interface PdfActionNamed { PdfActionNamedName Name { get; set; } } - [BaseType (typeof (PdfAction), Name="PDFActionRemoteGoTo")] + [iOS (11,0)] + [BaseType (typeof (PdfAction), Name = "PDFActionRemoteGoTo")] interface PdfActionRemoteGoTo { + + [DesignatedInitializer] [Export ("initWithPageIndex:atPoint:fileURL:")] IntPtr Constructor (nint pageIndex, CGPoint point, NSUrl fileUrl); @@ -86,7 +507,8 @@ interface PdfActionRemoteGoTo { NSUrl Url { get; set; } } - [BaseType (typeof (PdfAction), Name="PDFActionResetForm")] + [iOS (11,0)] + [BaseType (typeof (PdfAction), Name = "PDFActionResetForm")] interface PdfActionResetForm { //has a public Init ??? @@ -95,11 +517,14 @@ interface PdfActionResetForm { string [] Fields { get; set; } [Export ("fieldsIncludedAreCleared")] - bool FieldsIncludedAreCleared { get; set; } + bool FieldsIncludedAreCleared { get; set; } } - [BaseType (typeof (PdfAction), Name="PDFActionURL")] + [iOS (11,0)] + [BaseType (typeof (PdfAction), Name = "PDFActionURL")] interface PdfActionUrl { + + [DesignatedInitializer] [Export ("initWithURL:")] IntPtr Constructor (NSUrl url); @@ -107,16 +532,35 @@ interface PdfActionUrl { NSUrl Url { get; set; } } - [BaseType (typeof (NSObject), Name="PDFAnnotation")] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFAnnotation")] interface PdfAnnotation : NSCoding, NSCopying { + + [Mac (10,13)] + [Export ("initWithBounds:forType:withProperties:")] + [DesignatedInitializer] + IntPtr Constructor (CGRect bounds, NSString annotationType, [NullAllowed] NSDictionary properties); + + [Mac (10,13)] + [Wrap ("this (bounds, annotationType.GetConstant (), properties)")] + IntPtr Constructor (CGRect bounds, PdfAnnotationKey annotationType, [NullAllowed] NSDictionary properties); + + [Deprecated (PlatformName.iOS, 11, 0, message: "Use '.ctor (CGRect, PDFAnnotationKey, NSDictionary)' instead")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use '.ctor (CGRect, PDFAnnotationKey, NSDictionary)' instead")] [Export ("initWithBounds:")] IntPtr Constructor (CGRect bounds); [Export ("page")] - PdfPage Page { get; } + PdfPage Page { get; set; } +#if XAMCORE_4_0 + [Protected] [Export ("type")] - string Type { get; } + NSString Type { get; set; } +#else + [Export ("type")] + string Type { get; set; } +#endif [Export ("bounds")] CGRect Bounds { get; set; } @@ -127,6 +571,7 @@ interface PdfAnnotation : NSCoding, NSCopying { [Export ("userName")] string UserName { get; set; } + [NoiOS] [Export ("popup")] PdfAnnotationPopup Popup { get; set; } @@ -142,26 +587,240 @@ interface PdfAnnotation : NSCoding, NSCopying { [Export ("color")] NSColor Color { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 13)] [Export ("mouseUpAction")] PdfAction MouseUpAction { get; set; } [Export ("contents")] string Contents { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 12)] [Export ("toolTip")] string ToolTip { get; } [Export ("hasAppearanceStream")] bool HasAppearanceStream { get; } + [Deprecated (PlatformName.MacOSX, 10, 12)] [Export ("removeAllAppearanceStreams")] void RemoveAllAppearanceStreams (); + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] [Export ("drawWithBox:")] void Draw (PdfDisplayBox box); + + [Mac (10,13)] + [Export ("action", ArgumentSemantic.Strong), NullAllowed] + PdfAction Action { get; set; } + + [Mac (10,13)] + [Export ("highlighted")] + bool Highlighted { [Bind ("isHighlighted")] get; set; } + + [Mac (10,12)] + [Export ("drawWithBox:inContext:")] + void Draw (PdfDisplayBox box, CGContext context); + + [Internal] + [Mac (10,12)] + [Export ("setValue:forAnnotationKey:")] + bool _SetValue (IntPtr value, NSString key); + + [Internal] + [Mac (10,12)] + [Export ("valueForAnnotationKey:")] + [return: NullAllowed] + IntPtr _GetValue (NSString key); + + [Protected] + [Mac (10,12)] + [Export ("setBoolean:forAnnotationKey:")] + bool SetValue (bool boolean, NSString key); + + [Mac (10,12)] + [Wrap ("SetValue (boolean, key.GetConstant ())")] + bool SetValue (bool boolean, PdfAnnotationKey key); + + [Protected] + [Mac (10,12)] + [Export ("setRect:forAnnotationKey:")] + bool SetValue (CGRect rect, NSString key); + + [Mac (10,12)] + [Wrap ("SetValue (rect, key.GetConstant ())")] + bool SetValue (CGRect rect, PdfAnnotationKey key); + + [Mac (10,13)] + [Export ("annotationKeyValues", ArgumentSemantic.Copy)] + NSDictionary AnnotationKeyValues { get; } + + [Protected] + [Mac (10,12)] + [Export ("removeValueForAnnotationKey:")] + void RemoveValue (NSString key); + + [Mac (10,12)] + [Wrap ("RemoveValue (key.GetConstant ())")] + void RemoveValue (PdfAnnotationKey key); + + // PDFAnnotation (PDFAnnotationUtilities) Category + + [Mac (10,13)] + [NullAllowed, Export ("font", ArgumentSemantic.Copy)] + NSFont Font { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("fontColor", ArgumentSemantic.Copy)] + NSColor FontColor { get; set; } + + [Mac (10,13)] + [Export ("alignment", ArgumentSemantic.Assign)] + NSTextAlignment Alignment { get; set; } + + [Mac (10,13)] + [Export ("startPoint", ArgumentSemantic.Assign)] + CGPoint StartPoint { get; set; } + + [Mac (10,13)] + [Export ("endPoint", ArgumentSemantic.Assign)] + CGPoint EndPoint { get; set; } + + [Mac (10,13)] + [Export ("startLineStyle", ArgumentSemantic.Assign)] + PdfLineStyle StartLineStyle { get; set; } + + [Mac (10,13)] + [Export ("endLineStyle", ArgumentSemantic.Assign)] + PdfLineStyle EndLineStyle { get; set; } + + [Mac (10,13)] + [Static] + [Export ("lineStyleFromName:")] + PdfLineStyle GetLineStyle (string fromName); + + [Mac (10,13)] + [Static] + [Export ("nameForLineStyle:")] + string GetName (PdfLineStyle style); + + [Mac (10,13)] + [Export ("iconType", ArgumentSemantic.Assign)] + PdfTextAnnotationIconType IconType { get; set; } + + [Internal] + [Mac (10,13)] + [NullAllowed, Export ("quadrilateralPoints", ArgumentSemantic.Copy)] + IntPtr _QuadrilateralPoints { get; set; } + + [Mac (10,13)] + [Export ("markupType", ArgumentSemantic.Assign)] + PdfMarkupType MarkupType { get; set; } + + [Mac (10,13)] + [Export ("widgetFieldType")] + string WidgetFieldType { get; set; } + + [Mac (10,13)] + [Export ("widgetControlType", ArgumentSemantic.Assign)] + PdfWidgetControlType WidgetControlType { get; set; } + + [Mac (10,13)] + [Export ("multiline")] + bool Multiline { [Bind ("isMultiline")] get; set; } + + [Mac (10,13)] + [Export ("isPasswordField")] + bool IsPasswordField { get; } + + [Mac (10,13)] + [Export ("comb")] + bool Comb { [Bind ("hasComb")] get; set; } + + [Mac (10,13)] + [Export ("maximumLength")] + nint MaximumLength { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("widgetStringValue")] + string WidgetStringValue { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("widgetDefaultStringValue")] + string WidgetDefaultStringValue { get; set; } + + [Mac (10,13)] + [Export ("allowsToggleToOff")] + bool AllowsToggleToOff { get; set; } + + [Mac (10,13)] + [Export ("radiosInUnison")] + bool RadiosInUnison { get; set; } + + [Mac (10,13)] + [Export ("readOnly")] + bool ReadOnly { [Bind ("isReadOnly")] get; set; } + + [Mac (10,13)] + [Export ("listChoice")] + bool ListChoice { [Bind ("isListChoice")] get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("choices", ArgumentSemantic.Copy)] + string [] Choices { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("values", ArgumentSemantic.Copy)] + string [] Values { get; set; } + + [Mac (10,13)] + [Export ("buttonWidgetState", ArgumentSemantic.Assign)] + PdfWidgetCellState ButtonWidgetState { get; set; } + + [Mac (10,13)] + [Export ("buttonWidgetStateString")] + string ButtonWidgetStateString { get; set; } + + [Mac (10,13)] + [Export ("open")] + bool Open { [Bind ("isOpen")] get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("paths")] + NSBezierPath [] Paths { get; } + + [Mac (10,13)] + [Export ("addBezierPath:")] + void AddBezierPath (NSBezierPath path); + + [Mac (10,13)] + [Export ("removeBezierPath:")] + void RemoveBezierPath (NSBezierPath path); + + [Mac (10,13)] + [NullAllowed, Export ("destination", ArgumentSemantic.Strong)] + PdfDestination Destination { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("URL", ArgumentSemantic.Copy)] + NSUrl Url { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("fieldName")] + string FieldName { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("caption")] + string Caption { get; set; } + + [Mac (10,13)] + [NullAllowed, Export ("backgroundColor", ArgumentSemantic.Copy)] + NSColor BackgroundColor { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationButtonWidget")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationButtonWidget")] interface PdfAnnotationButtonWidget { [Export ("controlType")] PdfWidgetControlType ControlType { get; set; } @@ -176,7 +835,7 @@ interface PdfAnnotationButtonWidget { NSColor BackgroundColor { get; set; } [Export ("allowsToggleToOff")] - bool AllowsToggleToOff { get; } + bool AllowsToggleToOff { get; set; } [Export ("font")] NSFont Font { get; set; } @@ -194,7 +853,9 @@ interface PdfAnnotationButtonWidget { string OnStateValue { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationChoiceWidget")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationChoiceWidget")] interface PdfAnnotationChoiceWidget { [Export ("stringValue")] string Text { get; set; } @@ -219,13 +880,17 @@ interface PdfAnnotationChoiceWidget { string [] Choices { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationCircle")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationCircle")] interface PdfAnnotationCircle { [Export ("interiorColor")] NSColor InteriorColor { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationFreeText")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationFreeText")] interface PdfAnnotationFreeText { [Export ("font")] NSFont Font { get; set; } @@ -237,7 +902,9 @@ interface PdfAnnotationFreeText { NSTextAlignment Alignment { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationInk")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationInk")] interface PdfAnnotationInk { [Export ("paths")] NSBezierPath [] Paths { get; } @@ -249,7 +916,9 @@ interface PdfAnnotationInk { void RemoveBezierPathpath (NSBezierPath path); } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationLine")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationLine")] interface PdfAnnotationLine { [Export ("startPoint")] CGPoint StartPoint { get; set; } @@ -267,7 +936,9 @@ interface PdfAnnotationLine { NSColor InteriorColor { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationLink")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationLink")] interface PdfAnnotationLink { [Export ("destination")] PdfDestination Destination { get; set; } @@ -279,7 +950,9 @@ interface PdfAnnotationLink { void SetHighlighted (bool highlighted); } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationMarkup")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationMarkup")] interface PdfAnnotationMarkup { [Export ("quadrilateralPoints", ArgumentSemantic.Assign), NullAllowed] #if XAMCORE_2_0 @@ -292,31 +965,41 @@ interface PdfAnnotationMarkup { PdfMarkupType MarkupType { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationPopup")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationPopup")] interface PdfAnnotationPopup { [Export ("isOpen")] bool IsOpen { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationSquare")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationSquare")] interface PdfAnnotationSquare { [Export ("interiorColor")] NSColor InteriorColor { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationStamp")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationStamp")] interface PdfAnnotationStamp { [Export ("name")] string Name { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationText")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationText")] interface PdfAnnotationText { [Export ("iconType")] PdfTextAnnotationIconType IconType { get; set; } } - [BaseType (typeof (PdfAnnotation), Name="PDFAnnotationTextWidget")] + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 12)] + [BaseType (typeof (PdfAnnotation), Name = "PDFAnnotationTextWidget")] interface PdfAnnotationTextWidget { [Export ("stringValue")] string StringValue { get; set; } @@ -341,9 +1024,16 @@ interface PdfAnnotationTextWidget { [Export ("fieldName")] string FieldName { get; set; } + + [Export ("attributedStringValue")] + NSAttributedString AttributedStringValue { get; set; } + + [Export ("isMultiline")] + bool IsMultiline { get; set; } } - [BaseType (typeof (NSObject), Name="PDFBorder")] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFBorder")] interface PdfBorder : NSCoding, NSCopying { [Export ("style")] PdfBorderStyle Style { get; set; } @@ -364,12 +1054,19 @@ interface PdfBorder : NSCoding, NSCopying { NSArray DashPattern { get; set; } #endif + [Mac (10,13)] + [Export ("borderKeyValues", ArgumentSemantic.Copy)] + NSDictionary WeakBorderKeyValues { get; } + [Export ("drawInRect:")] void Draw (CGRect rect); } - [BaseType (typeof (NSObject), Name="PDFDestination")] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFDestination")] interface PdfDestination : NSCopying { + + [DesignatedInitializer] [Export ("initWithPage:atPoint:")] IntPtr Constructor (PdfPage page, CGPoint point); @@ -378,35 +1075,98 @@ interface PdfDestination : NSCopying { [Export ("point")] CGPoint Point { get; } - + + [Mac (10, 7)] + [Export ("zoom")] + nfloat Zoom { get; set; } + //Should Compare be more more .Net ified ? [Export ("compare:")] NSComparisonResult Compare (PdfDestination destination); } //Add attributes for delegates/events - [BaseType (typeof (NSObject), Name="PDFDocument", Delegates=new string [] { "WeakDelegate" }, Events=new Type [] { typeof (PdfDocumentDelegate)})] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFDocument", Delegates = new string [] { "WeakDelegate" }, Events = new Type [] { typeof (PdfDocumentDelegate) })] interface PdfDocument : NSCopying { + + [Field ("PDFDocumentDidUnlockNotification", "+PDFKit")] + [Notification] + NSString DidUnlockNotification { get; } + + [Field ("PDFDocumentDidBeginFindNotification", "+PDFKit")] + [Notification] + NSString DidBeginFindNotification { get; } + + [Field ("PDFDocumentDidEndFindNotification", "+PDFKit")] + [Notification] + NSString DidEndFindNotification { get; } + + [Field ("PDFDocumentDidBeginPageFindNotification", "+PDFKit")] + [Notification] + NSString DidBeginPageFindNotification { get; } + + [Field ("PDFDocumentDidEndPageFindNotification", "+PDFKit")] + [Notification] + NSString DidEndPageFindNotification { get; } + + [Field ("PDFDocumentDidFindMatchNotification", "+PDFKit")] + [Notification] + NSString DidFindMatchNotification { get; } + + [Field ("PDFDocumentDidBeginWriteNotification", "+PDFKit")] + [Notification] + NSString DidBeginWriteNotification { get; } + + [Field ("PDFDocumentDidEndWriteNotification", "+PDFKit")] + [Notification] + NSString DidEndWriteNotification { get; } + + [Field ("PDFDocumentDidBeginPageWriteNotification", "+PDFKit")] + [Notification] + NSString DidBeginPageWriteNotification { get; } + + [Field ("PDFDocumentDidEndPageWriteNotification", "+PDFKit")] + [Notification] + NSString DidEndPageWriteNotification { get; } + [Export ("initWithURL:")] + [DesignatedInitializer] IntPtr Constructor (NSUrl url); [Export ("initWithData:")] - IntPtr Constructor (NSData data); + [DesignatedInitializer] + IntPtr Constructor (NSData data); [Export ("documentURL")] NSUrl DocumentUrl { get; } - //[Export ("documentRef")] - //CGPdfDocumentRef DocumentRef { get; } + [Export ("documentRef")] + CGPDFDocument Document { get; } - [Export ("documentAttributes")] + [Advice ("Use the strongly typed '[Get|Set]DocumentAttributes' instead.")] + [Export ("documentAttributes", ArgumentSemantic.Copy)] NSDictionary DocumentAttributes { get; set; } + [Wrap ("new PdfDocumentAttributes (DocumentAttributes)")] + PdfDocumentAttributes GetDocumentAttributes (); + + [Wrap ("DocumentAttributes = attributes?.Dictionary")] + void SetDocumentAttributes (PdfDocumentAttributes attributes); + +#if XAMCORE_4_0 || IOS + [Export ("majorVersion")] + nint MajorVersion { get; } + + [Export ("minorVersion")] + nint MinorVersion { get; } +#else [Export ("majorVersion")] int MajorVersion { get; } /* int, not NSInteger */ [Export ("minorVersion")] int MinorVersion { get; } /* int, not NSInteger */ +#endif [Export ("isEncrypted")] bool IsEncrypted { get; } @@ -423,6 +1183,26 @@ interface PdfDocument : NSCopying { [Export ("allowsCopying")] bool AllowsCopying { get; } + [Mac (10,13)] + [Export ("allowsDocumentChanges")] + bool AllowsDocumentChanges { get; } + + [Mac (10,13)] + [Export ("allowsDocumentAssembly")] + bool AllowsDocumentAssembly { get; } + + [Mac (10,13)] + [Export ("allowsContentAccessibility")] + bool AllowsContentAccessibility { get; } + + [Mac (10,13)] + [Export ("allowsCommenting")] + bool AllowsCommenting { get; } + + [Mac (10,13)] + [Export ("allowsFormFieldEntry")] + bool AllowsFormFieldEntry { get; } + [Export ("permissionsStatus")] PdfDocumentPermissions PermissionsStatus { get; } @@ -448,12 +1228,21 @@ interface PdfDocument : NSCopying { [Export ("writeToFile:withOptions:")] bool Write (string path, NSDictionary options); + [Mac (10,13)] + [Wrap ("Write (path, options.Dictionary)")] + bool Write (string path, PdfDocumentWriteOptions options); + [Export ("writeToURL:")] bool Write (NSUrl url); [Export ("writeToURL:withOptions:")] bool Write (NSUrl url, NSDictionary options); + [Mac (10,13)] + [Wrap ("Write (url, options?.Dictionary)")] + bool Write (NSUrl url, PdfDocumentWriteOptions options); + + [NullAllowed] [Export ("outlineRoot")] PdfOutline OutlineRoot { get; set; } @@ -477,24 +1266,49 @@ interface PdfDocument : NSCopying { [Export ("exchangePageAtIndex:withPageAtIndex:")] void ExchangePages (nint indexA, nint indexB); - - // Check on how Classes map to Types + [Export ("pageClass")] Class PageClass { get; } - - // Shouldn't options should be a bit flag of comparison methods - find enum. + + [Wrap ("Class.Lookup (PageClass)")] + Type PageType { get; } + [Export ("findString:withOptions:")] +#if MONOMAC && !XAMCORE_4_0 + [Obsolete ("Use 'Find (string, NSStringCompareOptions)' instead.")] PdfSelection [] Find (string text, nint options); + [Wrap ("Find (text: text, options: (nint) (int) compareOptions)", IsVirtual = true)] +#endif + PdfSelection [] Find (string text, NSStringCompareOptions compareOptions); + [Export ("beginFindString:withOptions:")] +#if MONOMAC && !XAMCORE_4_0 + [Obsolete ("Use 'FindAsync (string, NSStringCompareOptions)' instead.")] void FindAsync (string text, nint options); + [Wrap ("FindAsync (text: text, options: (nint) (int) compareOptions)", IsVirtual = true)] +#endif + void FindAsync (string text, NSStringCompareOptions compareOptions); + [Export ("beginFindStrings:withOptions:")] +#if MONOMAC && !XAMCORE_4_0 + [Obsolete ("Use 'FindAsync (string [], NSStringCompareOptions)' instead.")] void FindAsync (string [] text, nint options); + [Wrap ("FindAsync (text: text, options: (nint) (int) compareOptions)", IsVirtual = true)] +#endif + void FindAsync (string [] text, NSStringCompareOptions compareOptions); + [Export ("findString:fromSelection:withOptions:")] +#if MONOMAC && !XAMCORE_4_0 + [Obsolete ("Use 'Find (string, PdfSelection, NSStringCompareOptions)' instead.")] PdfSelection Find (string text, PdfSelection selection, nint options); + [Wrap ("Find (text: text, selection: selection, options: (nint) (int) compareOptions)", IsVirtual = true)] +#endif + PdfSelection Find (string text, PdfSelection selection, NSStringCompareOptions compareOptions); + [Export ("isFinding")] bool IsFinding { get; } @@ -509,21 +1323,49 @@ interface PdfDocument : NSCopying { [Export ("selectionFromPage:atCharacterIndex:toPage:atCharacterIndex:")] PdfSelection GetSelection (PdfPage startPage, nint startCharIndex, PdfPage endPage, nint endCharIndex); + + [NoiOS] + [Mac (10,7)] + [Export ("printOperationForPrintInfo:scalingMode:autoRotate:")] + [return: NullAllowed] + NSPrintOperation GetPrintOperation ([NullAllowed] NSPrintInfo printInfo, PdfPrintScalingMode scaleMode, bool doRotate); } - - [BaseType (typeof (NSObject))] + + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFDocumentDelegate")] +#if IOS + [Protocol] +#else + [Protocol (FormalSince = "10.13", Name = "PDFDocumentDelegate")] +#endif [Model] - [Protocol (IsInformal = true)] interface PdfDocumentDelegate { + + [Export ("documentDidUnlock:"), EventArgs ("NSNotification")] + void DidUnlock (NSNotification notification); + + [Export ("documentDidBeginDocumentFind:"), EventArgs ("NSNotification")] + void DidBeginDocumentFind (NSNotification notification); + [Export ("didMatchString:"), EventArgs ("PdfSelection")] void DidMatchString (PdfSelection sender); - //the delegate method needs to take at least one parameter - //[Export ("classForPage"), DelegateName ("ClassForPageDelegate"), DefaultValue (null)] - //Class ClassForPage (); + [Export ("classForPage"), IgnoredInDelegate] + Class GetClassForPage (); + + [Mac (10,13)] + [DelegateName ("ClassForAnnotationTypeDelegate"), DefaultValue (null)] + [Export ("classForAnnotationType:")] + Class GetClassForAnnotationType (string annotationType); + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'GetClassForAnnotationType' instead.")] [Export ("classForAnnotationClass:"), DelegateName ("ClassForAnnotationClassDelegate"), DefaultValue (null)] +#if XAMCORE_4_0 + Class GetClassForAnnotationClass (Class sender); +#else Class ClassForAnnotationClass (Class sender); +#endif [Export ("documentDidEndDocumentFind:"), EventArgs ("NSNotification")] void FindFinished (NSNotification notification); @@ -538,15 +1380,14 @@ interface PdfDocumentDelegate { void MatchFound (NSNotification notification); } - [BaseType (typeof (NSObject), Name="PDFOutline")] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFOutline")] interface PdfOutline { - // Why did this have a special init???? - // Constructor/class needs special documentation on how to use one that is created (not obtained from another object). [Export ("document")] PdfDocument Document { get; } - [Export ("parent")] + [Export ("parent"), NullAllowed] PdfOutline Parent { get; } [Export ("numberOfChildren")] @@ -570,25 +1411,29 @@ interface PdfOutline { [Export ("isOpen")] bool IsOpen { get; set; } - [Export ("destination")] + [Export ("destination"), NullAllowed] PdfDestination Destination { get; set; } - [Export ("action")] + [Mac (10,13)] + [Export ("action"), NullAllowed] PdfAction Action { get; set; } } - [BaseType (typeof (NSObject), Name="PDFPage")] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFPage")] interface PdfPage : NSCopying { + + [DesignatedInitializer] [Export ("initWithImage:")] IntPtr Constructor (NSImage image); - [Export ("document")] + [Export ("document"), NullAllowed] PdfDocument Document { get; } - //[Export ("pageRef")] - //CGPdfPageRef PageRef { get; } + [Export ("pageRef"), NullAllowed] + CGPDFPage Page { get; } - [Export ("label")] + [Export ("label"), NullAllowed] string Label { get; } [Export ("boundsForBox:")] @@ -599,7 +1444,7 @@ interface PdfPage : NSCopying { [Export ("rotation")] nint Rotation { get; set; } // - (NSInteger) rotation; - rotation is not consistently declared - + //Check Docs say: "array will _most likely_ be typed to subclasses of the PdfAnnotation class" //do they mean that if it isn't a subclass it is the base class ?? //Maybe we should be safe and return NSArray ?? @@ -616,11 +1461,31 @@ interface PdfPage : NSCopying { void RemoveAnnotation (PdfAnnotation annotation); [Export ("annotationAtPoint:")] + [return: NullAllowed] PdfAnnotation GetAnnotation (CGPoint point); + [Mac (10,12)] + [Export ("transformForBox:")] + CGAffineTransform GetTransform (PdfDisplayBox box); + + [NoiOS] + [Mac (10,12)] [Export ("drawWithBox:")] void Draw (PdfDisplayBox box); + [Mac (10,12)] + [Export ("drawWithBox:toContext:")] + void Draw (PdfDisplayBox box, CGContext context); + + [Mac (10,12)] + [Export ("transformContext:forBox:")] + void TransformContext (CGContext context, PdfDisplayBox box); + + [Mac (10,13)] + [Export ("thumbnailOfSize:forBox:")] + NSImage GetThumbnail (CGSize size, PdfDisplayBox box); + + [NoiOS] [Export ("transformContextForBox:")] void TransformContext (PdfDisplayBox box); @@ -640,47 +1505,61 @@ interface PdfPage : NSCopying { nint GetCharacterIndex (CGPoint point); [Export ("selectionForRect:")] + [return: NullAllowed] PdfSelection GetSelection (CGRect rect); [Export ("selectionForWordAtPoint:")] + [return: NullAllowed] PdfSelection SelectWord (CGPoint point); [Export ("selectionForLineAtPoint:")] + [return: NullAllowed] PdfSelection SelectLine (CGPoint point); [Export ("selectionFromPoint:toPoint:")] + [return: NullAllowed] PdfSelection GetSelection (CGPoint startPoint, CGPoint endPoint); [Export ("selectionForRange:")] + [return: NullAllowed] PdfSelection GetSelection (NSRange range); [Export ("dataRepresentation")] NSData DataRepresentation { get; } } - [BaseType (typeof (NSObject), Name="PDFSelection")] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFSelection")] [DisableDefaultCtor] // An uncaught exception was raised: init: not a valid initializer for PDFSelection interface PdfSelection : NSCopying { + + [DesignatedInitializer] [Export ("initWithDocument:")] IntPtr Constructor (PdfDocument document); - //verify NSArray [Export ("pages")] PdfPage [] Pages { get; } - [Export ("color")] + [Export ("color", ArgumentSemantic.Copy), NullAllowed] NSColor Color { get; set; } - [Export ("string")] + [Export ("string"), NullAllowed] string Text { get; } - [Export ("attributedString")] + [Export ("attributedString"), NullAllowed] NSAttributedString AttributedString { get; } [Export ("boundsForPage:")] CGRect GetBoundsForPage (PdfPage page); - - //verify NSArray + + [Mac (10, 7)] + [Export ("numberOfTextRangesOnPage:")] + nuint GetNumberOfTextRanges (PdfPage page); + + [Mac (10, 7)] + [Export ("rangeAtIndex:onPage:")] + NSRange GetRange (nuint index, PdfPage page); + [Export ("selectionsByLine")] PdfSelection [] SelectionsByLine (); @@ -696,6 +1575,10 @@ interface PdfSelection : NSCopying { [Export ("extendSelectionAtStart:")] void ExtendSelectionAtStart (nint precede); + [Mac (10,13)] + [Export ("extendSelectionForLineBoundaries")] + void ExtendSelectionForLineBoundaries (); + [Export ("drawForPage:active:")] void Draw (PdfPage page, bool active); @@ -703,37 +1586,67 @@ interface PdfSelection : NSCopying { void Draw (PdfPage page, PdfDisplayBox box, bool active); } - [BaseType (typeof (NSView), Name="PDFThumbnailView")] - interface PdfThumbnailView { - [Export ("PDFView")] + [iOS (11,0)] + [BaseType (typeof (NSView), Name = "PDFThumbnailView")] + interface PdfThumbnailView : NSCoding { + + [Export ("initWithFrame:")] + IntPtr Constructor (CGRect frame); + + [Field ("PDFThumbnailViewDocumentEditedNotification", "+PDFKit")] + [Notification] + NSString DocumentEditedNotification { get; } + + [Export ("PDFView"), NullAllowed] PdfView PdfView { get; set; } [Export ("thumbnailSize")] CGSize ThumbnailSize { get; set; } + [NoMac] + [Export ("layoutMode")] + PdfThumbnailLayoutMode LayoutMode { get; set; } + + [NoMac] + [Export ("contentInset")] + NSEdgeInsets ContentInset { get; set; } + + [NoiOS] [Export ("maximumNumberOfColumns")] nint MaximumNumberOfColumns { get; set; } + [NoiOS] [Export ("labelFont")] NSFont LabelFont { get; set; } - [Export ("backgroundColor")] + [Export ("backgroundColor", ArgumentSemantic.Copy)] NSColor BackgroundColor { get; set; } + [NoiOS] [Export ("allowsDragging")] bool AllowsDragging { get; set; } + [NoiOS] [Export ("allowsMultipleSelection")] bool AllowsMultipleSelection { get; set; } - - //verify NSArray - [Export ("selectedPages")] + + [Export ("selectedPages", ArgumentSemantic.Strong), NullAllowed] PdfPage [] SelectedPages { get; } } - [BaseType (typeof (NSView), Name="PDFView", Delegates=new string [] { "WeakDelegate" }, Events=new Type [] { typeof (PdfViewDelegate)})] - interface PdfView : NSMenuDelegate { - [Export ("document")] + [iOS (11,0)] + [BaseType (typeof (NSView), Name = "PDFView", Delegates = new string [] { "WeakDelegate" }, Events = new Type [] { typeof (PdfViewDelegate) })] + interface PdfView : +#if IOS + UIGestureRecognizerDelegate +#else + NSMenuDelegate, NSAnimationDelegate +#endif + { + [Export ("initWithFrame:")] + IntPtr Constructor (CGRect frame); + + [Export ("document"), NullAllowed] PdfDocument Document { get; set; } [Export ("canGoToFirstPage")] @@ -794,26 +1707,53 @@ interface PdfView : NSMenuDelegate { [Export ("displayMode")] PdfDisplayMode DisplayMode { get; set; } + [Mac (10,13)] + [Export ("displayDirection")] + PdfDisplayDirection DisplayDirection { get; set; } + [Export ("displaysPageBreaks")] bool DisplaysPageBreaks { get; set; } + [Mac (10,13)] + [Export ("pageBreakMargins")] + NSEdgeInsets PageBreakMargins { get; set; } + [Export ("displayBox")] PdfDisplayBox DisplayBox { get; set; } [Export ("displaysAsBook")] bool DisplaysAsBook { get; set; } + [Mac (10,13)] + [Export ("displaysRTL")] + bool DisplaysRtl { get; set; } + + [Deprecated (PlatformName.MacOSX, 10, 12)] [Export ("shouldAntiAlias")] bool ShouldAntiAlias { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 12)] [Export ("greekingThreshold")] nfloat GreekingThreshold { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 12)] [Export ("takeBackgroundColorFrom:")] void TakeBackgroundColor (NSObject sender); [Export ("backgroundColor")] NSColor BackgroundColor { get; set; } + + [Mac (10,7)] + [Export ("interpolationQuality", ArgumentSemantic.Assign)] + PdfInterpolationQuality InterpolationQuality { get; set; } + + [NoMac] + [Export ("usePageViewController:withViewOptions:")] + void UsePageViewController (bool enable, [NullAllowed] NSDictionary viewOptions); + + [NoMac] + [Export ("isUsingPageViewController")] + bool IsUsingPageViewController { get; } [Export ("delegate", ArgumentSemantic.Assign), NullAllowed] NSObject WeakDelegate { get; set; } @@ -825,6 +1765,14 @@ interface PdfView : NSMenuDelegate { [Export ("scaleFactor")] nfloat ScaleFactor { get; set; } + [Mac (10,13)] + [Export ("minScaleFactor")] + nfloat MinScaleFactor { get; set; } + + [Mac (10,13)] + [Export ("maxScaleFactor")] + nfloat MaxScaleFactor { get; set; } + [Export ("zoomIn:")] void ZoomIn (NSObject sender); @@ -840,6 +1788,10 @@ interface PdfView : NSMenuDelegate { [Export ("autoScales")] bool AutoScales { get; set; } + [Mac (10,13)] + [Export ("scaleFactorForSizeToFit")] + nfloat ScaleFactorForSizeToFit { get; } + [Export ("areaOfInterestForMouse:")] PdfAreaOfInterest GetAreaOfInterest (NSEvent mouseEvent); @@ -847,6 +1799,7 @@ interface PdfView : NSMenuDelegate { [Export ("areaOfInterestForPoint:")] PdfAreaOfInterest GetAreaOfInterest (CGPoint point); + [NoiOS] [Export ("setCursorForAreaOfInterest:")] void SetCursor (PdfAreaOfInterest area); @@ -863,30 +1816,41 @@ interface PdfView : NSMenuDelegate { void ClearSelection (); [Export ("selectAll:")] - void SelectAll (NSObject sender); + void SelectAll ([NullAllowed] NSObject sender); [Export ("scrollSelectionToVisible:")] void ScrollSelectionToVisible (NSObject sender); - // Verify NSArray [Export ("highlightedSelections")] PdfSelection [] HighlightedSelections { get; set; } [Export ("takePasswordFrom:")] void TakePasswordFrom (NSObject sender); + [NoiOS] [Export ("drawPage:")] void DrawPage (PdfPage page); + [Mac (10,12)] + [Export ("drawPage:toContext:")] + void DrawPage (PdfPage page, CGContext context); + + [Mac (10,12)] + [Export ("drawPagePost:toContext:")] + void DrawPagePost (PdfPage page, CGContext context); + + [NoiOS] [Export ("drawPagePost:")] void DrawPagePost (PdfPage page); [Export ("copy:")] - void Copy (NSObject sender); + void Copy ([NullAllowed] NSObject sender); + [NoiOS] [Export ("printWithInfo:autoRotate:")] void Print (NSPrintInfo printInfo, bool doRotate); + [NoiOS] [Export ("printWithInfo:autoRotate:pageScaling:")] void Print (NSPrintInfo printInfo, bool doRotate, PdfPrintScalingMode scaleMode); @@ -917,57 +1881,72 @@ interface PdfView : NSMenuDelegate { [Export ("rowSizeForPage:")] CGSize RowSize (PdfPage page); + [NoiOS] + [Deprecated (PlatformName.MacOSX, 10, 13)] [Export ("allowsDragging")] bool AllowsDragging { get; set; } - //Verify NSArray [Export ("visiblePages")] PdfPage [] VisiblePages { get; } [Export ("enableDataDetectors")] bool EnableDataDetectors { get; set; } - [Field("PDFViewChangedHistoryNotification")] + [Field("PDFViewChangedHistoryNotification", "+PDFKit")] [Notification] NSString ChangedHistoryNotification { get; } - [Field("PDFViewDocumentChangedNotification")] + [Field("PDFViewDocumentChangedNotification", "+PDFKit")] [Notification] NSString DocumentChangedNotification { get; } - [Field ("PDFViewPageChangedNotification")] + [Field ("PDFViewPageChangedNotification", "+PDFKit")] [Notification] NSString PageChangedNotification { get; } - [Field ("PDFViewScaleChangedNotification")] + [Field ("PDFViewScaleChangedNotification", "+PDFKit")] [Notification] NSString ScaleChangedNotification { get; } - [Field ("PDFViewAnnotationHitNotification")] + [Field ("PDFViewAnnotationHitNotification", "+PDFKit")] [Notification (typeof (PdfViewAnnotationHitEventArgs))] NSString AnnotationHitNotification { get; } - [Field ("PDFViewCopyPermissionNotification")] + [Field ("PDFViewCopyPermissionNotification", "+PDFKit")] [Notification] NSString CopyPermissionNotification { get; } - [Field ("PDFViewAnnotationWillHitNotification")] + [Field ("PDFViewPrintPermissionNotification", "+PDFKit")] + [Notification] + NSString PrintPermissionNotification { get; } + + [Field ("PDFViewAnnotationWillHitNotification", "+PDFKit")] [Notification] NSString AnnotationWillHitNotification { get; } - [Field ("PDFViewSelectionChangedNotification")] + [Field ("PDFViewSelectionChangedNotification", "+PDFKit")] [Notification] NSString SelectionChangedNotification { get; } - [Field ("PDFViewDisplayModeChangedNotification")] + [Field ("PDFViewDisplayModeChangedNotification", "+PDFKit")] [Notification] NSString DisplayModeChangedNotification { get; } - [Field ("PDFViewDisplayBoxChangedNotification")] + [Field ("PDFViewDisplayBoxChangedNotification", "+PDFKit")] [Notification] NSString DisplayBoxChangedNotification { get; } + + [Field ("PDFViewVisiblePagesChangedNotification", "+PDFKit")] + [Notification] + NSString VisiblePagesChangedNotification { get; } + + [NoiOS] + [Mac (10,13)] + [Export ("acceptsDraggedFiles")] + bool AcceptsDraggedFiles { get; set; } } + [NoiOS] interface PdfViewAnnotationHitEventArgs { [Export ("PDFAnnotationHit")] PdfAnnotation AnnotationHit { get; } @@ -975,11 +1954,17 @@ interface PdfViewAnnotationHitEventArgs { //Verify delegate methods. There are default actions (not just return null ) that should occur //if the delegate does not implement the method. - [BaseType (typeof (NSObject))] + [iOS (11,0)] + [BaseType (typeof (NSObject), Name = "PDFViewDelegate")] +#if IOS + [Protocol] +#else + [Protocol (FormalSince = "10.12", Name = "PDFViewDelegate")] +#endif [Model] - [Protocol (IsInformal = true)] interface PdfViewDelegate { //from docs: 'By default, the scale factor is restricted to a range between 0.1 and 10.0 inclusive.' + [NoiOS] [Export ("PDFViewWillChangeScaleFactor:toScale:"), DelegateName ("PdfViewScale"), DefaultValueFromArgument ("scale")] nfloat WillChangeScaleFactor (PdfView sender, nfloat scale); @@ -989,6 +1974,7 @@ interface PdfViewDelegate { // from the docs: 'By default, this method uses the string, if any, associated with the // 'Title' key in the view's PDFDocument attribute dictionary. If there is no such string, // this method uses the last path component if the document is URL-based. + [NoiOS] [Export ("PDFViewPrintJobTitle:"), DelegateName ("PdfViewTitle"), DefaultValue ("String.Empty")] string TitleOfPrintJob (PdfView sender); @@ -998,6 +1984,7 @@ interface PdfViewDelegate { [Export ("PDFViewPerformGoToPage:"), EventArgs ("PdfView")] void PerformGoToPage (PdfView sender); + [NoiOS] [Export ("PDFViewPerformPrint:"), EventArgs ("PdfView")] void PerformPrint (PdfView sender); @@ -1006,3 +1993,4 @@ interface PdfViewDelegate { } } +#endif // MONOMAC || (IOS && XAMCORE_2_0) diff --git a/src/photos.cs b/src/photos.cs index f8b2944c6f25..1b2305daafa3 100644 --- a/src/photos.cs +++ b/src/photos.cs @@ -10,6 +10,9 @@ using System; #if !MONOMAC using XamCore.UIKit; +using NSImage = XamCore.Foundation.NSObject; // help [NoiOS] and [NoTV] +#else +using XamCore.AppKit; #endif namespace XamCore.Photos @@ -35,7 +38,10 @@ interface PHAdjustmentData : NSCoding, NSSecureCoding { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] +#if MONOMAC + [DisableDefaultCtor] // Crashes mac introspection test +#endif [BaseType (typeof (PHObject))] interface PHAsset { @@ -66,6 +72,10 @@ interface PHAsset { [Export ("hidden")] bool Hidden { [Bind ("isHidden")] get; } + [NoTV][NoiOS] + [Export ("syncFailureHidden")] + bool SyncFailureHidden { [Bind ("isSyncFailureHidden")] get; } + [Export ("favorite")] bool Favorite { [Bind ("isFavorite")] get; } @@ -105,6 +115,9 @@ interface PHAsset { [Export ("fetchAssetsWithOptions:")] PHFetchResult FetchAssets ([NullAllowed] PHFetchOptions options); + [Deprecated (PlatformName.TvOS, 11,0)] + [Deprecated (PlatformName.iOS, 11,0)] + [NoMac] [Static] [Export ("fetchAssetsWithALAssetURLs:options:")] PHFetchResult FetchAssets (NSUrl[] assetUrls, [NullAllowed] PHFetchOptions options); @@ -112,6 +125,14 @@ interface PHAsset { [iOS (9,0)] [Export ("sourceType", ArgumentSemantic.Assign)] PHAssetSourceType SourceType { get; } + + [TV (11,0), iOS (11,0), NoMac] + [Export ("playbackStyle", ArgumentSemantic.Assign)] + PHAssetPlaybackStyle PlaybackStyle { get; } + + [NoTV][NoiOS] + [Field ("PHLocalIdentifierNotFound")] + NSString LocalIdentifierNotFound { get; } } [iOS (8,0)] @@ -365,7 +386,7 @@ interface PHAssetResourceRequestOptions : NSCopying [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] interface PHChange { @@ -378,7 +399,7 @@ interface PHChange { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] interface PHObjectChangeDetails { @@ -395,12 +416,12 @@ interface PHObjectChangeDetails { bool ObjectWasDeleted { get; } } - [NoMac] + [Mac (10,13, onlyOn64 : true)] delegate void PHChangeDetailEnumerator (nuint fromIndex, nuint toIndex); [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] interface PHFetchResultChangeDetails { @@ -444,7 +465,7 @@ interface PHFetchResultChangeDetails { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (PHObject))] [DisableDefaultCtor] // not user createable (calling description fails, see below) must be fetched by API // NSInternalInconsistencyException Reason: PHCollection has no identifier @@ -476,7 +497,7 @@ interface PHCollection { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (PHCollection))] interface PHAssetCollection { @@ -536,7 +557,7 @@ interface PHAssetCollection { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (PHCollection))] interface PHCollectionList { @@ -659,8 +680,10 @@ interface PHContentEditingInput { [Export ("adjustmentData", ArgumentSemantic.Strong)] PHAdjustmentData AdjustmentData { get; } -#if !MONOMAC [Export ("displaySizeImage", ArgumentSemantic.Strong)] +#if MONOMAC + NSImage DisplaySizeImage { get; } +#else UIImage DisplaySizeImage { get; } #endif @@ -671,7 +694,7 @@ interface PHContentEditingInput { XamCore.CoreImage.CIImageOrientation FullSizeImageOrientation { get; } [Export ("avAsset", ArgumentSemantic.Strong)] - [Availability (Deprecated = Platform.iOS_9_0, Message="In iOS 9, use AudiovisualAsset property instead")] + [Availability (Deprecated = Platform.iOS_9_0, Message="Use 'AudiovisualAsset' property instead.")] AVAsset AvAsset { get; } [iOS (9,0)] @@ -681,6 +704,11 @@ interface PHContentEditingInput { [iOS (10,0)] [NullAllowed, Export ("livePhoto", ArgumentSemantic.Strong)] PHLivePhoto LivePhoto { get; } + + [TV (11,0), iOS (11,0)] + [Mac (10,13, onlyOn64 : true)] + [Export ("playbackStyle", ArgumentSemantic.Assign)] + PHAssetPlaybackStyle PlaybackStyle { get; } } [iOS (8,0)] @@ -706,7 +734,7 @@ interface PHContentEditingOutput : NSCoding, NSSecureCoding { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] interface PHFetchOptions : NSCopying { @@ -736,12 +764,12 @@ interface PHFetchOptions : NSCopying { nuint FetchLimit { get; set; } } - [NoMac] + [Mac (10,13, onlyOn64 : true)] delegate void PHFetchResultEnumerator (NSObject element, nuint elementIndex, out bool stop); [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // crash when calling 'description' and seems to be only returned from iOS (not user created) interface PHFetchResult : NSCopying { @@ -791,7 +819,7 @@ interface PHFetchResult : NSCopying { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] interface PHImageRequestOptions : NSCopying { @@ -842,7 +870,7 @@ interface PHVideoRequestOptions { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [Static] interface PHImageKeys { @@ -862,7 +890,9 @@ interface PHImageKeys { NSString ResultRequestID { get; } } -#if !MONOMAC +#if MONOMAC + delegate void PHImageResultHandler (NSImage result, NSDictionary info); +#else delegate void PHImageResultHandler (UIImage result, NSDictionary info); #endif @@ -877,7 +907,7 @@ interface PHImageKeys { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] interface PHImageManager { @@ -885,25 +915,24 @@ interface PHImageManager { [Export ("defaultManager")] PHImageManager DefaultManager { get; } -#if !MONOMAC [Export ("requestImageForAsset:targetSize:contentMode:options:resultHandler:")] int /* PHImageRequestID = int32_t */ RequestImageForAsset (PHAsset asset, CGSize targetSize, PHImageContentMode contentMode, [NullAllowed] PHImageRequestOptions options, PHImageResultHandler resultHandler); -#endif [Export ("cancelImageRequest:")] void CancelImageRequest (int /* PHImageRequestID = int32_t */ requestID); -#if !MONOMAC [Export ("requestImageDataForAsset:options:resultHandler:")] int /* PHImageRequestID = int32_t */ RequestImageData (PHAsset asset, [NullAllowed] PHImageRequestOptions options, PHImageDataHandler handler); -#endif + [NoMac] [Export ("requestPlayerItemForVideo:options:resultHandler:")] int /* PHImageRequestID = int32_t */ RequestPlayerItem (PHAsset asset, [NullAllowed] PHVideoRequestOptions options, PHImageManagerRequestPlayerHandler resultHandler); + [NoMac] [Export ("requestExportSessionForVideo:options:exportPreset:resultHandler:")] int /* PHImageRequestID = int32_t */ RequestExportSession (PHAsset asset, [NullAllowed] PHVideoRequestOptions options, string exportPreset, PHImageManagerRequestExportHandler resultHandler); + [NoMac] [Export ("requestAVAssetForVideo:options:resultHandler:")] #if XAMCORE_4_0 int /* PHImageRequestID = int32_t */ RequestAVAsset (PHAsset asset, [NullAllowed] PHVideoRequestOptions options, PHImageManagerRequestAVAssetHandler resultHandler); @@ -915,11 +944,14 @@ interface PHImageManager { CGSize MaximumSize { get; } [iOS (9,1)] + [NoMac] [Export ("requestLivePhotoForAsset:targetSize:contentMode:options:resultHandler:")] int /* PHImageRequestID = int32_t */ RequestLivePhoto (PHAsset asset, CGSize targetSize, PHImageContentMode contentMode, [NullAllowed] PHLivePhotoRequestOptions options, PHImageManagerRequestLivePhoto resultHandler); } -#if !MONOMAC +#if MONOMAC + delegate void PHImageDataHandler (NSData data, NSString dataUti, CGImagePropertyOrientation orientation, NSDictionary info); +#else delegate void PHImageDataHandler (NSData data, NSString dataUti, UIImageOrientation orientation, NSDictionary info); #endif @@ -944,7 +976,7 @@ interface PHCachingImageManager { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // doc -> "abstract base class" // throws "NSInternalInconsistencyException Reason: PHObject has no identifier" @@ -967,7 +999,7 @@ interface PHObjectPlaceholder { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [Protocol] [Model] [BaseType (typeof (NSObject))] @@ -984,7 +1016,7 @@ interface PHPhotoLibraryChangeObserver { [iOS (8,0)] [TV (10,0)] - [NoMac] + [Mac (10,13, onlyOn64 : true)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // NSInternalInconsistencyException Reason: -[PHPhotoLibrary init] unsupported interface PHPhotoLibrary { @@ -1014,6 +1046,19 @@ interface PHPhotoLibrary { void UnregisterChangeObserver ([Protocolize] PHPhotoLibraryChangeObserver observer); } + [Mac (10,13, onlyOn64 : true)] + [NoTV][NoiOS] + [Category] + [BaseType (typeof (PHPhotoLibrary))] + interface PHPhotoLibrary_CloudIdentifiers { + + [Export ("localIdentifiersForCloudIdentifiers:")] + string[] GetLocalIdentifiers (PHCloudIdentifier[] cloudIdentifiers); + + [Export ("cloudIdentifiersForLocalIdentifiers:")] + PHCloudIdentifier[] GetCloudIdentifiers (string[] localIdentifiers); + } + [iOS (9,1)] [TV (10,0)] #if MONOMAC @@ -1104,14 +1149,46 @@ interface PHLivePhotoEditingContext { [Export ("orientation")] CGImagePropertyOrientation Orientation { get; } - [Async] + [Internal] [Export ("prepareLivePhotoForPlaybackWithTargetSize:options:completionHandler:")] + void _PrepareLivePhotoForPlayback (CGSize targetSize, [NullAllowed] NSDictionary options, Action handler); + + [Async] + [Wrap ("_PrepareLivePhotoForPlayback (targetSize, null, handler)")] + void PrepareLivePhotoForPlayback (CGSize targetSize, Action handler); + + [Async] + [Wrap ("_PrepareLivePhotoForPlayback (targetSize, (NSDictionary)options, handler)", IsVirtual = true)] void PrepareLivePhotoForPlayback (CGSize targetSize, [NullAllowed] NSDictionary options, Action handler); +#if XAMCORE_2_0 + // the API existed earlier but the key needed to create the strong dictionary did not work + [iOS (11,0)][TV (11,0)][Mac (10,12, onlyOn64 : true)] [Async] + [Wrap ("_PrepareLivePhotoForPlayback (targetSize, options?.Dictionary, handler)")] + void PrepareLivePhotoForPlayback (CGSize targetSize, [NullAllowed] PHLivePhotoEditingOption options, Action handler); +#endif + + [Internal] [Export ("saveLivePhotoToOutput:options:completionHandler:")] + void _SaveLivePhoto (PHContentEditingOutput output, [NullAllowed] NSDictionary options, Action handler); + + [Async] + [Wrap ("_SaveLivePhoto (output, null, handler)")] + void SaveLivePhoto (PHContentEditingOutput output, Action handler); + + [Async] + [Wrap ("_SaveLivePhoto (output, options, handler)", IsVirtual = true)] void SaveLivePhoto (PHContentEditingOutput output, [NullAllowed] NSDictionary options, Action handler); +#if XAMCORE_2_0 + // the API existed earlier but the key needed to create the strong dictionary did not work + [iOS (11,0)][TV (11,0)][Mac (10,12, onlyOn64 : true)] + [Async] + [Wrap ("_SaveLivePhoto (output, options?.Dictionary, handler)")] + void SaveLivePhoto (PHContentEditingOutput output, [NullAllowed] PHLivePhotoEditingOption options, Action handler); +#endif + [Export ("cancel")] void Cancel (); } @@ -1140,16 +1217,66 @@ interface PHLivePhotoFrame { nfloat RenderScale { get; } } - // TODO returns null on Xcode 8 beta 1-6, rdar #28169810 https://trello.com/c/RwXK6YRX - // PHLivePhotoEditingContext.PrepareLivePhotoForPlayback and SaveLivePhoto could use a strong dictionary once it's available -#if false - [iOS (10,0)] - [TV (10,0)] +#if XAMCORE_2_0 // fails to build with mac/classic + [iOS (11,0)] + [TV (11,0)] [Mac (10,12, onlyOn64 : true)] - [Static] - interface PHLivePhotoEditingOption { + [Static][Internal] + interface PHLivePhotoEditingOptionKeys { [Field ("PHLivePhotoShouldRenderAtPlaybackTime")] - NSString ShouldRenderAtPlaybackTime { get; } + NSString ShouldRenderAtPlaybackTimeKey { get; } + } + + [iOS (11,0)] + [TV (11,0)] + [Mac (10,12, onlyOn64 : true)] + [StrongDictionary ("PHLivePhotoEditingOptionKeys")] + interface PHLivePhotoEditingOption { + bool ShouldRenderAtPlaybackTime { get; } } #endif + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (PHAssetCollection))] + interface PHProject { + + [Export ("projectExtensionData")] + NSData ProjectExtensionData { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + interface PHProjectChangeRequest { + + [Export ("initWithProject:")] + IntPtr Constructor (PHProject project); + + [Export ("title")] + string Title { get; set; } + + [Export ("projectExtensionData", ArgumentSemantic.Copy)] + NSData ProjectExtensionData { get; set; } + + [Export ("setKeyAsset:")] + void SetKeyAsset ([NullAllowed] PHAsset keyAsset); + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PHCloudIdentifier : NSSecureCoding { + + [Static] + [Export ("notFoundIdentifier")] + PHCloudIdentifier NotFoundIdentifier { get; } + + [Export ("stringValue")] + string StringValue { get; } + + [Export ("initWithStringValue:")] + IntPtr Constructor (string stringValue); + } } diff --git a/src/photosui.cs b/src/photosui.cs index 4543c133ae10..827cbe838c30 100644 --- a/src/photosui.cs +++ b/src/photosui.cs @@ -1,16 +1,21 @@ using XamCore.CoreGraphics; using XamCore.ObjCRuntime; using XamCore.Foundation; +#if !MONOMAC using XamCore.UIKit; +#else +using XamCore.AppKit; +using UIImage = XamCore.AppKit.NSImage; +#endif using XamCore.Photos; using System; -namespace XamCore.PhotosUI -{ +namespace XamCore.PhotosUI { [NoTV] - [iOS (8,0)] + [iOS (8, 0)] + [Mac (10, 13, onlyOn64: true)] [Protocol] -#if !XAMCORE_4_0 && !TVOS +#if !XAMCORE_4_0 && !TVOS && !MONOMAC // According to documentation you're supposed to implement this protocol in a UIViewController subclass, // which means a model (which does not inherit from UIViewController) is not useful. [Model] @@ -39,6 +44,7 @@ interface PHContentEditingController { bool ShouldShowCancelConfirmation { get; } } +#if !MONOMAC [TV (10,0)] [iOS (9,1)] [BaseType (typeof (UIView))] @@ -77,7 +83,7 @@ interface PHLivePhotoView { } [TV (10,0)] - [iOS (9,1)] + [iOS (9,1)][NoMac] [Protocol, Model] [BaseType (typeof (NSObject))] interface PHLivePhotoViewDelegate { @@ -87,4 +93,206 @@ interface PHLivePhotoViewDelegate { [Export ("livePhotoView:didEndPlaybackWithStyle:")] void DidEndPlayback (PHLivePhotoView livePhotoView, PHLivePhotoViewPlaybackStyle playbackStyle); } +#endif + + [Mac (10,13, onlyOn64: true)][NoiOS][NoTV][NoWatch] + [Static] + interface PHProjectType { + [Field ("PHProjectTypeUndefined")] + NSString Undefined { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [DisableDefaultCtor] + [BaseType (typeof (NSExtensionContext))] + interface PHProjectExtensionContext : NSSecureCoding, NSCopying { + + [Export ("photoLibrary")] + PHPhotoLibrary PhotoLibrary { get; } + + [Export ("project")] + PHProject Project { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [DisableDefaultCtor] + [BaseType (typeof (PHProjectElement))] + interface PHProjectJournalEntryElement : NSSecureCoding { + + [Export ("date")] + NSDate Date { get; } + + [NullAllowed, Export ("assetElement")] + PHProjectAssetElement AssetElement { get; } + + [NullAllowed, Export ("textElement")] + PHProjectTextElement TextElement { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [DisableDefaultCtor] + [BaseType (typeof (PHProjectElement))] + interface PHProjectTextElement : NSSecureCoding { + + [Export ("text")] + string Text { get; } + + [NullAllowed, Export ("attributedText")] + NSAttributedString AttributedText { get; } + + [Export ("textElementType")] + PHProjectTextElementType TextElementType { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [Protocol] + interface PHProjectExtensionController { + + [Export ("supportedProjectTypes", ArgumentSemantic.Copy)] + PHProjectTypeDescription [] GetSupportedProjectTypes (); + + [Abstract] + [Export ("beginProjectWithExtensionContext:projectInfo:completion:")] + void BeginProject (PHProjectExtensionContext extensionContext, PHProjectInfo projectInfo, Action completion); + + [Abstract] + [Export ("resumeProjectWithExtensionContext:completion:")] + void ResumeProject (PHProjectExtensionContext extensionContext, Action completion); + + [Abstract] + [Export ("finishProjectWithCompletionHandler:")] + void FinishProject (Action completion); + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PHProjectTypeDescription : NSSecureCoding { + + [Export ("projectType")] + NSString ProjectType { get; } + + [Export ("localizedTitle")] + string LocalizedTitle { get; } + + [NullAllowed, Export ("localizedDescription")] + string LocalizedDescription { get; } + + [NullAllowed, Export ("image", ArgumentSemantic.Copy)] + UIImage Image { get; } + + [Export ("subtypeDescriptions", ArgumentSemantic.Copy)] + PHProjectTypeDescription[] SubtypeDescriptions { get; } + + [Export ("initWithProjectType:title:description:image:subtypeDescriptions:")] + [DesignatedInitializer] + IntPtr Constructor (NSString projectType, string localizedTitle, [NullAllowed] string localizedDescription, [NullAllowed] UIImage image, PHProjectTypeDescription[] subtypeDescriptions); + + [Export ("initWithProjectType:title:description:image:")] + IntPtr Constructor (NSString projectType, string localizedTitle, [NullAllowed] string localizedDescription, [NullAllowed] UIImage image); + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PHProjectRegionOfInterest : NSSecureCoding { + + [Export ("rect")] + CGRect Rect { get; } + + [Export ("weight")] + double Weight { get; } + + [Export ("identifier")] + string Identifier { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PHProjectElement : NSSecureCoding { + + [Export ("weight")] + double Weight { get; } + + [Export ("placement")] + CGRect Placement { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [DisableDefaultCtor] + [BaseType (typeof (PHProjectElement))] + interface PHProjectAssetElement : NSSecureCoding { + + [Export ("cloudAssetIdentifier")] + PHCloudIdentifier CloudAssetIdentifier { get; } + + [Export ("annotation")] + string Annotation { get; } + + [Export ("cropRect")] + CGRect CropRect { get; } + + [Export ("regionsOfInterest")] + PHProjectRegionOfInterest[] RegionsOfInterest { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PHProjectInfo : NSSecureCoding { + + [Export ("creationSource")] + PHProjectCreationSource CreationSource { get; } + + [Export ("projectType")] + NSString ProjectType { get; } + + [Export ("sections")] + PHProjectSection[] Sections { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PHProjectSection : NSSecureCoding { + + [Export ("sectionContents")] + PHProjectSectionContent[] SectionContents { get; } + + [Export ("sectionType")] + PHProjectSectionType SectionType { get; } + + [Export ("title")] + string Title { get; } + } + + [Mac (10,13, onlyOn64 : true)] + [NoiOS][NoTV] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface PHProjectSectionContent : NSSecureCoding { + + [Export ("elements")] + PHProjectElement[] Elements { get; } + + [Export ("numberOfColumns")] + nint NumberOfColumns { get; } + + [Export ("aspectRatio")] + double AspectRatio { get; } + + [Export ("cloudAssetIdentifiers")] + PHCloudIdentifier[] CloudAssetIdentifiers { get; } + } } \ No newline at end of file diff --git a/src/pushkit.cs b/src/pushkit.cs index fd706022b89f..137569d5c71f 100644 --- a/src/pushkit.cs +++ b/src/pushkit.cs @@ -59,6 +59,10 @@ interface PKPushType { [iOS (9,0)] [Field ("PKPushTypeComplication")] NSString Complication { get; } + + [iOS (11,0)] + [Field ("PKPushTypeFileProvider")] + NSString FileProvider { get; } } [iOS (8,0)] @@ -70,10 +74,15 @@ interface PKPushRegistryDelegate { [Export ("pushRegistry:didUpdatePushCredentials:forType:"), EventArgs ("PKPushRegistryUpdated"), EventName ("CredentialsUpdated")] void DidUpdatePushCredentials (PKPushRegistry registry, PKPushCredentials credentials, string type); - [Abstract] + [Abstract] // now optional in iOS 11 + [Deprecated (PlatformName.iOS, 11,0, message: "Use the 'DidReceiveIncomingPushWithPayload' overload accepting an 'Action' argument instead.")] [Export ("pushRegistry:didReceiveIncomingPushWithPayload:forType:"), EventArgs ("PKPushRegistryRecieved"), EventName ("IncomingPushReceived")] void DidReceiveIncomingPush (PKPushRegistry registry, PKPushPayload payload, string type); + [iOS (11,0)] + [Export ("pushRegistry:didReceiveIncomingPushWithPayload:forType:withCompletionHandler:")] + void DidReceiveIncomingPush (PKPushRegistry registry, PKPushPayload payload, string type, Action completion); + [Export ("pushRegistry:didInvalidatePushTokenForType:"), EventArgs ("PKPushRegistryRecieved"), EventName ("PushTokenInvalidated")] void DidInvalidatePushToken (PKPushRegistry registry, string type); } diff --git a/src/quicklook.cs b/src/quicklook.cs index c0fdec953752..83855fed4354 100644 --- a/src/quicklook.cs +++ b/src/quicklook.cs @@ -143,6 +143,56 @@ interface QLPreviewItem { [Export ("previewItemTitle")] string ItemTitle { get; } } + + [iOS (11,0)] + [Protocol] + interface QLPreviewingController { + [Export ("preparePreviewOfSearchableItemWithIdentifier:queryString:completionHandler:")] + void PreparePreviewOfSearchableItem (string identifier, [NullAllowed] string queryString, Action handler); + + [Export ("preparePreviewOfFileAtURL:completionHandler:")] + void PreparePreviewOfFile (NSUrl url, Action handler); + } + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + interface QLThumbnailProvider { + [Export ("provideThumbnailForFileRequest:completionHandler:")] + void ProvideThumbnail (QLFileThumbnailRequest request, Action handler); + } + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface QLThumbnailReply { + [Static] + [Export ("replyWithContextSize:drawingBlock:")] + QLThumbnailReply CreateReply (CGSize contextSize, Func drawingBlock); + + [Static] + [Export ("replyWithContextSize:currentContextDrawingBlock:")] + QLThumbnailReply CreateReply (CGSize contextSize, Func drawingBlock); + + [Static] + [Export ("replyWithImageFileURL:")] + QLThumbnailReply CreateReply (NSUrl fileUrl); + } + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + interface QLFileThumbnailRequest { + [Export ("maximumSize")] + CGSize MaximumSize { get; } + + [Export ("minimumSize")] + CGSize MinimumSize { get; } + + [Export ("scale")] + nfloat Scale { get; } + + [Export ("fileURL", ArgumentSemantic.Copy)] + NSUrl FileUrl { get; } + } #else [Static] interface QLThumbnailImage { diff --git a/src/replaykit.cs b/src/replaykit.cs index 404351e6a047..de08e5e63bb2 100644 --- a/src/replaykit.cs +++ b/src/replaykit.cs @@ -61,7 +61,7 @@ interface RPScreenRecorder { [Export ("sharedRecorder")] RPScreenRecorder SharedRecorder { get; } - [Availability (Deprecated = Platform.iOS_10_0, Message = "Use StartRecording(Action)")] + [Availability (Deprecated = Platform.iOS_10_0, Message = "Use 'StartRecording (Action)' instead.")] [Async] [Export ("startRecordingWithMicrophoneEnabled:handler:")] void StartRecording (bool microphoneEnabled, [NullAllowed] Action handler); @@ -102,6 +102,20 @@ bool MicrophoneEnabled { [NoTV, iOS (10,0)] [NullAllowed, Export ("cameraPreviewView")] UIView CameraPreviewView { get; } + + [NoTV][iOS (11,0)] + [Export ("cameraPosition", ArgumentSemantic.Assign)] + RPCameraPosition CameraPosition { get; set; } + + [TV (11,0)][iOS (11,0)] + [Async] + [Export ("startCaptureWithHandler:completionHandler:")] + void StartCapture ([NullAllowed] Action captureHandler, [NullAllowed] Action completionHandler); + + [TV (11,0), iOS (11,0)] + [Async] + [Export ("stopCaptureWithHandler:")] + void StopCapture ([NullAllowed] Action handler); } interface IRPScreenRecorderDelegate { } @@ -112,9 +126,15 @@ interface IRPScreenRecorderDelegate { } [BaseType (typeof (NSObject))] interface RPScreenRecorderDelegate { + [Deprecated (PlatformName.TvOS, 11,0, message: "Use 'DidStopRecording(RPScreenRecorder,RPPreviewViewController,NSError)' instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'DidStopRecording(RPScreenRecorder,RPPreviewViewController,NSError)' instead.")] [Export ("screenRecorder:didStopRecordingWithError:previewViewController:")] void DidStopRecording (RPScreenRecorder screenRecorder, NSError error, [NullAllowed] RPPreviewViewController previewViewController); + [TV (11,0)][iOS (11,0)] + [Export ("screenRecorder:didStopRecordingWithPreviewViewController:error:")] + void DidStopRecording (RPScreenRecorder screenRecorder, [NullAllowed] RPPreviewViewController previewViewController, [NullAllowed] NSError error); + [Export ("screenRecorderDidChangeAvailability:")] void DidChangeAvailability (RPScreenRecorder screenRecorder); } @@ -135,6 +155,13 @@ interface RPBroadcastActivityViewController { [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] IRPBroadcastActivityViewControllerDelegate Delegate { get; set; } + + [iOS (11,0)] + [NoTV] + [Static] + [Async] + [Export ("loadBroadcastActivityViewControllerWithPreferredExtension:handler:")] + void LoadBroadcastActivityViewController ([NullAllowed] string preferredExtension, Action handler); } interface IRPBroadcastActivityViewControllerDelegate {} @@ -168,6 +195,8 @@ interface RPBroadcastController { [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] IRPBroadcastControllerDelegate Delegate { get; set; } + [Deprecated (PlatformName.TvOS, 11,0)] + [Deprecated (PlatformName.iOS, 11,0)] [Export ("broadcastExtensionBundleID")] string BroadcastExtensionBundleID { get; } @@ -198,10 +227,16 @@ interface RPBroadcastControllerDelegate { [Export ("broadcastController:didUpdateServiceInfo:")] void DidUpdateServiceInfo (RPBroadcastController broadcastController, NSDictionary serviceInfo); + + [TV (11,0), iOS (11,0)] + [Export ("broadcastController:didUpdateBroadcastURL:")] + void DidUpdateBroadcastUrl (RPBroadcastController broadcastController, NSUrl broadcastUrl); } [iOS (10,0)] [TV (10,0)] + [Deprecated (PlatformName.TvOS, 11,0)] + [Deprecated (PlatformName.iOS, 11,0)] [BaseType (typeof (NSObject))] interface RPBroadcastConfiguration : NSCoding, NSSecureCoding { [Export ("clipDuration")] @@ -221,8 +256,14 @@ interface NSExtensionContext_RPBroadcastExtension { [Export ("loadBroadcastingApplicationInfoWithCompletion:")] void LoadBroadcastingApplicationInfo (LoadBroadcastingHandler handler); + [Deprecated (PlatformName.TvOS, 11,0, message: "Use 'CompleteRequest(NSUrl,NSDictionary)' instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'CompleteRequest(NSUrl,NSDictionary)' instead.")] [Export ("completeRequestWithBroadcastURL:broadcastConfiguration:setupInfo:")] void CompleteRequest (NSUrl broadcastURL, RPBroadcastConfiguration broadcastConfiguration, [NullAllowed] NSDictionary setupInfo); + + [TV (11,0)][iOS (11,0)] + [Export ("completeRequestWithBroadcastURL:setupInfo:")] + void CompleteRequest (NSUrl broadcastURL, [NullAllowed] NSDictionary setupInfo); } [iOS (10,0)] @@ -231,10 +272,18 @@ interface NSExtensionContext_RPBroadcastExtension { interface RPBroadcastHandler : NSExtensionRequestHandling { [Export ("updateServiceInfo:")] void UpdateServiceInfo (NSDictionary serviceInfo); + + // NSInvalidArgumentException -[RPBroadcastHandler updateBroadcastURL:]: unrecognized selector sent to instance 0x608001a4b160 + // https://trello.com/c/eA440suj/91-33875315-rpbroadcasthandler-updatebroadcasturl-unrecognized-selector + //[TV (11,0)][iOS (11,0)] + //[Export ("updateBroadcastURL:")] + //void UpdateBroadcastUrl (NSUrl broadcastUrl); } [iOS (10,0)] [TV (10,0)] + [Deprecated (PlatformName.TvOS, 11,0, message: "Use 'RPBroadcastSampleHandler' instead.")] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'RPBroadcastSampleHandler' instead.")] [BaseType (typeof (RPBroadcastHandler))] interface RPBroadcastMP4ClipHandler { [Export ("processMP4ClipWithURL:setupInfo:finished:")] diff --git a/src/safariservices.cs b/src/safariservices.cs index 66cc5d49eae9..838e791d3677 100644 --- a/src/safariservices.cs +++ b/src/safariservices.cs @@ -59,8 +59,10 @@ partial interface SSReadingList { [Export ("addReadingListItemWithURL:title:previewText:error:")] bool Add (NSUrl url, [NullAllowed] string title, [NullAllowed] string previewText, out NSError error); +#if !XAMCORE_4_0 [Field ("SSReadingListErrorDomain")] NSString ErrorDomain { get; } +#endif } [iOS (9,0)] @@ -71,6 +73,12 @@ interface SFSafariViewController { [PostGet ("NibBundle")] IntPtr Constructor ([NullAllowed] string nibName, [NullAllowed] NSBundle bundle); + [iOS (11,0)] + [Export ("initWithURL:configuration:")] + [DesignatedInitializer] + IntPtr Constructor (NSUrl url, SFSafariViewControllerConfiguration configuration); + + [Deprecated (PlatformName.iOS, 11,0, message: "Use '.ctor (NSUrl, SFSafariViewControllerConfiguration)' instead.")] [DesignatedInitializer] [Export ("initWithURL:entersReaderIfAvailable:")] IntPtr Constructor (NSUrl url, bool entersReaderIfAvailable); @@ -87,12 +95,22 @@ interface SFSafariViewController { SFSafariViewControllerDelegate Delegate { get; set; } [iOS (10, 0)] + [NullAllowed] [Export ("preferredBarTintColor", ArgumentSemantic.Assign)] UIColor PreferredBarTintColor { get; set; } [iOS (10, 0)] + [NullAllowed] [Export ("preferredControlTintColor", ArgumentSemantic.Assign)] UIColor PreferredControlTintColor { get; set; } + + [iOS (11,0)] + [Export ("configuration", ArgumentSemantic.Copy)] + SFSafariViewControllerConfiguration Configuration { get; } + + [iOS (11,0)] + [Export ("dismissButtonStyle", ArgumentSemantic.Assign)] + SFSafariViewControllerDismissButtonStyle DismissButtonStyle { get; set; } } [iOS (9,0)] @@ -108,6 +126,41 @@ partial interface SFSafariViewControllerDelegate { [Export ("safariViewController:didCompleteInitialLoad:")] void DidCompleteInitialLoad (SFSafariViewController controller, bool didLoadSuccessfully); + + [iOS (11,0)] + [Export ("safariViewController:excludedActivityTypesForURL:title:")] + string[] GetExcludedActivityTypes (SFSafariViewController controller, NSUrl url, [NullAllowed] string title); + + [iOS (11,0)] + [Export ("safariViewController:initialLoadDidRedirectToURL:")] + void InitialLoadDidRedirectToUrl (SFSafariViewController controller, NSUrl url); + } + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + interface SFSafariViewControllerConfiguration : NSCopying { + [Export ("entersReaderIfAvailable")] + bool EntersReaderIfAvailable { get; set; } + + [Export ("barCollapsingEnabled")] + bool BarCollapsingEnabled { get; set; } + } + + [iOS (11,0)] + delegate void SFAuthenticationCompletionHandler ([NullAllowed] NSUrl callbackUrl, [NullAllowed] NSError error); + + [iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface SFAuthenticationSession { + [Export ("initWithURL:callbackURLScheme:completionHandler:")] + IntPtr Constructor (NSUrl url, [NullAllowed] string callbackUrlScheme, SFAuthenticationCompletionHandler completionHandler); + + [Export ("start")] + bool Start (); + + [Export ("cancel")] + void Cancel (); } #else [Mac (10,12, onlyOn64: true)] @@ -131,10 +184,17 @@ interface SFSafariApplication [Export ("showPreferencesForExtensionWithIdentifier:completionHandler:")] void ShowPreferencesForExtension (string identifier, [NullAllowed] Action completionHandler); - [Mac (10, 12, 4)] + [Mac (10,12,4, onlyOn64 : true)] + [Advice ("Unavailable to extensions")] [Static][Async] [Export ("dispatchMessageWithName:toExtensionWithIdentifier:userInfo:completionHandler:")] void DispatchMessage (string messageName, string identifier, [NullAllowed] NSDictionary userInfo, [NullAllowed] Action completionHandler); + + [Mac (10,13, onlyOn64 : true)] + [Static] + [Async] + [Export ("getHostApplicationWithCompletionHandler:")] + void GetHostApplication (Action completionHandler); } [Mac (10,12, onlyOn64 : true)] @@ -228,20 +288,25 @@ interface SFSafariTab [DisableDefaultCtor] interface SFSafariToolbarItem { + [Deprecated (PlatformName.MacOSX, 10,13, message: "Use 'SetEnabled (bool)' or 'SetBadgeText' instead.")] [Export ("setEnabled:withBadgeText:")] void SetEnabled (bool enabled, [NullAllowed] string badgeText); - [Mac (10, 12, 4)] + [Mac (10,12,4, onlyOn64: true)] [Export ("setEnabled:")] void SetEnabled (bool enabled); - [Mac (10, 12, 4)] + [Mac (10,12,4, onlyOn64: true)] [Export ("setBadgeText:")] void SetBadgeText ([NullAllowed] string badgeText); - [Mac (10, 12, 4)] + [Mac (10,12,4, onlyOn64: true)] [Export ("setImage:")] void SetImage ([NullAllowed] NSImage image); + + [Mac (10,13, onlyOn64: true)] + [Export ("setLabel:")] + void SetLabel ([NullAllowed] string label); } [Mac (10,12, onlyOn64: true)] diff --git a/src/scenekit.cs b/src/scenekit.cs index 6d0c3d20e640..6fbf2efcc79f 100644 --- a/src/scenekit.cs +++ b/src/scenekit.cs @@ -53,6 +53,7 @@ using GLContext = global::XamCore.OpenGL.CGLContext; #else +using XamCore.UIKit; #if WATCH using GLContext = global::XamCore.Foundation.NSObject; // won't be used -> [NoWatch] but must compile @@ -98,6 +99,9 @@ interface MTLRenderPassDescriptor {} [Mac (10,8), iOS (8,0)] delegate void SCNSceneSourceStatusHandler (float /* float, not CGFloat */ totalProgress, SCNSceneSourceStatus status, NSError error, ref bool stopLoading); + delegate void SCNAnimationDidStartHandler (SCNAnimation animation, SCNAnimatable receiver); + delegate void SCNAnimationDidStopHandler (SCNAnimation animation, SCNAnimatable receiver, bool completed); + [Watch (3,0)] [Mac (10,8), iOS (8,0)] [Model, Protocol] @@ -152,7 +156,14 @@ interface SCNAnimatable { #if XAMCORE_2_0 [Abstract] #endif - [Mac (10,9)] + [Introduced (PlatformName.WatchOS, 3, 0)] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'SCNAnimationPlayer.Paused' instead.")] + [Introduced (PlatformName.TvOS, 9, 0)] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'SCNAnimationPlayer.Paused' instead.")] + [Introduced (PlatformName.iOS, 8, 0)] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'SCNAnimationPlayer.Paused' instead.")] + [Introduced (PlatformName.MacOSX, 10, 9)] + [Deprecated (PlatformName.MacOSX, 10, 13,message: "Use 'SCNAnimationPlayer.Paused' instead.")] [Export ("isAnimationForKeyPaused:")] bool IsAnimationPaused (NSString key); @@ -307,9 +318,17 @@ interface SCNCamera : SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCod [Export ("name", ArgumentSemantic.Copy)] string Name { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'FieldOfView' or 'FocalLength' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FieldOfView' or 'FocalLength' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'FieldOfView' or 'FocalLength' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'FieldOfView' or 'FocalLength' instead.")] [Export ("xFov")] double XFov { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'FieldOfView' or 'FocalLength' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FieldOfView' or 'FocalLength' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'FieldOfView' or 'FocalLength' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'FieldOfView' or 'FocalLength' instead.")] [Export ("yFov")] double YFov { get; set; } @@ -337,18 +356,34 @@ interface SCNCamera : SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCod [Export ("orthographicScale")] double OrthographicScale { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'FocusDistance' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FocusDistance' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'FocusDistance' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'FocusDistance' instead.")] [iOS (8,0)][Mac (10,9)] [Export ("focalDistance")] nfloat FocalDistance { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'FocusDistance' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FocusDistance' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'FocusDistance' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'FocusDistance' instead.")] [iOS (8,0)][Mac (10,9)] [Export ("focalSize")] nfloat FocalSize { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'FStop' instead.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FStop' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'FStop' instead.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'FStop' instead.")] [iOS (8,0)][Mac (10,9)] [Export ("focalBlurRadius")] nfloat FocalBlurRadius { get; set; } + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use 'FStop' instead with FStop = SensorHeight / Aperture.")] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FStop' instead with FStop = SensorHeight / Aperture.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'FStop' instead with FStop = SensorHeight / Aperture.")] + [Deprecated (PlatformName.WatchOS, 4, 0, message: "Use 'FStop' instead with FStop = SensorHeight / Aperture.")] [iOS (8,0)][Mac (10,9)] [Export ("aperture")] nfloat Aperture { get; set; } @@ -443,9 +478,195 @@ interface SCNCamera : SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCod [Static] [Export ("cameraWithMDLCamera:")] SCNCamera FromModelCamera (MDLCamera modelCamera); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("fieldOfView")] + nfloat FieldOfView { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("projectionDirection", ArgumentSemantic.Assign)] + SCNCameraProjectionDirection ProjectionDirection { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("focalLength")] + nfloat FocalLength { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("sensorHeight")] + nfloat SensorHeight { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("wantsDepthOfField")] + bool WantsDepthOfField { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("focusDistance")] + nfloat FocusDistance { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("focalBlurSampleCount")] + nint FocalBlurSampleCount { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("fStop")] + nfloat FStop { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("apertureBladeCount")] + nint ApertureBladeCount { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("screenSpaceAmbientOcclusionIntensity")] + nfloat ScreenSpaceAmbientOcclusionIntensity { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("screenSpaceAmbientOcclusionRadius")] + nfloat ScreenSpaceAmbientOcclusionRadius { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("screenSpaceAmbientOcclusionBias")] + nfloat ScreenSpaceAmbientOcclusionBias { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("screenSpaceAmbientOcclusionDepthThreshold")] + nfloat ScreenSpaceAmbientOcclusionDepthThreshold { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("screenSpaceAmbientOcclusionNormalThreshold")] + nfloat ScreenSpaceAmbientOcclusionNormalThreshold { get; set; } + #endif } + interface ISCNCameraControlConfiguration {} + + [NoWatch] + [TV (11,0), Mac (10,13), iOS (11,0)] + [Protocol] + interface SCNCameraControlConfiguration + { + [Abstract] + [Export ("autoSwitchToFreeCamera")] + bool AutoSwitchToFreeCamera { get; set; } + + [Abstract] + [Export ("allowsTranslation")] + bool AllowsTranslation { get; set; } + + [Abstract] + [Export ("flyModeVelocity")] + nfloat FlyModeVelocity { get; set; } + + [Abstract] + [Export ("panSensitivity")] + nfloat PanSensitivity { get; set; } + + [Abstract] + [Export ("truckSensitivity")] + nfloat TruckSensitivity { get; set; } + + [Abstract] + [Export ("rotationSensitivity")] + nfloat RotationSensitivity { get; set; } + } + + interface ISCNCameraControllerDelegate {} + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Protocol] + [Model] // Figured I would keep the model for convenience, as all the methods here are optional + [BaseType (typeof(NSObject))] + interface SCNCameraControllerDelegate + { + [Export ("cameraInertiaWillStartForController:")] + void CameraInertiaWillStart (SCNCameraController cameraController); + + [Export ("cameraInertiaDidEndForController:")] + void CameraInertiaDidEnd (SCNCameraController cameraController); + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface SCNCameraController + { + [Export ("delegate", ArgumentSemantic.Assign)] + [NullAllowed] + [Protocolize] + SCNCameraControllerDelegate Delegate { get; set; } + + [NullAllowed, Export ("pointOfView", ArgumentSemantic.Retain)] + SCNNode PointOfView { get; set; } + + [Export ("interactionMode", ArgumentSemantic.Assign)] + SCNInteractionMode InteractionMode { get; set; } + + [Export ("target", ArgumentSemantic.Assign)] + SCNVector3 Target { get; set; } + + [Export ("automaticTarget")] + bool AutomaticTarget { get; set; } + + [Export ("worldUp", ArgumentSemantic.Assign)] + SCNVector3 WorldUp { get; set; } + + [Export ("inertiaEnabled")] + bool InertiaEnabled { get; set; } + + [Export ("inertiaFriction")] + float InertiaFriction { get; set; } + + [Export ("inertiaRunning")] + bool InertiaRunning { [Bind ("isInertiaRunning")] get; } + + [Export ("minimumVerticalAngle")] + float MinimumVerticalAngle { get; set; } + + [Export ("maximumVerticalAngle")] + float MaximumVerticalAngle { get; set; } + + [Export ("minimumHorizontalAngle")] + float MinimumHorizontalAngle { get; set; } + + [Export ("maximumHorizontalAngle")] + float MaximumHorizontalAngle { get; set; } + + [Export ("translateInCameraSpaceByX:Y:Z:")] + void TranslateInCameraSpace (float deltaX, float deltaY, float deltaZ); + + [Export ("frameNodes:")] + void FrameNodes (SCNNode[] nodes); + + [Export ("rotateByX:Y:")] + void Rotate (float deltaX, float deltaY); + + [Export ("rollBy:aroundScreenPoint:viewport:")] + void Roll (float delta, CGPoint screenPoint, CGSize viewport); + + [Export ("dollyBy:onScreenPoint:viewport:")] + void Dolly (float delta, CGPoint screenPoint, CGSize viewport); + + [Export ("rollAroundTarget:")] + void RollAroundTarget (float delta); + + [Export ("dollyToTarget:")] + void DollyToTarget (float delta); + + [Export ("clearRoll")] + void ClearRoll (); + + [Export ("stopInertia")] + void StopInertia (); + + [Export ("beginInteraction:withViewport:")] + void BeginInteraction (CGPoint location, CGSize viewport); + + [Export ("continueInteraction:withViewport:sensitivity:")] + void ContinueInteraction (CGPoint location, CGSize viewport, nfloat sensitivity); + + [Export ("endInteraction:withViewport:velocity:")] + void EndInteraction (CGPoint location, CGSize viewport, CGPoint velocity); + } + [Watch (3,0)] [Mac (10,8), iOS (8,0)] [BaseType (typeof (SCNGeometry))] @@ -744,6 +965,38 @@ interface SCNGeometryElement : NSSecureCoding { #endif } +#if XAMCORE_2_0 && !WATCH + [NoWatch, NoTV, Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface SCNGeometryTessellator : NSCopying, NSSecureCoding + { + [Export ("tessellationFactorScale")] + nfloat TessellationFactorScale { get; set; } + + [Export ("tessellationPartitionMode", ArgumentSemantic.Assign)] + MTLTessellationPartitionMode TessellationPartitionMode { get; set; } + + [Export ("adaptive")] + bool Adaptive { [Bind ("isAdaptive")] get; set; } + + [Export ("screenSpace")] + bool ScreenSpace { [Bind ("isScreenSpace")] get; set; } + + [Export ("edgeTessellationFactor")] + nfloat EdgeTessellationFactor { get; set; } + + [Export ("insideTessellationFactor")] + nfloat InsideTessellationFactor { get; set; } + + [Export ("maximumEdgeLength")] + nfloat MaximumEdgeLength { get; set; } + + [Export ("smoothingMode", ArgumentSemantic.Assign)] + SCNTessellationSmoothingMode SmoothingMode { get; set; } + } +#endif + [Watch (3,0)] [Mac (10,8), iOS (8,0)] [Static] @@ -782,6 +1035,10 @@ interface SCNHitTest { [TV (10, 0), Mac (10, 12), iOS (10, 0)] [Field ("SCNHitTestOptionCategoryBitMask")] NSString OptionCategoryBitMaskKey { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Field ("SCNHitTestOptionSearchMode")] + NSString OptionSearchModeKey { get; } } [Watch (3,0)] @@ -879,7 +1136,7 @@ interface SCNLight : SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCodi #if XAMCORE_3_0 [Availability (Unavailable = Platform.iOS_Version)] #elif !MONOMAC - [Obsolete ("Do not use; this method only exist in OSX, not in iOS")] + [Obsolete ("Do not use; this method only exist in macOS, not in iOS.")] #endif [NoTV] [Availability (Deprecated = Platform.Mac_10_10)] @@ -889,7 +1146,7 @@ interface SCNLight : SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCodi #if XAMCORE_3_0 [Availability (Unavailable = Platform.iOS_Version)] #elif !MONOMAC - [Obsolete ("Do not use; this method only exist in OSX, not in iOS")] + [Obsolete ("Do not use; this method only exist in macOS, not in iOS.")] #endif [NoTV] [Availability (Deprecated = Platform.Mac_10_10)] @@ -1130,6 +1387,19 @@ interface SCNMaterial : SCNAnimatable, SCNShadable, NSCopying, NSSecureCoding { [Static] [Export ("materialWithMDLMaterial:")] SCNMaterial FromMaterial (MDLMaterial material); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("displacement")] + SCNMaterialProperty Displacement { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("fillMode", ArgumentSemantic.Assign)] + SCNFillMode FillMode { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("colorBufferWriteMask", ArgumentSemantic.Assign)] + SCNColorMask ColorBufferWriteMask { get; set; } + #endif } @@ -1156,8 +1426,8 @@ interface SCNMaterialProperty : SCNAnimatable, NSSecureCoding { [Export ("wrapT")] SCNWrapMode WrapT { get; set; } - [Deprecated (PlatformName.iOS, 10, 0, message: "Deprecated")] - [Deprecated (PlatformName.MacOSX, 10, 12, message: "Deprecated")] + [Deprecated (PlatformName.iOS, 10, 0)] + [Deprecated (PlatformName.MacOSX, 10, 12)] [NoWatch, NoTV] [NullAllowed, Export ("borderColor", ArgumentSemantic.Retain)] NSObject BorderColor { get; set; } @@ -1226,6 +1496,7 @@ interface SCNHitTestOptions { bool IgnoreChildNodes { get; set; } bool IgnoreHiddenNodes { get; set; } SCNNode RootNode { get; set; } + SCNHitTestSearchMode OptionSearchMode { get; } } [Watch (3,0)] @@ -1266,7 +1537,11 @@ interface SCNSceneLoadingOptions { [Watch (3,0)] [Mac (10,8), iOS (8,0)] [BaseType (typeof (NSObject))] - interface SCNNode : SCNAnimatable, SCNBoundingVolume, SCNActionable, NSCopying, NSSecureCoding { + interface SCNNode : SCNAnimatable, SCNBoundingVolume, SCNActionable, NSCopying, NSSecureCoding +#if IOS || TVOS + , UIFocusItem +#endif + { [Export ("transform")] SCNMatrix4 Transform { get; set; } @@ -1629,7 +1904,7 @@ interface SCNProgramDelegate { [Availability (Unavailable = Platform.iOS_Version)] [NoTV, NoWatch] #endif - [Availability (Deprecated = Platform.Mac_10_10, Message = "Use the SCNProgram's Opaque property instead")] + [Availability (Deprecated = Platform.Mac_10_10, Message = "Use the SCNProgram's Opaque property instead.")] [Export ("programIsOpaque:")] bool IsProgramOpaque (SCNProgram program); #endif @@ -1710,10 +1985,19 @@ interface SCNRenderer : SCNSceneRenderer, SCNTechniqueSupport { [iOS (9,0)][Mac (10,11)] [Export ("renderAtTime:viewport:commandBuffer:passDescriptor:")] void Render (double timeInSeconds, CGRect viewport, IMTLCommandBuffer commandBuffer, MTLRenderPassDescriptor renderPassDescriptor); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("renderWithViewport:commandBuffer:passDescriptor:")] + void Render (CGRect viewport, IMTLCommandBuffer commandBuffer, MTLRenderPassDescriptor renderPassDescriptor); #endif [TV (10, 0), Mac (10, 12), iOS (10, 0)] [Export ("updateProbes:atTime:")] void Update (SCNNode [] lightProbes, double time); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("updateAtTime:")] + void Update (double time); + } [Watch (3,0)] @@ -1999,14 +2283,14 @@ interface SCNSceneSourceLoading { NSString UseSafeModeKey { get; } [Mac(10,10)] - [Availability (Deprecated = Platform.iOS_8_3)] // header says NA and docs says "Available in iOS 8.0 through iOS 8.2." - [NoTV, NoWatch] + [iOS (8,0)] // header said NA and docs says "Available in iOS 8.0 through iOS 8.2." but it's back on iOS11 + [TV (11,0), Watch (4,0)] [Field ("SCNSceneSourceConvertUnitsToMetersKey")] NSString ConvertUnitsToMetersKey { get; } [Mac(10,10)] - [Availability (Deprecated = Platform.iOS_8_3)] // header says NA and docs says "Available in iOS 8.0 through iOS 8.2." - [NoTV, NoWatch] + [iOS (8,0)] // header said NA and docs says "Available in iOS 8.0 through iOS 8.2." but it's back on iOS11 + [TV (11,0), Watch (4,0)] [Field ("SCNSceneSourceConvertToYUpKey")] NSString ConvertToYUpKey { get; } @@ -2084,6 +2368,8 @@ interface SCNSceneSourceProperties { NSString AssetUnitMeterKey { get; } } + interface ISCNSceneRenderer {} + [Watch (3,0)] [Mac (10,8), iOS (8,0)] [Protocol, Model] @@ -2345,6 +2631,11 @@ interface SCNSceneRendererDelegate { [Mac (10,10)] [Export ("renderer:didSimulatePhysicsAtTime:")] void DidSimulatePhysics ([Protocolize]SCNSceneRenderer renderer, double timeInSeconds); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Export ("renderer:didApplyConstraintsAtTime:")] + void DidApplyConstraints ([Protocolize] SCNSceneRenderer renderer, double atTime); + } [Watch (3,0)] @@ -2610,12 +2901,27 @@ interface SCNView : SCNSceneRenderer, SCNTechniqueSupport { [iOS (8,0)][Mac (10,10)] [Export ("antialiasingMode")] SCNAntialiasingMode AntialiasingMode { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("cameraControlConfiguration")] + ISCNCameraControlConfiguration CameraControlConfiguration { get; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("defaultCameraController")] + SCNCameraController DefaultCameraController { get; } + } +#if WATCH || XAMCORE_4_0 + [Watch (4,0)] + [Mac (10,9), iOS (8,0)] + delegate void SCNAnimationEventHandler (ISCNAnimationProtocol animation, NSObject animatedObject, bool playingBackward); +#else [Mac (10,9), iOS (8,0)] delegate void SCNAnimationEventHandler (CAAnimation animation, NSObject animatedObject, bool playingBackward); +#endif - [NoWatch] + [Watch (4,0)] [Mac (10,9), iOS (8,0)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] @@ -2713,6 +3019,16 @@ interface SCNConstraint : SCNAnimatable, NSCopying, NSSecureCoding { [Mac (10,10)] [Export ("influenceFactor")] nfloat InfluenceFactor { get; set; } + + [Mac (10, 10), iOS (8,0)] + [TV (11,0)][Watch (4,0)] + [Export ("enabled")] + bool Enabled { [Bind ("isEnabled")] get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("incremental")] + bool Incremental { [Bind ("isIncremental")] get; set; } + } [Watch (3,0)] @@ -2757,6 +3073,18 @@ interface SCNLookAtConstraint { [Static, Export ("lookAtConstraintWithTarget:")] SCNLookAtConstraint Create ([NullAllowed] SCNNode target); + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("targetOffset", ArgumentSemantic.Assign)] + SCNVector3 TargetOffset { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("localFront", ArgumentSemantic.Assign)] + SCNVector3 LocalFront { get; set; } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [Export ("worldUp", ArgumentSemantic.Assign)] + SCNVector3 WorldUp { get; set; } } [Mac (10,9), iOS (8,0)] @@ -2769,6 +3097,17 @@ interface SCNLookAtConstraint { interface SCNTransformConstraint { [Static, Export ("transformConstraintInWorldSpace:withBlock:")] SCNTransformConstraint Create (bool inWorldSpace, SCNTransformConstraintHandler transformHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("positionConstraintInWorldSpace:withBlock:")] + SCNTransformConstraint CreatePositionConstraint (bool inWorldSpace, Func transformHandler); + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [Static] + [Export ("orientationConstraintInWorldSpace:withBlock:")] + SCNTransformConstraint CreateOrientationConstraint (bool inWorldSpace, Func transformHandler); + } [Watch (3,0)] @@ -4022,4 +4361,128 @@ interface SCNBufferStream { [Export ("writeBytes:length:")] unsafe void Length (IntPtr bytes, nuint length); } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface SCNTimingFunction : NSSecureCoding + { + [Static] + [Export ("functionWithTimingMode:")] + SCNTimingFunction Create (SCNActionTimingMode timingMode); + + [Static, NoWatch] + [Export ("functionWithCAMediaTimingFunction:")] + SCNTimingFunction Create (CAMediaTimingFunction caTimingFunction); + } + + // Use the Swift name SCNAnimationProtocol since it conflicts with the type name + [Protocol (Name="SCNAnimation")] + interface SCNAnimationProtocol { + } + + interface ISCNAnimationProtocol {} + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface SCNAnimation : SCNAnimationProtocol, NSCopying, NSSecureCoding + { + [Static] + [Export ("animationWithContentsOfURL:")] + SCNAnimation FromUrl (NSUrl animationUrl); + + [Static] + [Export ("animationNamed:")] + SCNAnimation FromName (string animationName); + + [Static, NoWatch] + [Export ("animationWithCAAnimation:")] + SCNAnimation FromCAAnimation (CAAnimation caAnimation); + + [Export ("duration")] + double Duration { get; set; } + + [NullAllowed, Export ("keyPath")] + string KeyPath { get; set; } + + [Export ("timingFunction", ArgumentSemantic.Retain)] + SCNTimingFunction TimingFunction { get; set; } + + [Export ("blendInDuration")] + double BlendInDuration { get; set; } + + [Export ("blendOutDuration")] + double BlendOutDuration { get; set; } + + [Export ("removedOnCompletion")] + bool RemovedOnCompletion { [Bind ("isRemovedOnCompletion")] get; set; } + + [Export ("appliedOnCompletion")] + bool AppliedOnCompletion { [Bind ("isAppliedOnCompletion")] get; set; } + + [Export ("repeatCount")] + nfloat RepeatCount { get; set; } + + [Export ("autoreverses")] + bool Autoreverses { get; set; } + + [Export ("startDelay")] + double StartDelay { get; set; } + + [Export ("timeOffset")] + double TimeOffset { get; set; } + + [Export ("fillsForward")] + bool FillsForward { get; set; } + + [Export ("fillsBackward")] + bool FillsBackward { get; set; } + + [Export ("usesSceneTimeBase")] + bool UsesSceneTimeBase { get; set; } + + [NullAllowed, Export ("animationDidStart", ArgumentSemantic.Copy)] + SCNAnimationDidStartHandler AnimationDidStart { get; set; } + + [NullAllowed, Export ("animationDidStop", ArgumentSemantic.Copy)] + SCNAnimationDidStopHandler AnimationDidStop { get; set; } + + [NullAllowed, Export ("animationEvents", ArgumentSemantic.Copy)] + SCNAnimationEvent[] AnimationEvents { get; set; } + + [Export ("additive")] + bool Additive { [Bind ("isAdditive")] get; set; } + + [Export ("cumulative")] + bool Cumulative { [Bind ("isCumulative")] get; set; } + } + + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface SCNAnimationPlayer : SCNAnimatable, NSCopying, NSSecureCoding + { + [Static] + [Export ("animationPlayerWithAnimation:")] + SCNAnimationPlayer FromAnimation (SCNAnimation animation); + + [Export ("animation")] + SCNAnimation Animation { get; } + + [Export ("speed")] + nfloat Speed { get; set; } + + [Export ("blendFactor")] + nfloat BlendFactor { get; set; } + + [Export ("paused")] + bool Paused { get; set; } + + [Export ("play")] + void Play (); + + [Export ("stop")] + void Stop (); + + [Export ("stopWithBlendOutDuration:")] + void StopWithBlendOutDuration (double seconds); + } } diff --git a/src/social.cs b/src/social.cs index 5dc71cc4cde5..655a5492d845 100644 --- a/src/social.cs +++ b/src/social.cs @@ -24,24 +24,33 @@ namespace XamCore.Social { [Mac (10,8, onlyOn64 : true)] [Static] interface SLServiceType { + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Facebook SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Facebook SDK instead.")] [Field ("SLServiceTypeFacebook")] [Mac (10,8)] NSString Facebook { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Twitter SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Twitter SDK instead.")] [Field ("SLServiceTypeTwitter")] [Mac (10,8)] NSString Twitter { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Sina Weibo SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Sina Weibo SDK instead.")] [Field ("SLServiceTypeSinaWeibo")] [Mac (10,8)] NSString SinaWeibo { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use Tencent Weibo SDK instead.")] + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use Tencent Weibo SDK instead.")] [Since (7,0)] [Field ("SLServiceTypeTencentWeibo")] [Mac (10,9)] NSString TencentWeibo { get; } #if MONOMAC + [Deprecated (PlatformName.MacOSX, 10, 13, message: "Use LinkedIn SDK instead.")] [Field ("SLServiceTypeLinkedIn")] [Mac (10,9)] NSString LinkedIn { get; } diff --git a/src/spritekit.cs b/src/spritekit.cs index b91288a64d06..ff6516ca7200 100644 --- a/src/spritekit.cs +++ b/src/spritekit.cs @@ -21,13 +21,21 @@ using XamCore.CoreGraphics; using XamCore.CoreVideo; using XamCore.SceneKit; +#if !WATCH +using XamCore.Metal; +#endif using Vector2 = global::OpenTK.Vector2; using Vector3 = global::OpenTK.Vector3; using Matrix2 = global::OpenTK.Matrix2; using Matrix3 = global::OpenTK.Matrix3; using Matrix4 = global::OpenTK.Matrix4; +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; using Vector4 = global::OpenTK.Vector4; +using Quaternion = global::OpenTK.Quaternion; #if MONOMAC using XamCore.AppKit; @@ -37,6 +45,7 @@ using pfloat = System.nfloat; #else using XamCore.UIKit; +using NSLineBreakMode = global::XamCore.UIKit.UILineBreakMode; using pfloat = System.Single; #if !WATCH using UIView = global::XamCore.UIKit.UIView; @@ -51,6 +60,11 @@ interface AVPlayer {} interface CIFilter {} interface GKPolygonObstacle {} interface UIView {} + interface IMTLCommandBuffer {} + interface IMTLCommandQueue {} + interface IMTLDevice {} + interface IMTLRenderCommandEncoder {} + interface MTLRenderPassDescriptor {} #endif delegate void SKNodeChildEnumeratorHandler (SKNode node, out bool stop); @@ -109,6 +123,7 @@ interface SK3DNode { } + [DisableDefaultCtor] // DesignatedInitializer below #if MONOMAC [Mac (10,9, onlyOn64 : true)] [BaseType (typeof (NSResponder))] @@ -122,6 +137,10 @@ partial interface SKNode : NSCoding, NSCopying, UIFocusItem { [BaseType (typeof (NSObject))] partial interface SKNode : NSCoding, NSCopying { #endif + [DesignatedInitializer] + [Export ("init")] + IntPtr Constructor (); + [Static, Export ("node")] SKNode Create (); @@ -166,6 +185,12 @@ partial interface SKNode : NSCoding, NSCopying { [Export ("userInteractionEnabled")] bool UserInteractionEnabled { [Bind ("isUserInteractionEnabled")] get; set; } + [NoWatch] + [NoMac] + [TV (11,0), iOS (11,0)] + [Export ("focusBehavior", ArgumentSemantic.Assign)] + SKNodeFocusBehavior FocusBehavior { get; set; } + [Export ("parent")] SKNode Parent { get; } @@ -259,6 +284,7 @@ partial interface SKNode : NSCoding, NSCopying { [Export ("intersectsNode:")] bool IntersectsNode (SKNode node); + [iOS (8,3)][TV (9,0)][Mac (10,11)] [Export ("isEqualToNode:")] bool IsEqual (SKNode node); @@ -304,11 +330,13 @@ partial interface SKNode : NSCoding, NSCopying { [Export ("obstaclesFromSpriteTextures:accuracy:")] GKPolygonObstacle[] ObstaclesFromSpriteTextures (SKNode[] sprites, float accuracy); +#if !XAMCORE_4_0 + [Deprecated (PlatformName.iOS, 10,0, message: "Attributes are only available for node classes supporting SKShader (see SKSpriteNode etc.).")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Attributes are only available for node classes supporting SKShader (see SKSpriteNode etc.).")] [iOS (9,0),Mac(10,11)] [Export ("attributeValues", ArgumentSemantic.Copy)] NSDictionary AttributeValues { get; set; } -#if !XAMCORE_4_0 [Deprecated (PlatformName.iOS, 10,0, message: "Attributes are only available for node classes supporting SKShader (see SKSpriteNode etc.).")] [Deprecated (PlatformName.MacOSX, 10,12, message: "Attributes are only available for node classes supporting SKShader (see SKSpriteNode etc.).")] [iOS (9,0),Mac(10,11)] @@ -392,7 +420,10 @@ partial interface SKEffectNode : SKWarpable { [Export ("shader", ArgumentSemantic.Retain)] SKShader Shader { get; set; } -#if XAMCORE_4_0 + [iOS (9,0),Mac(10,11)] + [Export ("attributeValues", ArgumentSemantic.Copy)] + NSDictionary AttributeValues { get; set; } + [iOS (9,0), Mac(10,11)] [Export ("valueForAttributeNamed:")] [return: NullAllowed] @@ -401,7 +432,6 @@ partial interface SKEffectNode : SKWarpable { [iOS (9,0), Mac(10,11)] [Export ("setValue:forAttributeNamed:")] void SetValue (SKAttributeValue value, string key); -#endif } delegate Vector3 SKFieldForceEvaluator (/* vector_float3 */ Vector4 position, /* vector_float3 */ Vector4 velocity, float /* float, not CGFloat */ mass, float /* float, not CGFloat */ charge, double time); @@ -458,9 +488,11 @@ Vector4 Direction { SKFieldNode CreateRadialGravityField (); [Static, Export ("linearGravityFieldWithVector:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] SKFieldNode CreateLinearGravityField (/* vector_float3 */ Vector4 direction); [Static, Export ("velocityFieldWithVector:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] SKFieldNode CreateVelocityField (/* vector_float3 */ Vector4 direction); [Static, Export ("velocityFieldWithTexture:")] @@ -739,7 +771,10 @@ partial interface SKSpriteNode : SKWarpable { [Export ("scaleToSize:")] void ScaleTo (CGSize size); -#if XAMCORE_4_0 + [iOS (9,0),Mac(10,11)] + [Export ("attributeValues", ArgumentSemantic.Copy)] + NSDictionary AttributeValues { get; set; } + [iOS (9,0), Mac(10,11)] [Export ("valueForAttributeNamed:")] [return: NullAllowed] @@ -748,7 +783,6 @@ partial interface SKSpriteNode : SKWarpable { [iOS (9,0), Mac(10,11)] [Export ("setValue:forAttributeNamed:")] void SetValue (SKAttributeValue value, string key); -#endif } [Watch (3,0)] @@ -973,7 +1007,10 @@ partial interface SKEmitterNode { [Export ("particleRenderOrder", ArgumentSemantic.Assign)] SKParticleRenderOrder ParticleRenderOrder { get; set; } -#if XAMCORE_4_0 + [iOS (9,0),Mac(10,11)] + [Export ("attributeValues", ArgumentSemantic.Copy)] + NSDictionary AttributeValues { get; set; } + [iOS (9,0), Mac(10,11)] [Export ("valueForAttributeNamed:")] [return: NullAllowed] @@ -982,7 +1019,6 @@ partial interface SKEmitterNode { [iOS (9,0), Mac(10,11)] [Export ("setValue:forAttributeNamed:")] void SetValue (SKAttributeValue value, string key); -#endif } [Watch (3,0)] @@ -1182,12 +1218,29 @@ partial interface SKLabelNode { [Static, Export ("labelNodeWithText:")] SKLabelNode FromText ([NullAllowed] string text); + [TV (11,0), Watch (4,0), Mac (13,0), iOS (11,0)] + [Static] + [Export ("labelNodeWithAttributedText:")] + SKLabelNode FromText ([NullAllowed] NSAttributedString attributedText); + [Export ("verticalAlignmentMode")] SKLabelVerticalAlignmentMode VerticalAlignmentMode { get; set; } [Export ("horizontalAlignmentMode")] SKLabelHorizontalAlignmentMode HorizontalAlignmentMode { get; set; } + [TV (11,0), Watch (4,0), Mac (13,0), iOS (11,0)] + [Export ("numberOfLines")] + nint NumberOfLines { get; set; } + + [TV (11,0), Watch (4,0), Mac (13,0), iOS (11,0)] + [Export ("lineBreakMode", ArgumentSemantic.Assign)] + NSLineBreakMode LineBreakMode { get; set; } + + [TV (11,0), Watch (4,0), Mac (13,0), iOS (11,0)] + [Export ("preferredMaxLayoutWidth")] + nfloat PreferredMaxLayoutWidth { get; set; } + [Export ("fontName", ArgumentSemantic.Copy)] string FontName { get; set; } @@ -1195,6 +1248,10 @@ partial interface SKLabelNode { [NullAllowed] // nullable in Xcode7 headers and caught by introspection tests string Text { get; set; } + [TV (11,0), Watch (4,0), Mac (13,0), iOS (11,0)] + [NullAllowed, Export ("attributedText", ArgumentSemantic.Copy)] + NSAttributedString AttributedText { get; set; } + [Export ("fontSize")] nfloat FontSize { get; set; } @@ -1235,13 +1292,27 @@ interface SKLightNode { uint CategoryBitMask { get; set; } /* uint32_t */ } - [NoWatch] + [Watch (4,0)] [Mac (10,9, onlyOn64 : true)] [Since (7,0)] [BaseType (typeof (SKNode))] partial interface SKVideoNode { - [NoWatch] +#if WATCH + [Static, Export ("videoNodeWithFileNamed:")] + SKVideoNode VideoNodeWithFileNamed (string videoFile); + + [Static, Export ("videoNodeWithURL:")] + SKVideoNode VideoNodeWithURL (NSUrl videoURL); + + [DesignatedInitializer] + [Export ("initWithFileNamed:")] + IntPtr Constructor (string videoFile); + + [DesignatedInitializer] + [Export ("initWithURL:")] + IntPtr Constructor (NSUrl url); +#else [Static, Export ("videoNodeWithAVPlayer:")] SKVideoNode FromPlayer (AVPlayer player); @@ -1257,7 +1328,6 @@ partial interface SKVideoNode { [Static, Export ("videoNodeWithURL:"), Internal] SKVideoNode VideoNodeWithURL (NSUrl videoURL); - [NoWatch] [DesignatedInitializer] [Export ("initWithAVPlayer:")] IntPtr Constructor (AVPlayer player); @@ -1273,10 +1343,13 @@ partial interface SKVideoNode { [Export ("initWithURL:"), Internal] IntPtr InitWithURL (NSUrl url); +#endif + [NoWatch] [Export ("play")] void Play (); + [NoWatch] [Export ("pause")] void Pause (); @@ -1708,14 +1781,19 @@ interface SKUniform : NSCopying, NSCoding { IntPtr InitWithNameVectorFloat4 (string name, Vector4 value); #endif +#if !XAMCORE_4_0 [Internal] [NoWatch] [Availability (Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12)] [Export ("initWithName:floatMatrix2:")] IntPtr InitWithNameFloatMatrix2 (string name, Matrix2 value); +#endif +#if !XAMCORE_4_0 + [Obsolete ("Use the '(string, MatrixFloat2x2)' overload instead.")] [iOS (10,0)][Mac (10,12)] [TV (10,0)] + [Sealed] [Export ("initWithName:matrixFloat2x2:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] #if WATCH @@ -1724,15 +1802,25 @@ interface SKUniform : NSCopying, NSCoding { [Internal] IntPtr InitWithNameMatrixFloat2x2 (string name, Matrix2 value); #endif +#endif // !XAMCORE_4_0 + + [iOS (10,0)][Mac (10,12)] + [TV (10,0)] + [Export ("initWithName:matrixFloat2x2:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (string name, MatrixFloat2x2 value); +#if !XAMCORE_4_0 [Internal] [NoWatch] [Availability (Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12)] [Export ("initWithName:floatMatrix3:")] IntPtr InitWithNameFloatMatrix3 (string name, Matrix3 value); + [Obsolete ("Use the '(string, MatrixFloat3x3)' overload instead.")] [iOS (10,0)][Mac (10,12)] [TV (10,0)] + [Sealed] [Export ("initWithName:matrixFloat3x3:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] #if WATCH @@ -1740,25 +1828,44 @@ interface SKUniform : NSCopying, NSCoding { #else [Internal] IntPtr InitWithNameMatrixFloat3x3 (string name, Matrix3 value); +#endif #endif + [iOS (10,0)][Mac (10,12)] + [TV (10,0)] + [Export ("initWithName:matrixFloat3x3:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (string name, MatrixFloat3x3 value); + +#if !XAMCORE_4_0 [Internal] [NoWatch] [Availability (Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12)] [Export ("initWithName:floatMatrix4:")] IntPtr InitWithNameFloatMatrix4 (string name, Matrix4 value); +#endif +#if !XAMCORE_4_0 + [Obsolete ("Use the '(string, MatrixFloat4x4)' overload instead.")] [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Export ("initWithName:matrixFloat4x4:")] + [Sealed] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] #if WATCH IntPtr Constructor (string name, Matrix4 value); #else [Internal] IntPtr InitWithNameMatrixFloat4x4 (string name, Matrix4 value); +#endif #endif + [iOS (10,0)][Mac (10,12)] + [TV (10,0)] + [Export ("initWithName:matrixFloat4x4:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + IntPtr Constructor (string name, MatrixFloat4x4 value); + [Export ("name")] string Name { get; } @@ -1828,59 +1935,92 @@ Vector4 _VectorFloat4Value { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } +#if !XAMCORE_4_0 [Internal] [Availability (Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12)] [NoWatch] [Export ("floatMatrix2Value")] Matrix2 _FloatMatrix2Value { get; set; } +#endif +#if !XAMCORE_4_0 && WATCH + [Obsolete ("Use 'MatrixFloat2x2Value' instead.")] [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Export ("matrixFloat2x2Value", ArgumentSemantic.Assign)] -#if WATCH Matrix2 FloatMatrix2x2Value { -#else - [Internal] - Matrix2 _MatrixFloat2x2Value { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; + } +#endif + +#if !XAMCORE_4_0 && WATCH + [Sealed] // The selector is already used in the 'FloatMatrix2x2Value' property. #endif + [iOS (10,0)][Mac (10,12)] + [TV (10,0)] + [Export ("matrixFloat2x2Value", ArgumentSemantic.Assign)] + MatrixFloat2x2 MatrixFloat2x2Value { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } +#if !XAMCORE_4_0 [Internal] [NoWatch] [Availability (Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12)] [Export ("floatMatrix3Value")] Matrix3 _FloatMatrix3Value { get; set; } +#endif +#if !XAMCORE_4_0 && WATCH + [Obsolete ("Use 'MatrixFloat3x3Value' instead.")] [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Export ("matrixFloat3x3Value", ArgumentSemantic.Assign)] -#if WATCH Matrix3 FloatMatrix3x3Value { -#else - [Internal] - Matrix3 _MatrixFloat3x3Value { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; + } #endif + +#if !XAMCORE_4_0 && WATCH + [Sealed] // The selector is already used in the 'FloatMatrix3x3Value' property. +#endif + [iOS (10,0)][Mac (10,12)] + [TV (10,0)] + [Export ("matrixFloat3x3Value", ArgumentSemantic.Assign)] + MatrixFloat3x3 MatrixFloat3x3Value { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } +#if !XAMCORE_4_0 [Internal] [NoWatch] [Availability (Deprecated = Platform.iOS_10_0 | Platform.Mac_10_12)] [Export ("floatMatrix4Value")] Matrix4 _FloatMatrix4Value { get; set; } +#endif +#if !XAMCORE_4_0 && WATCH + [Obsolete ("Use 'FloatMatrix4x4Value' instead.")] [iOS (10,0)][Mac (10,12)] [TV (10,0)] [Export ("matrixFloat4x4Value", ArgumentSemantic.Assign)] -#if WATCH Matrix4 FloatMatrix4x4Value { -#else - [Internal] - Matrix4 _MatrixFloat4x4Value { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; + } +#endif + +#if !XAMCORE_4_0 && WATCH + [Sealed] // The selector is already used in the 'FloatMatrix4x4Value' property. #endif + [iOS (10,0)][Mac (10,12)] + [TV (10,0)] + [Export ("matrixFloat4x4Value", ArgumentSemantic.Assign)] + MatrixFloat4x4 MatrixFloat4x4Value { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; } @@ -1912,23 +2052,50 @@ Matrix4 _MatrixFloat4x4Value { [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] SKUniform Create (string name, Vector4 value); +#if !XAMCORE_4_0 + [Obsolete ("Use the '(string, MatrixFloat2x2)' overload instead.")] [iOS (10,0)][Mac (10,12)] [Static] [Export ("uniformWithName:matrixFloat2x2:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] SKUniform Create (string name, Matrix2 value); +#endif + [iOS (10,0)][Mac (10,12)] + [Static] + [Export ("uniformWithName:matrixFloat2x2:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + SKUniform Create (string name, MatrixFloat2x2 value); + +#if !XAMCORE_4_0 + [Obsolete ("Use the '(string, MatrixFloat3x3)' overload instead.")] [iOS (10,0)][Mac (10,12)] [Static] [Export ("uniformWithName:matrixFloat3x3:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] SKUniform Create (string name, Matrix3 value); +#endif + [iOS (10,0)][Mac (10,12)] + [Static] + [Export ("uniformWithName:matrixFloat3x3:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + SKUniform Create (string name, MatrixFloat3x3 value); + +#if !XAMCORE_4_0 + [Obsolete ("Use 'the '(string, MatrixFloat4x4)' overload instead.")] [iOS (10,0)][Mac (10,12)] [Static] [Export ("uniformWithName:matrixFloat4x4:")] [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] SKUniform Create (string name, Matrix4 value); +#endif + + [iOS (10,0)][Mac (10,12)] + [Static] + [Export ("uniformWithName:matrixFloat4x4:")] + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + SKUniform Create (string name, MatrixFloat4x4 value); } delegate void SKActionDurationHandler (SKNode node, nfloat elapsedTime); @@ -2825,8 +2992,13 @@ interface SKAttribute : NSCoding [iOS (9,0)][Mac (10,11, onlyOn64 : true)] [BaseType (typeof(NSObject))] + [DisableDefaultCtor] // DesignatedInitializer below interface SKAttributeValue : NSCoding { + [DesignatedInitializer] + [Export ("init")] + IntPtr Constructor (); + [Static] [Export ("valueWithFloat:")] SKAttributeValue Create (float value); @@ -3223,5 +3395,77 @@ interface SKWarpGeometryGrid : NSCoding [Export ("gridByReplacingDestPositions:")] SKWarpGeometryGrid _GridByReplacingDestPositions (IntPtr destPositions); } + + // SKRenderer is not available for WatchKit apps and the iOS simulator + [NoWatch] + [TV (11,0), Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface SKRenderer { + [Static] + [Export ("rendererWithDevice:")] + SKRenderer FromDevice (IMTLDevice device); + + [Export ("renderWithViewport:commandBuffer:renderPassDescriptor:")] + void Render (CGRect viewport, IMTLCommandBuffer commandBuffer, MTLRenderPassDescriptor renderPassDescriptor); + + [Export ("renderWithViewport:renderCommandEncoder:renderPassDescriptor:commandQueue:")] + void Render (CGRect viewport, IMTLRenderCommandEncoder renderCommandEncoder, MTLRenderPassDescriptor renderPassDescriptor, IMTLCommandQueue commandQueue); + + [Export ("updateAtTime:")] + void Update (double currentTime); + + [NullAllowed, Export ("scene", ArgumentSemantic.Assign)] + SKScene Scene { get; set; } + + [Export ("ignoresSiblingOrder")] + bool IgnoresSiblingOrder { get; set; } + + [Export ("shouldCullNonVisibleNodes")] + bool ShouldCullNonVisibleNodes { get; set; } + + [Export ("showsDrawCount")] + bool ShowsDrawCount { get; set; } + + [Export ("showsNodeCount")] + bool ShowsNodeCount { get; set; } + + [Export ("showsQuadCount")] + bool ShowsQuadCount { get; set; } + + [Export ("showsPhysics")] + bool ShowsPhysics { get; set; } + + [Export ("showsFields")] + bool ShowsFields { get; set; } + } + + [TV (11,0), Watch (4,0), Mac (13,0), iOS (11,0)] + [BaseType (typeof(SKNode))] + interface SKTransformNode { + [Export ("xRotation")] + nfloat XRotation { get; set; } + + [Export ("yRotation")] + nfloat YRotation { get; set; } + + [Export ("eulerAngles")] + VectorFloat3 EulerAngles { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; + } + + [Export ("rotationMatrix")] + MatrixFloat3x3 RotationMatrix { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; + } + + [Export ("quaternion")] + Quaternion Quaternion { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] set; + } + } } #endif diff --git a/src/storekit.cs b/src/storekit.cs index 6455c93e771c..088939224aec 100644 --- a/src/storekit.cs +++ b/src/storekit.cs @@ -80,7 +80,7 @@ partial interface SKPayment : NSMutableCopying { #if !MONOMAC [Static] [Export ("paymentWithProductIdentifier:")] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_5_0, Message = "Use FromProduct(SKProduct) after fetching the list of available products from SKProductRequest instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_5_0, Message = "Use 'FromProduct (SKProduct)'' after fetching the list of available products from 'SKProductRequest' instead.")] SKPayment CreateFrom (string identifier); #endif @@ -112,7 +112,7 @@ interface SKMutablePayment { [Static] [Export ("paymentWithProductIdentifier:")] - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_5_0, Message = "Use PaymentWithProduct(SKProduct) after fetching the list of available products from SKProductRequest instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_5_0, Message = "Use 'PaymentWithProduct (SKProduct)' after fetching the list of available products from 'SKProductRequest' instead.")] SKMutablePayment PaymentWithProduct (string identifier); [NullAllowed] // by default this property is null @@ -256,6 +256,10 @@ interface SKPaymentTransactionObserver { [Since(6,0)] [Export ("paymentQueue:updatedDownloads:")] void UpdatedDownloads (SKPaymentQueue queue, SKDownload [] downloads); + + [iOS (11,0)][TV (11,0)][NoMac] + [Export ("paymentQueue:shouldAddStorePayment:forProduct:")] + bool ShouldAddStorePayment (SKPaymentQueue queue, SKPayment payment, SKProduct product); } [BaseType (typeof (NSObject))] @@ -276,7 +280,7 @@ interface SKPaymentTransaction { string TransactionIdentifier { get; } #if !MONOMAC - [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use NSBundle.AppStoreReceiptUrl instead")] + [Availability (Introduced = Platform.iOS_3_0, Deprecated = Platform.iOS_7_0, Message = "Use 'NSBundle.AppStoreReceiptUrl' instead.")] [Export ("transactionReceipt")] NSData TransactionReceipt { get; } #endif @@ -414,6 +418,10 @@ interface SKStoreProductParameterKey [Field ("SKStoreProductParameterITunesItemIdentifier")] NSString ITunesItemIdentifier { get; } + [iOS (11,0)][TV (11,0)] + [Field ("SKStoreProductParameterProductIdentifier")] + NSString ProductIdentifier { get; } + [iOS (8,0)] [Field ("SKStoreProductParameterAffiliateToken")] NSString AffiliateToken { get; } @@ -461,15 +469,27 @@ interface SKCloudServiceController { [Export ("requestStorefrontIdentifierWithCompletionHandler:")] void RequestStorefrontIdentifier (Action completionHandler); + [iOS (11,0)][TV (11,0)] + [Async] + [Export ("requestStorefrontCountryCodeWithCompletionHandler:")] + void RequestStorefrontCountryCode (Action completionHandler); + [Async] [Export ("requestCapabilitiesWithCompletionHandler:")] void RequestCapabilities (Action completionHandler); [iOS (10,3), TV (10,2)] + [Deprecated (PlatformName.iOS, 11,0, message: "Use 'RequestUserToken' instead.")] + [Deprecated (PlatformName.TvOS, 11,0, message: "Use 'RequestUserToken' instead.")] [Async] [Export ("requestPersonalizationTokenForClientToken:withCompletionHandler:")] void RequestPersonalizationToken (string clientToken, Action completionHandler); + [iOS (11,0)][TV (11,0)] + [Async] + [Export ("requestUserTokenForDeveloperToken:completionHandler:")] + void RequestUserToken (string developerToken, Action completionHandler); + [Notification] [Field ("SKStorefrontIdentifierDidChangeNotification")] NSString StorefrontIdentifierDidChangeNotification { get; } @@ -477,6 +497,11 @@ interface SKCloudServiceController { [Notification] [Field ("SKCloudServiceCapabilitiesDidChangeNotification")] NSString CloudServiceCapabilitiesDidChangeNotification { get; } + + [iOS (11,0)][TV (11,0)] + [Notification] + [Field ("SKStorefrontCountryCodeDidChangeNotification")] + NSString StorefrontCountryCodeDidChangeNotification { get; } } [iOS (10,1)] @@ -523,6 +548,9 @@ interface SKCloudServiceSetupOptions [iOS (10,3)] string CampaignToken { get; set; } + + [iOS (11,0)] + string MessageIdentifier { get; set; } } [NoTV, iOS (10,1)] @@ -542,6 +570,10 @@ interface SKCloudServiceSetupOptionsKeys [iOS (10,3)] [Field ("SKCloudServiceSetupOptionsCampaignTokenKey")] NSString CampaignTokenKey { get; } + + [iOS (11,0)] + [Field ("SKCloudServiceSetupOptionsMessageIdentifierKey")] + NSString MessageIdentifierKey { get; } } [NoTV, iOS (10,1)] @@ -551,6 +583,18 @@ enum SKCloudServiceSetupAction Subscribe, } + [iOS (11,0), TV (11,0)] + enum SKCloudServiceSetupMessageIdentifier { + [Field ("SKCloudServiceSetupMessageIdentifierJoin")] + Join, + [Field ("SKCloudServiceSetupMessageIdentifierConnect")] + Connect, + [Field ("SKCloudServiceSetupMessageIdentifierAddMusic")] + AddMusic, + [Field ("SKCloudServiceSetupMessageIdentifierPlayMusic")] + PlayMusic, + } + [iOS (10,3)] [NoTV] [BaseType (typeof (NSObject))] @@ -561,5 +605,30 @@ interface SKStoreReviewController { [Export ("requestReview")] void RequestReview (); } + + [iOS (11,0), TV (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] // static Default property is the only documented way to get the controller + interface SKProductStorePromotionController { + [Static] + [Export ("defaultController")] + SKProductStorePromotionController Default { get; } + + [Async] + [Export ("fetchStorePromotionVisibilityForProduct:completionHandler:")] + void FetchStorePromotionVisibility (SKProduct product, [NullAllowed] Action completionHandler); + + [Async] + [Export ("updateStorePromotionVisibility:forProduct:completionHandler:")] + void Update (SKProductStorePromotionVisibility promotionVisibility, SKProduct product, [NullAllowed] Action completionHandler); + + [Async] + [Export ("fetchStorePromotionOrderWithCompletionHandler:")] + void FetchStorePromotionOrder ([NullAllowed] Action completionHandler); + + [Async] + [Export ("updateStorePromotionOrder:completionHandler:")] + void Update (SKProduct[] storePromotionOrder, [NullAllowed] Action completionHandler); + } #endif } diff --git a/src/tvmlkit.cs b/src/tvmlkit.cs index 38022a2401a9..b0d540c7ab7a 100644 --- a/src/tvmlkit.cs +++ b/src/tvmlkit.cs @@ -23,7 +23,11 @@ public enum TVElementAlignment : nint { Undefined, Left, Center, - Right + Right, + [TV (11,0)] + Leading, + [TV (11, 0)] + Trailing, } [TV (9,0)] @@ -49,7 +53,19 @@ public enum TVElementPosition : nint { BottomLeft, BottomRight, Header, - Footer + Footer, + [TV (11, 0)] + Leading, + [TV (11, 0)] + Trailing, + [TV (11, 0)] + TopLeading, + [TV (11, 0)] + TopTrailing, + [TV (11, 0)] + BottomLeading, + [TV (11, 0)] + BottomTrailing, } [TV (9,0)] diff --git a/src/tvservices.cs b/src/tvservices.cs index f66c71dbeb13..0a1313258b1f 100644 --- a/src/tvservices.cs +++ b/src/tvservices.cs @@ -29,6 +29,7 @@ interface TVContentItem : NSCopying, NSSecureCoding { TVContentIdentifier ContentIdentifier { get; } [NullAllowed, Export ("imageURL", ArgumentSemantic.Copy)] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'SetImageUrl' instead.")] NSUrl ImageUrl { get; set; } [Export ("imageShape", ArgumentSemantic.Assign)] @@ -70,6 +71,15 @@ interface TVContentItem : NSCopying, NSSecureCoding { [Export ("initWithContentIdentifier:")] [DesignatedInitializer] IntPtr Constructor (TVContentIdentifier ident); + + [TV (11,0)] + [Export ("imageURLForTraits:")] + [return: NullAllowed] + NSUrl GetImageUrl (TVContentItemImageTrait traits); + + [TV (11,0)] + [Export ("setImageURL:forTraits:")] + void SetImageUrl ([NullAllowed] NSUrl aUrl, TVContentItemImageTrait traits); } [TV (9,0)] diff --git a/src/twitter.cs b/src/twitter.cs index 8473aa01a03b..be2ee1a2110c 100644 --- a/src/twitter.cs +++ b/src/twitter.cs @@ -20,7 +20,7 @@ namespace XamCore.Twitter { delegate void TWTweetComposeHandler (TWTweetComposeViewControllerResult result); #endif - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use the Social framework")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use the 'Social' framework.")] [BaseType (typeof (NSObject))] interface TWRequest { [NullAllowed] // by default this property is null @@ -50,7 +50,7 @@ interface TWRequest { void PerformRequest (TWRequestHandler handler); } - [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use the Social framework")] + [Availability (Introduced = Platform.iOS_5_0, Deprecated = Platform.iOS_6_0, Message = "Use the 'Social' framework.")] [BaseType (typeof (UIViewController))] interface TWTweetComposeViewController { [Export ("initWithNibName:bundle:")] diff --git a/src/uikit.cs b/src/uikit.cs index 98fb4dff5a73..42ee0e8c8e6f 100644 --- a/src/uikit.cs +++ b/src/uikit.cs @@ -24,6 +24,15 @@ #endif using XamCore.CoreData; +#if XAMCORE_2_0 +#if IOS +using XamCore.FileProvider; +#endif // IOS +#if !TVOS +using XamCore.Intents; +#endif // !TVOS +#endif // XAMCORE_2_0 + using System; using System.ComponentModel; @@ -44,7 +53,8 @@ public enum UIFocusHeading : nuint { } [Native] // NSInteger -> UIApplication.h - [NoTV][NoWatch] + [NoWatch] + [TV (11,0)] public enum UIBackgroundRefreshStatus : nint { Restricted, Denied, Available } @@ -277,21 +287,27 @@ interface NSDataAsset : NSCopying NSString TypeIdentifier { get; } } + delegate void NSFileProviderExtensionFetchThumbnailsHandler (NSString identifier, [NullAllowed] NSData imageData, [NullAllowed] NSError error); + [NoWatch] [NoTV] [iOS (8,0)] [ThreadSafe] [BaseType (typeof (NSObject))] partial interface NSFileProviderExtension { + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'NSFileProviderManager' instead.")] [Static, Export ("writePlaceholderAtURL:withMetadata:error:")] bool WritePlaceholder (NSUrl placeholderUrl, NSDictionary metadata, ref NSError error); + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FileProvider::NSFileProviderManager.GetPlaceholderUrl (NSUrl)' instead.")] [Static, Export ("placeholderURLForURL:")] NSUrl GetPlaceholderUrl (NSUrl url); + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FileProvider::NSFileProviderManager.ProviderIdentifier' instead.")] [Export ("providerIdentifier")] string ProviderIdentifier { get; } + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'FileProvider::NSFileProviderManager.DocumentStorageUrl' instead.")] [Export ("documentStorageURL")] NSUrl DocumentStorageUrl { get; } @@ -314,6 +330,91 @@ partial interface NSFileProviderExtension { [Export ("stopProvidingItemAtURL:")] void StopProvidingItemAtUrl (NSUrl url); + +#if XAMCORE_2_0 && IOS + + [iOS (11,0)] + [Export ("itemForIdentifier:error:")] + [return: NullAllowed] + INSFileProviderItem GetItem (NSString identifier, out NSError error); + + // Inlining NSFileProviderExtension (NSFileProviderActions) so we get asyncs + + [iOS (11,0)] + [Async] + [Export ("importDocumentAtURL:toParentItemIdentifier:completionHandler:")] + void ImportDocument (NSUrl fileUrl, string parentItemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("createDirectoryWithName:inParentItemIdentifier:completionHandler:")] + void CreateDirectory (string directoryName, string parentItemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("renameItemWithIdentifier:toName:completionHandler:")] + void RenameItem (string itemIdentifier, string itemName, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("reparentItemWithIdentifier:toParentItemWithIdentifier:newName:completionHandler:")] + void ReparentItem (string itemIdentifier, string parentItemIdentifier, [NullAllowed] string newName, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("trashItemWithIdentifier:completionHandler:")] + void TrashItem (string itemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("untrashItemWithIdentifier:toParentItemIdentifier:completionHandler:")] + void UntrashItem (string itemIdentifier, [NullAllowed] string parentItemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("deleteItemWithIdentifier:completionHandler:")] + void DeleteItem (string itemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("setLastUsedDate:forItemIdentifier:completionHandler:")] + void SetLastUsedDate ([NullAllowed] NSDate lastUsedDate, string itemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("setTagData:forItemIdentifier:completionHandler:")] + void SetTagData ([NullAllowed] NSData tagData, string itemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Async] + [Export ("setFavoriteRank:forItemIdentifier:completionHandler:")] + void SetFavoriteRank ([NullAllowed] NSNumber favoriteRank, string itemIdentifier, Action completionHandler); + + [iOS (11,0)] + [Export ("enumeratorForContainerItemIdentifier:error:")] + [return: NullAllowed] + XamCore.FileProvider.INSFileProviderEnumerator GetEnumerator (string containerItemIdentifier, out NSError error); + + // From NSFileProviderExtension (NSFileProviderThumbnailing) + + [iOS (11,0)] + [Export ("fetchThumbnailsForItemIdentifiers:requestedSize:perThumbnailCompletionHandler:completionHandler:")] + [Async] + NSProgress FetchThumbnails (NSString [] itemIdentifiers, CGSize size, NSFileProviderExtensionFetchThumbnailsHandler perThumbnailCompletionHandler, Action completionHandler); + + // From NSFileProviderExtension (NSFileProviderService) + + [iOS (11,0)] + [Export ("supportedServiceSourcesForItemIdentifier:error:")] + [return: NullAllowed] + INSFileProviderServiceSource [] GetSupportedServiceSources (string itemIdentifier, out NSError error); + + // From NSFileProviderExtension (NSFileProviderDomain) + + [iOS (11,0)] + [NullAllowed, Export ("domain")] + NSFileProviderDomain Domain { get; } +#endif } #endif // !WATCH @@ -353,18 +454,50 @@ interface NSLayoutAnchor [NoWatch] [iOS (9,0)] + [TV (10,0)] [BaseType (typeof(NSLayoutAnchor))] [DisableDefaultCtor] // Handle is nil interface NSLayoutXAxisAnchor { + [iOS (10,0)] + [Export ("anchorWithOffsetToAnchor:")] + NSLayoutDimension CreateAnchorWithOffset (NSLayoutXAxisAnchor otherAnchor); + + [TV (11,0), iOS (11,0)] + [Export ("constraintEqualToSystemSpacingAfterAnchor:multiplier:")] + NSLayoutConstraint ConstraintEqualToSystemSpacingAfterAnchor (NSLayoutXAxisAnchor anchor, nfloat multiplier); + + [TV (11,0), iOS (11,0)] + [Export ("constraintGreaterThanOrEqualToSystemSpacingAfterAnchor:multiplier:")] + NSLayoutConstraint ConstraintGreaterThanOrEqualToSystemSpacingAfterAnchor (NSLayoutXAxisAnchor anchor, nfloat multiplier); + + [TV (11,0), iOS (11,0)] + [Export ("constraintLessThanOrEqualToSystemSpacingAfterAnchor:multiplier:")] + NSLayoutConstraint ConstraintLessThanOrEqualToSystemSpacingAfterAnchor (NSLayoutXAxisAnchor anchor, nfloat multiplier); } [NoWatch] [iOS (9,0)] + [TV (10,0)] [BaseType (typeof(NSLayoutAnchor))] [DisableDefaultCtor] // Handle is nil interface NSLayoutYAxisAnchor { + [iOS (10,0)] + [Export ("anchorWithOffsetToAnchor:")] + NSLayoutDimension CreateAnchorWithOffset (NSLayoutYAxisAnchor otherAnchor); + + [TV (11,0), iOS (11,0)] + [Export ("constraintEqualToSystemSpacingBelowAnchor:multiplier:")] + NSLayoutConstraint ConstraintEqualToSystemSpacingBelowAnchor (NSLayoutYAxisAnchor anchor, nfloat multiplier); + + [TV (11,0), iOS (11,0)] + [Export ("constraintGreaterThanOrEqualToSystemSpacingBelowAnchor:multiplier:")] + NSLayoutConstraint ConstraintGreaterThanOrEqualToSystemSpacingBelowAnchor (NSLayoutYAxisAnchor anchor, nfloat multiplier); + + [TV (11,0), iOS (11,0)] + [Export ("constraintLessThanOrEqualToSystemSpacingBelowAnchor:multiplier:")] + NSLayoutConstraint ConstraintLessThanOrEqualToSystemSpacingBelowAnchor (NSLayoutYAxisAnchor anchor, nfloat multiplier); } [NoWatch] @@ -420,7 +553,7 @@ interface NSLayoutConstraint { [Export ("shouldBeArchived")] bool ShouldBeArchived { get; set; } - [Export ("firstItem", ArgumentSemantic.Assign)] + [NullAllowed, Export ("firstItem", ArgumentSemantic.Assign)] NSObject FirstItem { get; } [Export ("firstAttribute")] @@ -685,7 +818,11 @@ partial interface NSTextAttachmentContainer { [Since (7,0)] [BaseType (typeof (NSObject))] - partial interface NSTextAttachment : NSTextAttachmentContainer, NSCoding { + partial interface NSTextAttachment : NSTextAttachmentContainer, NSCoding +#if !WATCH + , UIAccessibilityContentSizeCategoryImageAdjusting +#endif // !WATCH + { [DesignatedInitializer] [Export ("initWithData:ofType:")] [PostGet ("Contents")] @@ -1192,6 +1329,10 @@ interface NSCoder_UIGeometryKeyedCoding { [Export ("encodeUIEdgeInsets:forKey:")] void Encode (UIEdgeInsets edgeInsets, string forKey); + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("encodeDirectionalEdgeInsets:forKey:")] + void Encode (NSDirectionalEdgeInsets directionalEdgeInsets, string forKey); [Export ("encodeUIOffset:forKey:")] void Encode (UIOffset uiOffset, string forKey); @@ -1214,6 +1355,10 @@ interface NSCoder_UIGeometryKeyedCoding { [Export ("decodeUIEdgeInsetsForKey:")] UIEdgeInsets DecodeUIEdgeInsets (string key); + + [Watch (4,0), TV (11,0), iOS (11,0)] + [Export ("decodeDirectionalEdgeInsetsForKey:")] + NSDirectionalEdgeInsets DecodeDirectionalEdgeInsets (string key); [Export ("decodeUIOffsetForKey:")] UIOffset DecodeUIOffsetForKey (string key); @@ -1275,14 +1420,29 @@ interface UIAccessibility { [Export ("accessibilityLabel", ArgumentSemantic.Copy)] string AccessibilityLabel { get; set; } + [NoWatch] + [TV (11,0), iOS (11,0)] + [NullAllowed, Export ("accessibilityAttributedLabel", ArgumentSemantic.Copy)] + NSAttributedString AccessibilityAttributedLabel { get; set; } + [NullAllowed] // by default this property is null [Export ("accessibilityHint", ArgumentSemantic.Copy)] string AccessibilityHint { get; set; } + [NoWatch] + [TV (11,0), iOS (11,0)] + [NullAllowed, Export ("accessibilityAttributedHint", ArgumentSemantic.Copy)] + NSAttributedString AccessibilityAttributedHint { get; set; } + [NullAllowed] // by default this property is null [Export ("accessibilityValue", ArgumentSemantic.Copy)] string AccessibilityValue { get; set; } + [NoWatch] + [TV (11,0), iOS (11,0)] + [NullAllowed, Export ("accessibilityAttributedValue", ArgumentSemantic.Copy)] + NSAttributedString AccessibilityAttributedValue { get; set; } + [Export ("accessibilityTraits")] UIAccessibilityTrait AccessibilityTraits { get; set; } @@ -1378,9 +1538,17 @@ interface UIAccessibility { NSString AnnouncementDidFinishNotification { get; } [NoWatch] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'VoiceOverStatusDidChangeNotification' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'VoiceOverStatusDidChangeNotification' instead.")] [Field ("UIAccessibilityVoiceOverStatusChanged")] NSString VoiceOverStatusChanged { get; } + [NoWatch] + [TV (11,0), iOS (11,0)] + [Field ("UIAccessibilityVoiceOverStatusDidChangeNotification")] + [Notification] + NSString VoiceOverStatusDidChangeNotification { get; } + [NoWatch] [Since (5,0)] [Field ("UIAccessibilityMonoAudioStatusDidChangeNotification")] @@ -1554,6 +1722,22 @@ interface UIAccessibility { [Notification] [Field ("UIAccessibilityAssistiveTouchStatusDidChangeNotification")] NSString AssistiveTouchStatusDidChangeNotification { get; } + + [iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("UIAccessibilitySpeechAttributeQueueAnnouncement")] + NSString SpeechAttributeQueueAnnouncement { get; } + + [iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("UIAccessibilitySpeechAttributeIPANotation")] + NSString SpeechAttributeIpaNotation { get; } + + [iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("UIAccessibilityTextAttributeHeadingLevel")] + NSString TextAttributeHeadingLevel { get; } + + [iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("UIAccessibilityTextAttributeCustom")] + NSString TextAttributeCustom { get; } } interface UIAccessibilityAnnouncementFinishedEventArgs { @@ -1583,6 +1767,50 @@ interface UIAccessibilityContainer { [iOS (8,0)] [Export ("setAccessibilityElements:")] void SetAccessibilityElements ([NullAllowed] NSObject elements); + + [iOS (11,0), TV (11,0)] + [Export ("accessibilityContainerType", ArgumentSemantic.Assign)] + UIAccessibilityContainerType AccessibilityContainerType { get; set; } + } + + interface IUIAccessibilityContainerDataTableCell {} + + [iOS (11,0), TV (11,0)] + [Protocol] + interface UIAccessibilityContainerDataTableCell { + [Abstract] + [Export ("accessibilityRowRange")] + NSRange GetAccessibilityRowRange (); + + [Abstract] + [Export ("accessibilityColumnRange")] + NSRange GetAccessibilityColumnRange (); + } + + [iOS (11,0), TV (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UIAccessibilityContainerDataTable { + [Abstract] + [Export ("accessibilityDataTableCellElementForRow:column:")] + [return: NullAllowed] + IUIAccessibilityContainerDataTableCell GetAccessibilityDataTableCellElement (nuint row, nuint column); + + [Abstract] + [Export ("accessibilityRowCount")] + nuint AccessibilityRowCount { get; } + + [Abstract] + [Export ("accessibilityColumnCount")] + nuint AccessibilityColumnCount { get; } + + [Export ("accessibilityHeaderElementsForRow:")] + [return: NullAllowed] + IUIAccessibilityContainerDataTableCell[] GetAccessibilityHeaderElementsForRow (nuint row); + + [Export ("accessibilityHeaderElementsForColumn:")] + [return: NullAllowed] + IUIAccessibilityContainerDataTableCell[] GetAccessibilityHeaderElementsForColumn (nuint column); } [iOS (8,0)] @@ -1592,10 +1820,18 @@ partial interface UIAccessibilityCustomAction { [Export ("initWithName:target:selector:")] IntPtr Constructor (string name, NSObject target, Selector selector); + [TV (11,0), iOS (11,0)] + [Export ("initWithAttributedName:target:selector:")] + IntPtr Constructor (NSAttributedString attributedName, [NullAllowed] NSObject target, Selector selector); + [NullAllowed] // by default this property is null [Export ("name")] string Name { get; set; } + [TV (11,0), iOS (11,0)] + [Export ("attributedName", ArgumentSemantic.Copy)] + NSAttributedString AttributedName { get; set; } + [NullAllowed] // by default this property is null [Export ("target", ArgumentSemantic.Weak)] NSObject Target { get; set; } @@ -1614,11 +1850,27 @@ interface UIAccessibilityCustomRotor { [Export ("initWithName:itemSearchBlock:")] IntPtr Constructor (string name, UIAccessibilityCustomRotorSearch itemSearchHandler); + [iOS (11,0), TV (11,0)] + [Export ("initWithAttributedName:itemSearchBlock:")] + IntPtr Constructor (NSAttributedString attributedName, UIAccessibilityCustomRotorSearch itemSearchBlock); + + [iOS (11,0), TV (11,0)] + [Export ("initWithSystemType:itemSearchBlock:")] + IntPtr Constructor (UIAccessibilityCustomSystemRotorType type, UIAccessibilityCustomRotorSearch itemSearchBlock); + [Export ("name")] string Name { get; set; } + [iOS (11,0), TV (11,0)] + [Export ("attributedName", ArgumentSemantic.Copy)] + NSAttributedString AttributedName { get; set; } + [Export ("itemSearchBlock", ArgumentSemantic.Copy)] UIAccessibilityCustomRotorSearch ItemSearchHandler { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("systemRotorType")] + UIAccessibilityCustomSystemRotorType SystemRotorType { get; } } [iOS (10,0), TV (10,0)] @@ -1746,6 +1998,54 @@ interface UIAccessibilityAction { UIAccessibilityCustomAction [] AccessibilityCustomActions { get; set; } } + [NoWatch, NoTV] + [iOS (11,0)] + // NSObject category inlined in UIResponder + interface UIAccessibilityDragging { + [NullAllowed, Export ("accessibilityDragSourceDescriptors", ArgumentSemantic.Copy)] + UIAccessibilityLocationDescriptor[] AccessibilityDragSourceDescriptors { get; set; } + + [NullAllowed, Export ("accessibilityDropPointDescriptors", ArgumentSemantic.Copy)] + UIAccessibilityLocationDescriptor[] AccessibilityDropPointDescriptors { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIAccessibilityLocationDescriptor { + [Export ("initWithName:view:")] + IntPtr Constructor (string name, UIView view); + + [Export ("initWithName:point:inView:")] + IntPtr Constructor (string name, CGPoint point, UIView view); + + [Export ("initWithAttributedName:point:inView:")] + [DesignatedInitializer] + IntPtr Constructor (NSAttributedString attributedName, CGPoint point, UIView view); + + [NullAllowed, Export ("view", ArgumentSemantic.Weak)] + UIView View { get; } + + [Export ("point")] + CGPoint Point { get; } + + [Export ("name", ArgumentSemantic.Strong)] + string Name { get; } + + [Export ("attributedName", ArgumentSemantic.Strong)] + NSAttributedString AttributedName { get; } + } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Protocol] + interface UIAccessibilityContentSizeCategoryImageAdjusting { + [Abstract] + [Export ("adjustsImageSizeForAccessibilityContentSizeCategory")] + bool AdjustsImageSizeForAccessibilityContentSizeCategory { get; set; } + } + [NoTV] [BaseType (typeof (UIView), KeepRefUntil="Dismissed", Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof(UIActionSheetDelegate)})] interface UIActionSheet { @@ -1927,6 +2227,10 @@ interface UIActivityType [Since (9,0)] [Field ("UIActivityTypeOpenInIBooks")] NSString OpenInIBooks { get; } + + [iOS (11,0)] + [Field ("UIActivityTypeMarkupAsPDF")] + NSString MarkupAsPdf { get; } } // @@ -1976,19 +2280,19 @@ interface UIActivityItemSource { [Abstract] [Export ("activityViewController:itemForActivityType:")] - NSObject GetItemForActivity (UIActivityViewController activityViewController, NSString activityType); + NSObject GetItemForActivity (UIActivityViewController activityViewController, [NullAllowed] NSString activityType); [Since (7,0)] [Export ("activityViewController:dataTypeIdentifierForActivityType:")] - string GetDataTypeIdentifierForActivity (UIActivityViewController activityViewController, NSString activityType); + string GetDataTypeIdentifierForActivity (UIActivityViewController activityViewController, [NullAllowed] NSString activityType); [Since (7,0)] [Export ("activityViewController:subjectForActivityType:")] - string GetSubjectForActivity (UIActivityViewController activityViewController, NSString activityType); + string GetSubjectForActivity (UIActivityViewController activityViewController, [NullAllowed] NSString activityType); [Since (7,0)] [Export ("activityViewController:thumbnailImageForActivityType:suggestedSize:")] - UIImage GetThumbnailImageForActivity (UIActivityViewController activityViewController, NSString activityType, CGSize suggestedSize); + UIImage GetThumbnailImageForActivity (UIActivityViewController activityViewController, [NullAllowed] NSString activityType, CGSize suggestedSize); } [NoTV] @@ -2032,7 +2336,11 @@ partial interface UIAlertAction : NSCopying { [iOS (8,0)] [BaseType (typeof (UIViewController))] - partial interface UIAlertController { + partial interface UIAlertController +#if IOS + : UISpringLoadedInteractionSupporting +#endif + { [Export ("initWithNibName:bundle:")] [PostGet ("NibBundle")] IntPtr Constructor ([NullAllowed] string nibName, [NullAllowed] NSBundle bundle); @@ -2219,6 +2527,14 @@ interface UIStackView { [Export ("insertArrangedSubview:atIndex:")] void InsertArrangedSubview (UIView view, nuint stackIndex); + + [iOS (11,0), TV (11,0)] + [Export ("setCustomSpacing:afterView:")] + void SetCustomSpacing (nfloat spacing, UIView arrangedSubview); + + [iOS (11,0), TV (11,0)] + [Export ("customSpacingAfterView:")] + nfloat GetCustomSpacing (UIView arrangedSubview); } [Static] @@ -2346,6 +2662,14 @@ interface UIViewPropertyAnimator : UIViewImplicitlyAnimating, NSCopying [Export ("interruptible")] bool Interruptible { [Bind ("isInterruptible")] get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("scrubsLinearly")] + bool ScrubsLinearly { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("pausesOnCompletion")] + bool PausesOnCompletion { get; set; } [Export ("initWithDuration:timingParameters:")] [DesignatedInitializer] @@ -2588,7 +2912,7 @@ interface UIApplication { // From @interface UIApplication (UIRemoteNotifications) [NoTV] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'RegisterUserNotifications' and 'RegisterForNotifications' instead or if iOS 10+ 'UNUserNotificationCenter.RequestAuthorization'.")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'RegisterUserNotifications', 'RegisterForNotifications' or 'UNUserNotificationCenter.RequestAuthorization' instead.")] [Export ("registerForRemoteNotificationTypes:")] void RegisterForRemoteNotificationTypes (UIRemoteNotificationType types); @@ -2598,7 +2922,7 @@ interface UIApplication { // From @interface UIApplication (UIRemoteNotifications) [NoTV] - [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'CurrentUserNotificationSettings' instead or if iOS 10+ 'UNUserNotificationCenter.GetNotificationSettings'.")] + [Availability (Deprecated = Platform.iOS_8_0, Message = "Use 'CurrentUserNotificationSettings' or 'UNUserNotificationCenter.GetNotificationSettings' instead.")] [Export ("enabledRemoteNotificationTypes")] UIRemoteNotificationType EnabledRemoteNotificationTypes { get; } @@ -2686,10 +3010,12 @@ interface UIApplication { [NoTV] [Since (4,0)] + [Deprecated (PlatformName.iOS, 9, 0, message: "Use 'PushKit' instead.")] [Export ("setKeepAliveTimeout:handler:")] bool SetKeepAliveTimeout (double timeout, [NullAllowed] NSAction handler); [NoTV] + [Deprecated (PlatformName.iOS, 9, 0, message: "Use 'PushKit' instead.")] [Export ("clearKeepAliveTimeout")] void ClearKeepAliveTimeout (); @@ -2856,17 +3182,17 @@ interface UIApplication { [Export ("beginBackgroundTaskWithName:expirationHandler:")] nint BeginBackgroundTask (string taskName, NSAction expirationHandler); - [NoTV] + [TV (11,0)] [Since (7,0)] [Field ("UIApplicationBackgroundFetchIntervalMinimum")] double BackgroundFetchIntervalMinimum { get; } - [NoTV] + [TV (11,0)] [Since (7,0)] [Field ("UIApplicationBackgroundFetchIntervalNever")] double BackgroundFetchIntervalNever { get; } - [NoTV] + [TV (11,0)] [Since (7,0)] [Export ("setMinimumBackgroundFetchInterval:")] void SetMinimumBackgroundFetchInterval (double minimumBackgroundFetchInterval); @@ -2894,12 +3220,12 @@ interface UIApplication { [Field ("UIApplicationStateRestorationSystemVersionKey")] NSString StateRestorationSystemVersionKey { get; } - [NoTV] + [TV (11,0)] [Since (7,0)] [Export ("backgroundRefreshStatus")] UIBackgroundRefreshStatus BackgroundRefreshStatus { get; } - [NoTV] + [TV (11,0)] [Since (7,0)] [Notification] [Field ("UIApplicationBackgroundRefreshStatusDidChangeNotification")] @@ -2920,6 +3246,7 @@ interface UIApplication { // from @interface UIApplication (UIUserNotificationSettings) [NoTV] [iOS (8,0)] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'UNUserNotificationCenter.GetNotificationSettings' and 'UNUserNotificationCenter.GetNotificationCategories' instead.")] [Export ("currentUserNotificationSettings")] UIUserNotificationSettings CurrentUserNotificationSettings { get; } @@ -2936,6 +3263,7 @@ interface UIApplication { // from @interface UIApplication (UIUserNotificationSettings) [NoTV] [iOS (8,0)] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'UNUserNotificationCenter.RequestAuthorization' and 'UNUserNotificationCenter.SetNotificationCategories' instead.")] [Export ("registerUserNotificationSettings:")] void RegisterUserNotificationSettings (UIUserNotificationSettings notificationSettings); @@ -3365,7 +3693,7 @@ interface UIApplicationDelegate { [Export ("application:handleEventsForBackgroundURLSession:completionHandler:")] void HandleEventsForBackgroundUrl (UIApplication application, string sessionIdentifier, NSAction completionHandler); - [NoTV] + [TV (11,0)] [Since (7,0)] [Export ("application:performFetchWithCompletionHandler:")] void PerformFetch (UIApplication application, Action completionHandler); @@ -3387,6 +3715,7 @@ interface UIApplicationDelegate { [NoTV] [iOS (8,0)] + [Deprecated (PlatformName.iOS, 10, 0, message: "Use 'UNUserNotificationCenter.RequestAuthorization' instead.")] [Export ("application:didRegisterUserNotificationSettings:")] void DidRegisterUserNotificationSettings (UIApplication application, UIUserNotificationSettings notificationSettings); @@ -3442,6 +3771,13 @@ interface UIApplicationDelegate { [iOS (10,0), TV (10,0), NoWatch] [Export ("application:userDidAcceptCloudKitShareWithMetadata:")] void UserDidAcceptCloudKitShare (UIApplication application, CKShareMetadata cloudKitShareMetadata); + +#if XAMCORE_2_0 && !TVOS + [NoTV] + [iOS (11,0), Watch (4,0)] + [Export ("application:handleIntent:completionHandler:")] + void HandleIntent (UIApplication application, INIntent intent, Action completionHandler); +#endif // XAMCORE_2_0 && !TVOS } [Static] @@ -3488,10 +3824,24 @@ interface UIBarItem : NSCoding, UIAppearance, UIAccessibility, UIAccessibilityId [Export ("titleTextAttributesForState:"), Internal] [Appearance] NSDictionary _GetTitleTextAttributes (UIControlState state); + + [NoWatch] + [iOS (11,0), TV (11,0)] + [NullAllowed, Export ("largeContentSizeImage", ArgumentSemantic.Strong)] + UIImage LargeContentSizeImage { get; set; } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Export ("largeContentSizeImageInsets", ArgumentSemantic.Assign)] + UIEdgeInsets LargeContentSizeImageInsets { get; set; } } [BaseType (typeof (UIBarItem))] - interface UIBarButtonItem : NSCoding { + interface UIBarButtonItem : NSCoding +#if IOS + , UISpringLoadedInteractionSupporting +#endif + { [Export ("initWithImage:style:target:action:")] [PostGet ("Image")] [PostGet ("Target")] @@ -3688,7 +4038,11 @@ interface UICollectionReusableView { [BaseType (typeof (UIScrollView))] // Objective-C exception thrown. Name: NSInvalidArgumentException Reason: UICollectionView must be initialized with a non-nil layout parameter [DisableDefaultCtor] - interface UICollectionView : NSCoding { + interface UICollectionView : NSCoding, UIDataSourceTranslating +#if IOS + , UISpringLoadedInteractionSupporting +#endif + { [DesignatedInitializer] [Export ("initWithFrame:collectionViewLayout:"), PostGet ("CollectionViewLayout")] IntPtr Constructor (CGRect frame, UICollectionViewLayout layout); @@ -3883,6 +4237,41 @@ UICollectionViewTransitionLayout StartInteractiveTransition (UICollectionViewLay [iOS (10,0), TV (10,0)] [Export ("prefetchingEnabled")] bool PrefetchingEnabled { [Bind ("isPrefetchingEnabled")] get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [NullAllowed, Export ("dragDelegate", ArgumentSemantic.Weak)] + IUICollectionViewDragDelegate DragDelegate { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [NullAllowed, Export ("dropDelegate", ArgumentSemantic.Weak)] + IUICollectionViewDropDelegate DropDelegate { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("dragInteractionEnabled")] + bool DragInteractionEnabled { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("reorderingCadence", ArgumentSemantic.Assign)] + UICollectionViewReorderingCadence ReorderingCadence { get; set; } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Export ("hasUncommittedUpdates")] + bool HasUncommittedUpdates { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("hasActiveDrag")] + bool HasActiveDrag { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("hasActiveDrop")] + bool HasActiveDrop { get; } } interface IUICollectionViewDataSourcePrefetching {} @@ -4031,6 +4420,11 @@ interface UICollectionViewDelegate : UIScrollViewDelegate { [Export ("indexPathForPreferredFocusedViewInCollectionView:")] [return: NullAllowed] NSIndexPath GetIndexPathForPreferredFocusedView (UICollectionView collectionView); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("collectionView:shouldSpringLoadItemAtIndexPath:withContext:")] + bool ShouldSpringLoadItem (UICollectionView collectionView, NSIndexPath indexPath, IUISpringLoadedInteractionContext context); } [Since (6,0)] @@ -4055,6 +4449,11 @@ interface UICollectionViewCell { [NullAllowed] // by default this property is null [Export ("selectedBackgroundView", ArgumentSemantic.Retain)] UIView SelectedBackgroundView { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("dragStateDidChange:")] + void DragStateDidChange (UICollectionViewCellDragState dragState); } [Since (6,0)] @@ -4143,6 +4542,11 @@ interface UICollectionViewFlowLayout { [Export ("sectionInset")] UIEdgeInsets SectionInset { get; set; } + [NoWatch] + [iOS (11,0), TV (11,0)] + [Export ("sectionInsetReference", ArgumentSemantic.Assign)] + UICollectionViewFlowLayoutSectionInsetReference SectionInsetReference { get; set; } + [iOS (9,0)] [Export ("sectionHeadersPinToVisibleBounds")] bool SectionHeadersPinToVisibleBounds { get; set; } @@ -4304,6 +4708,15 @@ interface UICollectionViewLayout : NSCoding { [Export ("invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:previousIndexPaths:movementCancelled:")] UICollectionViewLayoutInvalidationContext GetInvalidationContextForEndingInteractiveMovementOfItems (NSIndexPath[] finalIndexPaths, NSIndexPath[] previousIndexPaths, bool movementCancelled); + [NoWatch] + [iOS (11,0), TV (11,0)] + [Export ("developmentLayoutDirection")] + UIUserInterfaceLayoutDirection DevelopmentLayoutDirection { get; } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Export ("flipsHorizontallyInOppositeLayoutDirection")] + bool FlipsHorizontallyInOppositeLayoutDirection { get; } } [Since (6,0)] @@ -4483,7 +4896,11 @@ interface UICollectionElementKindSectionKey // returns NIL handle causing exceptions in further calls, e.g. ToString // Objective-C exception thrown. Name: NSInvalidArgumentException Reason: *** -CGColor not defined for the UIColor ; need to first convert colorspace. [DisableDefaultCtor] - interface UIColor : NSSecureCoding, NSCopying { + interface UIColor : NSSecureCoding, NSCopying +#if !TVOS && !WATCH + , NSItemProviderWriting, NSItemProviderReading +#endif + { [Export ("colorWithWhite:alpha:")][Static] UIColor FromWhiteAlpha (nfloat white, nfloat alpha); @@ -4496,6 +4913,20 @@ interface UIColor : NSSecureCoding, NSCopying { [Export ("colorWithCGColor:")][Static] UIColor FromCGColor (CGColor color); + [iOS (11,0), TV (11,0)] + [Static] + [Export ("colorNamed:")] + [return: NullAllowed] + UIColor FromName (string name); + +#if !WATCH + [iOS (11,0), TV (11,0)] + [Static] + [Export ("colorNamed:inBundle:compatibleWithTraitCollection:")] + [return: NullAllowed] + UIColor FromName (string name, [NullAllowed] NSBundle inBundle, [NullAllowed] UITraitCollection compatibleWithTraitCollection); +#endif + [iOS (10,0), TV (10,0), Watch (3,0)] [Static] [Export ("colorWithDisplayP3Red:green:blue:alpha:")] @@ -4640,6 +5071,35 @@ [Static] [Export ("brownColor")] [Export ("getRed:green:blue:alpha:")] bool GetRGBA2 (out nfloat red, out nfloat green, out nfloat blue, out nfloat alpha); #endif + + // From the NSItemProviderReading protocol, a static method. + [Static] + [iOS (11,0), NoWatch, NoTV] + [Export ("readableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] +#if !WATCH && !TVOS + new +#endif + string[] ReadableTypeIdentifiers { get; } + + // From the NSItemProviderReading protocol, a static method. + [iOS (11,0), NoWatch, NoTV] + [Static] + [Export ("objectWithItemProviderData:typeIdentifier:error:")] + [return: NullAllowed] +#if !WATCH && !TVOS + new +#endif + UIColor GetObject (NSData data, string typeIdentifier, [NullAllowed] out NSError outError); + + // From the NSItemProviderWriting protocol, a static method. + // NSItemProviderWriting doesn't seem to be implemented for tvOS/watchOS, even though the headers say otherwise. + [NoWatch, NoTV, iOS (11,0)] + [Static] + [Export ("writableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] +#if !WATCH && !TVOS + new +#endif + string[] WritableTypeIdentifiers { get; } } #if !WATCH @@ -5304,6 +5764,11 @@ public enum UIFontTextStyle { [Since (9,0)] [Field ("UIFontTextStyleCallout")] Callout, + + [NoWatch, NoTV] + [iOS (11,0)] + [Field ("UIFontTextStyleLargeTitle")] + LargeTitle, } [Since (7,0)] @@ -5528,6 +5993,10 @@ [Internal] [Sealed] [Export ("requireGestureRecognizerToFail:")] void RequireGestureRecognizerToFail (UIGestureRecognizer otherGestureRecognizer); + [TV (11,0), iOS (11,0)] + [NullAllowed, Export ("name")] + string Name { get; set; } + // // These come from the UIGestureRecognizerProtected category, and you should only call // these methods from a subclass of UIGestureRecognizer, never externally @@ -5637,12 +6106,18 @@ interface UIGestureRecognizerDelegate { [BaseType (typeof(NSObject))] interface UIGraphicsRendererFormat : NSCopying { + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use 'PreferredFormat' instead.")] [Static] [Export ("defaultFormat")] UIGraphicsRendererFormat DefaultFormat { get; } [Export ("bounds")] CGRect Bounds { get; } + + [TV (11,0), iOS (11,0)] + [Static] + [Export ("preferredFormat")] + UIGraphicsRendererFormat PreferredFormat { get; } } [iOS (10,0), TV (10,0)] @@ -5728,6 +6203,11 @@ interface UIGraphicsImageRendererFormat [Static] [Export ("defaultFormat")] UIGraphicsImageRendererFormat DefaultFormat { get; } + + [iOS (11,0), TV (11,0)] + [Static] + [Export ("formatForTraitCollection:")] + UIGraphicsImageRendererFormat GetFormat (UITraitCollection traitCollection); } [iOS (10,0), TV (10,0)] @@ -5893,6 +6373,18 @@ interface UITextInputTraits { [iOS (10, 0)] // Did not add abstract here breaking change, anyways this is optional in objc [Export ("textContentType")] NSString TextContentType { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("smartQuotesType", ArgumentSemantic.Assign)] + UITextSmartQuotesType SmartQuotesType { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("smartDashesType", ArgumentSemantic.Assign)] + UITextSmartDashesType SmartDashesType { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("smartInsertDeleteType", ArgumentSemantic.Assign)] + UITextSmartInsertDeleteType SmartInsertDeleteType { get; set; } } interface UIKeyboardEventArgs { @@ -5999,7 +6491,7 @@ interface UIKeyboard { [Since (7,0)] [BaseType (typeof (NSObject))] interface UIKeyCommand : NSCopying, NSSecureCoding { - [Export ("input")] + [NullAllowed, Export ("input")] NSString Input { get; } [Export ("modifierFlags")] @@ -6695,10 +7187,22 @@ interface UIActivityIndicatorView : NSCoding { } #endif // !WATCH + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UIItemProviderPresentationSizeProviding { + [Abstract] + [Export ("preferredPresentationSizeForItemProvider")] + CGSize PreferredPresentationSizeForItemProvider { get; } + } + [BaseType (typeof (NSObject))] interface UIImage : NSSecureCoding #if !WATCH , UIAccessibility, UIAccessibilityIdentification +#if !TVOS + , NSItemProviderWriting, NSItemProviderReading, UIItemProviderPresentationSizeProviding +#endif #endif // !WATCH { [ThreadSafe] @@ -6750,6 +7254,25 @@ [Static] [Export ("imageWithCGImage:")][Autorelease] UIImage FromImage (CIImage image); #endif // !WATCH + // From the NSItemProviderReading protocol, a static method. + [Static] + [iOS (11,0), NoWatch, NoTV] + [Export ("readableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] +#if !WATCH && !TVOS + new +#endif + string[] ReadableTypeIdentifiers { get; } + + // From the NSItemProviderReading protocol, a static method. + [Static] + [Export ("objectWithItemProviderData:typeIdentifier:error:")] + [iOS (11,0), NoWatch, NoTV] + [return: NullAllowed] +#if !WATCH && !TVOS + new +#endif + UIImage GetObject (NSData data, string typeIdentifier, [NullAllowed] out NSError outError); + [Export ("renderingMode")] [ThreadSafe] [Since (7,0)] @@ -6949,6 +7472,16 @@ [Static] [Export ("imageWithCGImage:")][Autorelease] [Export ("imageWithHorizontallyFlippedOrientation")] UIImage GetImageWithHorizontallyFlippedOrientation (); #endif + + // From the NSItemProviderWriting protocol, a static method. + // NSItemProviderWriting doesn't seem to be implemented for tvOS/watchOS, even though the headers say otherwise. + [NoWatch, NoTV, iOS (11,0)] + [Static] + [Export ("writableTypeIdentifiersForItemProvider", ArgumentSemantic.Copy)] +#if !WATCH && !TVOS + new +#endif + string[] WritableTypeIdentifiers { get; } } #if !WATCH @@ -7098,6 +7631,11 @@ interface UIControl { [Export ("contentHorizontalAlignment")] UIControlContentHorizontalAlignment HorizontalAlignment { get; set; } + [NoWatch] + [iOS (11,0), TV (11,0)] + [Export ("effectiveContentHorizontalAlignment")] + UIControlContentHorizontalAlignment EffectiveContentHorizontalAlignment { get; } + [Export ("state")] UIControlState State { get; } @@ -7179,7 +7717,7 @@ interface UIBarPositioningDelegate { [Since (3,2)] [BaseType (typeof (NSObject))] [ThreadSafe] - interface UIBezierPath : NSCoding, NSCopying { + interface UIBezierPath : NSSecureCoding, NSCopying { // initWithFrame: --> unrecognized selector [Export ("bezierPath"), Static] @@ -7294,7 +7832,11 @@ interface UIBezierPath : NSCoding, NSCopying { #if !WATCH [BaseType (typeof (UIControl))] - interface UIButton { + interface UIButton : UIAccessibilityContentSizeCategoryImageAdjusting +#if IOS + , UISpringLoadedInteractionSupporting +#endif + { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frame); @@ -7522,7 +8064,11 @@ interface UILabel : UIContentSizeCategoryAdjusting { } [BaseType (typeof (UIView))] - interface UIImageView { + interface UIImageView +#if !WATCH + : UIAccessibilityContentSizeCategoryImageAdjusting +#endif // !WATCH + { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frame); @@ -7574,6 +8120,14 @@ interface UIImageView { [NoiOS] // UIKIT_AVAILABLE_TVOS_ONLY [Export ("focusedFrameGuide")] UILayoutGuide FocusedFrameGuide { get; } + + [TV (11, 0), NoWatch, NoiOS] + [Export ("overlayContentView", ArgumentSemantic.Strong)] + UIView OverlayContentView { get; } + + [TV (11,0), NoWatch, NoiOS] + [Export ("masksFocusEffectToContents")] + bool MasksFocusEffectToContents { get; set; } } [NoTV] @@ -7906,6 +8460,14 @@ interface UIImagePickerController { [Static, Export ("isFlashAvailableForCameraDevice:")] bool IsFlashAvailableForCameraDevice (UIImagePickerControllerCameraDevice cameraDevice); + [iOS (11,0)] + [Export ("imageExportPreset", ArgumentSemantic.Assign)] + UIImagePickerControllerImageUrlExportPreset ImageExportPreset { get; set; } + + [iOS (11,0)] + [Export ("videoExportPreset")] + string VideoExportPreset { get; set; } + #if XAMCORE_2_0 // manually bound (const fields) in monotouch.dll - unlike the newer fields (static properties) @@ -7925,6 +8487,7 @@ interface UIImagePickerController { NSString MediaURL { get; } #endif + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'UIImagePickerController.PHAsset' instead.")] [Field ("UIImagePickerControllerReferenceURL")] NSString ReferenceUrl { get; } @@ -7934,6 +8497,14 @@ interface UIImagePickerController { [iOS (9,1)] [Field ("UIImagePickerControllerLivePhoto")] NSString LivePhoto { get; } + + [iOS (11,0)] + [Field ("UIImagePickerControllerPHAsset")] + NSString PHAsset { get; } + + [iOS (11,0)] + [Field ("UIImagePickerControllerImageURL")] + NSString ImageUrl { get; } } // UINavigationControllerDelegate, UIImagePickerControllerDelegate @@ -8187,6 +8758,22 @@ interface UINavigationBar : UIBarPositioning, NSCoding { [Export ("backgroundImageForBarPosition:barMetrics:")] UIImage GetBackgroundImage (UIBarPosition barPosition, UIBarMetrics barMetrics); + [NoTV] + [iOS (11,0)] + [Export ("prefersLargeTitles")] + bool PrefersLargeTitles { get; set; } + + [NoTV] + [iOS (11,0)] + [Internal, NullAllowed, Export ("largeTitleTextAttributes", ArgumentSemantic.Copy)] + [Appearance] + NSDictionary _LargeTitleTextAttributes { get; set; } + + [NoTV] + [iOS (11,0)] + [Wrap ("_LargeTitleTextAttributes")] + [Appearance] + UIStringAttributes LargeTitleTextAttributes { get; set; } } [BaseType (typeof (UIBarPositioningDelegate))] @@ -8282,6 +8869,21 @@ UIBarButtonItem RightBarButtonItem { [Since (5,0)] [Export ("setRightBarButtonItems:animated:")][PostGet ("RightBarButtonItems")] void SetRightBarButtonItems (UIBarButtonItem [] items, bool animated); + + [NoTV] + [iOS (11,0)] + [Export ("largeTitleDisplayMode", ArgumentSemantic.Assign)] + UINavigationItemLargeTitleDisplayMode LargeTitleDisplayMode { get; set; } + + [NoTV] + [iOS (11,0)] + [NullAllowed, Export ("searchController", ArgumentSemantic.Retain)] + UISearchController SearchController { get; set; } + + [NoTV] + [iOS (11,0)] + [Export ("hidesSearchBarWhenScrolling")] + bool HidesSearchBarWhenScrolling { get; set; } } [BaseType (typeof (UIViewController))] @@ -8773,6 +9375,22 @@ interface UIPasteboard { [NoWatch, NoTV, iOS (10, 0)] [Export ("hasColors")] bool HasColors { get; } + + [NoWatch, NoTV, iOS (11,0)] + [Export ("itemProviders", ArgumentSemantic.Copy)] + NSItemProvider[] ItemProviders { get; set; } + + [NoWatch, NoTV, iOS (11,0)] + [Export ("setItemProviders:localOnly:expirationDate:")] + void SetItemProviders (NSItemProvider[] itemProviders, bool localOnly, [NullAllowed] NSDate expirationDate); + + [NoWatch, NoTV, iOS (11,0)] + [Export ("setObjects:")] + void SetObjects (INSItemProviderWriting[] objects); + + [NoWatch, NoTV, iOS (11,0)] + [Export ("setObjects:localOnly:expirationDate:")] + void SetObjects (INSItemProviderWriting[] objects, bool localOnly, [NullAllowed] NSDate expirationDate); } [NoTV] @@ -8901,6 +9519,16 @@ interface UIPickerViewAccessibilityDelegate { [Export ("pickerView:accessibilityHintForComponent:")] string GetAccessibilityHint (UIPickerView pickerView, nint component); + + [TV (11,0), iOS (11,0)] + [Export ("pickerView:accessibilityAttributedLabelForComponent:")] + [return: NullAllowed] + NSAttributedString GetAccessibilityAttributedLabel (UIPickerView pickerView, nint component); + + [TV (11,0), iOS (11,0)] + [Export ("pickerView:accessibilityAttributedHintForComponent:")] + [return: NullAllowed] + NSAttributedString GetAccessibilityAttributedHint (UIPickerView pickerView, nint component); } [NoTV] @@ -9189,7 +9817,14 @@ partial interface UIReferenceLibraryViewController : NSCoding { } [BaseType (typeof (NSObject))] - interface UIResponder : UIAccessibilityAction, UIAccessibilityFocus { + interface UIResponder : UIAccessibilityAction, UIAccessibilityFocus +#if !TVOS + , UIAccessibilityDragging +#endif // !TVOS +#if IOS + , UIPasteConfigurationSupporting +#endif // IOS + { [Export ("nextResponder")] UIResponder NextResponder { get; } @@ -9462,6 +10097,11 @@ UIScreenMode CurrentMode { [Notification] NSString DidConnectNotification { get; } + [iOS (11,0), TV (11,0)] + [Field ("UIScreenCapturedDidChangeNotification")] + [Notification] + NSString CapturedDidChangeNotification { get; } + [Since (7,0)] [return: NullAllowed] [Export ("snapshotViewAfterScreenUpdates:")] @@ -9498,6 +10138,10 @@ UIScreenMode CurrentMode { [iOS (10, 0)] [NullAllowed, Export ("focusedItem", ArgumentSemantic.Weak)] IUIFocusItem FocusedItem { get; } + + [iOS (11,0), TV (11,0)] + [Export ("captured")] + bool Captured { [Bind ("isCaptured")] get; } } [BaseType (typeof (UIView), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof(UIScrollViewDelegate)})] @@ -9514,6 +10158,27 @@ interface UIScrollView { [Export ("contentInset")] UIEdgeInsets ContentInset { get; set; } + [iOS (11,0), TV (11,0)] + [Export ("adjustedContentInset")] + UIEdgeInsets AdjustedContentInset { get; } + + [iOS (11,0), TV (11,0)] + [Export ("adjustedContentInsetDidChange")] + [Advice ("You must call the base method when overriding.")] // [RequiresSuper] + void AdjustedContentInsetDidChange (); + + [iOS (11,0), TV (11,0)] + [Export ("contentInsetAdjustmentBehavior", ArgumentSemantic.Assign)] + UIScrollViewContentInsetAdjustmentBehavior ContentInsetAdjustmentBehavior { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("contentLayoutGuide", ArgumentSemantic.Strong)] + UILayoutGuide ContentLayoutGuide { get; } + + [iOS (11,0), TV (11,0)] + [Export ("frameLayoutGuide", ArgumentSemantic.Strong)] + UILayoutGuide FrameLayoutGuide { get; } + [Export ("delegate", ArgumentSemantic.Assign)][NullAllowed] NSObject WeakDelegate { get; set; } @@ -9636,8 +10301,10 @@ interface UIScrollView { [Export ("keyboardDismissMode")] UIScrollViewKeyboardDismissMode KeyboardDismissMode { get; set; } - [NoWatch, NoiOS] + [NoWatch] + [iOS (11,0)] [TV (9,0)] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Configuring the 'PanGestureRecognizer' for indirect scrolling automatically supports directional presses now, so this property is no longer useful.")] [Export ("directionalPressGestureRecognizer")] UIGestureRecognizer DirectionalPressGestureRecognizer { get; } @@ -9692,6 +10359,10 @@ interface UIScrollViewDelegate { [Since (5,0)] [Export ("scrollViewWillEndDragging:withVelocity:targetContentOffset:"), EventArgs ("WillEndDragging")] void WillEndDragging (UIScrollView scrollView, CGPoint velocity, ref CGPoint targetContentOffset); + + [iOS (11,0), TV (11,0)] + [Export ("scrollViewDidChangeAdjustedContentInset:")] + void DidChangeAdjustedContentInset (UIScrollView scrollView); } [Protocol, Model] @@ -9699,6 +10370,11 @@ interface UIScrollViewDelegate { interface UIScrollViewAccessibilityDelegate { [Export ("accessibilityScrollStatusForScrollView:")] string GetAccessibilityScrollStatus (UIScrollView scrollView); + + [TV (11,0), iOS (11,0)] + [Export ("accessibilityAttributedScrollStatusForScrollView:")] + [return: NullAllowed] + NSAttributedString GetAccessibilityAttributedScrollStatus (UIScrollView scrollView); } [BaseType (typeof (UIView), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof(UISearchBarDelegate)})] @@ -10145,7 +10821,11 @@ partial interface UISearchResultsUpdating { } [BaseType (typeof(UIControl))] - interface UISegmentedControl { + interface UISegmentedControl +#if IOS + : UISpringLoadedInteractionSupporting +#endif + { [Export ("initWithItems:")] IntPtr Constructor (NSArray items); @@ -10546,7 +11226,11 @@ interface UISwitch : NSCoding { } [BaseType (typeof (UIView), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof(UITabBarDelegate)})] - interface UITabBar { + interface UITabBar +#if IOS + : UISpringLoadedInteractionSupporting +#endif + { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frame); @@ -10762,7 +11446,11 @@ IUIViewControllerAnimatedTransitioning GetAnimationControllerForTransition (UITa } [BaseType (typeof (UIBarItem))] - interface UITabBarItem : NSCoding { + interface UITabBarItem : NSCoding +#if IOS + , UISpringLoadedInteractionSupporting +#endif + { [Export ("enabled")][Override] bool Enabled { [Bind ("isEnabled")] get; set; } @@ -10846,7 +11534,11 @@ interface UITabBarItem : NSCoding { } [BaseType (typeof(UIScrollView))] - interface UITableView : NSCoding { + interface UITableView : NSCoding, UIDataSourceTranslating +#if IOS + , UISpringLoadedInteractionSupporting +#endif + { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frame); @@ -11135,7 +11827,52 @@ interface UITableView : NSCoding { [iOS (10,0), TV (10,0)] [NullAllowed, Export ("prefetchDataSource", ArgumentSemantic.Weak)] IUITableViewDataSourcePrefetching PrefetchDataSource { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [NullAllowed, Export ("dragDelegate", ArgumentSemantic.Weak)] + IUITableViewDragDelegate DragDelegate { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [NullAllowed, Export ("dropDelegate", ArgumentSemantic.Weak)] + IUITableViewDropDelegate DropDelegate { get; set; } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Export ("separatorInsetReference", ArgumentSemantic.Assign)] + UITableViewSeparatorInsetReference SeparatorInsetReference { get; set; } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Async] + [Export ("performBatchUpdates:completion:")] + void PerformBatchUpdates ([NullAllowed] Action updates, [NullAllowed] Action completion); + [NoWatch] + [TV (11,0), iOS (11,0)] + [Export ("hasUncommittedUpdates")] + bool HasUncommittedUpdates { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("dragInteractionEnabled")] + bool DragInteractionEnabled { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("hasActiveDrag")] + bool HasActiveDrag { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("hasActiveDrop")] + bool HasActiveDrop { get; } + + [NoWatch] + [TV (11,0), iOS (11,0)] + [Export ("insetsContentViewsToSafeArea")] + bool InsetsContentViewsToSafeArea { get; set; } } interface IUITableViewDataSourcePrefetching {} @@ -11341,6 +12078,25 @@ interface UITableViewSource { [Export ("indexPathForPreferredFocusedViewInTableView:")] [return: NullAllowed] NSIndexPath GetIndexPathForPreferredFocusedView (UITableView tableView); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("tableView:leadingSwipeActionsConfigurationForRowAtIndexPath:")] + [return: NullAllowed] + UISwipeActionsConfiguration GetLeadingSwipeActionsConfiguration (UITableView tableView, NSIndexPath indexPath); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("tableView:trailingSwipeActionsConfigurationForRowAtIndexPath:")] + [return: NullAllowed] + UISwipeActionsConfiguration GetTrailingSwipeActionsConfiguration (UITableView tableView, NSIndexPath indexPath); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("tableView:shouldSpringLoadRowAtIndexPath:withContext:")] + bool ShouldSpringLoadRow (UITableView tableView, NSIndexPath indexPath, IUISpringLoadedInteractionContext context); + + // WARNING: If you add more methods here, add them to UITableViewController as well. } [BaseType (typeof (UIView))] @@ -11449,6 +12205,16 @@ interface UITableViewCell : NSCoding, UIGestureRecognizerDelegate { [iOS (9,0)] // introduced in Xcode 7.1 SDK (iOS 9.1 but hidden in 9.0) [Export ("focusStyle", ArgumentSemantic.Assign)] UITableViewCellFocusStyle FocusStyle { get; set; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("dragStateDidChange:")] + void DragStateDidChange (UITableViewCellDragState dragState); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("userInteractionEnabledWhileDragging")] + bool UserInteractionEnabledWhileDragging { get; set; } } [BaseType (typeof (UIViewController))] @@ -11663,6 +12429,23 @@ interface UITableViewDelegate { [Export ("indexPathForPreferredFocusedViewInTableView:")] [return: NullAllowed] NSIndexPath GetIndexPathForPreferredFocusedView (UITableView tableView); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("tableView:leadingSwipeActionsConfigurationForRowAtIndexPath:")] + [return: NullAllowed] + UISwipeActionsConfiguration GetLeadingSwipeActionsConfiguration (UITableView tableView, NSIndexPath indexPath); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("tableView:trailingSwipeActionsConfigurationForRowAtIndexPath:")] + [return: NullAllowed] + UISwipeActionsConfiguration GetTrailingSwipeActionsConfiguration (UITableView tableView, NSIndexPath indexPath); + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("tableView:shouldSpringLoadRowAtIndexPath:withContext:")] + bool ShouldSpringLoadRow (UITableView tableView, NSIndexPath indexPath, IUISpringLoadedInteractionContext context); } [Since (6,0)] @@ -11691,6 +12474,7 @@ interface UITableViewHeaderFooterView : UIAppearance, NSCoding { [Export ("initWithReuseIdentifier:")] IntPtr Constructor (NSString reuseIdentifier); + [Advice ("You must call the base method when overriding.")] // [RequiresSuper] [Export ("prepareForReuse")] void PrepareForReuse (); @@ -11721,7 +12505,11 @@ interface UITableViewRowAction : NSCopying { [BaseType (typeof (UIControl), Delegates=new string [] { "WeakDelegate" })] // , Events=new Type [] {typeof(UITextFieldDelegate)})] custom logic needed, see https://bugzilla.xamarin.com/show_bug.cgi?id=53174 - interface UITextField : UITextInput, UIContentSizeCategoryAdjusting { + interface UITextField : UITextInput, UIContentSizeCategoryAdjusting +#if IOS + , UITextDraggable, UITextDroppable, UITextPasteConfigurationSupporting +#endif // IOS + { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frame); @@ -11901,7 +12689,11 @@ interface UITextFieldDelegate { } [BaseType (typeof (UIScrollView), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof(UITextViewDelegate)})] - interface UITextView : UITextInput, NSCoding, UIContentSizeCategoryAdjusting { + interface UITextView : UITextInput, NSCoding, UIContentSizeCategoryAdjusting +#if IOS + , UITextDraggable, UITextDroppable, UITextPasteConfigurationSupporting +#endif // IOS + { [Export ("initWithFrame:")] IntPtr Constructor (CGRect frame); @@ -12843,14 +13635,30 @@ [Static] [Export ("areAnimationsEnabled")] [Export ("layoutMargins")] UIEdgeInsets LayoutMargins { get; set; } + [iOS (11,0), TV (11,0)] + [Export ("directionalLayoutMargins", ArgumentSemantic.Assign)] + NSDirectionalEdgeInsets DirectionalLayoutMargins { get; set; } + [iOS(8,0)] [Export ("preservesSuperviewLayoutMargins")] bool PreservesSuperviewLayoutMargins { get; set; } + [iOS (11,0), TV (11,0)] + [Export ("insetsLayoutMarginsFromSafeArea")] + bool InsetsLayoutMarginsFromSafeArea { get; set; } + [iOS(8,0)] [Export ("layoutMarginsDidChange")] void LayoutMarginsDidChange (); + [iOS (11,0), TV (11,0)] + [Export ("safeAreaInsets")] + UIEdgeInsets SafeAreaInsets { get; } + + [iOS (11,0), TV (11,0)] + [Export ("safeAreaInsetsDidChange")] + void SafeAreaInsetsDidChange (); + [iOS (9,0)] [Static] [Export ("userInterfaceLayoutDirectionForSemanticContentAttribute:")] @@ -12877,6 +13685,10 @@ [Static] [Export ("areAnimationsEnabled")] [Export ("readableContentGuide", ArgumentSemantic.Strong)] UILayoutGuide ReadableContentGuide { get; } + [iOS (11,0), TV (11,0)] + [Export ("safeAreaLayoutGuide", ArgumentSemantic.Strong)] + UILayoutGuide SafeAreaLayoutGuide { get; } + [iOS (9,0)] [Export ("inheritedAnimationDuration")] [Static] @@ -12951,6 +13763,24 @@ [Static] [Export ("areAnimationsEnabled")] [iOS (9,0)] // added in Xcode 7.1 / iOS 9.1 SDK [Export ("canBecomeFocused")] new bool CanBecomeFocused { get; } + + [NoWatch, NoTV, iOS (11,0)] + [Export ("addInteraction:")] + void AddInteraction (IUIInteraction interaction); + + [NoWatch, NoTV, iOS (11,0)] + [Export ("removeInteraction:")] + void RemoveInteraction (IUIInteraction interaction); + + [NoWatch, NoTV, iOS (11, 0)] + [Export ("interactions", ArgumentSemantic.Copy)] + IUIInteraction[] Interactions { get; set; } + + // UIAccessibilityInvertColors category + [NoWatch] + [TV (11,0), iOS (11,0)] + [Export ("accessibilityIgnoresInvertColors")] + bool AccessibilityIgnoresInvertColors { get; set; } } [Category, BaseType (typeof (UIView))] @@ -13158,13 +13988,13 @@ interface UIViewController : NSCoding, UIAppearanceContainer, UIContentContainer // 3.2 extensions from MoviePlayer [NoMac] [NoTV] - [Availability (Introduced = Platform.iOS_3_2, Deprecated = Platform.iOS_9_0)] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Export ("presentMoviePlayerViewControllerAnimated:")] void PresentMoviePlayerViewController (MPMoviePlayerViewController moviePlayerViewController); [NoMac] [NoTV] - [Availability (Introduced = Platform.iOS_3_2, Deprecated = Platform.iOS_9_0)] + [Availability (Deprecated = Platform.iOS_9_0, Message = "Use 'AVPlayerViewController' (AVKit) instead.")] [Export ("dismissMoviePlayerViewControllerAnimated")] void DismissMoviePlayerViewController (); @@ -13376,6 +14206,8 @@ interface UIViewController : NSCoding, UIAppearanceContainer, UIContentContainer bool ExtendedLayoutIncludesOpaqueBars { get; set; } [Since (7,0)] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use UIScrollView's 'ContentInsetAdjustmentBehavior' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use UIScrollView's 'ContentInsetAdjustmentBehavior' instead.")] [Export ("automaticallyAdjustsScrollViewInsets", ArgumentSemantic.Assign)] bool AutomaticallyAdjustsScrollViewInsets { get; set; } @@ -13422,10 +14254,14 @@ interface UIViewController : NSCoding, UIAppearanceContainer, UIContentContainer UIViewController ChildViewControllerForStatusBarHidden (); [Since (7,0)] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use UIView's 'SafeAreaLayoutGuide' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use UIView's 'SafeAreaLayoutGuide' instead.")] [Export ("topLayoutGuide")] IUILayoutSupport TopLayoutGuide { get; } [Since (7,0)] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use UIView's 'SafeAreaLayoutGuide' instead.")] + [Deprecated (PlatformName.TvOS, 11, 0, message: "Use UIView's 'SafeAreaLayoutGuide' instead.")] [Export ("bottomLayoutGuide")] IUILayoutSupport BottomLayoutGuide { get; } @@ -13528,6 +14364,75 @@ interface UIViewController : NSCoding, UIAppearanceContainer, UIContentContainer [iOS (10,0), TV (10,0)] [Export ("restoresFocusAfterTransition")] bool RestoresFocusAfterTransition { get; set; } + + [NoWatch, NoiOS] + [TV (11,0)] + [Export ("preferredUserInterfaceStyle")] + UIUserInterfaceStyle PreferredUserInterfaceStyle { get; } + + [NoWatch, NoiOS] + [TV (11,0)] + [Export ("setNeedsUserInterfaceAppearanceUpdate")] + void SetNeedsUserInterfaceAppearanceUpdate (); + + [NoWatch, NoiOS] + [TV (11, 0)] + [NullAllowed, Export ("childViewControllerForUserInterfaceStyle")] + UIViewController ChildViewControllerForUserInterfaceStyle { get; } + + [iOS (11,0), TV (11,0)] + [Export ("additionalSafeAreaInsets", ArgumentSemantic.Assign)] + UIEdgeInsets AdditionalSafeAreaInsets { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("systemMinimumLayoutMargins")] + NSDirectionalEdgeInsets SystemMinimumLayoutMargins { get; } + + [iOS (11,0), TV (11,0)] + [Export ("viewRespectsSystemMinimumLayoutMargins")] + bool ViewRespectsSystemMinimumLayoutMargins { get; set; } + + [iOS (11,0), TV (11,0)] + [Export ("viewLayoutMarginsDidChange")] + [Advice ("You must call the base method when overriding.")] // [RequiresSuper] + void ViewLayoutMarginsDidChange (); + + [iOS (11,0), TV (11,0)] + [Export ("viewSafeAreaInsetsDidChange")] + [Advice ("You must call the base method when overriding.")] // [RequiresSuper] + void ViewSafeAreaInsetsDidChange (); + + [NoWatch, NoTV] + [iOS (11,0)] + [NullAllowed, Export ("childViewControllerForScreenEdgesDeferringSystemGestures")] + UIViewController ChildViewControllerForScreenEdgesDeferringSystemGestures { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("preferredScreenEdgesDeferringSystemGestures")] + UIRectEdge PreferredScreenEdgesDeferringSystemGestures { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("setNeedsUpdateOfScreenEdgesDeferringSystemGestures")] + void SetNeedsUpdateOfScreenEdgesDeferringSystemGestures (); + + // UIHomeIndicatorAutoHidden (UIViewController) category + + [NoWatch, NoTV] + [iOS (11,0)] + [NullAllowed, Export ("childViewControllerForHomeIndicatorAutoHidden")] + UIViewController ChildViewControllerForHomeIndicatorAutoHidden { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("prefersHomeIndicatorAutoHidden")] + bool PrefersHomeIndicatorAutoHidden { get; } + + [NoWatch, NoTV] + [iOS (11,0)] + [Export ("setNeedsUpdateOfHomeIndicatorAutoHidden")] + void SetNeedsUpdateOfHomeIndicatorAutoHidden (); } [Since (7,0)] @@ -14171,6 +15076,14 @@ interface UITextContentType { [Field ("UITextContentTypeCreditCardNumber")] NSString CreditCardNumber { get; } + + [iOS (11,0), TV (11,0)] + [Field ("UITextContentTypeUsername")] + NSString Username { get; } + + [iOS (11,0), TV (11,0)] + [Field ("UITextContentTypePassword")] + NSString Password { get; } } [Since (3,2)] @@ -14241,6 +15154,10 @@ interface UISplitViewController { [iOS (8,0)] [Field ("UISplitViewControllerAutomaticDimension")] nfloat AutomaticDimension { get; } + + [iOS (11,0), TV (11,0)] + [Export ("primaryEdge", ArgumentSemantic.Assign)] + UISplitViewControllerPrimaryEdge PrimaryEdge { get; set; } } [Since (3,2)] @@ -15409,8 +16326,33 @@ partial interface UIInputViewController : UITextInputDelegate { [iOS (10,0), TV (10,0)] [Export ("handleInputModeListFromView:withEvent:")] void HandleInputModeList (UIView fromView, UIEvent withEvent); + + [iOS (11,0), TV (11,0)] + [Export ("hasFullAccess")] + bool HasFullAccess { get; } + + [iOS (11,0), TV (11,0)] + [Export ("needsInputModeSwitchKey")] + bool NeedsInputModeSwitchKey { get; } } + [NoWatch, NoTV, iOS (11,0)] + [Protocol] + interface UIInteraction + { + [Abstract] + [Export ("view", ArgumentSemantic.Weak)] + UIView View { get; } + + [Abstract] + [Export ("willMoveToView:")] + void WillMoveToView ([NullAllowed] UIView view); + + [Abstract] + [Export ("didMoveToView:")] + void DidMoveToView ([NullAllowed] UIView view); + } + [NoWatch] [iOS (8,0)] [Protocol, Model] @@ -15436,6 +16378,24 @@ partial interface UITextDocumentProxy : UIKeyInput { [iOS (10, 0)] [NullAllowed, Export ("documentInputMode")] UITextInputMode DocumentInputMode { get; } + + // New abstract, breaks ABI + // Radar: 33685383 +#if XAMCORE_4_0 + [Abstract] +#endif + [iOS (11,0)] + [NullAllowed, Export ("selectedText")] + string SelectedText { get; } + + // New abstract, breaks ABI + // Radar: 33685383 +#if XAMCORE_4_0 + [Abstract] +#endif + [iOS (11,0)] + [Export ("documentIdentifier", ArgumentSemantic.Copy)] + NSUuid DocumentIdentifier { get; } } [NoWatch] @@ -15674,6 +16634,7 @@ partial interface UIMutableUserNotificationAction { [NoWatch] [NoTV] [iOS (8,0)] + [Deprecated (PlatformName.iOS, 11, 0, message: "Use 'UIDocumentPickerViewController' instead.")] [BaseType (typeof (UIViewController), Delegates=new string [] {"Delegate"}, Events=new Type [] {typeof (UIDocumentMenuDelegate)})] [DisableDefaultCtor] // NSInvalidArgumentException Reason: You cannot initialize a UIDocumentMenuViewController except by the initWithDocumentTypes:inMode: and initWithURL:inMode: initializers. partial interface UIDocumentMenuViewController : NSCoding { @@ -15726,10 +16687,16 @@ partial interface UIDocumentPickerViewController : NSCoding { [Export ("initWithDocumentTypes:inMode:")] IntPtr Constructor (string [] allowedUTIs, UIDocumentPickerMode mode); + [Advice ("This method will be deprecated in a future release and should be avoided. Instead, use 'UIDocumentPickerViewController (NSUrl[], UIDocumentPickerMode)'.")] [DesignatedInitializer] [Export ("initWithURL:inMode:")] IntPtr Constructor (NSUrl url, UIDocumentPickerMode mode); + [iOS (11,0)] + [Export ("initWithURLs:inMode:")] + [DesignatedInitializer] + IntPtr Constructor (NSUrl[] urls, UIDocumentPickerMode mode); + [Export ("delegate", ArgumentSemantic.Weak), NullAllowed] NSObject WeakDelegate { get; set; } @@ -15739,6 +16706,10 @@ partial interface UIDocumentPickerViewController : NSCoding { [Export ("documentPickerMode", ArgumentSemantic.Assign)] UIDocumentPickerMode DocumentPickerMode { get; } + + [iOS (11,0)] + [Export ("allowsMultipleSelection")] + bool AllowsMultipleSelection { get; set; } } [NoWatch] @@ -15747,10 +16718,17 @@ partial interface UIDocumentPickerViewController : NSCoding { [Protocol, Model] [BaseType (typeof (NSObject))] partial interface UIDocumentPickerDelegate { + [Deprecated (PlatformName.iOS, 11, 0, message: "Implement 'DidPickDocument (UIDocumentPickerViewController, NSUrl[])' instead.")] +#if !XAMCORE_4_0 [Abstract] +#endif [Export ("documentPicker:didPickDocumentAtURL:"), EventArgs ("UIDocumentPicked")] void DidPickDocument (UIDocumentPickerViewController controller, NSUrl url); + [iOS (11,0)] + [Export ("documentPicker:didPickDocumentsAtURLs:"), EventArgs ("UIDocumentPickedAtUrls"), EventName ("DidPickDocumentAtUrls")] + void DidPickDocument (UIDocumentPickerViewController controller, NSUrl[] urls); + [Export ("documentPickerWasCancelled:")] void WasCancelled (UIDocumentPickerViewController controller); } @@ -15822,6 +16800,15 @@ interface UIAccessibilityReadingContent { [Abstract] [Export ("accessibilityPageContent")] string GetAccessibilityPageContent (); + + [TV (11,0), iOS (11,0)] + [Export ("accessibilityAttributedContentForLineNumber:")] + [return: NullAllowed] + NSAttributedString GetAccessibilityAttributedContent (nint lineNumber); + + [TV (11,0), iOS (11,0)] + [NullAllowed, Export ("accessibilityAttributedPageContent")] + NSAttributedString GetAccessibilityAttributedPageContent (); } [NoWatch] @@ -15845,6 +16832,7 @@ interface UIGuidedAccessRestrictionDelegate { string GetDetailTextForGuidedAccessRestriction (string restrictionIdentifier); } + [DisableDefaultCtor] // [Assert] -init is not a useful initializer for this class. Use one of the designated initializers instead [NoWatch] [iOS (9,0)] // added in Xcode 7.1 / iOS 9.1 SDK [BaseType (typeof (UIFocusUpdateContext))] @@ -15878,6 +16866,16 @@ interface UICubicTimingParameters : UITimingCurveProvider [DesignatedInitializer] IntPtr Constructor (CGPoint point1, CGPoint point2); } + + interface IUIFocusAnimationContext {} + + [iOS (11,0)] + [Protocol] + interface UIFocusAnimationContext { + [Abstract] + [Export ("duration")] + double Duration { get; } + } [NoWatch] [iOS (9,0)] @@ -15886,6 +16884,16 @@ interface UIFocusAnimationCoordinator { [Export ("addCoordinatedAnimations:completion:")] [Async] void AddCoordinatedAnimations ([NullAllowed] Action animations, [NullAllowed] Action completion); + + [Async] + [TV (11,0), iOS (11,0)] + [Export ("addCoordinatedFocusingAnimations:completion:")] + void AddCoordinatedFocusingAnimations ([NullAllowed] Action animations, [NullAllowed] Action completion); + + [Async] + [TV (11,0), iOS (11,0)] + [Export ("addCoordinatedUnfocusingAnimations:completion:")] + void AddCoordinatedUnfocusingAnimations ([NullAllowed] Action animations, [NullAllowed] Action completion); } [NoWatch] @@ -15914,6 +16922,7 @@ interface UIFocusItem : UIFocusEnvironment bool CanBecomeFocused { get; } } + [DisableDefaultCtor] // [Assert] -init is not a useful initializer for this class. Use one of the designated initializers instead [NoWatch] [iOS (9,0)] [BaseType (typeof(NSObject))] @@ -15934,6 +16943,71 @@ interface UIFocusUpdateContext { [iOS (10,0), TV (10,0)] [NullAllowed, Export ("nextFocusedItem", ArgumentSemantic.Weak)] IUIFocusItem NextFocusedItem { get; } + + [iOS (11,0), TV (11,0)] + [Notification] + [Field ("UIFocusDidUpdateNotification")] + NSString DidUpdateNotification { get; } + + [iOS (11,0), TV (11,0)] + [Notification] + [Field ("UIFocusMovementDidFailNotification")] + NSString MovementDidFailNotification { get; } + + [iOS (11,0), TV (11,0)] + [Field ("UIFocusUpdateContextKey")] + NSString Key { get; } + + [iOS (11,0), TV (11,0)] + [Field ("UIFocusUpdateAnimationCoordinatorKey")] + NSString AnimationCoordinatorKey { get; } + } + + [NoWatch] + [iOS (11,0), TV (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIFocusSystem { + [Static] + [Export ("environment:containsEnvironment:")] + bool Contains (IUIFocusEnvironment environment, IUIFocusEnvironment otherEnvironment); + + [NoiOS] + [Static] + [Export ("registerURL:forSoundIdentifier:")] + void RegisterUrl (NSUrl soundFileUrl, NSString identifier); + + // The 2 values associated with the 'UIFocusSoundIdentifier' smart enum cannot be used. + // See https://developer.apple.com/documentation/uikit/uifocussystem/2887479-register + // Do not specify one of the UIKit sound identifiers (such as default); doing so will cause an immediate assertion failure and crash your app. + } + + interface IUIFocusDebuggerOutput {} + + [NoWatch] + [iOS (11,0), TV (11,0)] + [Protocol] + interface UIFocusDebuggerOutput {} + + [NoWatch] + [iOS (11,0), TV (11,0)] + [BaseType (typeof(NSObject))] + interface UIFocusDebugger { + [Static] + [Export ("help")] + IUIFocusDebuggerOutput Help { get; } + + [Static] + [Export ("status")] + IUIFocusDebuggerOutput Status { get; } + + [Static] + [Export ("checkFocusabilityForItem:")] + IUIFocusDebuggerOutput CheckFocusability (IUIFocusItem item); + + [Static] + [Export ("simulateFocusUpdateRequestFromEnvironment:")] + IUIFocusDebuggerOutput SimulateFocusUpdateRequest (IUIFocusEnvironment environment); } [NoWatch] @@ -16032,6 +17106,17 @@ interface UITableViewFocusUpdateContext { NSIndexPath NextFocusedIndexPath { [return: NullAllowed] get; } } + [NoWatch, NoiOS] + [TV (11,0)] + public enum UIFocusSoundIdentifier { + + [Field ("UIFocusSoundIdentifierNone")] + None, + + [Field ("UIFocusSoundIdentifierDefault")] + Default, + } + interface IUIFocusEnvironment {} [NoWatch] [iOS (9,0)] @@ -16072,6 +17157,12 @@ interface UIFocusEnvironment { [iOS (10, 0)] [Export ("preferredFocusEnvironments", ArgumentSemantic.Copy)] IUIFocusEnvironment[] PreferredFocusEnvironments { get; } + + [NoiOS] + [TV (11,0)] + [Export ("soundIdentifierForFocusUpdateInContext:")] + [return: NullAllowed] + NSString GetSoundIdentifier (UIFocusUpdateContext context); } #endif // !WATCH @@ -16091,4 +17182,1329 @@ interface UITextAttributesConstants { [Field ("UITextAttributeTextShadowOffset")] NSString TextShadowOffset { get; } } + +#if !WATCH +#region Drag and Drop + interface IUIInteraction {} + interface IUIDropSession {} + interface IUIDragDropSession {} + interface IUIDragAnimating {} + interface IUIDragSession {} + interface IUIDragInteractionDelegate {} + interface IUIDropInteractionDelegate {} + interface IUICollectionViewDragDelegate {} + interface IUICollectionViewDropDelegate {} + interface IUICollectionViewDropCoordinator {} + interface IUICollectionViewDropItem {} + interface IUICollectionViewDropPlaceholderContext {} + interface IUITableViewDragDelegate {} + interface IUITableViewDropDelegate {} + interface IUITableViewDropCoordinator {} + interface IUITableViewDropItem {} + interface IUITableViewDropPlaceholderContext {} + interface IUITextDragDelegate {} + interface IUITextDraggable {} + interface IUITextDragRequest {} + interface IUITextDroppable {} + interface IUITextDropDelegate {} + interface IUITextDropRequest {} + + [NoWatch, NoTV, iOS (11,0)] + [Protocol] + interface UIDragAnimating + { + [Abstract] + [Export ("addAnimations:")] + void AddAnimations (Action animations); + + [Abstract] + [Export ("addCompletion:")] + void AddCompletion (Action completion); + } + + [NoWatch, NoTV, iOS (11,0)] + [Protocol] + interface UIDragDropSession + { + [Abstract] + [Export ("items")] + UIDragItem[] Items { get; } + + [Abstract] + [Export ("locationInView:")] + CGPoint LocationInView ([NullAllowed] UIView view); + + [Abstract] + [Export ("allowsMoveOperation")] + bool AllowsMoveOperation { get; } + + [Abstract] + [Export ("restrictedToDraggingApplication")] + bool RestrictedToDraggingApplication { [Bind ("isRestrictedToDraggingApplication")] get; } + + [Abstract] + [Export ("hasItemsConformingToTypeIdentifiers:")] + bool HasConformingItems (string[] typeIdentifiers); + + [Abstract] + [Export ("canLoadObjectsOfClass:")] + bool CanLoadObjects (Class itemProviderReadingClass); + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIDragItem + { + [Export ("initWithItemProvider:")] + [DesignatedInitializer] + IntPtr Constructor (NSItemProvider itemProvider); + + [Export ("itemProvider")] + NSItemProvider ItemProvider { get; } + + [NullAllowed, Export ("localObject", ArgumentSemantic.Strong)] + NSObject LocalObject { get; set; } + + [NullAllowed, Export ("previewProvider", ArgumentSemantic.Copy)] + Func PreviewProvider { get; set; } + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIDragPreview : NSCopying + { + [Export ("initWithView:parameters:")] + [DesignatedInitializer] + IntPtr Constructor (UIView view, UIDragPreviewParameters parameters); + + [Export ("initWithView:")] + IntPtr Constructor (UIView view); + + [Export ("view")] + UIView View { get; } + + [Export ("parameters", ArgumentSemantic.Copy)] + UIDragPreviewParameters Parameters { get; } + + // From URLPreviews (UIDragPreview) category + + [Static] + [Export ("previewForURL:")] + UIDragPreview GetPreview (NSUrl url); + + [Static] + [Export ("previewForURL:title:")] + UIDragPreview GetPreview (NSUrl url, [NullAllowed] string title); + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + interface UIDragPreviewParameters : NSCopying + { + [Export ("initWithTextLineRects:")] + IntPtr Constructor (NSValue[] textLineRects); + + [NullAllowed, Export ("visiblePath", ArgumentSemantic.Copy)] + UIBezierPath VisiblePath { get; set; } + + [Export ("backgroundColor", ArgumentSemantic.Copy)] + UIColor BackgroundColor { get; set; } + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIDragPreviewTarget : NSCopying + { + [Export ("initWithContainer:center:transform:")] + [DesignatedInitializer] + IntPtr Constructor (UIView container, CGPoint center, CGAffineTransform transform); + + [Export ("initWithContainer:center:")] + IntPtr Constructor (UIView container, CGPoint center); + + [Export ("container")] + UIView Container { get; } + + [Export ("center")] + CGPoint Center { get; } + + [Export ("transform")] + CGAffineTransform Transform { get; } + } + + [NoWatch, NoTV, iOS (11,0)] + [Protocol] + interface UIDragSession : UIDragDropSession + { + [Abstract] + [NullAllowed, Export ("localContext", ArgumentSemantic.Strong)] + NSObject LocalContext { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIDragInteraction : UIInteraction { + [Export ("initWithDelegate:")] + [DesignatedInitializer] + IntPtr Constructor (IUIDragInteractionDelegate @delegate); + + [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] + IUIDragInteractionDelegate Delegate { get; } + + [Export ("allowsSimultaneousRecognitionDuringLift")] + bool AllowsSimultaneousRecognitionDuringLift { get; set; } + + [Export ("enabled")] + bool Enabled { [Bind ("isEnabled")] get; set; } + + [Static] + [Export ("enabledByDefault")] + bool EnabledByDefault { [Bind ("isEnabledByDefault")] get; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UIDragInteractionDelegate { + [Abstract] + [Export ("dragInteraction:itemsForBeginningSession:")] + UIDragItem[] GetItemsForBeginningSession (UIDragInteraction interaction, IUIDragSession session); + + [Export ("dragInteraction:previewForLiftingItem:session:")] + [return: NullAllowed] + UITargetedDragPreview GetPreviewForLiftingItem (UIDragInteraction interaction, UIDragItem item, IUIDragSession session); + + [Export ("dragInteraction:willAnimateLiftWithAnimator:session:")] + void WillAnimateLift (UIDragInteraction interaction, IUIDragAnimating animator, IUIDragSession session); + + [Export ("dragInteraction:sessionWillBegin:")] + void SessionWillBegin (UIDragInteraction interaction, IUIDragSession session); + + [Export ("dragInteraction:sessionAllowsMoveOperation:")] + bool SessionAllowsMoveOperation (UIDragInteraction interaction, IUIDragSession session); + + [Export ("dragInteraction:sessionIsRestrictedToDraggingApplication:")] + bool SessionIsRestrictedToDraggingApplication (UIDragInteraction interaction, IUIDragSession session); + + [Export ("dragInteraction:prefersFullSizePreviewsForSession:")] + bool PrefersFullSizePreviews (UIDragInteraction interaction, IUIDragSession session); + + [Export ("dragInteraction:sessionDidMove:")] + void SessionDidMove (UIDragInteraction interaction, IUIDragSession session); + + [Export ("dragInteraction:session:willEndWithOperation:")] + void SessionWillEnd (UIDragInteraction interaction, IUIDragSession session, UIDropOperation operation); + + [Export ("dragInteraction:session:didEndWithOperation:")] + void SessionDidEnd (UIDragInteraction interaction, IUIDragSession session, UIDropOperation operation); + + [Export ("dragInteraction:sessionDidTransferItems:")] + void SessionDidTransferItems (UIDragInteraction interaction, IUIDragSession session); + + [Export ("dragInteraction:itemsForAddingToSession:withTouchAtPoint:")] + UIDragItem[] GetItemsForAddingToSession (UIDragInteraction interaction, IUIDragSession session, CGPoint point); + + [Export ("dragInteraction:sessionForAddingItems:withTouchAtPoint:")] + [return: NullAllowed] + IUIDragSession GetSessionForAddingItems (UIDragInteraction interaction, IUIDragSession[] sessions, CGPoint point); + + [Export ("dragInteraction:session:willAddItems:forInteraction:")] + void WillAddItems (UIDragInteraction interaction, IUIDragSession session, UIDragItem[] items, UIDragInteraction addingInteraction); + + [Export ("dragInteraction:previewForCancellingItem:withDefault:")] + [return: NullAllowed] + UITargetedDragPreview GetPreviewForCancellingItem (UIDragInteraction interaction, UIDragItem item, UITargetedDragPreview defaultPreview); + + [Export ("dragInteraction:item:willAnimateCancelWithAnimator:")] + void WillAnimateCancel (UIDragInteraction interaction, UIDragItem item, IUIDragAnimating animator); + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] // If Apple adds a delegate setter: Delegates=new string [] {"Delegate"}, Events=new Type [] { typeof (UIDropInteractionDelegate)})] + [DisableDefaultCtor] + interface UIDropInteraction : UIInteraction + { + [Export ("initWithDelegate:")] + [DesignatedInitializer] + IntPtr Constructor (IUIDropInteractionDelegate @delegate); + + [Export ("delegate", ArgumentSemantic.Weak)] + [NullAllowed] + IUIDropInteractionDelegate Delegate { get; } + + [Export ("allowsSimultaneousDropSessions")] + bool AllowsSimultaneousDropSessions { get; set; } + } + + [NoWatch, NoTV, iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UIDropInteractionDelegate + { + [Export ("dropInteraction:canHandleSession:"), DelegateName ("Func"), NoDefaultValue] + bool CanHandleSession (UIDropInteraction interaction, IUIDropSession session); + + [Export ("dropInteraction:sessionDidEnter:"), EventArgs ("UIDropInteraction")] + void SessionDidEnter (UIDropInteraction interaction, IUIDropSession session); + + [Export ("dropInteraction:sessionDidUpdate:"), DelegateName ("Func"), NoDefaultValue] + UIDropProposal SessionDidUpdate (UIDropInteraction interaction, IUIDropSession session); + + [Export ("dropInteraction:sessionDidExit:"), EventArgs ("UIDropInteraction")] + void SessionDidExit (UIDropInteraction interaction, IUIDropSession session); + + [Export ("dropInteraction:performDrop:"), EventArgs ("UIDropInteraction")] + void PerformDrop (UIDropInteraction interaction, IUIDropSession session); + + [Export ("dropInteraction:concludeDrop:"), EventArgs ("UIDropInteraction")] + void ConcludeDrop (UIDropInteraction interaction, IUIDropSession session); + + [Export ("dropInteraction:sessionDidEnd:"), EventArgs ("UIDropInteraction")] + void SessionDidEnd (UIDropInteraction interaction, IUIDropSession session); + + [Export ("dropInteraction:previewForDroppingItem:withDefault:")] + [return: NullAllowed][DelegateName("UIDropInteractionPreviewForItem"), NoDefaultValue] + UITargetedDragPreview GetPreviewForDroppingItem (UIDropInteraction interaction, UIDragItem item, UITargetedDragPreview defaultPreview); + + [Export ("dropInteraction:item:willAnimateDropWithAnimator:"), EventArgs("UIDropInteractionAnimation")] + void WillAnimateDrop (UIDropInteraction interaction, UIDragItem item, IUIDragAnimating animator); + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIDropProposal : NSCopying + { + [Export ("initWithDropOperation:")] + [DesignatedInitializer] + IntPtr Constructor (UIDropOperation operation); + + [Export ("operation")] + UIDropOperation Operation { get; } + + [Export ("precise")] + bool Precise { [Bind ("isPrecise")] get; set; } + + [Export ("prefersFullSizePreview")] + bool PrefersFullSizePreview { get; set; } + } + + [NoWatch, NoTV, iOS (11,0)] + [Protocol] + interface UIDropSession : UIDragDropSession, NSProgressReporting + { + [Abstract] + [NullAllowed, Export ("localDragSession")] + IUIDragSession LocalDragSession { get; } + + [Abstract] + [Export ("progressIndicatorStyle", ArgumentSemantic.Assign)] + UIDropSessionProgressIndicatorStyle ProgressIndicatorStyle { get; set; } + + [Abstract] + [Export ("loadObjectsOfClass:completion:")] + NSProgress LoadObjects (Class itemProviderReadingClass, Action completion); + } + + [NoWatch, NoTV, iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UITargetedDragPreview : NSCopying + { + [Export ("initWithView:parameters:target:")] + [DesignatedInitializer] + IntPtr Constructor (UIView view, UIDragPreviewParameters parameters, UIDragPreviewTarget target); + + [Export ("initWithView:parameters:")] + IntPtr Constructor (UIView view, UIDragPreviewParameters parameters); + + [Export ("initWithView:")] + IntPtr Constructor (UIView view); + + [Export ("target")] + UIDragPreviewTarget Target { get; } + + [Export ("view")] + UIView View { get; } + + [Export ("parameters", ArgumentSemantic.Copy)] + UIDragPreviewParameters Parameters { get; } + + [Export ("size")] + CGSize Size { get; } + + [Export ("retargetedPreviewWithTarget:")] + UITargetedDragPreview GetRetargetedPreview (UIDragPreviewTarget newTarget); + + // From URLPreviews (UITargetedDragPreview) category + + [Static] + [Export ("previewForURL:target:")] + UITargetedDragPreview GetPreview (NSUrl url, UIDragPreviewTarget target); + + [Static] + [Export ("previewForURL:title:target:")] + UITargetedDragPreview GetPreview (NSUrl url, [NullAllowed] string title, UIDragPreviewTarget target); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UICollectionViewDragDelegate { + [Abstract] + [Export ("collectionView:itemsForBeginningDragSession:atIndexPath:")] + UIDragItem[] GetItemsForBeginningDragSession (UICollectionView collectionView, IUIDragSession session, NSIndexPath indexPath); + + [Export ("collectionView:itemsForAddingToDragSession:atIndexPath:point:")] + UIDragItem[] GetItemsForAddingToDragSession (UICollectionView collectionView, IUIDragSession session, NSIndexPath indexPath, CGPoint point); + + [Export ("collectionView:dragPreviewParametersForItemAtIndexPath:")] + [return: NullAllowed] + UIDragPreviewParameters GetDragPreviewParameters (UICollectionView collectionView, NSIndexPath indexPath); + + [Export ("collectionView:dragSessionWillBegin:")] + void DragSessionWillBegin (UICollectionView collectionView, IUIDragSession session); + + [Export ("collectionView:dragSessionDidEnd:")] + void DragSessionDidEnd (UICollectionView collectionView, IUIDragSession session); + + [Export ("collectionView:dragSessionAllowsMoveOperation:")] + bool DragSessionAllowsMoveOperation (UICollectionView collectionView, IUIDragSession session); + + [Export ("collectionView:dragSessionIsRestrictedToDraggingApplication:")] + bool DragSessionIsRestrictedToDraggingApplication (UICollectionView collectionView, IUIDragSession session); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UICollectionViewDropDelegate { + [Abstract] + [Export ("collectionView:performDropWithCoordinator:")] + void PerformDrop (UICollectionView collectionView, IUICollectionViewDropCoordinator coordinator); + + [Export ("collectionView:canHandleDropSession:")] + bool CanHandleDropSession (UICollectionView collectionView, IUIDropSession session); + + [Export ("collectionView:dropSessionDidEnter:")] + void DropSessionDidEnter (UICollectionView collectionView, IUIDropSession session); + + [Export ("collectionView:dropSessionDidUpdate:withDestinationIndexPath:")] + UICollectionViewDropProposal DropSessionDidUpdate (UICollectionView collectionView, IUIDropSession session, [NullAllowed] NSIndexPath destinationIndexPath); + + [Export ("collectionView:dropSessionDidExit:")] + void DropSessionDidExit (UICollectionView collectionView, IUIDropSession session); + + [Export ("collectionView:dropSessionDidEnd:")] + void DropSessionDidEnd (UICollectionView collectionView, IUIDropSession session); + + [Export ("collectionView:dropPreviewParametersForItemAtIndexPath:")] + [return: NullAllowed] + UIDragPreviewParameters GetDropPreviewParameters (UICollectionView collectionView, NSIndexPath indexPath); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(UIDropProposal))] + [DisableDefaultCtor] // NSInternalInconsistencyException Reason: Not implemented + interface UICollectionViewDropProposal { + + // inline from base type + [Export ("initWithDropOperation:")] + [DesignatedInitializer] + IntPtr Constructor (UIDropOperation operation); + + [Export ("initWithDropOperation:intent:")] + IntPtr Constructor (UIDropOperation operation, UICollectionViewDropIntent intent); + + [Export ("intent")] + UICollectionViewDropIntent Intent { get; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UICollectionViewDropCoordinator { + [Abstract] + [Export ("items")] + IUICollectionViewDropItem[] Items { get; } + + [Abstract] + [NullAllowed, Export ("destinationIndexPath")] + NSIndexPath DestinationIndexPath { get; } + + [Abstract] + [Export ("proposal")] + UICollectionViewDropProposal Proposal { get; } + + [Abstract] + [Export ("session")] + IUIDropSession Session { get; } + + [Abstract] + [Export ("dropItem:toPlaceholder:")] + IUICollectionViewDropPlaceholderContext DropItemToPlaceholder (UIDragItem dragItem, UICollectionViewDropPlaceholder placeholder); + + [Abstract] + [Export ("dropItem:toItemAtIndexPath:")] + IUIDragAnimating DropItemToItem (UIDragItem dragItem, NSIndexPath itemIndexPath); + + [Abstract] + [Export ("dropItem:intoItemAtIndexPath:rect:")] + IUIDragAnimating DropItemIntoItem (UIDragItem dragItem, NSIndexPath itemIndexPath, CGRect rect); + + [Abstract] + [Export ("dropItem:toTarget:")] + IUIDragAnimating DropItemToTarget (UIDragItem dragItem, UIDragPreviewTarget target); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UICollectionViewPlaceholder { + [Export ("initWithInsertionIndexPath:reuseIdentifier:")] + [DesignatedInitializer] + IntPtr Constructor (NSIndexPath insertionIndexPath, string reuseIdentifier); + + [NullAllowed, Export ("cellUpdateHandler", ArgumentSemantic.Copy)] + Action CellUpdateHandler { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(UICollectionViewPlaceholder))] + interface UICollectionViewDropPlaceholder { + // inlined + [Export ("initWithInsertionIndexPath:reuseIdentifier:")] + IntPtr Constructor (NSIndexPath insertionIndexPath, string reuseIdentifier); + + [NullAllowed, Export ("previewParametersProvider", ArgumentSemantic.Copy)] + Func PreviewParametersProvider { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UICollectionViewDropItem { + [Abstract] + [Export ("dragItem")] + UIDragItem DragItem { get; } + + [Abstract] + [NullAllowed, Export ("sourceIndexPath")] + NSIndexPath SourceIndexPath { get; } + + [Abstract] + [Export ("previewSize")] + CGSize PreviewSize { get; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UICollectionViewDropPlaceholderContext : UIDragAnimating { + [Abstract] + [Export ("dragItem")] + UIDragItem DragItem { get; } + + [Abstract] + [Export ("commitInsertionWithDataSourceUpdates:")] + bool CommitInsertion (Action dataSourceUpdates); + + [Abstract] + [Export ("deletePlaceholder")] + bool DeletePlaceholder (); + + [Abstract] + [Export ("setNeedsCellUpdate")] + void SetNeedsCellUpdate (); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UITableViewDragDelegate { + [Abstract] + [Export ("tableView:itemsForBeginningDragSession:atIndexPath:")] + UIDragItem[] GetItemsForBeginningDragSession (UITableView tableView, IUIDragSession session, NSIndexPath indexPath); + + [Export ("tableView:itemsForAddingToDragSession:atIndexPath:point:")] + UIDragItem[] GetItemsForAddingToDragSession (UITableView tableView, IUIDragSession session, NSIndexPath indexPath, CGPoint point); + + [Export ("tableView:dragPreviewParametersForRowAtIndexPath:")] + [return: NullAllowed] + UIDragPreviewParameters GetDragPreviewParameters (UITableView tableView, NSIndexPath indexPath); + + [Export ("tableView:dragSessionWillBegin:")] + void DragSessionWillBegin (UITableView tableView, IUIDragSession session); + + [Export ("tableView:dragSessionDidEnd:")] + void DragSessionDidEnd (UITableView tableView, IUIDragSession session); + + [Export ("tableView:dragSessionAllowsMoveOperation:")] + bool DragSessionAllowsMoveOperation (UITableView tableView, IUIDragSession session); + + [Export ("tableView:dragSessionIsRestrictedToDraggingApplication:")] + bool DragSessionIsRestrictedToDraggingApplication (UITableView tableView, IUIDragSession session); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UITableViewDropDelegate { + [Abstract] + [Export ("tableView:performDropWithCoordinator:")] + void PerformDrop (UITableView tableView, IUITableViewDropCoordinator coordinator); + + [Export ("tableView:canHandleDropSession:")] + bool CanHandleDropSession (UITableView tableView, IUIDropSession session); + + [Export ("tableView:dropSessionDidEnter:")] + void DropSessionDidEnter (UITableView tableView, IUIDropSession session); + + [Export ("tableView:dropSessionDidUpdate:withDestinationIndexPath:")] + UITableViewDropProposal DropSessionDidUpdate (UITableView tableView, IUIDropSession session, [NullAllowed] NSIndexPath destinationIndexPath); + + [Export ("tableView:dropSessionDidExit:")] + void DropSessionDidExit (UITableView tableView, IUIDropSession session); + + [Export ("tableView:dropSessionDidEnd:")] + void DropSessionDidEnd (UITableView tableView, IUIDropSession session); + + [Export ("tableView:dropPreviewParametersForRowAtIndexPath:")] + [return: NullAllowed] + UIDragPreviewParameters GetDropPreviewParameters (UITableView tableView, NSIndexPath indexPath); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(UIDropProposal))] + [DisableDefaultCtor] // NSInternalInconsistencyException Reason: Not implemented + interface UITableViewDropProposal { + + // inline from base type + [Export ("initWithDropOperation:")] + [DesignatedInitializer] + IntPtr Constructor (UIDropOperation operation); + + [Export ("initWithDropOperation:intent:")] + IntPtr Constructor (UIDropOperation operation, UITableViewDropIntent intent); + + [Export ("intent")] + UITableViewDropIntent Intent { get; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UITableViewDropCoordinator { + [Abstract] + [Export ("items")] + IUITableViewDropItem[] Items { get; } + + [Abstract] + [NullAllowed, Export ("destinationIndexPath")] + NSIndexPath DestinationIndexPath { get; } + + [Abstract] + [Export ("proposal")] + UITableViewDropProposal Proposal { get; } + + [Abstract] + [Export ("session")] + IUIDropSession Session { get; } + + [Abstract] + [Export ("dropItem:toPlaceholder:")] + IUITableViewDropPlaceholderContext DropItemToPlaceholder (UIDragItem dragItem, UITableViewDropPlaceholder placeholder); + + [Abstract] + [Export ("dropItem:toRowAtIndexPath:")] + IUIDragAnimating DropItemToRow (UIDragItem dragItem, NSIndexPath indexPath); + + [Abstract] + [Export ("dropItem:intoRowAtIndexPath:rect:")] + IUIDragAnimating DropItemIntoRow (UIDragItem dragItem, NSIndexPath indexPath, CGRect rect); + + [Abstract] + [Export ("dropItem:toTarget:")] + IUIDragAnimating DropItemToTarget (UIDragItem dragItem, UIDragPreviewTarget target); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UITableViewPlaceholder { + [Export ("initWithInsertionIndexPath:reuseIdentifier:rowHeight:")] + [DesignatedInitializer] + IntPtr Constructor (NSIndexPath insertionIndexPath, string reuseIdentifier, nfloat rowHeight); + + [NullAllowed, Export ("cellUpdateHandler", ArgumentSemantic.Copy)] + Action CellUpdateHandler { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(UITableViewPlaceholder))] + interface UITableViewDropPlaceholder { + // inlined + [Export ("initWithInsertionIndexPath:reuseIdentifier:rowHeight:")] + IntPtr Constructor (NSIndexPath insertionIndexPath, string reuseIdentifier, nfloat rowHeight); + + [NullAllowed, Export ("previewParametersProvider", ArgumentSemantic.Copy)] + Func PreviewParametersProvider { get; set; } + } + + [NoWatch, NoTV, iOS (11,0)] + [Protocol] + interface UITableViewDropItem { + [Abstract] + [Export ("dragItem")] + UIDragItem DragItem { get; } + + [Abstract] + [NullAllowed, Export ("sourceIndexPath")] + NSIndexPath SourceIndexPath { get; } + + [Abstract] + [Export ("previewSize")] + CGSize PreviewSize { get; } + } + + [NoWatch, NoTV, iOS (11,0)] + [Protocol] + interface UITableViewDropPlaceholderContext : UIDragAnimating { + [Abstract] + [Export ("dragItem")] + UIDragItem DragItem { get; } + + [Abstract] + [Export ("commitInsertionWithDataSourceUpdates:")] + bool CommitInsertion (Action dataSourceUpdates); + + [Abstract] + [Export ("deletePlaceholder")] + bool DeletePlaceholder (); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UITextDragPreviewRenderer { + [Export ("initWithLayoutManager:range:")] + IntPtr Constructor (NSLayoutManager layoutManager, NSRange range); + + [Export ("initWithLayoutManager:range:unifyRects:")] + [DesignatedInitializer] + IntPtr Constructor (NSLayoutManager layoutManager, NSRange range, bool unifyRects); + + [Export ("layoutManager")] + NSLayoutManager LayoutManager { get; } + + [Export ("image")] + UIImage Image { get; } + + [Export ("firstLineRect")] + CGRect FirstLineRect { get; } + + [Export ("bodyRect")] + CGRect BodyRect { get; } + + [Export ("lastLineRect")] + CGRect LastLineRect { get; } + + [Export ("adjustFirstLineRect:bodyRect:lastLineRect:textOrigin:")] + void Adjust (ref CGRect firstLineRect, ref CGRect bodyRect, ref CGRect lastLineRect, CGPoint origin); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UITextDraggable : UITextInput { + [Abstract] + [NullAllowed, Export ("textDragDelegate", ArgumentSemantic.Weak)] + IUITextDragDelegate TextDragDelegate { get; set; } + + [Abstract] + [NullAllowed, Export ("textDragInteraction")] + UIDragInteraction TextDragInteraction { get; } + + [Abstract] + [Export ("textDragActive")] + bool TextDragActive { [Bind ("isTextDragActive")] get; } + + [Abstract] + [Export ("textDragOptions", ArgumentSemantic.Assign)] + UITextDragOptions TextDragOptions { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UITextDragDelegate { + [Export ("textDraggableView:itemsForDrag:")] + UIDragItem[] GetItemsForDrag (IUITextDraggable textDraggableView, IUITextDragRequest dragRequest); + + [Export ("textDraggableView:dragPreviewForLiftingItem:session:")] + [return: NullAllowed] + UITargetedDragPreview GetPreviewForLiftingItem (IUITextDraggable textDraggableView, UIDragItem item, IUIDragSession session); + + [Export ("textDraggableView:willAnimateLiftWithAnimator:session:")] + void WillAnimateLift (IUITextDraggable textDraggableView, IUIDragAnimating animator, IUIDragSession session); + + [Export ("textDraggableView:dragSessionWillBegin:")] + void DragSessionWillBegin (IUITextDraggable textDraggableView, IUIDragSession session); + + [Export ("textDraggableView:dragSessionDidEnd:withOperation:")] + void DragSessionDidEnd (IUITextDraggable textDraggableView, IUIDragSession session, UIDropOperation operation); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UITextDragRequest { + [Abstract] + [Export ("dragRange")] + UITextRange DragRange { get; } + + [Abstract] + [Export ("suggestedItems")] + UIDragItem[] SuggestedItems { get; } + + [Abstract] + [Export ("existingItems")] + UIDragItem[] ExistingItems { get; } + + [Abstract] + [Export ("selected")] + bool Selected { [Bind ("isSelected")] get; } + + [Abstract] + [Export ("dragSession")] + IUIDragSession DragSession { get; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(UIDropProposal))] + [DisableDefaultCtor] + interface UITextDropProposal : NSCopying { + // inlined + [Export ("initWithDropOperation:")] + IntPtr Constructor (UIDropOperation operation); + + [Export ("dropAction", ArgumentSemantic.Assign)] + UITextDropAction DropAction { get; set; } + + [Export ("dropProgressMode", ArgumentSemantic.Assign)] + UITextDropProgressMode DropProgressMode { get; set; } + + [Export ("useFastSameViewOperations")] + bool UseFastSameViewOperations { get; set; } + + [Export ("dropPerformer", ArgumentSemantic.Assign)] + UITextDropPerformer DropPerformer { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UITextDroppable : UITextInput, UITextPasteConfigurationSupporting { + [Abstract] + [NullAllowed, Export ("textDropDelegate", ArgumentSemantic.Weak)] + IUITextDropDelegate TextDropDelegate { get; set; } + + [Abstract] + [NullAllowed, Export ("textDropInteraction")] + UIDropInteraction TextDropInteraction { get; } + + [Abstract] + [Export ("textDropActive")] + bool TextDropActive { [Bind ("isTextDropActive")] get; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UITextDropDelegate { + [Export ("textDroppableView:willBecomeEditableForDrop:")] + UITextDropEditability WillBecomeEditable (IUITextDroppable textDroppableView, IUITextDropRequest drop); + + [Export ("textDroppableView:proposalForDrop:")] + UITextDropProposal GetProposalForDrop (IUITextDroppable textDroppableView, IUITextDropRequest drop); + + [Export ("textDroppableView:willPerformDrop:")] + void WillPerformDrop (IUITextDroppable textDroppableView, IUITextDropRequest drop); + + [Export ("textDroppableView:previewForDroppingAllItemsWithDefault:")] + [return: NullAllowed] + UITargetedDragPreview GetPreviewForDroppingAllItems (IUITextDroppable textDroppableView, UITargetedDragPreview defaultPreview); + + [Export ("textDroppableView:dropSessionDidEnter:")] + void DropSessionDidEnter (IUITextDroppable textDroppableView, IUIDropSession session); + + [Export ("textDroppableView:dropSessionDidUpdate:")] + void DropSessionDidUpdate (IUITextDroppable textDroppableView, IUIDropSession session); + + [Export ("textDroppableView:dropSessionDidExit:")] + void DropSessionDidExit (IUITextDroppable textDroppableView, IUIDropSession session); + + [Export ("textDroppableView:dropSessionDidEnd:")] + void DropSessionDidEnd (IUITextDroppable textDroppableView, IUIDropSession session); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UITextDropRequest { + [Abstract] + [Export ("dropPosition")] + UITextPosition DropPosition { get; } + + [Abstract] + [Export ("suggestedProposal")] + UITextDropProposal SuggestedProposal { get; } + + [Abstract] + [Export ("sameView")] + bool SameView { [Bind ("isSameView")] get; } + + [Abstract] + [Export ("dropSession")] + IUIDropSession DropSession { get; } + } + +#endregion + + [TV (11,0), iOS (11,0)] + [Protocol] + interface UIDataSourceTranslating { + [Abstract] + [Export ("presentationSectionIndexForDataSourceSectionIndex:")] + nint GetPresentationSectionIndex (nint dataSourceSectionIndex); + + [Abstract] + [Export ("dataSourceSectionIndexForPresentationSectionIndex:")] + nint GetDataSourceSectionIndex (nint presentationSectionIndex); + + [Abstract] + [Export ("presentationIndexPathForDataSourceIndexPath:")] + [return: NullAllowed] + NSIndexPath GetPresentationIndexPath ([NullAllowed] NSIndexPath dataSourceIndexPath); + + [Abstract] + [Export ("dataSourceIndexPathForPresentationIndexPath:")] + [return: NullAllowed] + NSIndexPath GetDataSourceIndexPath ([NullAllowed] NSIndexPath presentationIndexPath); + + [Abstract] + [Export ("performUsingPresentationValues:")] + void PerformUsingPresentationValues (Action actionsToTranslate); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UISpringLoadedInteraction : UIInteraction { + [Export ("initWithInteractionBehavior:interactionEffect:activationHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] IUISpringLoadedInteractionBehavior interactionBehavior, [NullAllowed] IUISpringLoadedInteractionEffect interactionEffect, Action handler); + + [Export ("initWithActivationHandler:")] + IntPtr Constructor (Action handler); + + [Export ("interactionBehavior", ArgumentSemantic.Strong)] + IUISpringLoadedInteractionBehavior InteractionBehavior { get; } + + [Export ("interactionEffect", ArgumentSemantic.Strong)] + IUISpringLoadedInteractionEffect InteractionEffect { get; } + } + + interface IUISpringLoadedInteractionBehavior {} + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UISpringLoadedInteractionBehavior { + [Abstract] + [Export ("shouldAllowInteraction:withContext:")] + bool ShouldAllowInteraction (UISpringLoadedInteraction interaction, IUISpringLoadedInteractionContext context); + + [Export ("interactionDidFinish:")] + void InteractionDidFinish (UISpringLoadedInteraction interaction); + } + + interface IUISpringLoadedInteractionEffect {} + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UISpringLoadedInteractionEffect { + [Abstract] + [Export ("interaction:didChangeWithContext:")] + void DidChange (UISpringLoadedInteraction interaction, IUISpringLoadedInteractionContext context); + } + + interface IUISpringLoadedInteractionContext {} + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UISpringLoadedInteractionContext { + [Abstract] + [Export ("state")] + UISpringLoadedInteractionEffectState State { get; } + + [Abstract] + [NullAllowed, Export ("targetView", ArgumentSemantic.Strong)] + UIView TargetView { get; set; } + + [Abstract] + [NullAllowed, Export ("targetItem", ArgumentSemantic.Strong)] + NSObject TargetItem { get; set; } + + [Abstract] + [Export ("locationInView:")] + CGPoint LocationInView ([NullAllowed] UIView view); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UISpringLoadedInteractionSupporting { + [Abstract] + [Export ("springLoaded")] + bool SpringLoaded { [Bind ("isSpringLoaded")] get; set; } + } + + // https://bugzilla.xamarin.com/show_bug.cgi?id=58282, we should be able to write one delegate with a 'Action'. See original signature: + // typedef void (^UIContextualActionHandler)(UIContextualAction * _Nonnull, __kindof UIView * _Nonnull, void (^ _Nonnull)(BOOL)); + [NoWatch, NoTV] + [iOS (11,0)] + delegate void UIContextualActionHandler (UIContextualAction action, UIView sourceView, [BlockCallback] UIContextualActionCompletionHandler completionHandler); + + [NoWatch, NoTV] + [iOS (11,0)] + delegate void UIContextualActionCompletionHandler (bool finished); + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIContextualAction { + [Static] + [Export ("contextualActionWithStyle:title:handler:")] + UIContextualAction FromContextualActionStyle (UIContextualActionStyle style, [NullAllowed] string title, UIContextualActionHandler handler); + + [Export ("style")] + UIContextualActionStyle Style { get; } + + [Export ("handler", ArgumentSemantic.Copy)] + UIContextualActionHandler Handler { get; } + + [NullAllowed, Export ("title")] + string Title { get; set; } + + [NullAllowed, Export ("backgroundColor", ArgumentSemantic.Copy)] + UIColor BackgroundColor { get; set; } + + [NullAllowed, Export ("image", ArgumentSemantic.Copy)] + UIImage Image { get; set; } + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UISwipeActionsConfiguration { + [Static] + [Export ("configurationWithActions:")] + UISwipeActionsConfiguration FromActions (UIContextualAction[] actions); + + [Export ("actions", ArgumentSemantic.Copy)] + UIContextualAction[] Actions { get; } + + [Export ("performsFirstActionWithFullSwipe")] + bool PerformsFirstActionWithFullSwipe { get; set; } + } + + interface IUITextPasteConfigurationSupporting {} + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UITextPasteConfigurationSupporting : UIPasteConfigurationSupporting { + [Abstract] + [NullAllowed, Export ("pasteDelegate", ArgumentSemantic.Weak)] + IUITextPasteDelegate PasteDelegate { get; set; } + } + + interface IUITextPasteDelegate {} + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UITextPasteDelegate { + [Export ("textPasteConfigurationSupporting:transformPasteItem:")] + void TransformPasteItem (IUITextPasteConfigurationSupporting textPasteConfigurationSupporting, IUITextPasteItem item); + + [Export ("textPasteConfigurationSupporting:combineItemAttributedStrings:forRange:")] + NSAttributedString CombineItemAttributedStrings (IUITextPasteConfigurationSupporting textPasteConfigurationSupporting, NSAttributedString[] itemStrings, UITextRange textRange); + + [Export ("textPasteConfigurationSupporting:performPasteOfAttributedString:toRange:")] + UITextRange PerformPaste (IUITextPasteConfigurationSupporting textPasteConfigurationSupporting, NSAttributedString attributedString, UITextRange textRange); + + [Export ("textPasteConfigurationSupporting:shouldAnimatePasteOfAttributedString:toRange:")] + bool ShouldAnimatePaste (IUITextPasteConfigurationSupporting textPasteConfigurationSupporting, NSAttributedString attributedString, UITextRange textRange); + } + + interface IUITextPasteItem {} + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UITextPasteItem { + [Abstract] + [Export ("itemProvider")] + NSItemProvider ItemProvider { get; } + + [Abstract] + [NullAllowed, Export ("localObject")] + NSObject LocalObject { get; } + + [Abstract] + [Export ("defaultAttributes")] + NSDictionary DefaultAttributes { get; } + + [Abstract] + [Export ("setStringResult:")] + void SetStringResult (string @string); + + [Abstract] + [Export ("setAttributedStringResult:")] + void SetAttributedStringResult (NSAttributedString @string); + + [Abstract] + [Export ("setAttachmentResult:")] + void SetAttachmentResult (NSTextAttachment textAttachment); + + [Abstract] + [Export ("setNoResult")] + void SetNoResult (); + + [Abstract] + [Export ("setDefaultResult")] + void SetDefaultResult (); + } + + [NoWatch, NoTV] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + interface UIPasteConfiguration : NSSecureCoding, NSCopying { + [Export ("acceptableTypeIdentifiers", ArgumentSemantic.Copy)] + string[] AcceptableTypeIdentifiers { get; set; } + + [Export ("initWithAcceptableTypeIdentifiers:")] + IntPtr Constructor (string[] acceptableTypeIdentifiers); + + [Export ("addAcceptableTypeIdentifiers:")] + void AddAcceptableTypeIdentifiers (string[] acceptableTypeIdentifiers); + + [Export ("initWithTypeIdentifiersForAcceptingClass:")] + IntPtr Constructor (Class itemProviderReadingClass); + + [Wrap ("this (new Class (itemProviderReadingType))")] + IntPtr Constructor (Type itemProviderReadingType); + + [Export ("addTypeIdentifiersForAcceptingClass:")] + void AddTypeIdentifiers (Class itemProviderReadingClass); + + [Wrap ("AddTypeIdentifiers (new Class (itemProviderReadingType))")] + void AddTypeIdentifiers (Type itemProviderReadingType); + } + + interface IUIPasteConfigurationSupporting {} + + [NoWatch, NoTV] + [iOS (11,0)] + [Protocol] + interface UIPasteConfigurationSupporting { + [Abstract] + [NullAllowed, Export ("pasteConfiguration", ArgumentSemantic.Copy)] + UIPasteConfiguration PasteConfiguration { get; set; } + + [Export ("pasteItemProviders:")] + void Paste (NSItemProvider[] itemProviders); + + [Export ("canPasteItemProviders:")] + bool CanPaste (NSItemProvider[] itemProviders); + } + + [NoTV, NoWatch] + [iOS (11,0)] + [BaseType (typeof(UIViewController))] + interface UIDocumentBrowserViewController : NSCoding { + [Export ("initForOpeningFilesWithContentTypes:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] string[] allowedContentTypes); + + [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] + IUIDocumentBrowserViewControllerDelegate Delegate { get; set; } + + [Export ("allowsDocumentCreation")] + bool AllowsDocumentCreation { get; set; } + + [Export ("allowsPickingMultipleItems")] + bool AllowsPickingMultipleItems { get; set; } + + [Export ("allowedContentTypes", ArgumentSemantic.Copy)] + string[] AllowedContentTypes { get; } + + [Export ("additionalLeadingNavigationBarButtonItems", ArgumentSemantic.Strong)] + UIBarButtonItem[] AdditionalLeadingNavigationBarButtonItems { get; set; } + + [Export ("additionalTrailingNavigationBarButtonItems", ArgumentSemantic.Strong)] + UIBarButtonItem[] AdditionalTrailingNavigationBarButtonItems { get; set; } + + [Async] + [Export ("revealDocumentAtURL:importIfNeeded:completion:")] + void RevealDocument (NSUrl url, bool importIfNeeded, [NullAllowed] Action completion); + + [Async] + [Export ("importDocumentAtURL:nextToDocumentAtURL:mode:completionHandler:")] + void ImportDocument (NSUrl documentUrl, NSUrl neighbourUrl, UIDocumentBrowserImportMode importMode, Action completion); + + [Export ("transitionControllerForDocumentURL:")] + UIDocumentBrowserTransitionController GetTransitionController (NSUrl documentUrl); + + [Export ("customActions", ArgumentSemantic.Strong)] + UIDocumentBrowserAction[] CustomActions { get; set; } + + [Export ("browserUserInterfaceStyle", ArgumentSemantic.Assign)] + UIDocumentBrowserUserInterfaceStyle BrowserUserInterfaceStyle { get; set; } + } + + interface IUIDocumentBrowserViewControllerDelegate {} + + [NoTV, NoWatch] + [iOS (11,0)] + [Protocol, Model] + [BaseType (typeof(NSObject))] + interface UIDocumentBrowserViewControllerDelegate { + [Export ("documentBrowser:didPickDocumentURLs:")] + void DidPickDocumentUrls (UIDocumentBrowserViewController controller, NSUrl[] documentUrls); + + [Export ("documentBrowser:didRequestDocumentCreationWithHandler:")] + void DidRequestDocumentCreation (UIDocumentBrowserViewController controller, Action importHandler); + + [Export ("documentBrowser:didImportDocumentAtURL:toDestinationURL:")] + void DidImportDocument (UIDocumentBrowserViewController controller, NSUrl sourceUrl, NSUrl destinationUrl); + + [Export ("documentBrowser:failedToImportDocumentAtURL:error:")] + void FailedToImportDocument (UIDocumentBrowserViewController controller, NSUrl documentUrl, [NullAllowed] NSError error); + + [Export ("documentBrowser:applicationActivitiesForDocumentURLs:")] + UIActivity[] GetApplicationActivities (UIDocumentBrowserViewController controller, NSUrl[] documentUrls); + + [Export ("documentBrowser:willPresentActivityViewController:")] + void WillPresent (UIDocumentBrowserViewController controller, UIActivityViewController activityViewController); + } + + [NoTV, NoWatch] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIDocumentBrowserTransitionController : UIViewControllerAnimatedTransitioning { + [NullAllowed, Export ("loadingProgress", ArgumentSemantic.Strong)] + NSProgress LoadingProgress { get; set; } + + [NullAllowed, Export ("targetView", ArgumentSemantic.Weak)] + UIView TargetView { get; set; } + } + + [NoTV, NoWatch] + [iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIDocumentBrowserAction { + [Export ("initWithIdentifier:localizedTitle:availability:handler:")] + [DesignatedInitializer] + IntPtr Constructor (string identifier, string localizedTitle, UIDocumentBrowserActionAvailability availability, Action handler); + + [Export ("identifier")] + string Identifier { get; } + + [Export ("localizedTitle")] + string LocalizedTitle { get; } + + [Export ("availability")] + UIDocumentBrowserActionAvailability Availability { get; } + + [NullAllowed, Export ("image", ArgumentSemantic.Strong)] + UIImage Image { get; set; } + + [Export ("supportedContentTypes", ArgumentSemantic.Copy)] + string[] SupportedContentTypes { get; set; } + + [Export ("supportsMultipleItems")] + bool SupportsMultipleItems { get; set; } + } +#endif // !WATCH + + [Watch (4,0), TV (11,0), iOS (11,0)] + [BaseType (typeof(NSObject))] + [DisableDefaultCtor] + interface UIFontMetrics { + [Static] + [Export ("defaultMetrics", ArgumentSemantic.Strong)] + UIFontMetrics DefaultMetrics { get; } + + [Static] + [Export ("metricsForTextStyle:")] + UIFontMetrics GetMetrics (string textStyle); + + [Export ("initForTextStyle:")] + [DesignatedInitializer] + IntPtr Constructor (string textStyle); + + [Export ("scaledFontForFont:")] + UIFont GetScaledFont (UIFont font); + + [Export ("scaledFontForFont:maximumPointSize:")] + UIFont GetScaledFont (UIFont font, nfloat maximumPointSize); + + [Export ("scaledValueForValue:")] + nfloat GetScaledValue (nfloat value); + +#if !WATCH + [NoWatch] + [Export ("scaledFontForFont:compatibleWithTraitCollection:")] + UIFont GetScaledFont (UIFont font, [NullAllowed] UITraitCollection traitCollection); + + [NoWatch] + [Export ("scaledFontForFont:maximumPointSize:compatibleWithTraitCollection:")] + UIFont GetScaledFont (UIFont font, nfloat maximumPointSize, [NullAllowed] UITraitCollection traitCollection); + + [NoWatch] + [Export ("scaledValueForValue:compatibleWithTraitCollection:")] + nfloat GetScaledValue (nfloat value, [NullAllowed] UITraitCollection traitCollection); +#endif // !WATCH + } } diff --git a/src/usernotifications.cs b/src/usernotifications.cs index a79d4cd2b43c..74b5d8c87035 100644 --- a/src/usernotifications.cs +++ b/src/usernotifications.cs @@ -56,7 +56,9 @@ public enum UNNotificationActionOptions : nuint { public enum UNNotificationCategoryOptions : nuint { None = 0, CustomDismissAction = (1 << 0), - AllowInCarPlay = (2 << 0) + AllowInCarPlay = (2 << 0), + HiddenPreviewsShowTitle = (1 << 2), + HiddenPreviewsShowSubtitle = (1 << 3), } [Introduced (PlatformName.iOS, 10, 0)] @@ -114,6 +116,15 @@ public enum UNNotificationPresentationOptions : nuint { Alert = (1 << 2) } + [NoWatch, NoTV, iOS (11,0)] + [Native] + public enum UNShowPreviewsSetting : nint + { + Always, + WhenAuthenticated, + Never + } + [Introduced (PlatformName.iOS, 10, 0)] [Introduced (PlatformName.TvOS, 10, 0)] [Introduced (PlatformName.WatchOS, 3, 0)] @@ -257,9 +268,19 @@ interface UNNotificationCategory : NSCopying, NSSecureCoding { [Export ("options")] UNNotificationCategoryOptions Options { get; } + [NoWatch, iOS (11, 0)] + [Export ("hiddenPreviewsBodyPlaceholder")] + string HiddenPreviewsBodyPlaceholder { get; } + [Static] [Export ("categoryWithIdentifier:actions:intentIdentifiers:options:")] UNNotificationCategory FromIdentifier (string identifier, UNNotificationAction [] actions, string [] intentIdentifiers, UNNotificationCategoryOptions options); + + [NoWatch, iOS (11,0)] + [Static] + [Export ("categoryWithIdentifier:actions:intentIdentifiers:hiddenPreviewsBodyPlaceholder:options:")] + UNNotificationCategory FromIdentifier (string identifier, UNNotificationAction[] actions, string[] intentIdentifiers, string hiddenPreviewsBodyPlaceholder, UNNotificationCategoryOptions options); + } [Introduced (PlatformName.iOS, 10, 0)] @@ -478,6 +499,10 @@ interface UNNotificationSettings : NSCopying, NSSecureCoding { [Unavailable (PlatformName.WatchOS)] [Export ("alertStyle")] UNAlertStyle AlertStyle { get; } + + [NoWatch, NoTV, iOS (11, 0)] + [Export ("showPreviewsSetting")] + UNShowPreviewsSetting ShowPreviewsSetting { get; } } [Introduced (PlatformName.iOS, 10, 0)] diff --git a/src/videosubscriberaccount.cs b/src/videosubscriberaccount.cs index ec6f425ed46f..acd07915dfc1 100644 --- a/src/videosubscriberaccount.cs +++ b/src/videosubscriberaccount.cs @@ -92,6 +92,10 @@ interface VSAccountManagerDelegate { [Abstract] [Export ("accountManager:dismissViewController:")] void DismissViewController (VSAccountManager accountManager, UIViewController viewController); + + [iOS (11,0)][TV (11,0)] + [Export ("accountManager:shouldAuthenticateAccountProviderWithIdentifier:")] + bool ShouldAuthenticateAccountProvider (VSAccountManager accountManager, string accountProviderIdentifier); } [Introduced (PlatformName.iOS, 10, 0)] @@ -179,6 +183,10 @@ interface VSAccountMetadataRequest { [Export ("supportedAccountProviderIdentifiers", ArgumentSemantic.Copy)] string [] SupportedAccountProviderIdentifiers { get; set; } + [TV (11,0)][iOS (11,0)] + [Export ("featuredAccountProviderIdentifiers", ArgumentSemantic.Copy)] + string[] FeaturedAccountProviderIdentifiers { get; set; } + [NullAllowed, Export ("verificationToken")] string VerificationToken { get; set; } @@ -232,5 +240,37 @@ enum VSAccountProviderAuthenticationScheme { Saml, } + [TV (11,0)][iOS (11,0)] + [Native] + public enum VSSubscriptionAccessLevel : nint { + Unknown, + FreeWithAccount, + Paid, + } + + [TV (11,0)][iOS (11,0)] + [BaseType (typeof (NSObject))] + interface VSSubscription { + [Export ("expirationDate", ArgumentSemantic.Copy)] + NSDate ExpirationDate { get; set; } + + [Export ("accessLevel", ArgumentSemantic.Assign)] + VSSubscriptionAccessLevel AccessLevel { get; set; } + + [Export ("tierIdentifiers", ArgumentSemantic.Copy)] + string[] TierIdentifiers { get; set; } + } + + [TV (11,0)][iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface VSSubscriptionRegistrationCenter { + [Static] + [Export ("defaultSubscriptionRegistrationCenter")] + VSSubscriptionRegistrationCenter Default { get; } + + [Export ("setCurrentSubscription:")] + void SetCurrentSubscription ([NullAllowed] VSSubscription currentSubscription); + } } diff --git a/src/vision.cs b/src/vision.cs new file mode 100644 index 000000000000..ece41f344b13 --- /dev/null +++ b/src/vision.cs @@ -0,0 +1,1251 @@ +// +// Vision C# bindings +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using XamCore.CoreFoundation; +using XamCore.CoreGraphics; +using XamCore.CoreImage; +using XamCore.CoreML; +using XamCore.CoreVideo; +using XamCore.Foundation; +using XamCore.Metal; +using XamCore.ObjCRuntime; +using XamCore.ImageIO; + +using Matrix3 = global::OpenTK.NMatrix3; + +namespace XamCore.Vision { + + [ErrorDomain ("VNErrorDomain")] + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Native] + enum VNErrorCode : nint { + Ok = 0, + RequestCancelled, + InvalidFormat, + OperationFailed, + OutOfBoundsError, + InvalidOption, + IOError, + MissingOption, + NotImplemented, + InternalError, + OutOfMemory, + UnknownError, + InvalidOperation, + InvalidImage, + InvalidArgument, + InvalidModel, + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Native] + enum VNRequestTrackingLevel : nuint { + Accurate = 0, + Fast, + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Native] + enum VNImageCropAndScaleOption : nuint { + CenterCrop = 0, + ScaleFit = 1, + ScaleFill, + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + enum VNBarcodeSymbology { + [Field ("VNBarcodeSymbologyAztec")] + Aztec, + + [Field ("VNBarcodeSymbologyCode39")] + Code39, + + [Field ("VNBarcodeSymbologyCode39Checksum")] + Code39Checksum, + + [Field ("VNBarcodeSymbologyCode39FullASCII")] + Code39FullAscii, + + [Field ("VNBarcodeSymbologyCode39FullASCIIChecksum")] + Code39FullAsciiChecksum, + + [Field ("VNBarcodeSymbologyCode93")] + Code93, + + [Field ("VNBarcodeSymbologyCode93i")] + Code93i, + + [Field ("VNBarcodeSymbologyCode128")] + Code128, + + [Field ("VNBarcodeSymbologyDataMatrix")] + DataMatrix, + + [Field ("VNBarcodeSymbologyEAN8")] + Ean8, + + [Field ("VNBarcodeSymbologyEAN13")] + Ean13, + + [Field ("VNBarcodeSymbologyI2of5")] + I2OF5, + + [Field ("VNBarcodeSymbologyI2of5Checksum")] + I2OF5Checksum, + + [Field ("VNBarcodeSymbologyITF14")] + Itf14, + + [Field ("VNBarcodeSymbologyPDF417")] + Pdf417, + + [Field ("VNBarcodeSymbologyQR")] + QR, + + [Field ("VNBarcodeSymbologyUPCE")] + Upce, + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface VNCoreMLModel { + + [Static] + [Export ("modelForMLModel:error:")] + [return: NullAllowed] + VNCoreMLModel FromMLModel (MLModel model, out NSError error); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + delegate void VNRequestCompletionHandler (VNRequest request, NSError error); + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageBasedRequest))] + interface VNCoreMLRequest { + + [Export ("model")] + VNCoreMLModel Model { get; } + + [Export ("imageCropAndScaleOption", ArgumentSemantic.Assign)] + VNImageCropAndScaleOption ImageCropAndScaleOption { get; set; } + + [Export ("initWithModel:")] + IntPtr Constructor (VNCoreMLModel model); + + [Export ("initWithModel:completionHandler:")] + [DesignatedInitializer] + IntPtr Constructor (VNCoreMLModel model, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (VNImageBasedRequest))] + interface VNDetectBarcodesRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Static] + [Protected] + [Export ("supportedSymbologies", ArgumentSemantic.Copy)] + NSString [] WeakSupportedSymbologies { get; } + + [Static] + [Wrap ("VNBarcodeSymbologyExtensions.GetValues (WeakSupportedSymbologies)")] + VNBarcodeSymbology [] SupportedSymbologies { get; } + + [Protected] + [Export ("symbologies", ArgumentSemantic.Copy)] + NSString [] WeakSymbologies { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageBasedRequest))] + interface VNDetectFaceLandmarksRequest : VNFaceObservationAccepting { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageBasedRequest))] + interface VNDetectFaceRectanglesRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageBasedRequest))] + interface VNDetectHorizonRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageBasedRequest))] + interface VNDetectRectanglesRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("minimumAspectRatio")] + float MinimumAspectRatio { get; set; } + + [Export ("maximumAspectRatio")] + float MaximumAspectRatio { get; set; } + + [Export ("quadratureTolerance")] + float QuadratureTolerance { get; set; } + + [Export ("minimumSize")] + float MinimumSize { get; set; } + + [Export ("minimumConfidence")] + float MinimumConfidence { get; set; } + + [Export ("maximumObservations")] + nuint MaximumObservations { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageBasedRequest))] + interface VNDetectTextRectanglesRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("reportCharacterBoxes")] + bool ReportCharacterBoxes { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface VNFaceLandmarkRegion { + + [Export ("pointCount")] + nuint PointCount { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNFaceLandmarkRegion))] + interface VNFaceLandmarkRegion2D { + + [Internal] + [Export ("normalizedPoints")] + IntPtr _GetNormalizedPoints (); + + [Internal] + [Export ("pointsInImageOfSize:")] + IntPtr _GetPointsInImage (CGSize imageSize); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface VNFaceLandmarks { + + [Export ("confidence")] + float Confidence { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNFaceLandmarks))] + interface VNFaceLandmarks2D { + + [NullAllowed, Export ("allPoints")] + VNFaceLandmarkRegion2D AllPoints { get; } + + [NullAllowed, Export ("faceContour")] + VNFaceLandmarkRegion2D FaceContour { get; } + + [NullAllowed, Export ("leftEye")] + VNFaceLandmarkRegion2D LeftEye { get; } + + [NullAllowed, Export ("rightEye")] + VNFaceLandmarkRegion2D RightEye { get; } + + [NullAllowed, Export ("leftEyebrow")] + VNFaceLandmarkRegion2D LeftEyebrow { get; } + + [NullAllowed, Export ("rightEyebrow")] + VNFaceLandmarkRegion2D RightEyebrow { get; } + + [NullAllowed, Export ("nose")] + VNFaceLandmarkRegion2D Nose { get; } + + [NullAllowed, Export ("noseCrest")] + VNFaceLandmarkRegion2D NoseCrest { get; } + + [NullAllowed, Export ("medianLine")] + VNFaceLandmarkRegion2D MedianLine { get; } + + [NullAllowed, Export ("outerLips")] + VNFaceLandmarkRegion2D OuterLips { get; } + + [NullAllowed, Export ("innerLips")] + VNFaceLandmarkRegion2D InnerLips { get; } + + [NullAllowed, Export ("leftPupil")] + VNFaceLandmarkRegion2D LeftPupil { get; } + + [NullAllowed, Export ("rightPupil")] + VNFaceLandmarkRegion2D RightPupil { get; } + } + + interface IVNFaceObservationAccepting { } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Protocol] + interface VNFaceObservationAccepting { + + [Abstract] + [NullAllowed, Export ("inputFaceObservations", ArgumentSemantic.Copy)] + VNFaceObservation [] InputFaceObservations { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (VNTargetedImageRequest))] + interface VNImageRegistrationRequest { + + // Inlined from parent class + [Export ("initWithTargetedCVPixelBuffer:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:options:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict); + + [Wrap ("this (cgImage, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options); + + [Export ("initWithTargetedCGImage:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:orientation:options:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (cgImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCGImage:orientation:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:options:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict); + + [Wrap ("this (ciImage, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options); + + [Export ("initWithTargetedCIImage:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:orientation:options:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (ciImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCIImage:orientation:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:options:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options); + + [Export ("initWithTargetedImageURL:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:orientation:options:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageURL:orientation:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:options:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict); + + [Wrap ("this (imageData, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, VNImageOptions options); + + [Export ("initWithTargetedImageData:options:completionHandler:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:orientation:options:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageData, orientation, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageData:orientation:options:completionHandler:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageRegistrationRequest))] + interface VNTranslationalImageRegistrationRequest { + + // Inlined from parent class + [Export ("initWithTargetedCVPixelBuffer:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:options:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict); + + [Wrap ("this (cgImage, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options); + + [Export ("initWithTargetedCGImage:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:orientation:options:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (cgImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCGImage:orientation:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:options:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict); + + [Wrap ("this (ciImage, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options); + + [Export ("initWithTargetedCIImage:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:orientation:options:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (ciImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCIImage:orientation:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:options:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options); + + [Export ("initWithTargetedImageURL:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:orientation:options:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageURL:orientation:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:options:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict); + + [Wrap ("this (imageData, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, VNImageOptions options); + + [Export ("initWithTargetedImageData:options:completionHandler:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:orientation:options:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageData, orientation, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageData:orientation:options:completionHandler:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageRegistrationRequest))] + interface VNHomographicImageRegistrationRequest { + + // Inlined from parent class + [Export ("initWithTargetedCVPixelBuffer:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:options:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict); + + [Wrap ("this (cgImage, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options); + + [Export ("initWithTargetedCGImage:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:orientation:options:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (cgImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCGImage:orientation:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:options:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict); + + [Wrap ("this (ciImage, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options); + + [Export ("initWithTargetedCIImage:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:orientation:options:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (ciImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCIImage:orientation:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:options:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options); + + [Export ("initWithTargetedImageURL:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:orientation:options:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageURL:orientation:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:options:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict); + + [Wrap ("this (imageData, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, VNImageOptions options); + + [Export ("initWithTargetedImageData:options:completionHandler:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:orientation:options:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageData, orientation, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageData:orientation:options:completionHandler:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface VNObservation : NSCopying, NSSecureCoding { + + [Export ("uuid", ArgumentSemantic.Strong)] + NSUuid Uuid { get; } + + [Export ("confidence")] + float Confidence { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNObservation))] + interface VNDetectedObjectObservation { + + [Static] + [Export ("observationWithBoundingBox:")] + VNDetectedObjectObservation FromBoundingBox (CGRect boundingBox); + + [Export ("boundingBox", ArgumentSemantic.Assign)] + CGRect BoundingBox { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNDetectedObjectObservation))] + interface VNFaceObservation { + + [NullAllowed, Export ("landmarks", ArgumentSemantic.Strong)] + VNFaceLandmarks2D Landmarks { get; } + + [New] + [Static] + [Export ("observationWithBoundingBox:")] + VNFaceObservation FromBoundingBox (CGRect boundingBox); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNObservation))] + interface VNClassificationObservation { + + [Export ("identifier")] + string Identifier { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNObservation))] + interface VNCoreMLFeatureValueObservation { + + [Export ("featureValue", ArgumentSemantic.Copy)] + MLFeatureValue FeatureValue { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNObservation))] + interface VNPixelBufferObservation { + + [Export ("pixelBuffer")] + CVPixelBuffer PixelBuffer { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNDetectedObjectObservation))] + interface VNRectangleObservation { + + [Export ("topLeft", ArgumentSemantic.Assign)] + CGPoint TopLeft { get; } + + [Export ("topRight", ArgumentSemantic.Assign)] + CGPoint TopRight { get; } + + [Export ("bottomLeft", ArgumentSemantic.Assign)] + CGPoint BottomLeft { get; } + + [Export ("bottomRight", ArgumentSemantic.Assign)] + CGPoint BottomRight { get; } + + [New] + [Static] + [Export ("observationWithBoundingBox:")] + VNRectangleObservation FromBoundingBox (CGRect boundingBox); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNDetectedObjectObservation))] + interface VNTextObservation { + + [NullAllowed, Export ("characterBoxes", ArgumentSemantic.Copy)] + VNRectangleObservation [] CharacterBoxes { get; } + + [New] + [Static] + [Export ("observationWithBoundingBox:")] + VNTextObservation FromBoundingBox (CGRect boundingBox); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (VNRectangleObservation))] + interface VNBarcodeObservation { + + [Protected] + [Export ("symbology")] + NSString WeakSymbology { get; } + + [Wrap ("VNBarcodeSymbologyExtensions.GetValue (WeakSymbology)")] + VNBarcodeSymbology Symbology { get; } + + [NullAllowed, Export ("barcodeDescriptor", ArgumentSemantic.Strong)] + CIBarcodeDescriptor BarcodeDescriptor { get; } + + [New] + [Static] + [Export ("observationWithBoundingBox:")] + VNBarcodeObservation FromBoundingBox (CGRect boundingBox); + + [NullAllowed, Export ("payloadStringValue")] + string PayloadStringValue { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNObservation))] + interface VNHorizonObservation { + + [Export ("transform", ArgumentSemantic.Assign)] + CGAffineTransform Transform { get; } + + [Export ("angle")] + nfloat Angle { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (VNObservation))] + interface VNImageAlignmentObservation { + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageAlignmentObservation))] + interface VNImageTranslationAlignmentObservation { + + [Export ("alignmentTransform", ArgumentSemantic.Assign)] + CGAffineTransform AlignmentTransform { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [DisableDefaultCtor] + [BaseType (typeof (VNImageAlignmentObservation))] + interface VNImageHomographicAlignmentObservation { + + [Export ("warpTransform", ArgumentSemantic.Assign)] + Matrix3 WarpTransform { + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + get; + [MarshalDirective (NativePrefix = "xamarin_simd__", Library = "__Internal")] + set; + } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (NSObject))] + interface VNRequest : NSCopying { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("preferBackgroundProcessing")] + bool PreferBackgroundProcessing { get; set; } + + [NullAllowed, Export ("preferredMetalContext", ArgumentSemantic.Retain)] + IMTLDevice PreferredMetalContext { get; set; } + + // From docs: VNObservation subclasses specific to the VNRequest subclass + // Since downcasting is not easy we are exposing + // this property as a generic method 'GetResults'. + [Internal] + [NullAllowed, Export ("results", ArgumentSemantic.Copy)] + IntPtr _Results { get; } + + [NullAllowed, Export ("completionHandler", ArgumentSemantic.Copy)] + VNRequestCompletionHandler CompletionHandler { get; } + + [Export ("usesCPUOnly")] + bool UsesCpuOnly { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [DisableDefaultCtor] + [BaseType (typeof (VNRequest))] + interface VNImageBasedRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("regionOfInterest", ArgumentSemantic.Assign)] + CGRect RegionOfInterest { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Internal] + [Static] + interface VNImageOptionKeys { + [Field ("VNImageOptionProperties")] + NSString PropertiesKey { get; } + + [Field ("VNImageOptionCameraIntrinsics")] + NSString CameraIntrinsicsKey { get; } + + [Field ("VNImageOptionCIContext")] + NSString CIContextKey { get; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [StrongDictionary ("VNImageOptionKeys")] + interface VNImageOptions { + [Export ("PropertiesKey")] // Have the option to set your own dict + NSDictionary WeakProperties { get; set; } + + [StrongDictionary] // Yep we need CoreGraphics to disambiguate + CoreGraphics.CGImageProperties Properties { get; set; } + + NSData CameraIntrinsics { get; set; } + CIContext CIContext { get; set; } + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface VNImageRequestHandler { + + [Export ("initWithCVPixelBuffer:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary options); + + [Wrap ("this (pixelBuffer, imageOptions?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions imageOptions); + + [Export ("initWithCVPixelBuffer:orientation:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary options); + + [Wrap ("this (pixelBuffer, orientation, imageOptions?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions imageOptions); + + [Export ("initWithCGImage:options:")] + IntPtr Constructor (CGImage image, NSDictionary options); + + [Wrap ("this (image, imageOptions?.Dictionary)")] + IntPtr Constructor (CGImage image, VNImageOptions imageOptions); + + [Export ("initWithCGImage:orientation:options:")] + IntPtr Constructor (CGImage image, CGImagePropertyOrientation orientation, NSDictionary options); + + [Wrap ("this (image, orientation, imageOptions?.Dictionary)")] + IntPtr Constructor (CGImage image, CGImagePropertyOrientation orientation, VNImageOptions imageOptions); + + [Export ("initWithCIImage:options:")] + IntPtr Constructor (CIImage image, NSDictionary options); + + [Wrap ("this (image, imageOptions?.Dictionary)")] + IntPtr Constructor (CIImage image, VNImageOptions imageOptions); + + [Export ("initWithCIImage:orientation:options:")] + IntPtr Constructor (CIImage image, CGImagePropertyOrientation orientation, NSDictionary options); + + [Wrap ("this (image, orientation, imageOptions?.Dictionary)")] + IntPtr Constructor (CIImage image, CGImagePropertyOrientation orientation, VNImageOptions imageOptions); + + [Export ("initWithURL:options:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary options); + + [Wrap ("this (imageUrl, imageOptions?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions imageOptions); + + [Export ("initWithURL:orientation:options:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary options); + + [Wrap ("this (imageUrl, orientation, imageOptions?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions imageOptions); + + [Export ("initWithData:options:")] + IntPtr Constructor (NSData imageData, NSDictionary options); + + [Wrap ("this (imageData, imageOptions?.Dictionary)")] + IntPtr Constructor (NSData imageData, VNImageOptions imageOptions); + + [Export ("initWithData:orientation:options:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary options); + + [Wrap ("this (imageData, orientation, imageOptions?.Dictionary)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions imageOptions); + + [Export ("performRequests:error:")] + bool Perform (VNRequest [] requests, out NSError error); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] // it's a designated initializer + interface VNSequenceRequestHandler { + + [DesignatedInitializer] + [Export ("init")] + IntPtr Constructor (); + + [Export ("performRequests:onCVPixelBuffer:error:")] + bool Perform (VNRequest [] requests, CVPixelBuffer pixelBuffer, out NSError error); + + [Export ("performRequests:onCVPixelBuffer:orientation:error:")] + bool Perform (VNRequest [] requests, CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, out NSError error); + + [Export ("performRequests:onCGImage:error:")] + bool Perform (VNRequest [] requests, CGImage image, out NSError error); + + [Export ("performRequests:onCGImage:orientation:error:")] + bool Perform (VNRequest [] requests, CGImage image, CGImagePropertyOrientation orientation, out NSError error); + + [Export ("performRequests:onCIImage:error:")] + bool Perform (VNRequest [] requests, CIImage image, out NSError error); + + [Export ("performRequests:onCIImage:orientation:error:")] + bool Perform (VNRequest [] requests, CIImage image, CGImagePropertyOrientation orientation, out NSError error); + + [Export ("performRequests:onImageURL:error:")] + bool Perform (VNRequest [] requests, NSUrl imageUrl, out NSError error); + + [Export ("performRequests:onImageURL:orientation:error:")] + bool Perform (VNRequest [] requests, NSUrl imageUrl, CGImagePropertyOrientation orientation, out NSError error); + + [Export ("performRequests:onImageData:error:")] + bool Perform (VNRequest [] requests, NSData imageData, out NSError error); + + [Export ("performRequests:onImageData:orientation:error:")] + bool Perform (VNRequest [] requests, NSData imageData, CGImagePropertyOrientation orientation, out NSError error); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [BaseType (typeof (VNImageBasedRequest))] + [DisableDefaultCtor] + interface VNTargetedImageRequest { + + [Export ("initWithTargetedCVPixelBuffer:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCVPixelBuffer:orientation:options:completionHandler:")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (pixelBuffer, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CVPixelBuffer pixelBuffer, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:options:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict); + + [Wrap ("this (cgImage, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options); + + [Export ("initWithTargetedCGImage:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCGImage:orientation:options:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (cgImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCGImage:orientation:options:completionHandler:")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (cgImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CGImage cgImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:options:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict); + + [Wrap ("this (ciImage, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options); + + [Export ("initWithTargetedCIImage:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedCIImage:orientation:options:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (ciImage, orientation, options?.Dictionary)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedCIImage:orientation:options:completionHandler:")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (ciImage, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (CIImage ciImage, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:options:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options); + + [Export ("initWithTargetedImageURL:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageURL:orientation:options:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageURL:orientation:options:completionHandler:")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageUrl, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSUrl imageUrl, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:options:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict); + + [Wrap ("this (imageData, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, VNImageOptions options); + + [Export ("initWithTargetedImageData:options:completionHandler:")] + IntPtr Constructor (NSData imageData, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, VNImageOptions options, VNRequestCompletionHandler completionHandler); + + [Export ("initWithTargetedImageData:orientation:options:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict); + + [Wrap ("this (imageData, orientation, options?.Dictionary)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options); + + [Export ("initWithTargetedImageData:orientation:options:completionHandler:")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, NSDictionary optionsDict, [NullAllowed] VNRequestCompletionHandler completionHandler); + + [Wrap ("this (imageData, orientation, options?.Dictionary, completionHandler)")] + IntPtr Constructor (NSData imageData, CGImagePropertyOrientation orientation, VNImageOptions options, VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (VNTrackingRequest))] + [DisableDefaultCtor] + interface VNTrackObjectRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("initWithDetectedObjectObservation:")] + IntPtr Constructor (VNDetectedObjectObservation observation); + + [Export ("initWithDetectedObjectObservation:completionHandler:")] + IntPtr Constructor (VNDetectedObjectObservation observation, [NullAllowed] VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [BaseType (typeof (VNTrackingRequest))] + [DisableDefaultCtor] + interface VNTrackRectangleRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("initWithRectangleObservation:")] + IntPtr Constructor (VNRectangleObservation observation); + + [Export ("initWithRectangleObservation:completionHandler:")] + [DesignatedInitializer] + IntPtr Constructor (VNRectangleObservation observation, [NullAllowed] VNRequestCompletionHandler completionHandler); + } + + [TV (11,0), Mac (10,13, onlyOn64: true), iOS (11,0)] + [Abstract] + [BaseType (typeof (VNImageBasedRequest))] + [DisableDefaultCtor] + interface VNTrackingRequest { + + [Export ("initWithCompletionHandler:")] + [DesignatedInitializer] + IntPtr Constructor ([NullAllowed] VNRequestCompletionHandler completionHandler); + + [Export ("inputObservation", ArgumentSemantic.Strong)] + VNDetectedObjectObservation InputObservation { get; set; } + + [Export ("trackingLevel", ArgumentSemantic.Assign)] + VNRequestTrackingLevel TrackingLevel { get; set; } + + [Export ("lastFrame")] + bool LastFrame { [Bind ("isLastFrame")] get; set; } + } +} +#endif diff --git a/src/watchkit.cs b/src/watchkit.cs index b3e2ffa097ea..91ca0bbd1680 100644 --- a/src/watchkit.cs +++ b/src/watchkit.cs @@ -26,10 +26,12 @@ namespace XamCore.WatchKit { [iOS (8,2)] [BaseType (typeof (NSObject))] [Abstract] // To use this class, subclass it - // FIXME: that's not 100% obvious - OTOH beta2 crash if we call `init` + [DisableDefaultCtor] // DesignatedInitializer below interface WKInterfaceController { - // `init` is now (beta 2) the designated initializer + [DesignatedInitializer] + [Export ("init")] + IntPtr Constructor (); [Export ("awakeWithContext:")] void Awake ([NullAllowed] NSObject context); @@ -56,13 +58,13 @@ interface WKInterfaceController { [Export ("table:didSelectRowAtIndex:")] void DidSelectRow (WKInterfaceTable table, nint rowIndex); - [Deprecated (PlatformName.iOS, 10,0, message: "Use UNUserNotificationCenterDelegate")] - [Deprecated (PlatformName.WatchOS, 3,0, message: "Use UNUserNotificationCenterDelegate")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'UNUserNotificationCenterDelegate' instead.")] + [Deprecated (PlatformName.WatchOS, 3,0, message: "Use 'UNUserNotificationCenterDelegate' instead.")] [Export ("handleActionWithIdentifier:forRemoteNotification:")] void HandleRemoteNotificationAction ([NullAllowed] string identifier, NSDictionary remoteNotification); - [Deprecated (PlatformName.iOS, 10,0, message: "Use UNUserNotificationCenterDelegate")] - [Deprecated (PlatformName.WatchOS, 3,0, message: "Use UNUserNotificationCenterDelegate")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'UNUserNotificationCenterDelegate' instead.")] + [Deprecated (PlatformName.WatchOS, 3,0, message: "Use 'UNUserNotificationCenterDelegate' instead.")] [Export ("handleActionWithIdentifier:forLocalNotification:")] void HandleLocalNotificationAction ([NullAllowed] string identifier, UILocalNotification localNotification); @@ -71,6 +73,7 @@ interface WKInterfaceController { [Export ("handleActionWithIdentifier:forNotification:")] void HandleAction ([NullAllowed] string identifier, UNNotification notification); + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'WKExtensionDelegate.HandleUserActivity' instead.")] [Export ("handleUserActivity:")] // This NSDictionary is OK, it is arbitrary and user specific void HandleUserActivity ([NullAllowed] NSDictionary userActivity); @@ -157,9 +160,15 @@ interface WKInterfaceController { [Static, Export ("openParentApplication:reply:")] bool OpenParentApplication (NSDictionary userInfo, [NullAllowed] Action reply); + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'ReloadRootPageControllers' instead.")] [Static, Export ("reloadRootControllersWithNames:contexts:")] void ReloadRootControllers (string [] names, [NullAllowed] NSObject [] contexts); + [Watch (4,0)][NoiOS] + [Static] + [Export ("reloadRootPageControllersWithNames:contexts:orientation:pageIndex:")] + void ReloadRootPageControllers (string[] names, [NullAllowed] NSObject[] contexts, WKPageOrientation orientation, nint pageIndex); + #if !XAMCORE_3_0 // now exposed with the corresponding WKErrorCode enum [Field ("WatchKitErrorDomain")] @@ -192,9 +201,11 @@ interface WKInterfaceController { [Export ("dismissAddPassesController")] void DismissAddPassesController (); + [Deprecated (PlatformName.WatchOS, 4,0, message: "Glances support was removed.")] [Export ("beginGlanceUpdates")] void BeginGlanceUpdates (); + [Deprecated (PlatformName.WatchOS, 4,0, message: "Glances support was removed.")] [Export ("endGlanceUpdates")] void EndGlanceUpdates (); @@ -215,19 +226,40 @@ interface WKInterfaceController { [Watch (3,0)][NoiOS] [Export ("crownSequencer", ArgumentSemantic.Strong)] WKCrownSequencer CrownSequencer { get; } + + [Watch (4,0)][NoiOS] + [Export ("scrollToObject:atScrollPosition:animated:")] + void ScrollTo (WKInterfaceObject @object, WKInterfaceScrollPosition scrollPosition, bool animated); + + [Watch (4,0)][NoiOS] + [Export ("interfaceDidScrollToTop")] + void InterfaceDidScrollToTop (); + + [Watch (4,0)][NoiOS] + [Export ("interfaceOffsetDidScrollToTop")] + void InterfaceOffsetDidScrollToTop (); + + [Watch (4,0)][NoiOS] + [Export ("interfaceOffsetDidScrollToBottom")] + void InterfaceOffsetDidScrollToBottom (); } [iOS (8,2)] [BaseType (typeof (WKInterfaceController))] + [DisableDefaultCtor] // DesignatedInitializer below interface WKUserNotificationInterfaceController { - [Deprecated (PlatformName.iOS, 10,0, message: "Use DidReceiveNotification")] - [Deprecated (PlatformName.WatchOS, 3,0, message: "Use DidReceiveNotification:")] + [DesignatedInitializer] + [Export ("init")] + IntPtr Constructor (); + + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'DidReceiveNotification' instead.")] + [Deprecated (PlatformName.WatchOS, 3,0, message: "Use 'DidReceiveNotification' instead.")] [Export ("didReceiveRemoteNotification:withCompletion:")] void DidReceiveRemoteNotification (NSDictionary remoteNotification, Action completionHandler); - [Deprecated (PlatformName.iOS, 10,0, message: "Use DidReceiveNotification")] - [Deprecated (PlatformName.WatchOS, 3,0, message: "Use DidReceiveNotification:")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'DidReceiveNotification' instead.")] + [Deprecated (PlatformName.WatchOS, 3,0, message: "Use 'DidReceiveNotification' instead.")] [Export ("didReceiveLocalNotification:withCompletion:")] void DidReceiveLocalNotification (UILocalNotification localNotification, Action completionHandler); @@ -236,12 +268,12 @@ interface WKUserNotificationInterfaceController { void DidReceiveNotification (UNNotification notification, Action completionHandler); [NoiOS] - [Deprecated (PlatformName.WatchOS, 3,0, message: "Use overload accepting an UNNotification parameter")] + [Deprecated (PlatformName.WatchOS, 3,0, message: "Use overload accepting an 'UNNotification' parameter.")] [Export ("suggestionsForResponseToActionWithIdentifier:forRemoteNotification:inputLanguage:")] string[] GetSuggestionsForResponseToAction (string identifier, NSDictionary remoteNotification, string inputLanguage); [NoiOS] - [Deprecated (PlatformName.WatchOS, 3,0, message: "Use overload accepting an UNNotification parameter")] + [Deprecated (PlatformName.WatchOS, 3,0, message: "Use overload accepting an 'UNNotification' parameter.")] [Export ("suggestionsForResponseToActionWithIdentifier:forLocalNotification:inputLanguage:")] string[] GetSuggestionsForResponseToAction (string identifier, UILocalNotification localNotification, string inputLanguage); @@ -330,6 +362,11 @@ interface WKAccessibility { [Notification] [Field ("WKAccessibilityVoiceOverStatusChanged")] NSString VoiceOverStatusChanged { get; } + + [Watch (4,0)][NoiOS] + [Notification] + [Field ("WKAccessibilityReduceMotionStatusDidChangeNotification")] + NSString ReduceMotionStatusDidChangeNotification { get; } } [iOS (8,2)] @@ -414,6 +451,18 @@ interface WKInterfaceDevice { [Watch (3,0)][NoiOS] [Export ("crownOrientation")] WKInterfaceDeviceCrownOrientation CrownOrientation { get; } + + [Watch (4,0)][NoiOS] + [Export ("batteryMonitoringEnabled")] + bool BatteryMonitoringEnabled { [Bind ("isBatteryMonitoringEnabled")] get; set; } + + [Watch (4,0)][NoiOS] + [Export ("batteryLevel")] + float BatteryLevel { get; } + + [Watch (4,0)][NoiOS] + [Export ("batteryState")] + WKInterfaceDeviceBatteryState BatteryState { get; } } [iOS (8,2)] @@ -830,6 +879,26 @@ interface WKExtension { [Watch (3,0)] [Export ("applicationState")] WKApplicationState ApplicationState { get; } + + [Watch (4,0)] + [NullAllowed, Export ("visibleInterfaceController")] + WKInterfaceController VisibleInterfaceController { get; } + + [Watch (4,0)] + [Export ("isApplicationRunningInDock")] + bool IsApplicationRunningInDock { get; } + + [Watch (4,0)] + [Export ("autorotating")] + bool Autorotating { [Bind ("isAutorotating")] get; set; } + + [Watch (4,0)] + [Export ("frontmostTimeoutExtended")] + bool FrontmostTimeoutExtended { [Bind ("isFrontmostTimeoutExtended")] get; set; } + + [Watch (4,0)] + [Export ("enableWaterLock")] + void EnableWaterLock (); } [NoiOS] @@ -892,6 +961,10 @@ interface WKExtensionDelegate { [Watch (3,0)] [Export ("handleWorkoutConfiguration:")] void HandleWorkoutConfiguration (HKWorkoutConfiguration workoutConfiguration); + + [Watch (4,0)] + [Export ("deviceOrientationDidChange")] + void DeviceOrientationDidChange (); } [Watch (2,2), NoiOS] @@ -1024,8 +1097,13 @@ interface WKRefreshBackgroundTask { [NullAllowed, Export ("userInfo")] INSSecureCoding UserInfo { get; } + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'SetTaskCompleted (false)' instead.")] [Export ("setTaskCompleted")] void SetTaskCompleted (); + + [Watch (4,0)] + [Export ("setTaskCompletedWithSnapshot:")] + void SetTaskCompleted (bool refreshSnapshot); } [Watch (3,0)][NoiOS] @@ -1037,9 +1115,14 @@ interface WKApplicationRefreshBackgroundTask { [BaseType (typeof (WKRefreshBackgroundTask))] interface WKSnapshotRefreshBackgroundTask { + [Deprecated (PlatformName.WatchOS, 4,0, message: "Use 'ReasonForSnapshot' instead.")] [Export ("returnToDefaultState")] bool ReturnToDefaultState { get; } + [Watch (4,0)] + [Export ("reasonForSnapshot")] + WKSnapshotReason ReasonForSnapshot { get; } + [Export ("setTaskCompletedWithDefaultStateRestored:estimatedSnapshotExpiration:userInfo:")] void SetTaskCompleted (bool restoredDefaultState, [NullAllowed] NSDate estimatedSnapshotExpiration, [NullAllowed] INSSecureCoding userInfo); } diff --git a/src/webkit.cs b/src/webkit.cs index fa53fa1a763e..2ff763ee6244 100644 --- a/src/webkit.cs +++ b/src/webkit.cs @@ -1090,7 +1090,7 @@ partial interface DomEvent { void PreventDefault (); #if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initEvent:canBubbleArg:cancelableArg:")] void InitEvent (string eventTypeArg, bool canBubbleArg, bool cancelableArg); #endif @@ -1107,7 +1107,7 @@ partial interface DomEvent { [DisableDefaultCtor] partial interface DomOverflowEvent { #if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initOverflowEvent:horizontalOverflow:verticalOverflow:")] void InitEvent (ushort orient, bool hasHorizontalOverflow, bool hasVerticalOverflow); #endif @@ -1142,7 +1142,7 @@ partial interface DomProgressEvent { [DisableDefaultCtor] partial interface DomUIEvent { #if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initUIEvent:canBubble:cancelable:view:detail:")] void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, int /* int, not NSInteger */ detail); #endif @@ -1179,11 +1179,11 @@ partial interface DomUIEvent { [DisableDefaultCtor] partial interface DomKeyboardEvent { #if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:altGraphKey:")] void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, string keyIdentifier, DomKeyLocation keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey); - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initKeyboardEvent:canBubble:cancelable:view:keyIdentifier:keyLocation:ctrlKey:altKey:shiftKey:metaKey:")] void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, string keyIdentifier, DomKeyLocation keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey); #endif @@ -1231,7 +1231,7 @@ partial interface DomKeyboardEvent { [DisableDefaultCtor] partial interface DomMouseEvent { #if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initMouseEvent:canBubble:cancelable:view:detail:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:button:relatedTarget:")] void InitEvent (string eventType, bool canBubble, bool cancelable, DomAbstractView view, int /* int, not NSInteger */ detail, int /* int, not NSInteger */ screenX, int /* int, not NSInteger */ screenY, int /* int, not NSInteger */ clientX, int /* int, not NSInteger */ clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, ushort button, [Protocolize] DomEventTarget relatedTarget); #endif @@ -1293,7 +1293,7 @@ partial interface DomMouseEvent { [DisableDefaultCtor] partial interface DomWheelEvent { #if !XAMCORE_3_0 - [Obsolete ("Use the constructor instead")] + [Obsolete ("Use the constructor instead.")] [Export ("initWheelEvent:wheelDeltaY:view:screenX:screenY:clientX:clientY:ctrlKey:altKey:shiftKey:metaKey:")] void InitEvent (int /* int, not NSInteger */ wheelDeltaX, int /* int, not NSInteger */ wheelDeltaY, DomAbstractView view, int /* int, not NSInteger */ screenX, int /* int, not NSInteger */ screnY, int /* int, not NSInteger */ clientX, int /* int, not NSInteger */ clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey); #endif diff --git a/src/wkwebkit.cs b/src/wkwebkit.cs index 64196e64fe04..b4e50a703d03 100644 --- a/src/wkwebkit.cs +++ b/src/wkwebkit.cs @@ -61,6 +61,77 @@ interface WKBackForwardList { WKBackForwardListItem ItemAtIndex (nint index); } + [Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface WKContentRuleList + { + [Export ("identifier")] + string Identifier { get; } + } + + [Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface WKContentRuleListStore + { + [Static] + [Export ("defaultStore")] + WKContentRuleListStore DefaultStore { get; } + + [Static] + [Export ("storeWithURL:")] + WKContentRuleListStore FromUrl (NSUrl url); + + [Export ("compileContentRuleListForIdentifier:encodedContentRuleList:completionHandler:")] + [Async] + void CompileContentRuleList (string identifier, string encodedContentRuleList, Action completionHandler); + + [Export ("lookUpContentRuleListForIdentifier:completionHandler:")] + [Async] + void LookUpContentRuleList (string identifier, Action completionHandler); + + [Export ("removeContentRuleListForIdentifier:completionHandler:")] + [Async] + void RemoveContentRuleList (string identifier, Action completionHandler); + + [Export ("getAvailableContentRuleListIdentifiers:")] + [Async] + void GetAvailableContentRuleListIdentifiers (Action callback); + } + + [Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject), Name = "WKHTTPCookieStore")] + [DisableDefaultCtor] + interface WKHttpCookieStore + { + [Export ("getAllCookies:")] + [Async] + void GetAllCookies (Action completionHandler); + + [Export ("setCookie:completionHandler:")] + [Async] + void SetCookie (NSHttpCookie cookie, [NullAllowed] Action completionHandler); + + [Export ("deleteCookie:completionHandler:")] + [Async] + void DeleteCookie (NSHttpCookie cookie, [NullAllowed] Action completionHandler); + + [Export ("addObserver:")] + void AddObserver (IWKHttpCookieStoreObserver observer); + + [Export ("removeObserver:")] + void RemoveObserver (IWKHttpCookieStoreObserver observer); + } + + interface IWKHttpCookieStoreObserver {} + + [Mac (10,13), iOS (11,0)] + [Protocol (Name = "WKHTTPCookieStoreObserver")] + interface WKHttpCookieStoreObserver + { + [Export ("cookiesDidChangeInCookieStore:")] + void CookiesDidChangeInCookieStore (WKHttpCookieStore cookieStore); + } + [iOS (8,0), Mac (10,10, onlyOn64 : true)] // Not defined in 32-bit [BaseType (typeof (NSObject))] interface WKFrameInfo : NSCopying { @@ -74,6 +145,10 @@ interface WKFrameInfo : NSCopying { [iOS (9,0)][Mac (10,11, onlyOn64 : true)] [Export ("securityOrigin")] WKSecurityOrigin SecurityOrigin { get; } + + [iOS (11,0)][Mac (10,13, onlyOn64 : true)] + [NullAllowed, Export ("webView", ArgumentSemantic.Weak)] + WKWebView WebView { get; } } [iOS (8,0), Mac (10,10, onlyOn64 : true)] // Not defined in 32-bit @@ -227,6 +302,59 @@ interface WKSecurityOrigin { nint Port { get; } } + + [Mac (10,13), iOS (11,0)] + [BaseType (typeof(NSObject))] + interface WKSnapshotConfiguration : NSCopying { + [Export ("rect")] + CGRect Rect { get; set; } + + [Export ("snapshotWidth")] + NSNumber SnapshotWidth { get; set; } + } + +#if XAMCORE_2_0 + interface IWKUrlSchemeHandler {} + [Mac (10,13), iOS (11,0)] + [Protocol (Name = "WKURLSchemeHandler")] + interface WKUrlSchemeHandler + { + [Abstract] + [Export ("webView:startURLSchemeTask:")] + void StartUrlSchemeTask (WKWebView webView, IWKUrlSchemeTask urlSchemeTask); + + [Abstract] + [Export ("webView:stopURLSchemeTask:")] + void StopUrlSchemeTask (WKWebView webView, IWKUrlSchemeTask urlSchemeTask); + } +#endif + interface IWKUrlSchemeTask {} + + [Mac (10,13), iOS (11,0)] + [Protocol (Name = "WKURLSchemeTask")] + interface WKUrlSchemeTask + { + [Abstract] + [Export ("request", ArgumentSemantic.Copy)] + NSUrlRequest Request { get; } + + [Abstract] + [Export ("didReceiveResponse:")] + void DidReceiveResponse (NSUrlResponse response); + + [Abstract] + [Export ("didReceiveData:")] + void DidReceiveData (NSData data); + + [Abstract] + [Export ("didFinish")] + void DidFinish (); + + [Abstract] + [Export ("didFailWithError:")] + void DidFailWithError (NSError error); + } + [iOS (9,0), Mac(10,11, onlyOn64 : true)] [BaseType (typeof(NSObject))] interface WKWebsiteDataRecord @@ -296,6 +424,10 @@ interface WKWebsiteDataStore : NSCoding { [Export ("removeDataOfTypes:modifiedSince:completionHandler:")] [Async] void RemoveDataOfTypes (NSSet websiteDataTypes, NSDate date, Action completionHandler); + + [Mac (10, 13), iOS (11, 0)] + [Export ("httpCookieStore")] + WKHttpCookieStore HttpCookieStore { get; } } [Mac (10,12, onlyOn64 : true)][NoiOS, NoWatch, NoTV] @@ -366,6 +498,18 @@ interface WKUserContentController : NSCoding { [Export ("removeScriptMessageHandlerForName:")] void RemoveScriptMessageHandler (string name); + + [Mac (10,13), iOS (11,0)] + [Export ("addContentRuleList:")] + void AddContentRuleList (WKContentRuleList contentRuleList); + + [Mac (10,13), iOS (11,0)] + [Export ("removeContentRuleList:")] + void RemoveContentRuleList (WKContentRuleList contentRuleList); + + [Mac (10,13), iOS (11,0)] + [Export ("removeAllContentRuleLists")] + void RemoveAllContentRuleLists (); } [iOS (8,0), Mac (10,10, onlyOn64 : true)] // Not defined in 32-bit @@ -518,8 +662,8 @@ interface WKWebView { string CustomUserAgent { get; set; } [iOS (9,0)][Mac (10,11, onlyOn64 : true)] - [Deprecated (PlatformName.iOS, 10,0, message: "Use ServerTrust property")] - [Deprecated (PlatformName.MacOSX, 10,12, message: "Use ServerTrust property")] + [Deprecated (PlatformName.iOS, 10,0, message: "Use 'ServerTrust' property.")] + [Deprecated (PlatformName.MacOSX, 10,12, message: "Use 'ServerTrust' property.")] [Export ("certificateChain", ArgumentSemantic.Copy)] SecCertificate[] CertificateChain { get; } @@ -530,6 +674,23 @@ interface WKWebView { [iOS (10,0)][Mac (10,12, onlyOn64 : true)] [NullAllowed, Export ("serverTrust")] SecTrust ServerTrust { get; } + +#if !MONOMAC + [iOS (11,0)] + [Async] + [Export ("takeSnapshotWithConfiguration:completionHandler:")] + void TakeSnapshot ([NullAllowed] WKSnapshotConfiguration snapshotConfiguration, Action completionHandler); +#else + [Mac (10,13)] + [Export ("takeSnapshotWithConfiguration:completionHandler:")] + [Async] + void TakeSnapshot ([NullAllowed] WKSnapshotConfiguration snapshotConfiguration, Action completionHandler); +#endif + [Mac (10,13), iOS (11,0)] + [Static] + [Export ("handlesURLScheme:")] + bool HandlesUrlScheme (string urlScheme); + } delegate void WKJavascriptEvaluationResult (NSObject result, NSError error); @@ -566,18 +727,18 @@ interface WKWebViewConfiguration : NSCopying, NSCoding { [Export ("allowsInlineMediaPlayback")] bool AllowsInlineMediaPlayback { get; set; } - [Availability (Introduced = Platform.iOS_8_0, Deprecated = Platform.iOS_9_0, Message = "Use RequiresUserActionForMediaPlayback or MediaTypesRequiringUserActionForPlayback")] + [Availability (Introduced = Platform.iOS_8_0, Deprecated = Platform.iOS_9_0, Message = "Use 'RequiresUserActionForMediaPlayback' or 'MediaTypesRequiringUserActionForPlayback' instead.")] [Export ("mediaPlaybackRequiresUserAction")] bool MediaPlaybackRequiresUserAction { get; set; } - [Availability (Introduced = Platform.iOS_8_0, Deprecated = Platform.iOS_9_0, Message = "Use AllowsAirPlayForMediaPlayback")] + [Availability (Introduced = Platform.iOS_8_0, Deprecated = Platform.iOS_9_0, Message = "Use 'AllowsAirPlayForMediaPlayback' instead.")] [Export ("mediaPlaybackAllowsAirPlay")] bool MediaPlaybackAllowsAirPlay { get; set; } [Export ("selectionGranularity")] WKSelectionGranularity SelectionGranularity { get; set; } - [Availability (Introduced = Platform.iOS_9_0, Deprecated = Platform.iOS_10_0, Message = "Use MediaTypesRequiringUserActionForPlayback")] + [Availability (Introduced = Platform.iOS_9_0, Deprecated = Platform.iOS_10_0, Message = "Use 'MediaTypesRequiringUserActionForPlayback' instead.")] [Export ("requiresUserActionForMediaPlayback")] bool RequiresUserActionForMediaPlayback { get; set; } @@ -597,6 +758,17 @@ interface WKWebViewConfiguration : NSCopying, NSCoding { [NoMac] [Export ("ignoresViewportScaleLimits")] bool IgnoresViewportScaleLimits { get; set; } + +#if XAMCORE_2_0 + [Mac (10,13), iOS (11,0)] + [Export ("setURLSchemeHandler:forURLScheme:")] + void SetUrlSchemeHandler ([NullAllowed] IWKUrlSchemeHandler urlSchemeHandler, string urlScheme); + + [Mac (10,13), iOS (11,0)] + [Export ("urlSchemeHandlerForURLScheme:")] + [return: NullAllowed] + IWKUrlSchemeHandler GetUrlSchemeHandler (string urlScheme); +#endif } [iOS (8,0), Mac (10,10, onlyOn64 : true)] // Not defined in 32-bit diff --git a/system-dependencies.sh b/system-dependencies.sh index 6ed6bc0a05f2..7056d5741623 100755 --- a/system-dependencies.sh +++ b/system-dependencies.sh @@ -273,6 +273,8 @@ function install_specific_xcode () { log "Executing '$SUDO xcode-select -s $XCODE_DEVELOPER_ROOT'" $SUDO xcode-select -s $XCODE_DEVELOPER_ROOT + log "Clearing xcrun cache..." + xcrun -k ok "Xcode $XCODE_VERSION provisioned" } @@ -320,6 +322,8 @@ function check_specific_xcode () { if ! test -z $PROVISION_XCODE; then log "Executing '$SUDO xcode-select -s $XCODE_DEVELOPER_ROOT'" $SUDO xcode-select -s $XCODE_DEVELOPER_ROOT + log "Clearing xcrun cache..." + xcrun -k else fail "'xcode-select -p' does not point to $XCODE_DEVELOPER_ROOT, it points to $XCODE_SELECT. Execute '$SUDO xcode-select -s $XCODE_DEVELOPER_ROOT' to fix." fi diff --git a/tests/apitest/apitest.csproj b/tests/apitest/apitest.csproj index f1d29a8dadd1..c6271294d17a 100644 --- a/tests/apitest/apitest.csproj +++ b/tests/apitest/apitest.csproj @@ -63,6 +63,7 @@ + diff --git a/tests/apitest/src/AppKit/NSFont.cs b/tests/apitest/src/AppKit/NSFont.cs new file mode 100644 index 000000000000..51a35629e415 --- /dev/null +++ b/tests/apitest/src/AppKit/NSFont.cs @@ -0,0 +1,54 @@ +using System; +using NUnit.Framework; + +#if !XAMCORE_2_0 +using MonoMac.AppKit; +using MonoMac.ObjCRuntime; +using MonoMac.Foundation; +using MonoMac.CoreGraphics; +using MonoMac.CoreText; +#else +using AppKit; +using ObjCRuntime; +using Foundation; +using CoreGraphics; +using CoreText; +#endif + +namespace Xamarin.Mac.Tests +{ + [TestFixture] + public class NSFontTests + { + [Test] + public void GetBoundingRect_SmokeTest () + { + CGFont cgFont = CGFont.CreateWithFontName ("Arial"); + ushort [] glyphs = new ushort [5]; + for (int i = 0 ; i < 5 ; ++i) + glyphs[i] = cgFont.GetGlyphWithGlyphName ("Hello"[i].ToString ()); + + CTFont ctFont = new CTFont (cgFont, 14, new CTFontDescriptor ("Arial", 14)); + NSFont nsFont = NSFont.FromCTFont (ctFont); + + var bounding = nsFont.GetBoundingRects (glyphs); + var advancement = nsFont.GetAdvancements (glyphs); + Assert.AreEqual (5, bounding.Length); + Assert.AreEqual (5, advancement.Length); + } + + [Test] + public void GetBoundingRect_WithEmptyGlyphs () + { + CGFont cgFont = CGFont.CreateWithFontName ("Arial"); + ushort [] glyphs = new ushort [] {}; + + CTFont ctFont = new CTFont (cgFont, 14, new CTFontDescriptor ("Arial", 14)); + NSFont nsFont = NSFont.FromCTFont (ctFont); + + Assert.Throws (() => nsFont.GetBoundingRects (glyphs)); + Assert.Throws (() => nsFont.GetAdvancements (glyphs)); + } + } +} + diff --git a/tests/apitest/src/AppKit/NSView.cs b/tests/apitest/src/AppKit/NSView.cs index 595e20ce390a..b3e684c0dc13 100644 --- a/tests/apitest/src/AppKit/NSView.cs +++ b/tests/apitest/src/AppKit/NSView.cs @@ -70,8 +70,11 @@ public void AllItemsWithNSMenuShouldAllowNull () // Can't test typeof (NSResponder) since it is abstract List types = new List { typeof (NSCell), typeof (NSMenuItem), typeof (NSPathControl), typeof (NSPopUpButton), typeof (NSPopUpButtonCell) }; - if (IntPtr.Size == 4) - types.Add (typeof (NSMenuView)); // NSMenuView is 32-bit only + // objc[22864]: Cannot form weak reference to instance (0x4268d0) of class NSMenuView. It is possible that this object was over-released, or is in the process of deallocation. + // Error occurs in Xcode as well, so not a result of our code + // Radar #33966228: "Thanks for the info, I think it would be best to just exclude this case from testing. We might keep your bug around to cover the case of NSWindow having problems in general with non-weak-compatible classes, but I don’t think we’ll fix it just for NSMenuView." + //if (IntPtr.Size == 4) + //types.Add (typeof (NSMenuView)); // NSMenuView is 32-bit only foreach (Type t in types) { object o = Activator.CreateInstance (t); diff --git a/tests/apitest/src/MonoMac/CBUUID.cs b/tests/apitest/src/MonoMac/CBUUID.cs index 02a690e6f2e7..a92b144bffcb 100644 --- a/tests/apitest/src/MonoMac/CBUUID.cs +++ b/tests/apitest/src/MonoMac/CBUUID.cs @@ -30,7 +30,6 @@ public void Roundtrip_16bits () using (CBUUID uuid = CBUUID.FromString ("1234")) { Assert.That (uuid.Handle, Is.Not.EqualTo (IntPtr.Zero), "Handle"); Assert.IsNotNull (uuid.Data, "Data"); - Assert.That (uuid.Description, Is.EqualTo ("Unknown (<1234>)"), "Description"); Assert.That (uuid.ToString (false), Is.EqualTo ("1234"), "ToString(false)"); Assert.That (uuid.ToString (true), Is.EqualTo ("00001234-0000-1000-8000-00805f9b34fb"), "ToString(true)"); using (CBUUID u2 = CBUUID.FromString (uuid.ToString ())) { @@ -45,7 +44,6 @@ public void Roundtrip_128bits () using (CBUUID uuid = CBUUID.FromString ("12345678-90AB-CDEF-cafe-c80c20443d0b")) { Assert.That (uuid.Handle, Is.Not.EqualTo (IntPtr.Zero), "Handle"); Assert.IsNotNull (uuid.Data, "Data"); - Assert.That (uuid.Description, Is.EqualTo ("Unknown (<12345678 90abcdef cafec80c 20443d0b>)"), "Description"); Assert.That (uuid.ToString (false), Is.EqualTo (uuid.ToString (true)), "ToString"); using (CBUUID u2 = CBUUID.FromString (uuid.ToString ())) { Assert.That (u2.ToString (), Is.EqualTo (uuid.ToString ()), "Roundtrip"); @@ -136,4 +134,4 @@ public void PartialsOfDifferentSizeNotEqual () CBUUID.FromString ("12345678-0000-1000-8000-00805f9b34fb"))); } } -} \ No newline at end of file +} diff --git a/tests/bindings-framework-test/XTest.framework.linkwith.cs b/tests/bindings-framework-test/XTest.framework.linkwith.cs index 8d0206b07deb..fb6f1c942109 100644 --- a/tests/bindings-framework-test/XTest.framework.linkwith.cs +++ b/tests/bindings-framework-test/XTest.framework.linkwith.cs @@ -7,7 +7,16 @@ using System.Runtime.InteropServices; #if __UNIFIED__ -[assembly: LinkWith ("XTest.framework")] -[assembly: LinkWith ("XStaticObjectTest.framework", LinkerFlags = "-lz")] -[assembly: LinkWith ("XStaticArTest.framework")] +[assembly: LinkWith ("XTest.framework", Frameworks = LinkWithConstants.Frameworks)] +[assembly: LinkWith ("XStaticObjectTest.framework", LinkerFlags = "-lz", Frameworks = LinkWithConstants.Frameworks)] +[assembly: LinkWith ("XStaticArTest.framework", Frameworks = LinkWithConstants.Frameworks)] #endif + +static class LinkWithConstants +{ +#if __WATCHOS__ + public const string Frameworks = ""; +#else + public const string Frameworks = "ModelIO"; +#endif +} diff --git a/tests/bindings-test/StructsAndEnums.cs b/tests/bindings-test/StructsAndEnums.cs index 26e6b3c0730d..9396fcf68a09 100644 --- a/tests/bindings-test/StructsAndEnums.cs +++ b/tests/bindings-test/StructsAndEnums.cs @@ -3,13 +3,118 @@ #if !__UNIFIED__ using nint=System.Int32; +#else +using Foundation; +using ObjCRuntime; #endif +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x3 = global::OpenTK.NMatrix4x3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; + namespace Bindings.Test { public static class CFunctions { [DllImport ("__Internal")] public static extern int theUltimateAnswer (); + + [DllImport ("__Internal")] + public static extern void x_get_matrix_float2x2 (IntPtr self, string sel, out float r0c0, out float r0c1, out float r1c0, out float r1c1); + + [DllImport ("__Internal")] + public static extern void x_get_matrix_float3x3 (IntPtr self, string sel, out float r0c0, out float r0c1, out float r0c2, out float r1c0, out float r1c1, out float r1c2, out float r2c0, out float r2c1, out float r2c2); + + [DllImport ("__Internal")] + public static extern void x_get_matrix_float4x4 (IntPtr self, string sel, out float r0c0, out float r0c1, out float r0c2, out float r0c3, out float r1c0, out float r1c1, out float r1c2, out float r1c3, out float r2c0, out float r2c1, out float r2c2, out float r2c3, out float r3c0, out float r3c1, out float r3c2, out float r3c3); + + [DllImport ("__Internal")] + public static extern void x_get_matrix_float4x3 (IntPtr self, string sel, out float r0c0, out float r0c1, out float r0c2, out float r0c3, out float r1c0, out float r1c1, out float r1c2, out float r1c3, out float r2c0, out float r2c1, out float r2c2, out float r2c3); + + public static MatrixFloat2x2 GetMatrixFloat2x2 (NSObject obj, string selector) + { + float r0c0, r0c1, r1c0, r1c1; + x_get_matrix_float2x2 (obj.Handle, selector, out r0c0, out r0c1, out r1c0, out r1c1); + return new MatrixFloat2x2 ( + r0c0, r0c1, + r1c0, r1c1); + } + + public static MatrixFloat3x3 GetMatrixFloat3x3 (NSObject obj, string selector) + { + float r0c0, r0c1, r0c2, r1c0, r1c1, r1c2, r2c0, r2c1, r2c2; + x_get_matrix_float3x3 (obj.Handle, selector, out r0c0, out r0c1, out r0c2, out r1c0, out r1c1, out r1c2, out r2c0, out r2c1, out r2c2); + return new MatrixFloat3x3 ( + r0c0, r0c1, r0c2, + r1c0, r1c1, r1c2, + r2c0, r2c1, r2c2); + + } + + public static MatrixFloat4x4 GetMatrixFloat4x4 (NSObject obj, string selector) + { + float r0c0, r0c1, r0c2, r0c3, r1c0, r1c1, r1c2, r1c3, r2c0, r2c1, r2c2, r2c3, r3c0, r3c1, r3c2, r3c3; + x_get_matrix_float4x4 (obj.Handle, selector, out r0c0, out r0c1, out r0c2, out r0c3, out r1c0, out r1c1, out r1c2, out r1c3, out r2c0, out r2c1, out r2c2, out r2c3, out r3c0, out r3c1, out r3c2, out r3c3); + return new MatrixFloat4x4 ( + r0c0, r0c1, r0c2, r0c3, + r1c0, r1c1, r1c2, r1c3, + r2c0, r2c1, r2c2, r2c3, + r3c0, r3c1, r3c2, r3c3); + } + + public static MatrixFloat4x3 GetMatrixFloat4x3 (NSObject obj, string selector) + { + float r0c0, r0c1, r0c2, r0c3, r1c0, r1c1, r1c2, r1c3, r2c0, r2c1, r2c2, r2c3; + x_get_matrix_float4x3 (obj.Handle, selector, out r0c0, out r0c1, out r0c2, out r0c3, out r1c0, out r1c1, out r1c2, out r1c3, out r2c0, out r2c1, out r2c2, out r2c3); + return new MatrixFloat4x3 ( + r0c0, r0c1, r0c2, r0c3, + r1c0, r1c1, r1c2, r1c3, + r2c0, r2c1, r2c2, r2c3); + } + +#if !__WATCHOS__ + [DllImport ("__Internal")] + public static extern void x_mdltransformcomponent_get_local_transform (IntPtr self, double time, out float r0c0, out float r0c1, out float r0c2, out float r0c3, out float r1c0, out float r1c1, out float r1c2, out float r1c3, out float r2c0, out float r2c1, out float r2c2, out float r2c3, out float r3c0, out float r3c1, out float r3c2, out float r3c3); + + public static MatrixFloat4x4 MDLTransformComponent_GetLocalTransform (INativeObject obj, double time) + { + float r0c0, r0c1, r0c2, r0c3, r1c0, r1c1, r1c2, r1c3, r2c0, r2c1, r2c2, r2c3, r3c0, r3c1, r3c2, r3c3; + x_mdltransformcomponent_get_local_transform (obj.Handle, time, out r0c0, out r0c1, out r0c2, out r0c3, out r1c0, out r1c1, out r1c2, out r1c3, out r2c0, out r2c1, out r2c2, out r2c3, out r3c0, out r3c1, out r3c2, out r3c3); + return new MatrixFloat4x4 ( + r0c0, r0c1, r0c2, r0c3, + r1c0, r1c1, r1c2, r1c3, + r2c0, r2c1, r2c2, r2c3, + r3c0, r3c1, r3c2, r3c3); + } + + [DllImport ("__Internal")] + public static extern void x_mdltransform_create_global_transform (IntPtr obj, double time, out float r0c0, out float r0c1, out float r0c2, out float r0c3, out float r1c0, out float r1c1, out float r1c2, out float r1c3, out float r2c0, out float r2c1, out float r2c2, out float r2c3, out float r3c0, out float r3c1, out float r3c2, out float r3c3); + + public static MatrixFloat4x4 MDLTransform_CreateGlobalTransform (INativeObject obj, double time) + { + float r0c0, r0c1, r0c2, r0c3, r1c0, r1c1, r1c2, r1c3, r2c0, r2c1, r2c2, r2c3, r3c0, r3c1, r3c2, r3c3; + x_mdltransform_create_global_transform (obj.Handle, time, out r0c0, out r0c1, out r0c2, out r0c3, out r1c0, out r1c1, out r1c2, out r1c3, out r2c0, out r2c1, out r2c2, out r2c3, out r3c0, out r3c1, out r3c2, out r3c3); + return new MatrixFloat4x4 ( + r0c0, r0c1, r0c2, r0c3, + r1c0, r1c1, r1c2, r1c3, + r2c0, r2c1, r2c2, r2c3, + r3c0, r3c1, r3c2, r3c3); + } + + [DllImport ("__Internal")] + public static extern void x_mdltransform_get_rotation_matrix (IntPtr obj, double time, out float r0c0, out float r0c1, out float r0c2, out float r0c3, out float r1c0, out float r1c1, out float r1c2, out float r1c3, out float r2c0, out float r2c1, out float r2c2, out float r2c3, out float r3c0, out float r3c1, out float r3c2, out float r3c3); + + public static MatrixFloat4x4 MDLTransform_GetRotationMatrix (INativeObject obj, double time) + { + float r0c0, r0c1, r0c2, r0c3, r1c0, r1c1, r1c2, r1c3, r2c0, r2c1, r2c2, r2c3, r3c0, r3c1, r3c2, r3c3; + x_mdltransform_get_rotation_matrix (obj.Handle, time, out r0c0, out r0c1, out r0c2, out r0c3, out r1c0, out r1c1, out r1c2, out r1c3, out r2c0, out r2c1, out r2c2, out r2c3, out r3c0, out r3c1, out r3c2, out r3c3); + return new MatrixFloat4x4 ( + r0c0, r0c1, r0c2, r0c3, + r1c0, r1c1, r1c2, r1c3, + r2c0, r2c1, r2c2, r2c3, + r3c0, r3c1, r3c2, r3c3); + } +#endif } } diff --git a/tests/bindings-test/libtest.linkwith.cs b/tests/bindings-test/libtest.linkwith.cs index df0c9c264c2c..15cef4441237 100644 --- a/tests/bindings-test/libtest.linkwith.cs +++ b/tests/bindings-test/libtest.linkwith.cs @@ -6,9 +6,18 @@ #endif using System.Runtime.InteropServices; -[assembly: LinkWith ("libtest.a", LinkTarget.Simulator | LinkTarget.ArmV6 | LinkTarget.ArmV7 | LinkTarget.ArmV7s | LinkTarget.Arm64 | LinkTarget.Simulator64, SmartLink = true, Frameworks = "Foundation" , LinkerFlags = "-lz")] +[assembly: LinkWith ("libtest.a", LinkTarget.Simulator | LinkTarget.ArmV6 | LinkTarget.ArmV7 | LinkTarget.ArmV7s | LinkTarget.Arm64 | LinkTarget.Simulator64, SmartLink = true, Frameworks = LinkWithConstants.Frameworks, LinkerFlags = "-lz")] public static class LibTest { [DllImport ("__Internal")] public static extern int theUltimateAnswer (); } + +static class LinkWithConstants +{ +#if __WATCHOS__ + public const string Frameworks = "Foundation"; +#else + public const string Frameworks = "Foundation ModelIO"; +#endif +} diff --git a/tests/common/Configuration.cs b/tests/common/Configuration.cs index 69ad7b4500a4..1c66bac2d2d9 100644 --- a/tests/common/Configuration.cs +++ b/tests/common/Configuration.cs @@ -19,6 +19,7 @@ class Configuration public static string sdk_version; public static string watchos_sdk_version; public static string tvos_sdk_version; + public static string macos_sdk_version; public static string xcode_root; public static string XcodeVersion; public static string xcode5_root; @@ -159,6 +160,7 @@ static Configuration () sdk_version = GetVariable ("IOS_SDK_VERSION", "8.0"); watchos_sdk_version = GetVariable ("WATCH_SDK_VERSION", "2.0"); tvos_sdk_version = GetVariable ("TVOS_SDK_VERSION", "9.0"); + macos_sdk_version = GetVariable ("OSX_SDK_VERSION", "10.12"); xcode_root = GetVariable ("XCODE_DEVELOPER_ROOT", "/Applications/Xcode.app/Contents/Developer"); xcode5_root = GetVariable ("XCODE5_DEVELOPER_ROOT", "/Applications/Xcode511.app/Contents/Developer"); xcode6_root = GetVariable ("XCODE6_DEVELOPER_ROOT", "/Applications/Xcode601.app/Contents/Developer"); diff --git a/tests/common/TestRuntime.cs b/tests/common/TestRuntime.cs index 28489e67ebb3..3aab32c68eff 100644 --- a/tests/common/TestRuntime.cs +++ b/tests/common/TestRuntime.cs @@ -97,9 +97,92 @@ public static void AssertXcodeVersion (int major, int minor) NUnit.Framework.Assert.Ignore ("Requires the platform version shipped with Xcode {0}.{1}", major, minor); } +#if !MONOMAC + public static void AssertDevice () + { + if (ObjCRuntime.Runtime.Arch == Arch.SIMULATOR) + NUnit.Framework.Assert.Ignore ("This test only runs on device."); + } +#endif + + // This function checks if the current Xcode version is exactly (neither higher nor lower) the requested one. + public static bool CheckExactXcodeVersion (int major, int minor, int beta = 0) + { + // Add the Build number minus the one last character, sometimes Apple releases + // different builds from the same Beta, for example in Xcode 9 Beta 3 we have + // 15A5318g on device and 15A5318e on the simulator + var nineb1 = new { + Xcode = new { Major = 9, Minor = 0, Beta = 1 }, + iOS = new { Major = 11, Minor = 0, Build = "15A5278" }, + tvOS = new { Major = 11, Minor = 0, Build = "?" }, + macOS = new { Major = 10, Minor = 13, Build = "?" }, + watchOS = new { Major = 4, Minor = 0, Build = "?" }, + }; + var nineb2 = new { + Xcode = new { Major = 9, Minor = 0, Beta = 2 }, + iOS = new { Major = 11, Minor = 0, Build = "15A5304" }, + tvOS = new { Major = 11, Minor = 0, Build = "?" }, + macOS = new { Major = 10, Minor = 13, Build = "?" }, + watchOS = new { Major = 4, Minor = 0, Build = "?" }, + }; + var nineb3 = new { + Xcode = new { Major = 9, Minor = 0, Beta = 3 }, + iOS = new { Major = 11, Minor = 0, Build = "15A5318" }, + tvOS = new { Major = 11, Minor = 0, Build = "?" }, + macOS = new { Major = 10, Minor = 13, Build = "?" }, + watchOS = new { Major = 4, Minor = 0, Build = "?" }, + }; + + var versions = new [] { + nineb1, + nineb2, + nineb3, + }; + + foreach (var v in versions) { + if (v.Xcode.Major != major) + continue; + if (v.Xcode.Minor != minor) + continue; + if (v.Xcode.Beta != beta) + continue; + +#if __IOS__ + if (!CheckExactiOSSystemVersion (v.iOS.Major, v.iOS.Minor)) + return false; + if (v.iOS.Build == "?") + throw new NotImplementedException ($"Build number for iOS {v.iOS.Major}.{v.iOS.Minor} beta {beta} (candidate: {GetiOSBuildVersion ()})"); + var actual = GetiOSBuildVersion (); + Console.WriteLine (actual); + return actual.StartsWith (v.iOS.Build, StringComparison.Ordinal); +#else + throw new NotImplementedException (); +#endif + } + + throw new NotImplementedException ($"Build information for Xcode version {major}.{minor} beta {beta} not found"); + } + public static bool CheckXcodeVersion (int major, int minor, int build = 0) { switch (major) { + case 9: + switch (minor) { + case 0: +#if __WATCHOS__ + return CheckWatchOSSystemVersion (4, 0); +#elif __TVOS__ + return ChecktvOSSystemVersion (11, 0); +#elif __IOS__ + return CheckiOSSystemVersion (11, 0); +#elif MONOMAC + return CheckMacSystemVersion (10, 13, 0); +#else + throw new NotImplementedException (); +#endif + default: + throw new NotImplementedException (); + } case 8: switch (minor) { case 0: @@ -306,6 +389,16 @@ public static bool CheckiOSSystemVersion (int major, int minor, bool throwIfOthe #endif } + public static bool CheckExactiOSSystemVersion (int major, int minor) + { +#if __IOS__ + var version = Version.Parse (UIDevice.CurrentDevice.SystemVersion); + return version.Major == major && version.Minor == minor; +#else + throw new Exception ("Can't get iOS System version on other platforms."); +#endif + } + // This method returns true if: // system version >= specified version // AND diff --git a/tests/generator/Makefile b/tests/generator/Makefile index 0c2af43086b4..951be32ef320 100644 --- a/tests/generator/Makefile +++ b/tests/generator/Makefile @@ -21,7 +21,7 @@ else IOS_GENERATOR = $(IOS_CURRENT_DIR)/bin/btouch-native /baselib:$(IOS_CURRENT_DIR)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll /unsafe endif IOS_TESTS = bug15283 bug15307 bug15799 bug16036 sof20696157 bug23041 bug27430 bug27428 bug34042 btouch-with-hyphen-in-name property-redefination-ios arrayfromhandlebug bug36457 bug39614 bug40282 bug17232 bug24078-ignore-methods-events strong-dict-support-templated-dicts bug43579 bindastests -IOS_CUSTOM_TESTS = forum54078 desk63279 desk79124 multiple-api-definitions1 multiple-api-definitions2 bug29493 classNameCollision bi1036 bug37527 bug27986 bug35176 bi1046 bindas1048error bindas1049error bindas1050modelerror bindas1050protocolerror virtualwrap bug42855 bug52570classinternal bug52570methodinternal bug52570allowstaticmembers bug42742 warnaserror nowarn noasyncinternalwrapper noasyncwarningcs0219 bug53076 bug53076withmodel bug57070 +IOS_CUSTOM_TESTS = forum54078 desk63279 desk79124 multiple-api-definitions1 multiple-api-definitions2 bug29493 classNameCollision bi1036 bug37527 bug27986 bug35176 bi1046 bindas1048error bindas1049error bindas1050modelerror bindas1050protocolerror virtualwrap bug42855 bug52570classinternal bug52570methodinternal bug52570allowstaticmembers bug42742 warnaserror nowarn noasyncinternalwrapper noasyncwarningcs0219 bug53076 bug53076withmodel bug57070 fieldenumtests smartenumwithframework MAC_CURRENT_DIR=$(MAC_DESTDIR)/Library/Frameworks/Xamarin.Mac.framework/Versions/Current ifdef IKVM @@ -273,6 +273,19 @@ bug53076withmodel: echo "Error: Expected 10 'Async (this IMyFooProtocol' matches in generated code. If you modified code that generates extension FooRequiredMethodAsync (AsyncAttribute) please update the 'Async (this IMyFooProtocol' count."; exit 1; \ fi +fieldenumtests: + @rm -Rf $@.tmpdir + @mkdir -p $@.tmpdir + $(if $(V),,@echo "$@";) $(IOS_GENERATOR) --sourceonly:$@.source -tmpdir=$@.tmpdir $@.cs --process-enums + +smartenumwithframework: + @rm -Rf $@.tmpdir + @mkdir -p $@.tmpdir + $(if $(V),,@echo "$@";) $(IOS_GENERATOR) --sourceonly:$@.source -tmpdir=$@.tmpdir $@.cs --process-enums + @if [ `grep -r "Libraries.CoreImage.Handle" $@.tmpdir/SmartEnumWithFramework | wc -l` -ne 2 ]; then \ + echo "Error: Expected 2 'Libraries.CoreImage.Handle'."; exit 1; \ + fi + clean-local:: rm -f *.dll *.source rm -Rf *.tmpdir diff --git a/tests/generator/fieldenumtests.cs b/tests/generator/fieldenumtests.cs new file mode 100644 index 000000000000..49b23e7053b2 --- /dev/null +++ b/tests/generator/fieldenumtests.cs @@ -0,0 +1,66 @@ +using System; +using Foundation; +using ObjCRuntime; + +namespace FieldEnumTests { + + [Native] + enum FooNIntEnum : long { + Zero, + One, + Two + } + + [Native] + enum FooNUIntEnum : ulong { + Zero, + One, + Two + } + + enum FooSmartEnum { + [Field ("ZeroSmartField", "__Internal")] + Zero, + [Field ("OneSmartField", "__Internal")] + One, + [Field ("TwoSmartField", "__Internal")] + Two + } + + enum FooIntEnum { + Zero, + One, + Two + } + + [BaseType (typeof (NSObject))] + interface MyFooClass { + + [Field ("UIntField", "__Internal")] + uint UIntField { get; set; } + + [Field ("ULongField", "__Internal")] + ulong ULongField { get; set; } + + [Field ("LongField", "__Internal")] + long LongField { get; set; } + + [Field ("NUIntField", "__Internal")] + nuint NUIntField { get; set; } + + [Field ("NIntField", "__Internal")] + nint NIntField { get; set; } + + [Field ("NIntField", "__Internal")] + FooNIntEnum FooNIntField { get; set; } + + [Field ("NUIntField", "__Internal")] + FooNUIntEnum FooNUIntField { get; set; } + + [Field ("FooSmartField", "__Internal")] + FooSmartEnum FooSmartField { get; set; } + + [Field ("FooIntEnumField", "__Internal")] + FooIntEnum FooIntEnumField { get; set; } + } +} \ No newline at end of file diff --git a/tests/generator/smartenumwithframework.cs b/tests/generator/smartenumwithframework.cs new file mode 100644 index 000000000000..8b49a91cee37 --- /dev/null +++ b/tests/generator/smartenumwithframework.cs @@ -0,0 +1,14 @@ +using System; +using ObjCRuntime; +using Foundation; + +namespace SmartEnumWithFramework { + + enum FooEnumTest { + [Field ("First", "+CoreImage")] + First, + + [Field ("Second", "+CoreImage")] + Second, + } +} \ No newline at end of file diff --git a/tests/introspection/ApiBaseTest.cs b/tests/introspection/ApiBaseTest.cs index 183b8f2d753b..b79c1d78487a 100644 --- a/tests/introspection/ApiBaseTest.cs +++ b/tests/introspection/ApiBaseTest.cs @@ -66,6 +66,8 @@ protected ApiBaseTest () protected void AddErrorLine (string line) { error_output.AppendLine (line); + if (!line.StartsWith ("[FAIL] ", StringComparison.Ordinal)) + Console.Error.Write ("[FAIL] "); Console.Error.WriteLine (line); Errors++; } @@ -172,14 +174,13 @@ protected bool SkipDueToAttributeInProperty (MemberInfo member) var m = member as MethodInfo; if (m == null || // Skip anything that is not a method - !m.Attributes.HasFlag (MethodAttributes.SpecialName) || - !m.Name.Contains ("get_")) // We want getters with SpecialName Attribute + !m.Attributes.HasFlag (MethodAttributes.SpecialName)) // We want properties with SpecialName Attribute return false; // FIXME: In the future we could cache this to reduce memory requirements var property = m.DeclaringType .GetProperties () - .SingleOrDefault (p => p.GetGetMethod () == m); + .SingleOrDefault (p => p.GetGetMethod () == m || p.GetSetMethod () == m); return property != null && SkipDueToAttribute (property); } @@ -214,6 +215,10 @@ protected virtual string FindLibrary (string libname, bool requiresFullPath = fa case "AudioUnit": libname = "AudioToolbox"; break; + case "IOSurface": + if (!TestRuntime.CheckXcodeVersion (9, 0)) + prefix = Path.Combine (Path.GetDirectoryName (prefix), "PrivateFrameworks"); + break; #endif case "CoreAnimation": // generated code uses QuartzCore correctly - even if the [Field] property is wrong diff --git a/tests/introspection/ApiCoreImageFiltersTest.cs b/tests/introspection/ApiCoreImageFiltersTest.cs index fd7678e30cf6..f6fcdab76046 100644 --- a/tests/introspection/ApiCoreImageFiltersTest.cs +++ b/tests/introspection/ApiCoreImageFiltersTest.cs @@ -67,6 +67,24 @@ protected virtual bool Skip (string nativeName) case "CIDepthOfField": // NSUnknownKeyException [ valueForUndefinedKey:]: this class is not key value coding-compliant for the key inputCropAmount. case "CISunbeamsGenerator": + case "CIAreaMinMaxRed": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIAttributedTextImageGenerator": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIBarcodeGenerator": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIBicubicScaleTransform": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIBlendWithBlueMask": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIBlendWithRedMask": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIBokehBlur": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIColorCubesMixedWithMask": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIColorCurves": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIDepthBlurEffect": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIDepthToDisparity": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIDisparityToDepth": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIEdgePreserveUpsampleFilter": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CILabDeltaE": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIMorphologyGradient": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIMorphologyMaximum": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CIMorphologyMinimum": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 + case "CITextImageGenerator": // https://bugzilla.xamarin.com/show_bug.cgi?id=57350 return true; // FIXME: Remove if fixed. Doesn't appear to exist in El Capitan. Reported in radar #22099780 // case "CIMaskedVariableBlur": diff --git a/tests/introspection/ApiCtorInitTest.cs b/tests/introspection/ApiCtorInitTest.cs index d0111c6823e9..d13d5451c307 100644 --- a/tests/introspection/ApiCtorInitTest.cs +++ b/tests/introspection/ApiCtorInitTest.cs @@ -77,6 +77,28 @@ protected virtual bool Skip (Type type) return true; case "NEPacketTunnelProvider": return true; + case "NSUnitDispersion": // -init should never be called on NSUnit! + case "NSUnitVolume": // -init should never be called on NSUnit! + case "NSUnitDuration": // -init should never be called on NSUnit! + case "NSUnitElectricCharge": // -init should never be called on NSUnit! + case "NSUnitElectricCurrent": // -init should never be called on NSUnit! + case "NSUnitElectricPotentialDifference": // -init should never be called on NSUnit! + case "NSUnitElectricResistance": // -init should never be called on NSUnit! + case "NSUnit": // -init should never be called on NSUnit! + case "NSUnitEnergy": // -init should never be called on NSUnit! + case "NSUnitAcceleration": // -init should never be called on NSUnit! + case "NSUnitFrequency": // -init should never be called on NSUnit! + case "NSUnitAngle": // -init should never be called on NSUnit! + case "NSUnitFuelEfficiency": // -init should never be called on NSUnit! + case "NSUnitArea": // -init should never be called on NSUnit! + case "NSUnitIlluminance": // -init should never be called on NSUnit! + case "NSUnitConcentrationMass": // -init should never be called on NSUnit! + case "NSUnitLength": // -init should never be called on NSUnit! + case "NSUnitMass": // -init should never be called on NSUnit! + case "NSUnitPower": // -init should never be called on NSUnit! + case "NSUnitPressure": // -init should never be called on NSUnit! + case "NSUnitSpeed": // -init should never be called on NSUnit! + return true; } return SkipDueToAttribute (type); @@ -304,11 +326,47 @@ protected virtual bool Match (ConstructorInfo ctor, Type type) if (ctor.ToString () == "Void .ctor(String, NSBundle)") return true; break; + case "MKCompassButton": + case "MKScaleView": + case "MKUserTrackingButton": + // Xcode9 added types that are created only from static methods (no init) + return true; #if __TVOS__ case "UISearchBar": // - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER __TVOS_PROHIBITED; return true; #endif + case "PdfAnnotationButtonWidget": + case "PdfAnnotationChoiceWidget": + case "PdfAnnotationCircle": + case "PdfAnnotationFreeText": + case "PdfAnnotationInk": + case "PdfAnnotationLine": + case "PdfAnnotationLink": + case "PdfAnnotationMarkup": + case "PdfAnnotationPopup": + case "PdfAnnotationSquare": + case "PdfAnnotationStamp": + case "PdfAnnotationText": + case "PdfAnnotationTextWidget": + // This ctor was introduced in 10,13 but all of the above objects are deprecated in 10,12 + // so it does not make much sense to expose this ctor in all the deprecated subclasses +#if XAMCORE_2_0 + if (ctor.ToString () == "Void .ctor(CGRect, NSString, NSDictionary)") +#else + if (ctor.ToString () == "Void .ctor(RectangleF, NSString, NSDictionary)") +#endif + return true; + break; + case "VNTargetedImageRequest": // Explicitly disabled + if (ctor.ToString () == "Void .ctor(VNRequestCompletionHandler)") + return true; + break; + case "PKPaymentRequestShippingContactUpdate": + // a more precise designated initializer is provided + if (ctor.ToString () == "Void .ctor(PKPaymentSummaryItem[])") + return true; + break; } var ep = ctor.GetParameters (); diff --git a/tests/introspection/ApiFieldTest.cs b/tests/introspection/ApiFieldTest.cs index fb1d27cfdb57..ae0439cd2da0 100644 --- a/tests/introspection/ApiFieldTest.cs +++ b/tests/introspection/ApiFieldTest.cs @@ -71,7 +71,7 @@ protected virtual bool Skip (PropertyInfo property) /// Override if you want to skip testing the specified constant. /// /// Constant name to ignore. - protected virtual bool Skip (string constantName) + protected virtual bool Skip (string constantName, string libraryName) { return false; } @@ -227,7 +227,7 @@ public void FieldExists () continue; string name = f.SymbolName; - if (Skip (name)) + if (Skip (name, f.LibraryName)) continue; string path = FindLibrary (f.LibraryName); diff --git a/tests/introspection/ApiProtocolTest.cs b/tests/introspection/ApiProtocolTest.cs index 9c9c55dfdcb8..55a708edfdf2 100644 --- a/tests/introspection/ApiProtocolTest.cs +++ b/tests/introspection/ApiProtocolTest.cs @@ -71,6 +71,7 @@ protected virtual bool Skip (Type type, string protocolName) case "CAEmitterCell": case "GKAchievement": case "GKScore": + case "MPMediaItem": // new in iOS8 and 10.0 case "NSExtensionContext": case "NSLayoutAnchor`1": @@ -81,6 +82,11 @@ protected virtual bool Skip (Type type, string protocolName) case "GKCloudPlayer": // iOS 10 : test throw because of generic usage case "NSMeasurement`1": + // Xcode 9 - Conformance not in headers + case "MLDictionaryConstraint": + case "MLImageConstraint": + case "MLMultiArrayConstraint": + case "VSSubscription": return true; // skip } break; @@ -114,6 +120,8 @@ protected virtual bool Skip (Type type, string protocolName) case "GKGameSession": // iOS 10 : test throw because of generic usage case "NSMeasurement`1": + // iOS 11 / tvOS 11 + case "VSSubscription": return true; } break; @@ -140,6 +148,10 @@ protected virtual bool Skip (Type type, string protocolName) // iOS 10 : test throw because of generic usage case "NSMeasurement`1": return true; // skip + // xcode 9 + case "NSConstraintConflict": // Conformance not in headers + case "VSSubscription": + return true; } break; // conformance added in Xcode 8 (iOS 10 / macOS 10.12) @@ -156,6 +168,10 @@ protected virtual bool Skip (Type type, string protocolName) return true; } break; + case "NSProgressReporting": + if (!TestRuntime.CheckXcodeVersion (9, 0)) + return true; + break; } return false; } diff --git a/tests/introspection/ApiSelectorTest.cs b/tests/introspection/ApiSelectorTest.cs index 8711feda9ef5..7f371696a167 100644 --- a/tests/introspection/ApiSelectorTest.cs +++ b/tests/introspection/ApiSelectorTest.cs @@ -66,6 +66,18 @@ protected virtual bool Skip (Type type, string selectorName) // These concrete (wrapper) subclasses do not implement all of those optional members, but we // still need to provide a binding for them, so that user subclasses can implement those members. switch (type.Name) { + case "AVAggregateAssetDownloadTask": + switch (selectorName) { + case "URLAsset": // added in Xcode 9 and it is present. + return true; + } + break; + case "AVAssetDownloadStorageManager": + switch (selectorName) { + case "sharedDownloadStorageManager": // added in Xcode 9 and it is present. + return true; + } + break; case "MKCircle": case "MKPolygon": case "MKPolyline": @@ -149,6 +161,26 @@ protected virtual bool Skip (Type type, string selectorName) return true; } break; + // Xcode 9 + case "CIQRCodeFeature": + switch (selectorName) { + case "copyWithZone:": + case "encodeWithCoder:": + return !TestRuntime.CheckXcodeVersion (9, 0); + } + break; + case "CKFetchRecordZoneChangesOptions": + switch (selectorName) { + case "copyWithZone:": + return !TestRuntime.CheckXcodeVersion (9, 0); + } + break; +#if !MONOMAC + case "MTLCaptureManager": + if (Runtime.Arch == Arch.SIMULATOR) + return true; + break; +#endif } #endif // This ctors needs to be manually bound @@ -329,6 +361,115 @@ protected virtual bool Skip (Type type, string selectorName) return true; } break; + case "MTLArgumentDescriptor": + switch (selectorName) { + case "access": + case "setAccess:": + case "arrayLength": + case "setArrayLength:": + case "constantBlockAlignment": + case "setConstantBlockAlignment:": + case "dataType": + case "setDataType:": + case "index": + case "setIndex:": + case "textureType": + case "setTextureType:": + return true; + } + break; + case "MTLHeapDescriptor": + switch (selectorName) { + case "cpuCacheMode": + case "setCpuCacheMode:": + case "size": + case "setSize:": + case "storageMode": + case "setStorageMode:": + return true; + } + break; + case "MTLPipelineBufferDescriptor": + switch (selectorName) { + case "mutability": + case "setMutability:": + return true; + } + break; + case "MTLPointerType": + switch (selectorName) { + case "access": + case "alignment": + case "dataSize": + case "elementIsArgumentBuffer": + case "elementType": + return true; + } + break; + case "MTLTextureReferenceType": + switch (selectorName) { + case "access": + case "isDepthTexture": + case "textureDataType": + case "textureType": + return true; + } + break; + case "MTLType": + switch (selectorName) { + case "dataType": + return true; + } + break; + case "MTLTileRenderPipelineColorAttachmentDescriptor": + switch (selectorName) { + case "pixelFormat": + case "setPixelFormat:": + return true; + } + break; + case "MTLTileRenderPipelineDescriptor": + switch (selectorName) { + case "colorAttachments": + case "label": + case "setLabel:": + case "rasterSampleCount": + case "setRasterSampleCount:": + case "threadgroupSizeMatchesTileSize": + case "setThreadgroupSizeMatchesTileSize:": + case "tileBuffers": + case "tileFunction": + case "setTileFunction:": + return true; + } + break; + case "AVPlayerLooper": // This API got introduced in Xcode 8.0 binding but is not currently present nor in Xcode 8.3 or Xcode 9.0 needs research + switch (selectorName) { + case "isLoopingEnabled": + return true; + } + break; + case "NSQueryGenerationToken": // A test was added in monotouch tests to ensure the selector works + switch (selectorName) { + case "encodeWithCoder:": + return true; + } + break; + case "INSpeakableString": + switch (selectorName) { + case "initWithVocabularyIdentifier:spokenPhrase:pronunciationHint:": + case "initWithIdentifier:spokenPhrase:pronunciationHint:": + return true; + } + break; + case "HMCharacteristicEvent": + switch (selectorName) { + case "copyWithZone:": + case "mutableCopyWithZone:": + // Added in Xcode9 (i.e. only 64 bits) so skip 32 bits + return !TestRuntime.CheckXcodeVersion (9,0); + } + break; } // old binding mistake diff --git a/tests/introspection/ApiSignatureTest.cs b/tests/introspection/ApiSignatureTest.cs index 1fadf6807949..dfb92a153976 100644 --- a/tests/introspection/ApiSignatureTest.cs +++ b/tests/introspection/ApiSignatureTest.cs @@ -233,6 +233,10 @@ void CheckMemberSignature (MethodBase m, Type t, IntPtr class_ptr, ref int n) if (methodinfo == null && constructorinfo == null) return; + // Don't check obsolete methods, it could be obsoleted because it was broken. + if (m.GetCustomAttributes () != null) + return; + if (m.DeclaringType != t) return; @@ -388,9 +392,9 @@ static bool IgnoreSimd (Type pt) case "Vector4": case "Vector4i": case "Vector4d": - case "Matrix2": - case "Matrix3": - case "Matrix4": + case "MatrixFloat2x2": + case "MatrixFloat3x3": + case "MatrixFloat4x4": case "MDLAxisAlignedBoundingBox": // struct { Vector3, Vector3 } return true; default: @@ -675,6 +679,8 @@ protected virtual bool Check (char encodedType, Type type) case "System.Byte": // GLKBaseEffect 'instance Boolean get_ColorMaterialEnabled()' selector: colorMaterialEnabled == C8@0:4 case "System.Boolean": + // CoreNFC.NFCTypeNameFormat enum is byte + case "CoreNFC.NFCTypeNameFormat": return true; default: return false; @@ -981,6 +987,10 @@ protected virtual bool IgnoreAsync (MethodInfo m) // It does not make sense for this API case "RequestData": return m.DeclaringType.Name == "PHAssetResourceManager"; + // It does not make sense for this API + case "Register": + case "SignalEnumerator": + return m.DeclaringType.Name == "NSFileProviderManager"; } return false; } diff --git a/tests/introspection/ApiTypoTest.cs b/tests/introspection/ApiTypoTest.cs index 67de630e3795..c38f9b6aef03 100644 --- a/tests/introspection/ApiTypoTest.cs +++ b/tests/introspection/ApiTypoTest.cs @@ -24,8 +24,10 @@ using System.Linq; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using NUnit.Framework; #if XAMCORE_2_0 +using ObjCRuntime; #if MONOMAC using AppKit; #else @@ -35,6 +37,8 @@ #else #if MONOMAC using MonoMac.AppKit; +using MonoMac.ObjCRuntime; +using MonoMac.Foundation; #else using MonoTouch.UIKit; #endif @@ -58,6 +62,14 @@ public virtual bool Skip (MemberInfo methodName, string typo) { return SkipAllowed (methodName.DeclaringType.Name, methodName.Name, typo); } + HashSet allowedMemberRule4 = new HashSet { + "Platform", + "PlatformHelper", + "AvailabilityAttribute", + "iOSAttribute", + "MacAttribute", + }; + HashSet allowed = new HashSet () { "Aac", "Accurracy", @@ -85,11 +97,15 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Automapping", "Automounted", "Autoredirect", + "Avci", // file type "Aliasable", + "Arcball", "Backface", - "Bancaire", + "Bancaire", // french + "Bancaires", // french "Bary", "Batc", + "Bgra", // acrnym for Blue, Green, Red, Alpha "Bim", "Biquad", "Bitangent", @@ -118,6 +134,7 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Conflictserror", "Connnect", "Counterclock", + "Copyback", "Craete", "Crosstraining", "Cubemap", @@ -158,6 +175,7 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Ecdh", // Elliptic Curve Diffie–Hellman "Ecdsa", // Elliptic Curve Digital Signature Algorithm "Ecies", // Elliptic Curve Integrated Encryption Scheme + "Editability", "Eof", // acronym End-Of-File "Emagic", "Emaili", @@ -181,24 +199,31 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Gpp", "Gpu", // acronym for Graphics Processing Unit "Grbg", // acronym for Green-Red-Blue-Green + "Greeking", "Hdmi", "Hdr", "Hectopascals", + "Heic", // file type + "Heif", // file type "Hevc", // CMVideoCodecType / High Efficiency Video Coding + "Heif", // High Efficiency Image File Format "Hfp", "Hipass", "Hls", + "Hoa", "Hrtf", // acronym used in AUSpatializationAlgorithm "Hvxc", // MPEG4ObjectID "Ies", "Icq", "Identd", + "Imageblock", "Imagefor", "Imap", "Imaps", "Img", "Indoorrun", "Indoorcycle", + "Inklist", "Indoorwalk", "Inser", "Interac", @@ -211,6 +236,7 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Ipp", "Iptc", "Ircs", + "Itf", "Itu", "Jcb", // Japanese credit card company "Jfif", @@ -257,6 +283,7 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Mtc", // acronym "Mul", "Mult", + "Multipath", "Multipeer", "Muxed", "Nanograms", @@ -267,8 +294,10 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Ntlm", "Ntsc", "nuint", + "Ndef", "Numbernumber", "Nyquist", + "Oaep", // Optimal asymmetric encryption padding "Objectfor", "Occlussion", "Ocurrences", @@ -301,8 +330,10 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Preseti", "Propogate", "Psec", + "Psm", // Protocol/Service Multiplexer "Pvrtc", // MTLBlitOption - PowerVR Texture Compression "Quaterniond", + "Quadding", "Qura", "Quic", "Reacquirer", @@ -321,6 +352,7 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Rsa", // Rivest, Shamir and Adleman "Rssi", "Rtp", + "Rtl", "Rtsp", "Saml", // acronym "Scn", @@ -359,7 +391,9 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Superentity", "Sym", "Synchronizable", + "Symbologies", "Tanh", + "Tessellator", "Texcoord", "Texel", "th", @@ -371,6 +405,7 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Tls", "Tlv", "Toi", + "Transceive", "Truncantion", "Tweening", "tx", @@ -381,13 +416,18 @@ public virtual bool Skip (MemberInfo methodName, string typo) { "Undecodable", "Underrun", "Unflagged", + "Unfocusing", "Unorm", + "Unpremultiplied", "Unpremultiplying", "Unprepare", "Unproject", + "Unpublish", "Uterance", "Unentitled", + "Untrash", "Utf", + "Upce", "Uti", "Varispeed", "Vergence", @@ -677,6 +717,8 @@ bool IsObsolete (MemberInfo mi) return false; if (mi.GetCustomAttributes (true).Any ()) return true; + if (mi.GetCustomAttributes (true).Any ()) + return true; return IsObsolete (mi.DeclaringType); } @@ -686,7 +728,12 @@ public void TypoTest () var types = Assembly.GetTypes (); int totalErrors = 0; foreach (Type t in types) { - if (t.IsPublic && !IsObsolete (t)) { + if (t.IsPublic) { + AttributesMessageTypoRules (t, t.Name, ref totalErrors); + + if (IsObsolete (t)) + continue; + string txt = NameCleaner (t.Name); var typo = GetTypo (txt); if (typo.Length > 0 ) { @@ -698,7 +745,12 @@ public void TypoTest () var fields = t.GetFields (); foreach (FieldInfo f in fields) { - if (!f.IsPublic && !f.IsFamily && !IsObsolete (f)) + if (!f.IsPublic && !f.IsFamily) + continue; + + AttributesMessageTypoRules (f, t.Name, ref totalErrors); + + if (IsObsolete (f)) continue; txt = NameCleaner (f.Name); @@ -713,7 +765,12 @@ public void TypoTest () var methods = t.GetMethods (); foreach (MethodInfo m in methods) { - if (!m.IsPublic && !m.IsFamily && !IsObsolete (m)) + if (!m.IsPublic && !m.IsFamily) + continue; + + AttributesMessageTypoRules (m, t.Name, ref totalErrors); + + if (IsObsolete (m)) continue; txt = NameCleaner (m.Name); @@ -747,6 +804,73 @@ public void TypoTest () Assert.IsTrue ((totalErrors == 0), "We have {0} typos!", totalErrors); } + string GetMessage (object attribute) + { + string message = null; + if (attribute is AdviceAttribute) + message = ((AdviceAttribute)attribute).Message; + if (attribute is ObsoleteAttribute) + message = ((ObsoleteAttribute)attribute).Message; + if (attribute is AvailabilityBaseAttribute) + message = ((AvailabilityBaseAttribute)attribute).Message; + + return message; + } + + void AttributesMessageTypoRules (MemberInfo mi, string typeName, ref int totalErrors) + { + if (mi == null) + return; + + foreach (object ca in mi.GetCustomAttributes ()) { + string message = GetMessage (ca); + if (message != null) { + var memberAndTypeFormat = mi.Name == typeName ? "Type: {0}" : "Member name: {1}, Type: {0}"; + var memberAndType = string.Format (memberAndTypeFormat, typeName, mi.Name); + + // Rule 1: https://github.com/xamarin/xamarin-macios/wiki/BINDINGS#rule-1 + // Note: we don't enforce that rule for the Obsolete (not Obsoleted) attribute since the attribute itself doesn't support versions. + if (!(ca is ObsoleteAttribute)) { + var forbiddenOSNames = new [] { "iOS", "watchOS", "tvOS", "macOS" }; + if (forbiddenOSNames.Any (s => Regex.IsMatch (message, $"({s} ?)[0-9]+"))) { + ReportError ("[Rule 1] Don't put OS information in attribute's message: \"{0}\" - {1}", message, memberAndType); + totalErrors++; + } + } + + // Rule 2: https://github.com/xamarin/xamarin-macios/wiki/BINDINGS#rule-2 + if (message.Contains ('`')) { + ReportError ("[Rule 2] Replace grave accent (`) by apostrophe (') in attribute's message: \"{0}\" - {1}", message, memberAndType); + totalErrors++; + } + + // Rule 3: https://github.com/xamarin/xamarin-macios/wiki/BINDINGS#rule-3 + if (!message.EndsWith (".", StringComparison.Ordinal)) { + ReportError ("[Rule 3] Missing '.' in attribute's message: \"{0}\" - {1}", message, memberAndType); + totalErrors++; + } + + // Rule 4: https://github.com/xamarin/xamarin-macios/wiki/BINDINGS#rule-4 + if (!allowedMemberRule4.Contains (mi.Name)) { + var forbiddenAvailabilityKeywords = new [] { "introduced", "deprecated", "obsolete", "obsoleted" }; + if (forbiddenAvailabilityKeywords.Any (s => Regex.IsMatch (message, $"({s})", RegexOptions.IgnoreCase))) { + ReportError ("[Rule 4] Don't use availability keywords in attribute's message: \"{0}\" - {1}", message, memberAndType); + totalErrors++; + } + } + + var forbiddensWords = new [] { "OSX", "OS X" }; + for (int i = 0; i < forbiddensWords.Length; i++) { + var word = forbiddensWords [i]; + if (Regex.IsMatch (message, $"({word})", RegexOptions.IgnoreCase)) { + ReportError ("Don't use {0} in attribute's message: \"{1}\" - {2}", word, message, memberAndType); + totalErrors++; + } + } + } + } + } + public abstract string GetTypo (string txt); static StringBuilder clean = new StringBuilder (); diff --git a/tests/introspection/Mac/MacApiCtorInitTest.cs b/tests/introspection/Mac/MacApiCtorInitTest.cs index 9165cd462dd3..fa293083c5b4 100644 --- a/tests/introspection/Mac/MacApiCtorInitTest.cs +++ b/tests/introspection/Mac/MacApiCtorInitTest.cs @@ -43,6 +43,29 @@ protected override bool Skip (Type type) case "MonoMac.QuickLookUI.QLPreviewPanel": return true; // These should be DisableDefaultCtor but can't due to backward compat + case "MonoMac.AppKit.NSCollectionViewTransitionLayout": + case "AppKit.NSCollectionViewTransitionLayout": + case "Foundation.NSUnitDispersion": // -init should never be called on NSUnit! + case "Foundation.NSUnitVolume": // -init should never be called on NSUnit! + case "Foundation.NSUnitDuration": // -init should never be called on NSUnit! + case "Foundation.NSUnitElectricCharge": // -init should never be called on NSUnit! + case "Foundation.NSUnitElectricCurrent": // -init should never be called on NSUnit! + case "Foundation.NSUnitElectricPotentialDifference": // -init should never be called on NSUnit! + case "Foundation.NSUnitElectricResistance": // -init should never be called on NSUnit! + case "Foundation.NSUnit": // -init should never be called on NSUnit! + case "Foundation.NSUnitEnergy": // -init should never be called on NSUnit! + case "Foundation.NSUnitAcceleration": // -init should never be called on NSUnit! + case "Foundation.NSUnitFrequency": // -init should never be called on NSUnit! + case "Foundation.NSUnitAngle": // -init should never be called on NSUnit! + case "Foundation.NSUnitFuelEfficiency": // -init should never be called on NSUnit! + case "Foundation.NSUnitArea": // -init should never be called on NSUnit! + case "Foundation.NSUnitIlluminance": // -init should never be called on NSUnit! + case "Foundation.NSUnitConcentrationMass": // -init should never be called on NSUnit! + case "Foundation.NSUnitLength": // -init should never be called on NSUnit! + case "Foundation.NSUnitMass": // -init should never be called on NSUnit! + case "Foundation.NSUnitPower": // -init should never be called on NSUnit! + case "Foundation.NSUnitPressure": // -init should never be called on NSUnit! + case "Foundation.NSUnitSpeed": // -init should never be called on NSUnit! case "MonoMac.EventKit.EKParticipant": case "EventKit.EKParticipant": case "XamCore.CoreImage.CISampler": @@ -180,6 +203,11 @@ protected override void CheckNSObjectProtocol (NSObject obj) protected override void CheckToString (NSObject obj) { switch (obj.GetType ().FullName) { + // Crashes on 10.13 + case "MonoMac.AppKit.NSStoryboard": + case "AppKit.NSStoryboard": + case "MonoMac.AVFoundation.AVCaptureInputPort": // https://bugzilla.xamarin.com/show_bug.cgi?id=57668 + case "AVFoundation.AVCaptureInputPort": // https://bugzilla.xamarin.com/show_bug.cgi?id=57668 // Crashes on 10.12 case "Contacts.CNContainer": // native crash calling MonoMac.Foundation.NSObject.get_Description () @@ -242,6 +270,8 @@ protected override void Dispose (NSObject obj, Type type) case "CoreData.NSPersistentStoreCoordinator": case "AppKit.NSColorPanel": case "MonoMac.AppKit.NSColorPanel": + case "Foundation.NSFileProviderService": + case "MonoMac.Foundation.NSFileProviderService": do_not_dispose.Add (obj); break; // 10.11 diff --git a/tests/introspection/Mac/MacApiFieldTest.cs b/tests/introspection/Mac/MacApiFieldTest.cs index 8b3e2a345250..9026a486d726 100644 --- a/tests/introspection/Mac/MacApiFieldTest.cs +++ b/tests/introspection/Mac/MacApiFieldTest.cs @@ -79,6 +79,8 @@ protected override bool Skip (PropertyInfo p) } switch (p.Name) { + case "CharacteristicValidRangeString": + return Mac.CheckSystemVersion (10, 13); // radar 32858911 // NSTableView case "RowViewKey": return true; @@ -158,9 +160,13 @@ protected override bool Skip (PropertyInfo p) } } - protected override bool Skip (string constantName) + protected override bool Skip (string constantName, string libraryName) { switch (constantName) { + case "CBUUIDValidRangeString": + if (Mac.CheckSystemVersion (10, 13)); // radar 32858911 + return true; + break; // Only there for API compat case "kSecUseNoAuthenticationUI": case "kSecUseOperationPrompt": @@ -177,7 +183,7 @@ protected override bool Skip (string constantName) return true; goto default; default: - return base.Skip (constantName); + return base.Skip (constantName, libraryName); } } diff --git a/tests/introspection/Mac/MacApiProtocolTest.cs b/tests/introspection/Mac/MacApiProtocolTest.cs index eaf2c295db9e..6f9b5b4596db 100644 --- a/tests/introspection/Mac/MacApiProtocolTest.cs +++ b/tests/introspection/Mac/MacApiProtocolTest.cs @@ -52,6 +52,21 @@ protected override bool Skip (Type type, string protocolName) case "SFSafariWindow": // Not declared in header file case "SFContentBlockerState": // Not declared in header file case "NEFlowMetaData": // Not declared in header file + case "MKMapItem": // Not declared in header file + case "CAConstraintLayoutManager": // Not declared in header file + case "NSQueryGenerationToken": // Declared in header file but SupportsSecureCoding returns false - radar 32856944 + case "NSPersistentHistoryToken": // Conformance not in headers + case "NSPropertyDescription": // NSPropertyDescription and children does not declare in header file + case "NSAttributeDescription": + case "NSExpressionDescription": + case "NSFetchedPropertyDescription": + case "NSRelationshipDescription": + case "NSEntityDescription": // Not declared in header file + case "NSFetchIndexDescription": // Not declared in header file + case "NSFetchIndexElementDescription": // Not declared in header file + case "NSFetchRequest": // Not declared in header file + case "NSManagedObjectModel": // Not declared in header file + case "NSUserInterfaceCompressionOptions": // Not declared in header file return true; default: // CIFilter started implementing NSSecureCoding in 10.11 @@ -72,6 +87,7 @@ protected override bool Skip (Type type, string protocolName) case "EKReminder": // Not declared in header file case "ACAccount": // Not declared in header file case "NEFlowMetaData": // Not declared in header file + case "ACAccountCredential": // Not declared in header file return true; } break; @@ -87,6 +103,7 @@ protected override bool Skip (Type type, string protocolName) case "EKParticipant": // Not declared in header file case "EKRecurrenceRule": // Not declared in header file case "EKReminder": // Not declared in header file + case "INPerson": // Not declared in header file return true; } break; @@ -114,6 +131,10 @@ protected override bool Skip (Type type, string protocolName) case "SFSafariToolbarItem": // Not declared in header file case "SFSafariWindow": // Not declared in header file case "NEFlowMetaData": // Not declared in header file + case "MKMapItem": // Not declared in header file + case "NSConstraintConflict": // Not declared in header file + case "NSQueryGenerationToken": // Declared in header file but SupportsSecureCoding returns false - radar 32856944 + case "NSPersistentHistoryToken": // Conformance not in headers return true; } break; @@ -180,6 +201,22 @@ protected override bool Skip (Type type, string protocolName) break; case "NSExtensionRequestHandling": return IntPtr.Size == 4; + case "NSAppearanceCustomization": + switch (type.Name) { + case "NSPopover": + if (!Mac.CheckSystemVersion (10, 13)) // Was added in 10.13 + return true; + break; + } + break; + case "NSUserInterfaceValidations": + switch (type.Name) { + case "NSSplitViewController": + if (!Mac.CheckSystemVersion (10, 13)) // Was added in 10.13 + return true; + break; + } + break; } switch (type.Name) { diff --git a/tests/introspection/Mac/MacApiSelectorTest.cs b/tests/introspection/Mac/MacApiSelectorTest.cs index 026d5a419bd4..528687b2b63e 100644 --- a/tests/introspection/Mac/MacApiSelectorTest.cs +++ b/tests/introspection/Mac/MacApiSelectorTest.cs @@ -41,6 +41,9 @@ public MacApiSelectorTest () protected override bool Skip (Type type) { switch (type.FullName) { + case "MonoMac.AppKit.NSWindowTabGroup": + case "AppKit.NSWindowTabGroup": + return true; /// 32930276 case "MonoMac.CIFilter.CIMaskedVariableBlur": // Appears to be missing from 10.11, not documented case "CIFilter.CIMaskedVariableBlur": if (Mac.CheckSystemVersion (10, 11)) @@ -323,6 +326,15 @@ protected override bool Skip (Type type, string selectorName) if (Mac.CheckSystemVersion (10, 11)) return true; break; + case "earliestBeginDate": + case "setEarliestBeginDate:": + case "countOfBytesClientExpectsToSend": + case "setCountOfBytesClientExpectsToSend:": + case "countOfBytesClientExpectsToReceive": + case "setCountOfBytesClientExpectsToReceive:": + if (Mac.CheckSystemVersion (10, 13)) + return true; + break; } break; case "NSUrlSessionConfiguration": diff --git a/tests/introspection/Mac/MacApiSignatureTest.cs b/tests/introspection/Mac/MacApiSignatureTest.cs index b5a45bca57d7..9ba5f6d77d26 100644 --- a/tests/introspection/Mac/MacApiSignatureTest.cs +++ b/tests/introspection/Mac/MacApiSignatureTest.cs @@ -63,6 +63,23 @@ protected override bool Skip (Type type, MethodBase method, string selector) return true; switch (type.Name) { + case "PdfDocument": + switch (selector) { + case "majorVersion": // radar 32884659 + case "minorVersion": + return true; + } + break; + + case "NSPopover": + switch (selector) { + // Apple re-used these selectors for a new property of same size but different type + // We've obsoleteted the "old" one + case "appearance": + case "setAppearance:": + return true; + } + break; case "AVPlayerItemOutput": case "AVPlayerItemVideoOutput": case "NSSharingService": diff --git a/tests/introspection/Mac/MacCoreImageFiltersTest.cs b/tests/introspection/Mac/MacCoreImageFiltersTest.cs index 0a7cdc77c706..821c7eae116b 100644 --- a/tests/introspection/Mac/MacCoreImageFiltersTest.cs +++ b/tests/introspection/Mac/MacCoreImageFiltersTest.cs @@ -33,6 +33,7 @@ public class MacCoreImageFiltersTest : ApiCoreImageFiltersTest protected override bool Skip (string nativeName) { switch (nativeName) { + case "CIEdgePreserveUpsampleFilter": // Appears in 10.13 but not documented case "CIMaskedVariableBlur": // Appears removed in 10.11 but not documented if (Mac.CheckSystemVersion (10, 11)) return true; diff --git a/tests/introspection/Mac/introspection-mac.csproj b/tests/introspection/Mac/introspection-mac.csproj index 6b8d613be26e..438c406bd4f9 100644 --- a/tests/introspection/Mac/introspection-mac.csproj +++ b/tests/introspection/Mac/introspection-mac.csproj @@ -3,7 +3,7 @@ Debug x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334} + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA} {42C0BBD9-55CE-4FC1-8D90-A7348ABAFB23};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Exe introspection diff --git a/tests/introspection/iOS/iOSApiCtorInitTest.cs b/tests/introspection/iOS/iOSApiCtorInitTest.cs index acb751c033ae..f32ba9b3a6a1 100644 --- a/tests/introspection/iOS/iOSApiCtorInitTest.cs +++ b/tests/introspection/iOS/iOSApiCtorInitTest.cs @@ -73,6 +73,11 @@ protected override bool Skip (Type type) return true; break; #endif // !__WATCHOS__ + case "CoreNFC": // Only available on device + case "DeviceCheck": // Only available on device + if (Runtime.Arch == Arch.SIMULATOR) + return true; + break; } switch (type.Name) { @@ -196,6 +201,19 @@ protected override bool Skip (Type type) case "INStartWorkoutIntent": return true; #endif + // iOS 11 Beta 1 + case "UICollectionViewFocusUpdateContext": // [Assert] -init is not a useful initializer for this class. Use one of the designated initializers instead + case "UIFocusUpdateContext": // [Assert] -init is not a useful initializer for this class. Use one of the designated initializers instead + case "EKCalendarItem": // Fails with NSInvalidArgumentException +[EKCalendarItem frozenClass]: unrecognized selector sent to class, will fill a radar + case "EKParticipant": // ctor disabled in XAMCORE_3_0 + case "UITableViewFocusUpdateContext": // Objective-C exception thrown. Name: NSInternalInconsistencyException Reason: Invalid parameter not satisfying: focusSystem, will fill a radar + return true; + case "INBookRestaurantReservationIntentResponse": // iOS 11 beta 2: stack overflow in description. radar:32945914 + return true; + case "MPVolumeView": // Started failing with Xcode 9 beta 3 + return true; + case "IOSurface": // Only works on device + return Runtime.Arch == Arch.SIMULATOR; default: return base.Skip (type); } @@ -322,6 +340,11 @@ protected override void CheckToString (NSObject obj) if (TestRuntime.CheckXcodeVersion (8, 0)) return; break; + // Xcode 9 Beta 1 to avoid crashes + case "CIImageAccumulator": + if (TestRuntime.CheckXcodeVersion (9, 0)) + return; + break; default: base.CheckToString (obj); break; diff --git a/tests/introspection/iOS/iOSApiFieldTest.cs b/tests/introspection/iOS/iOSApiFieldTest.cs index e09f94045e8e..0e964664fb77 100644 --- a/tests/introspection/iOS/iOSApiFieldTest.cs +++ b/tests/introspection/iOS/iOSApiFieldTest.cs @@ -53,9 +53,15 @@ protected override bool Skip (PropertyInfo p) case "MonoTouch.MetalKit": case "MetalPerformanceShaders": case "MonoTouch.MetalPerformanceShaders": + case "CoreNFC": // Only available on device + case "DeviceCheck": // Only available on device if (Runtime.Arch == Arch.SIMULATOR) return true; break; + case "IOSurface": + // Available in the simulator starting with iOS 11 + return Runtime.Arch == Arch.SIMULATOR && !TestRuntime.CheckXcodeVersion (9, 0); + } switch (p.Name) { @@ -104,8 +110,13 @@ protected override bool Skip (PropertyInfo p) } } - protected override bool Skip (string constantName) + protected override bool Skip (string constantName, string libraryName) { + switch (libraryName) { + case "IOSurface": + return Runtime.Arch == Arch.SIMULATOR && !TestRuntime.CheckXcodeVersion (9, 0); + } + switch (constantName) { // grep ImageIO binary shows those symbols are not part of the binary // that match older results (nil) when loading them (see above) @@ -134,6 +145,7 @@ protected override bool Skip (string constantName) case "MTKTextureLoaderOptionTextureCPUCacheMode": case "MTKModelErrorDomain": case "MTKModelErrorKey": + case "NFCISO15693TagResponseErrorKey": // Not in simulator since no NFC on it return Runtime.Arch == Arch.SIMULATOR; default: return false; diff --git a/tests/introspection/iOS/iOSApiProtocolTest.cs b/tests/introspection/iOS/iOSApiProtocolTest.cs index 614c40e0a773..03784e6d9494 100644 --- a/tests/introspection/iOS/iOSApiProtocolTest.cs +++ b/tests/introspection/iOS/iOSApiProtocolTest.cs @@ -157,6 +157,11 @@ protected override bool Skip (Type type, string protocolName) case "PKPaymentRequest": case "PKPaymentToken": case "PKLabeledValue": + case "PKPaymentAuthorizationResult": + case "PKPaymentRequestShippingMethodUpdate": + case "PKPaymentRequestUpdate": + case "PKPaymentRequestPaymentMethodUpdate": + case "PKPaymentRequestShippingContactUpdate": // iOS9 case "UIFont": case "AVAssetTrackSegment": @@ -183,6 +188,32 @@ protected override bool Skip (Type type, string protocolName) case "MPMusicPlayerControllerMutableQueue": case "MPMusicPlayerControllerQueue": return true; + // iOS 11.0 + case "UICollectionViewUpdateItem": // Conformance not in headers + case "MKMapItem": // Conformance not in headers + case "NSConstraintConflict": // Conformance not in headers + case "NSQueryGenerationToken": // Conformance not in headers + case "NSPersistentHistoryToken": // Conformance not in headers + case "ARCamera": + case "HMPresenceEvent": + case "HMMutablePresenceEvent": + case "HMSignificantTimeEvent": + case "HMMutableSignificantTimeEvent": + case "HMCalendarEvent": + case "HMMutableCalendarEvent": + case "HMCharacteristicThresholdRangeEvent": + case "HMMutableCharacteristicThresholdRangeEvent": + case "HMDurationEvent": + case "HMMutableDurationEvent": + case "HMMutableCharacteristicEvent": + case "HMMutableLocationEvent": + case "HMTimeEvent": + case "ILMessageFilterExtensionContext": // Conformance not in headers + case "MSMessageLiveLayout": + case "NSFileProviderDomain": // Conformance not in headers + case "FPUIActionExtensionContext": // Conformance not in headers + case "UIDocumentBrowserAction": // Conformance not in headers + return true; #if __WATCHOS__ case "CLKComplicationTemplate": case "CLKComplicationTemplateCircularSmallRingImage": @@ -258,6 +289,11 @@ protected override bool Skip (Type type, string protocolName) case "PKPaymentRequest": case "PKPaymentToken": case "PKLabeledValue": + case "PKPaymentAuthorizationResult": + case "PKPaymentRequestShippingMethodUpdate": + case "PKPaymentRequestUpdate": + case "PKPaymentRequestPaymentMethodUpdate": + case "PKPaymentRequestShippingContactUpdate": // iOS9 case "UIFont": case "AVAssetTrackSegment": @@ -285,6 +321,40 @@ protected override bool Skip (Type type, string protocolName) case "MPMusicPlayerControllerMutableQueue": case "MPMusicPlayerControllerQueue": return true; + // iOS 11.0 + case "MKMapItem": // Conformance not in headers + case "NSQueryGenerationToken": // Conformance not in headers + case "NSPersistentHistoryToken": // Conformance not in headers + case "ARCamera": + case "HMPresenceEvent": + case "HMMutablePresenceEvent": + case "HMSignificantTimeEvent": + case "HMMutableSignificantTimeEvent": + case "HMCalendarEvent": + case "HMMutableCalendarEvent": + case "HMCharacteristicThresholdRangeEvent": + case "HMMutableCharacteristicThresholdRangeEvent": + case "HMDurationEvent": + case "HMMutableDurationEvent": + case "HMMutableCharacteristicEvent": + case "HMMutableLocationEvent": + case "HMTimeEvent": + case "ILMessageFilterExtensionContext": // Conformance not in headers + case "NSAttributeDescription": + case "NSEntityDescription": + case "NSExpressionDescription": + case "NSFetchedPropertyDescription": + case "NSFetchIndexDescription": + case "NSFetchIndexElementDescription": + case "NSFetchRequest": + case "NSManagedObjectModel": + case "NSPropertyDescription": + case "NSRelationshipDescription": + case "MSMessageLiveLayout": + case "NSFileProviderDomain": // Conformance not in headers + case "FPUIActionExtensionContext": // Conformance not in headers + case "UIDocumentBrowserAction": // Conformance not in headers + return true; #if __WATCHOS__ case "CLKComplicationTemplate": case "CLKComplicationTemplateCircularSmallRingImage": @@ -335,7 +405,6 @@ protected override bool Skip (Type type, string protocolName) switch (type.Name) { // undocumented conformance (up to 7.0) and conformity varies between iOS versions case "MKDirectionsRequest": - case "MPMediaItem": case "MPMediaPlaylist": case "MPMediaItemCollection": case "MPMediaEntity": @@ -363,6 +432,17 @@ protected override bool Skip (Type type, string protocolName) // iOS 10.2 case "VSAccountProviderResponse": return true; + // iOS 11.0 + case "UICollectionViewUpdateItem": // Conformance not in headers + case "ACAccountCredential": // b2: Conformance not in headers + case "ILMessageFilterExtensionContext": // b2: Conformance not in headers + case "HMCharacteristicEvent": // Selectors not available on 32 bit + case "NSFileProviderDomain": // Conformance not in headers + case "FPUIActionExtensionContext": // Conformance not in headers + case "CXCall": // Conformance not in headers + case "UIDocumentBrowserAction": // Conformance not in headers + return true; + #if __WATCHOS__ case "CLKComplicationTimelineEntry": return true; @@ -375,6 +455,11 @@ protected override bool Skip (Type type, string protocolName) // iOS 10.3 case "MPMusicPlayerControllerMutableQueue": case "MPMusicPlayerControllerQueue": + // iOS 11 + case "INRideDriver": + case "INRestaurantGuest": + case "INPerson": + case "HMCharacteristicEvent": // Selectors not available on 32 bit return true; } break; @@ -434,6 +519,9 @@ protected override bool Skip (Type type, string protocolName) case "SKVideoNode": case "SKSpriteNode": return !TestRuntime.CheckXcodeVersion (8,0); + case "SCNNode": + case "SCNReferenceNode": + return !TestRuntime.CheckXcodeVersion (9,0); } break; @@ -544,6 +632,9 @@ protected override bool Skip (Type type, string protocolName) case "UIVisualEffectView": case "UIWindow": return !TestRuntime.CheckXcodeVersion (8, 0); + case "SCNNode": + case "SCNReferenceNode": + return !TestRuntime.CheckXcodeVersion (9,0); } break; @@ -555,6 +646,23 @@ protected override bool Skip (Type type, string protocolName) return !TestRuntime.CheckXcodeVersion (8, 0); } break; + + case "UISpringLoadedInteractionSupporting": // types do not conform to protocol but protocol methods work on those types (see monotouch-test) + switch (type.Name) { + case "UIButton": + case "UICollectionView": + case "UISegmentedControl": + case "UITableView": + case "UITabBar": + case "UIAlertController": + case "PKPaymentButton": + case "PKAddPassButton": + return true; + } + break; + + case "UIPasteConfigurationSupporting": // types do not conform to protocol but protocol methods work on those types (base type tests in monotouch-test) + return true; // Skip everything because 'UIResponder' implements 'UIPasteConfigurationSupporting' and that's 130+ types } return base.Skip (type, protocolName); } diff --git a/tests/introspection/iOS/iOSApiSelectorTest.cs b/tests/introspection/iOS/iOSApiSelectorTest.cs index 28113dadbdb5..f16275b03dd4 100644 --- a/tests/introspection/iOS/iOSApiSelectorTest.cs +++ b/tests/introspection/iOS/iOSApiSelectorTest.cs @@ -61,6 +61,12 @@ protected override bool Skip (Type type) if (Runtime.Arch == Arch.SIMULATOR) return true; break; + // Xcode 9 + case "CoreNFC": + case "DeviceCheck": + if (Runtime.Arch == Arch.SIMULATOR) + return true; + break; // Apple does not ship a PushKit for every arch on some devices :( // case "PushKit": @@ -86,8 +92,9 @@ protected override bool Skip (Type type) case "UILocalNotification": return true; - // Metal is not available on the (iOS8) simulator + // Metal is not available on the simulator case "CAMetalLayer": + case "SKRenderer": return (Runtime.Arch == Arch.SIMULATOR); // iOS 10 - this type can only be instantiated on devices, but the selectors are forwarded @@ -176,6 +183,16 @@ protected override bool CheckResponse (bool value, Type actualType, MethodBase m if (TestRuntime.CheckXcodeVersion (7, 0)) return true; break; + case "earliestBeginDate": + case "setEarliestBeginDate:": + case "countOfBytesClientExpectsToSend": + case "setCountOfBytesClientExpectsToSend:": + case "countOfBytesClientExpectsToReceive": + case "setCountOfBytesClientExpectsToReceive:": + case "progress": + if (TestRuntime.CheckXcodeVersion (9, 0)) + return true; + break; } break; case "NSUrlSessionConfiguration": @@ -207,19 +224,20 @@ protected override bool CheckResponse (bool value, Type actualType, MethodBase m break; } break; - case "SKNode": + case "SKNode": // iOS 10+ + case "SCNNode": // iOS 11+ switch (name) { - // UIFocus protocol conformance on iOS10+ + // UIFocus protocol conformance case "didUpdateFocusInContext:withAnimationCoordinator:": case "setNeedsFocusUpdate": case "shouldUpdateFocusInContext:": case "updateFocusIfNeeded": -#if __TVOS__ case "canBecomeFocused": -#else +#if !__TVOS__ case "preferredFocusedView": #endif - if (!TestRuntime.CheckXcodeVersion (8, 0)) + int major = declaredType.Name == "SKNode" ? 8 : 9; + if (!TestRuntime.CheckXcodeVersion (major, 0)) return true; break; #if __TVOS__ @@ -228,6 +246,48 @@ protected override bool CheckResponse (bool value, Type actualType, MethodBase m #endif } break; + case "CIContext": + switch (name) { + case "render:toIOSurface:bounds:colorSpace:": + if (Runtime.Arch == Arch.SIMULATOR) + return true; + if (!TestRuntime.CheckXcodeVersion (9, 0)) + return true; + break; + } + break; + case "CIImage": + switch (name) { + case "initWithIOSurface:": + case "initWithIOSurface:options:": + if (Runtime.Arch == Arch.SIMULATOR) + return true; + if (!TestRuntime.CheckXcodeVersion (9, 0)) + return true; + break; + } + break; + case "CIRenderDestination": + switch (name) { + case "initWithIOSurface:": + if (Runtime.Arch == Arch.SIMULATOR) + return true; + if (!TestRuntime.CheckXcodeVersion (9, 0)) + return true; + break; + } + break; + case "EAGLContext": + switch (name) { + // symbol only exists on devices (not in simulator libraries) + case "texImageIOSurface:target:internalFormat:width:height:format:type:plane:": + if (Runtime.Arch == Arch.SIMULATOR) + return true; + if (!TestRuntime.CheckXcodeVersion (9, 0)) + return true; + break; + } + break; } switch (name) { @@ -578,6 +638,8 @@ protected override bool CheckResponse (bool value, Type actualType, MethodBase m return !TestRuntime.CheckXcodeVersion (7, 0); case "HKWorkoutEvent": return !TestRuntime.CheckXcodeVersion (8, 0); + case "HMLocationEvent": + return !TestRuntime.CheckXcodeVersion (9, 0); } break; @@ -633,6 +695,9 @@ protected override bool CheckResponse (bool value, Type actualType, MethodBase m case "HKBiologicalSexObject": case "HKBloodTypeObject": return !TestRuntime.CheckXcodeVersion (7, 0); + case "MPSKernel": + case "MPSCnnConvolutionDescriptor": + return !TestRuntime.CheckXcodeVersion (9, 0); #if __TVOS__ case "SKAttribute": case "SKAttributeValue": @@ -649,6 +714,12 @@ protected override bool CheckResponse (bool value, Type actualType, MethodBase m return true; break; #endif + case "mutableCopyWithZone:": + switch (declaredType.Name) { + case "HMLocationEvent": + return !TestRuntime.CheckXcodeVersion (9, 0); + } + break; } return base.CheckResponse (value, actualType, method, ref name); @@ -664,6 +735,17 @@ protected override bool CheckStaticResponse (bool value, Type actualType, Type d return true; } break; + case "imageWithIOSurface:": + case "imageWithIOSurface:options:": + switch (declaredType.Name) { + case "CIImage": + if (Runtime.Arch == Arch.SIMULATOR) + return true; + if (!TestRuntime.CheckXcodeVersion (9, 0)) + return true; + break; + } + break; #if __WATCHOS__ case "fetchAllRecordZonesOperation": case "fetchCurrentUserRecordOperation": diff --git a/tests/introspection/iOS/iOSApiWeakPropertyTest.cs b/tests/introspection/iOS/iOSApiWeakPropertyTest.cs index 2c2f3c84b84c..a2b28b194489 100644 --- a/tests/introspection/iOS/iOSApiWeakPropertyTest.cs +++ b/tests/introspection/iOS/iOSApiWeakPropertyTest.cs @@ -39,6 +39,9 @@ protected override bool Skip (PropertyInfo property) // UIStringAttributes is a DictionaryContainer that expose a Weak* NSString case "UIStringAttributes": return property.Name == "WeakTextEffect"; + // VNImageOptions is a DictionaryContainer that exposes a Weak* NSDictionary + case "VNImageOptions": + return property.Name == "WeakProperties"; #if !XAMCORE_3_0 // #37451 - setter does not exists but we have to keep it for binary compatibility // OTOH we can't give it a selector (private API) even if we suspect Apple is mostly running `strings` on executable diff --git a/tests/linker-ios/link sdk/DllImportTest.cs b/tests/linker-ios/link sdk/DllImportTest.cs index 46053907b383..cdc6a99053fb 100644 --- a/tests/linker-ios/link sdk/DllImportTest.cs +++ b/tests/linker-ios/link sdk/DllImportTest.cs @@ -53,20 +53,29 @@ public void Sqlite3 () Assert.That (Dlfcn.dlsym (lib, "sqlite3_bind_int"), Is.Not.EqualTo (IntPtr.Zero), "sqlite3_bind_int"); // iOS does not have some symbols defined - if that change/fail in the future we'll need to update Mono.Data.Sqlite // note: Apple devices (at least iOS and AppleTV) running 10.x have a more recent version of libsqlite which includes _key and _rekey - var version = TestRuntime.CheckXcodeVersion (8, 0); - if (version && (Runtime.Arch == Arch.DEVICE)) { - Assert.That (Dlfcn.dlsym (lib, "sqlite3_key"), Is.Not.EqualTo (IntPtr.Zero), "sqlite3_key"); - Assert.That (Dlfcn.dlsym (lib, "sqlite3_rekey"), Is.Not.EqualTo (IntPtr.Zero), "sqlite3_rekey"); - } else { - Assert.That (Dlfcn.dlsym (lib, "sqlite3_key"), Is.EqualTo (IntPtr.Zero), "sqlite3_key"); - Assert.That (Dlfcn.dlsym (lib, "sqlite3_rekey"), Is.EqualTo (IntPtr.Zero), "sqlite3_rekey"); - } - Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_database_name"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_database_name"); - Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_database_name16"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_database_name16"); - Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_origin_name"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_origin_name"); - Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_origin_name16"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_origin_name16"); - Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_table_name"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_table_name"); - Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_table_name16"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_table_name16"); + // note 2: simulators also got the new libsqlite version with Xcode 9, and since Xcode 9 ships an ever newer sqlite version, + // we get even more API as well. + var hasNewerSqlite = TestRuntime.CheckXcodeVersion (9, 0); + var hasNewSqlite = hasNewerSqlite || TestRuntime.CheckXcodeVersion (8, 0) && Runtime.Arch == Arch.DEVICE; + + var new_symbols = new string [] { + "sqlite3_key", + "sqlite3_rekey", + }; + var newer_symbols = new string [] { + "sqlite3_column_database_name", + "sqlite3_column_database_name16", + "sqlite3_column_origin_name", + "sqlite3_column_origin_name16", + "sqlite3_column_table_name", + "sqlite3_column_table_name16", + }; + + foreach (var symbol in new_symbols) + Assert.That (Dlfcn.dlsym (lib, symbol), hasNewSqlite ? Is.Not.EqualTo (IntPtr.Zero) : Is.EqualTo (IntPtr.Zero), symbol); + + foreach (var symbol in newer_symbols) + Assert.That (Dlfcn.dlsym (lib, symbol), hasNewerSqlite ? Is.Not.EqualTo (IntPtr.Zero) : Is.EqualTo (IntPtr.Zero), symbol); } finally { Dlfcn.dlclose (lib); diff --git a/tests/mmptest/src/FrameworkLinksTests.cs b/tests/mmptest/src/FrameworkLinksTests.cs index 30c4acb6315d..c96e0a0dec57 100644 --- a/tests/mmptest/src/FrameworkLinksTests.cs +++ b/tests/mmptest/src/FrameworkLinksTests.cs @@ -1,4 +1,6 @@ -using System; +#define ENABLE_STATIC_REGISTRAR_TESTS + +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -70,9 +72,11 @@ public void UnifiedWithoutLinking_ShouldHaveManyFrameworkClangLines () string [] clangParts = GetUnifiedProjectClangInvocation (tmpDir); AssertUnlinkedFrameworkStatus (clangParts); +#if ENABLE_STATIC_REGISTRAR_TESTS // Even with static registrar clangParts = GetUnifiedProjectClangInvocation (tmpDir, StaticRegistrarConfig); AssertUnlinkedFrameworkStatus (clangParts); +#endif }); } @@ -96,9 +100,11 @@ public void UnifiedWithLinking_ShouldHaveFewFrameworkClangLines () string[] clangParts = GetUnifiedProjectClangInvocation (tmpDir, LinkerEnabledConfig); AssertLinkedFrameworkStatus (clangParts); +#if ENABLE_STATIC_REGISTRAR_TESTS // Even with static registrar clangParts = GetUnifiedProjectClangInvocation (tmpDir, LinkerEnabledConfig + StaticRegistrarConfig); AssertLinkedFrameworkStatus (clangParts); +#endif }); } diff --git a/tests/mmptest/src/MMPTest.cs b/tests/mmptest/src/MMPTest.cs index a760047f9b11..8b09cc6ef9c9 100644 --- a/tests/mmptest/src/MMPTest.cs +++ b/tests/mmptest/src/MMPTest.cs @@ -1,3 +1,5 @@ +#define ENABLE_STATIC_REGISTRAR_TESTS + using System; using System.Collections.Generic; using System.Diagnostics; @@ -67,7 +69,9 @@ public void CollisionBetweenEXEAndSDKAssembly_ShouldFailBuild () }); } +#if ENABLE_STATIC_REGISTRAR_TESTS [Test] +#endif public void Unified_Static_RegistrarTest () { if (!PlatformHelpers.CheckSystemVersion (10, 11)) @@ -607,7 +611,9 @@ public void Unified_SideBySideXamMac_ConsoleTest () }); } +#if ENABLE_STATIC_REGISTRAR_TESTS [Test] +#endif public void UnifiedDebugBuilds_ShouldLinkToPartialStatic_UnlessDisabled () { RunMMPTest (tmpDir => diff --git a/tests/mmptest/src/TargetFrameworkDetectionTests.cs b/tests/mmptest/src/TargetFrameworkDetectionTests.cs index aaa0bf05249e..35de6abb24a0 100644 --- a/tests/mmptest/src/TargetFrameworkDetectionTests.cs +++ b/tests/mmptest/src/TargetFrameworkDetectionTests.cs @@ -23,7 +23,7 @@ string CreateTestExe (string tmpDir) string GetTestMMPInvocation (string tmpDir, string libPath, TargetFramework targetFramework, bool correctReference = true) { string xmReference = correctReference ? GetXMReference (targetFramework) : GetWrongXMReference (targetFramework); - return $"-v -v -v -v -v --output={tmpDir} --arch=x86_64 --sdkroot {Configuration.xcode_root} --minos 10.7 {libPath} --sdk 10.12 --nolink -p --profile:{targetFramework} -a:{xmReference}"; + return $"-v -v -v -v -v --output={tmpDir} --arch=x86_64 --sdkroot {Configuration.xcode_root} --minos 10.7 {libPath} --sdk {Configuration.macos_sdk_version} --nolink -p --profile:{targetFramework} -a:{xmReference}"; } string GetWrongXMReference (TargetFramework target) diff --git a/tests/monotouch-test/ARKit/ARPointCloudTest.cs b/tests/monotouch-test/ARKit/ARPointCloudTest.cs new file mode 100644 index 000000000000..1d2ec5650a1e --- /dev/null +++ b/tests/monotouch-test/ARKit/ARPointCloudTest.cs @@ -0,0 +1,104 @@ +// +// Unit tests for ARPointCloud +// +// Authors: +// Vincent Dondain +// +// Copyright 2017 Microsoft. All rights reserved. +// + +#if XAMCORE_2_0 && __IOS__ + +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using ARKit; +using AVFoundation; +using Foundation; +using NUnit.Framework; +using ObjCRuntime; + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + +namespace MonoTouchFixtures.ARKit { + + class ARPointCloudPoker : ARPointCloud { + + GCHandle vectorArrayHandle; + GCHandle identifiersHandle; + VectorFloat3 [] vectorArray; + ulong [] identifiers; + + public ARPointCloudPoker () : base (IntPtr.Zero) + { + } + + public override nuint Count { + get { + return 2; + } + } + + protected unsafe override IntPtr GetRawPoints () + { + vectorArray = new VectorFloat3 [] { new VectorFloat3 (1, 2, 3), new VectorFloat3 (4, 5, 6) }; + if (!vectorArrayHandle.IsAllocated) + vectorArrayHandle = GCHandle.Alloc (vectorArray, GCHandleType.Pinned); + return vectorArrayHandle.AddrOfPinnedObject (); + } + + protected unsafe override IntPtr GetRawIdentifiers () + { + identifiers = new ulong [] { 0, 1 }; + if (!identifiersHandle.IsAllocated) + identifiersHandle = GCHandle.Alloc (identifiers, GCHandleType.Pinned); + ulong* addr = (ulong*)identifiersHandle.AddrOfPinnedObject (); + return (IntPtr)addr; + } + + protected override void Dispose (bool disposing) + { + base.Dispose (disposing); + if (vectorArrayHandle.IsAllocated) + vectorArrayHandle.Free (); + if (identifiersHandle.IsAllocated) + identifiersHandle.Free (); + } + } + + [TestFixture] + [Preserve (AllMembers = true)] + public class ARPointCloudTest { + + [SetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void PointsTest () + { + var cloud = new ARPointCloudPoker (); + + var points = cloud.Points; + Assert.AreEqual (new VectorFloat3 (1, 2, 3), cloud.Points [0]); + Assert.AreEqual (new VectorFloat3 (4, 5, 6), cloud.Points [1]); + } + + [Test] + public void IdentifiersTest () + { + var cloud = new ARPointCloudPoker (); + + var points = cloud.Identifiers; + Assert.AreEqual (0, cloud.Identifiers [0]); + Assert.AreEqual (1, cloud.Identifiers [1]); + } + } +} + +#endif // XAMCORE_2_0 && __IOS__ diff --git a/tests/monotouch-test/AVFoundation/AVDepthDataTests.cs b/tests/monotouch-test/AVFoundation/AVDepthDataTests.cs new file mode 100644 index 000000000000..3ab42118425e --- /dev/null +++ b/tests/monotouch-test/AVFoundation/AVDepthDataTests.cs @@ -0,0 +1,49 @@ +// +// AVDepthDataTests.cs +// +// Authors: +// Alex Soto +// +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !__WATCHOS__ + +using System; +using NUnit.Framework; + +using AVFoundation; +using Foundation; +using ImageIO; + +namespace MonoTouchFixtures.AVFoundation { + + [TestFixture] + [Preserve (AllMembers = true)] + public class AVDepthDataTests { + + [Test] + public void AvailableDepthDataTypesTest () + { + TestRuntime.AssertDevice (); + TestRuntime.AssertXcodeVersion (9, 0); + + // xamarinmonkey.heic is the new photo format, also this one includes depth data + var imgdata = NSData.FromFile ("CoreImage/xamarinmonkey.heic"); + Assert.NotNull (imgdata, "imgdata"); + + var imageSource = CGImageSource.FromData (imgdata); + Assert.NotNull (imageSource, "imageSource"); + + var info = imageSource.CopyAuxiliaryDataInfo (0, CGImageAuxiliaryDataType.Disparity); + Assert.NotNull (info, "info"); + + NSError err; + var depthData = AVDepthData.Create (info, out err); + Assert.NotNull (depthData, "depthData"); + Assert.NotNull (depthData.AvailableDepthDataTypes, "AvailableDepthDataTypes"); + } + } +} +#endif diff --git a/tests/monotouch-test/AVFoundation/AVPlayerLooperTest.cs b/tests/monotouch-test/AVFoundation/AVPlayerLooperTest.cs new file mode 100644 index 000000000000..f8089aee70ee --- /dev/null +++ b/tests/monotouch-test/AVFoundation/AVPlayerLooperTest.cs @@ -0,0 +1,35 @@ +#if !__WATCHOS__ +using System; +using System.IO; +#if XAMCORE_2_0 +using Foundation; +using AVFoundation; +#else +using MonoTouch.AVFoundation; +using MonoTouch.Foundation; +#endif +using NUnit.Framework; +namespace monotouchtest.AVFoundation +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class AVPlayerLooperTest + { +#if !XAMCORE_4_0 + public void TestLoopingEnabled () + { + string file = Path.Combine (NSBundle.MainBundle.ResourcePath, "Hand.wav"); + Assert.True (File.Exists (file), file); + using (var url = new NSUrl (file)) + using (var playerItem = AVPlayerItem.FromUrl (url)) + using (AVQueuePlayer player = AVQueuePlayer.FromItems (new[] { playerItem })) + using (var playerLooper = AVPlayerLooper.FromPlayer (player, playerItem)) { + Assert.True (playerLooper.LoopingEnabled, "The default value should be true."); + playerLooper.DisableLooping (); + Assert.False (playerLooper.LoopingEnabled, "Looping enabled should return false after 'DisableLooping'"); + } + } +#endif + } +} +#endif \ No newline at end of file diff --git a/tests/monotouch-test/AddressBook/SourceTest.cs b/tests/monotouch-test/AddressBook/SourceTest.cs index b786a8b332f9..f51f4eef2365 100644 --- a/tests/monotouch-test/AddressBook/SourceTest.cs +++ b/tests/monotouch-test/AddressBook/SourceTest.cs @@ -43,7 +43,11 @@ public void Default () // ABRecord // some bots returns -1 (invalid) and I get 0 after a reset (maybe permission related?) Assert.That (source.Id, Is.LessThanOrEqualTo (0), "Id"); - Assert.That (source.Type, Is.EqualTo (ABRecordType.Source), "Type"); + if (TestRuntime.CheckXcodeVersion (9, 0)) { + Assert.That (source.Type, Is.EqualTo (ABRecordType.Person), "Type"); + } else { + Assert.That (source.Type, Is.EqualTo (ABRecordType.Source), "Type"); + } } } } diff --git a/tests/monotouch-test/AddressBookUI/AddressFormattingTest.cs b/tests/monotouch-test/AddressBookUI/AddressFormattingTest.cs index bdc256d0a211..e5502d045dd6 100644 --- a/tests/monotouch-test/AddressBookUI/AddressFormattingTest.cs +++ b/tests/monotouch-test/AddressBookUI/AddressFormattingTest.cs @@ -45,12 +45,19 @@ public void ChateauFrontenac () { new NSString ("SubThoroughfare"), new NSString ("1-3") }, { new NSString ("CountryCode"), new NSString ("CA") }, }) { - string expected = "1–3 Rue Des Carrières\nQuebec City‎ Quebec‎ G1R 5J5"; + string expected1 = "1–3 Rue Des Carrières\nQuebec City‎ Quebec‎ G1R 5J5"; + string expected2 = "1–3 Rue Des Carrières\nQuebec City Quebec G1R 5J5"; // there's a "(char) 8206" character just after 'Quebec' + string expected; string s = ABAddressFormatting.ToString (dict, false); + if (TestRuntime.CheckXcodeVersion (9, 0)) { + expected = expected2; + } else { + expected = expected1; + } Assert.That (s, Is.EqualTo (expected), "false"); // country names can be translated, e.g. chinese, so we can't compare it s = ABAddressFormatting.ToString (dict, true); - Assert.True (s.StartsWith (expected, StringComparison.Ordinal), "prefix"); + Assert.That (s, Is.StringStarting (expected), "prefix"); // Apple broke this again (8.0.x are hard to predict) - test will fail once it's corrected // iOS 8.1.2 device: working @@ -62,8 +69,8 @@ public void ChateauFrontenac () if (!UIDevice.CurrentDevice.CheckSystemVersion (8,2)) return; - Assert.That (s [expected.Length], Is.EqualTo ('\n'), "newline"); - Assert.That (s.Length > expected.Length + 1, "country"); + // iOS 11.0 beta 1, 2, 3 and 4 are broken + // and I give up (this test was not meant to track Apple breakages) } } } diff --git a/tests/monotouch-test/Asserts.cs b/tests/monotouch-test/Asserts.cs index 8d468eb504c5..5d2b8e0d93c2 100644 --- a/tests/monotouch-test/Asserts.cs +++ b/tests/monotouch-test/Asserts.cs @@ -2,16 +2,25 @@ #if XAMCORE_2_0 #if !__WATCHOS__ using ModelIO; +#if !MONOMAC +using MetalPerformanceShaders; +#endif #endif #else using MonoTouch.ModelIO; #endif using OpenTK; +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x3 = global::OpenTK.NMatrix4x3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; +using MatrixDouble4x4 = global::OpenTK.NMatrix4d; +using VectorDouble3 = global::OpenTK.NVector3d; using NUnit.Framework; public static class Asserts { -#if !__WATCHOS__ public static void AreEqual (bool expected, bool actual, string message) { Assert.AreEqual (expected, actual, message + " (M)"); @@ -22,6 +31,11 @@ public static void AreEqual (float expected, float actual, string message) Assert.AreEqual (expected, actual, message + " (M)"); } + public static void AreEqual (float expected, float actual, float delta, string message) + { + Assert.AreEqual (expected, actual, delta, message); + } + public static void AreEqual (Vector2 expected, Vector2 actual, string message) { Assert.AreEqual (expected.X, actual.X, message + " (X)"); @@ -35,6 +49,41 @@ public static void AreEqual (Vector3 expected, Vector3 actual, string message) Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); } + public static void AreEqual (Vector3 expected, Vector3 actual, float delta, string message) + { + Assert.AreEqual (expected.X, actual.X, delta, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, delta, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, delta, message + " (Z)"); + } + + public static void AreEqual (Vector3 expected, VectorFloat3 actual, string message) + { + Assert.AreEqual (expected.X, actual.X, 0.001, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, 0.001, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); + } + + public static void AreEqual (VectorFloat3 expected, Vector3 actual, string message) + { + Assert.AreEqual (expected.X, actual.X, 0.001, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, 0.001, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); + } + + public static void AreEqual (VectorFloat3 expected, VectorFloat3 actual, string message) + { + Assert.AreEqual (expected.X, actual.X, 0.001, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, 0.001, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); + } + + public static void AreEqual (VectorFloat3 expected, VectorFloat3 actual, float delta, string message) + { + Assert.AreEqual (expected.X, actual.X, delta, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, delta, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, delta, message + " (Z)"); + } + public static void AreEqual (Vector4 expected, Vector4 actual, string message) { Assert.AreEqual (expected.X, actual.X, message + " (X)"); @@ -43,6 +92,14 @@ public static void AreEqual (Vector4 expected, Vector4 actual, string message) Assert.AreEqual (expected.W, actual.W, message + " (W)"); } + public static void AreEqual (Vector4 expected, Vector4 actual, float delta, string message) + { + Assert.AreEqual (expected.X, actual.X, delta, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, delta, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, delta, message + " (Z)"); + Assert.AreEqual (expected.W, actual.W, delta, message + " (W)"); + } + public static void AreEqual (Matrix2 expected, Matrix2 actual, string message) { AreEqual (expected.R0C0, actual.R0C0, message + " (R0C0)"); @@ -64,6 +121,19 @@ public static void AreEqual (Matrix3 expected, Matrix3 actual, string message) AreEqual (expected.R2C2, actual.R2C2, message + " (R2C2)"); } + public static void AreEqual (Matrix3 expected, Matrix3 actual, float delta, string message) + { + AreEqual (expected.R0C0, actual.R0C0, delta, message + " (R0C0)"); + AreEqual (expected.R0C1, actual.R0C1, delta, message + " (R0C1)"); + AreEqual (expected.R0C2, actual.R0C2, delta, message + " (R0C2)"); + AreEqual (expected.R1C0, actual.R1C0, delta, message + " (R1C0)"); + AreEqual (expected.R1C1, actual.R1C1, delta, message + " (R1C1)"); + AreEqual (expected.R1C2, actual.R1C2, delta, message + " (R1C2)"); + AreEqual (expected.R2C0, actual.R2C0, delta, message + " (R2C0)"); + AreEqual (expected.R2C1, actual.R2C1, delta, message + " (R2C1)"); + AreEqual (expected.R2C2, actual.R2C2, delta, message + " (R2C2)"); + } + public static void AreEqual (Matrix4 expected, Matrix4 actual, string message) { AreEqual (expected.Column0, actual.Column0, message + " (Col0)"); @@ -72,17 +142,460 @@ public static void AreEqual (Matrix4 expected, Matrix4 actual, string message) AreEqual (expected.Column3, actual.Column3, message + " (Col3)"); } + public static void AreEqual (Matrix4 expected, Matrix4 actual, float delta, string message) + { + AreEqual (expected.Column0, actual.Column0, delta, message + " (Col0)"); + AreEqual (expected.Column1, actual.Column1, delta, message + " (Col1)"); + AreEqual (expected.Column2, actual.Column2, delta, message + " (Col2)"); + AreEqual (expected.Column3, actual.Column3, delta, message + " (Col3)"); + } + public static void AreEqual (Vector2i expected, Vector2i actual, string message) { Assert.AreEqual (expected.X, actual.X, message + " (X)"); Assert.AreEqual (expected.Y, actual.Y, message + " (Y)"); } + public static void AreEqual (Vector4i expected, Vector4i actual, string message) + { + Assert.AreEqual (expected.X, actual.X, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, message + " (Z)"); + Assert.AreEqual (expected.W, actual.W, message + " (W)"); + } + +#if !__WATCHOS__ public static void AreEqual (MDLAxisAlignedBoundingBox expected, MDLAxisAlignedBoundingBox actual, string message) { AreEqual (expected.MaxBounds, actual.MaxBounds, message + " (MaxBounds)"); AreEqual (expected.MinBounds, actual.MinBounds, message + " (MinBounds)"); } #endif // !__WATCHOS__ + + public static void AreEqual (Quaternion expected, Quaternion actual, string message) + { + Assert.AreEqual (expected.X, actual.X, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, message + " (Z)"); + Assert.AreEqual (expected.W, actual.W, message + " (W)"); + } + +#if !MONOMAC && !__WATCHOS__ + public static void AreEqual (MPSImageHistogramInfo expected, MPSImageHistogramInfo actual, string message) + { + Assert.AreEqual (expected.HistogramForAlpha, actual.HistogramForAlpha, message + " HistogramForAlpha"); + Asserts.AreEqual (expected.MaxPixelValue, actual.MaxPixelValue, message + " MaxPixelValue"); + Asserts.AreEqual (expected.MinPixelValue, actual.MinPixelValue, message + " MinPixelValue"); + Assert.AreEqual (expected.NumberOfHistogramEntries, actual.NumberOfHistogramEntries, message + " NumberOfHistogramEntries"); + } +#endif // !MONOMAC && !__WATCHOS__ + + public static void AreEqual (MatrixFloat2x2 expected, MatrixFloat2x2 actual, string message) + { + AreEqual (expected.R0C0, actual.R0C0, message + " (R0C0)"); + AreEqual (expected.R1C0, actual.R1C0, message + " (R1C0)"); + AreEqual (expected.R0C1, actual.R0C1, message + " (R0C1)"); + AreEqual (expected.R1C1, actual.R1C1, message + " (R1C1)"); + } + + public static void AreEqual (MatrixFloat2x2 expected, MatrixFloat2x2 actual, float delta, string message) + { + AreEqual (expected.R0C0, actual.R0C0, delta, message + " (R0C0)"); + AreEqual (expected.R1C0, actual.R1C0, delta, message + " (R1C0)"); + AreEqual (expected.R0C1, actual.R0C1, delta, message + " (R0C1)"); + AreEqual (expected.R1C1, actual.R1C1, delta, message + " (R1C1)"); + } + + public static void AreEqual (Matrix2 expected, MatrixFloat2x2 actual, string message) + { + AreEqual (expected.R0C0, actual.R0C0, message + " (R0C0)"); + AreEqual (expected.R0C1, actual.R0C1, message + " (R0C1)"); + AreEqual (expected.R1C0, actual.R1C0, message + " (R1C0)"); + AreEqual (expected.R1C1, actual.R1C1, message + " (R1C1)"); + } + + public static void AreEqual (MatrixFloat2x2 expected, Matrix2 actual, string message) + { + AreEqual (expected.R0C0, actual.R0C0, message + " (R0C0)"); + AreEqual (expected.R0C1, actual.R0C1, message + " (R0C1)"); + AreEqual (expected.R1C0, actual.R1C0, message + " (R1C0)"); + AreEqual (expected.R1C1, actual.R1C1, message + " (R1C1)"); + } + + public static void AreEqual (MatrixFloat3x3 expected, MatrixFloat3x3 actual, string message) + { + AreEqual (expected.R0C0, actual.R0C0, message + " (R0C0)"); + AreEqual (expected.R1C0, actual.R1C0, message + " (R1C0)"); + AreEqual (expected.R2C0, actual.R2C0, message + " (R2C0)"); + AreEqual (expected.R0C1, actual.R0C1, message + " (R0C1)"); + AreEqual (expected.R1C1, actual.R1C1, message + " (R1C1)"); + AreEqual (expected.R2C1, actual.R2C1, message + " (R2C1)"); + AreEqual (expected.R0C2, actual.R0C2, message + " (R0C2)"); + AreEqual (expected.R1C2, actual.R1C2, message + " (R1C2)"); + AreEqual (expected.R2C2, actual.R2C2, message + " (R2C2)"); + } + + public static void AreEqual (MatrixFloat3x3 expected, MatrixFloat3x3 actual, float delta, string message) + { + AreEqual (expected.R0C0, actual.R0C0, delta, message + " (R0C0)"); + AreEqual (expected.R1C0, actual.R1C0, delta, message + " (R1C0)"); + AreEqual (expected.R2C0, actual.R2C0, delta, message + " (R2C0)"); + AreEqual (expected.R0C1, actual.R0C1, delta, message + " (R0C1)"); + AreEqual (expected.R1C1, actual.R1C1, delta, message + " (R1C1)"); + AreEqual (expected.R2C1, actual.R2C1, delta, message + " (R2C1)"); + AreEqual (expected.R0C2, actual.R0C2, delta, message + " (R0C2)"); + AreEqual (expected.R1C2, actual.R1C2, delta, message + " (R1C2)"); + AreEqual (expected.R2C2, actual.R2C2, delta, message + " (R2C2)"); + } + + public static void AreEqual (Matrix3 expected, MatrixFloat3x3 actual, string message) + { + AreEqual (expected.R0C0, actual.R0C0, message + " (R0C0)"); + AreEqual (expected.R0C1, actual.R0C1, message + " (R0C1)"); + AreEqual (expected.R0C2, actual.R0C2, message + " (R0C2)"); + AreEqual (expected.R1C0, actual.R1C0, message + " (R1C0)"); + AreEqual (expected.R1C1, actual.R1C1, message + " (R1C1)"); + AreEqual (expected.R1C2, actual.R1C2, message + " (R1C2)"); + AreEqual (expected.R2C0, actual.R2C0, message + " (R2C0)"); + AreEqual (expected.R2C1, actual.R2C1, message + " (R2C1)"); + AreEqual (expected.R2C2, actual.R2C2, message + " (R2C2)"); + } + + public static void AreEqual (MatrixFloat3x3 expected, Matrix3 actual, string message) + { + AreEqual (expected.R0C0, actual.R0C0, message + " (R0C0)"); + AreEqual (expected.R0C1, actual.R0C1, message + " (R0C1)"); + AreEqual (expected.R0C2, actual.R0C2, message + " (R0C2)"); + AreEqual (expected.R1C0, actual.R1C0, message + " (R1C0)"); + AreEqual (expected.R1C1, actual.R1C1, message + " (R1C1)"); + AreEqual (expected.R1C2, actual.R1C2, message + " (R1C2)"); + AreEqual (expected.R2C0, actual.R2C0, message + " (R2C0)"); + AreEqual (expected.R2C1, actual.R2C1, message + " (R2C1)"); + AreEqual (expected.R2C2, actual.R2C2, message + " (R2C2)"); + } + + public static void AreEqual (MatrixFloat4x4 expected, MatrixFloat4x4 actual, string message) + { + AreEqual (expected.M11, actual.M11, message + " (M11)"); + AreEqual (expected.M21, actual.M21, message + " (M21)"); + AreEqual (expected.M31, actual.M31, message + " (M31)"); + AreEqual (expected.M41, actual.M41, message + " (M41)"); + AreEqual (expected.M12, actual.M12, message + " (M12)"); + AreEqual (expected.M22, actual.M22, message + " (M22)"); + AreEqual (expected.M32, actual.M32, message + " (M32)"); + AreEqual (expected.M42, actual.M42, message + " (M42)"); + AreEqual (expected.M13, actual.M13, message + " (M13)"); + AreEqual (expected.M23, actual.M23, message + " (M23)"); + AreEqual (expected.M33, actual.M33, message + " (M33)"); + AreEqual (expected.M43, actual.M43, message + " (M43)"); + AreEqual (expected.M14, actual.M14, message + " (M14)"); + AreEqual (expected.M24, actual.M24, message + " (M24)"); + AreEqual (expected.M34, actual.M34, message + " (M34)"); + AreEqual (expected.M44, actual.M44, message + " (M44)"); + } + + public static void AreEqual (MatrixFloat4x4 expected, MatrixFloat4x4 actual, float delta, string message) + { + AreEqual (expected.M11, actual.M11, delta, message + " (M11)"); + AreEqual (expected.M21, actual.M21, delta, message + " (M21)"); + AreEqual (expected.M31, actual.M31, delta, message + " (M31)"); + AreEqual (expected.M41, actual.M41, delta, message + " (M41)"); + AreEqual (expected.M12, actual.M12, delta, message + " (M12)"); + AreEqual (expected.M22, actual.M22, delta, message + " (M22)"); + AreEqual (expected.M32, actual.M32, delta, message + " (M32)"); + AreEqual (expected.M42, actual.M42, delta, message + " (M42)"); + AreEqual (expected.M13, actual.M13, delta, message + " (M13)"); + AreEqual (expected.M23, actual.M23, delta, message + " (M23)"); + AreEqual (expected.M33, actual.M33, delta, message + " (M33)"); + AreEqual (expected.M43, actual.M43, delta, message + " (M43)"); + AreEqual (expected.M14, actual.M14, delta, message + " (M14)"); + AreEqual (expected.M24, actual.M24, delta, message + " (M24)"); + AreEqual (expected.M34, actual.M34, delta, message + " (M34)"); + AreEqual (expected.M44, actual.M44, delta, message + " (M44)"); + } + + public static void AreEqual (Matrix4 expected, MatrixFloat4x4 actual, string message) + { + AreEqual (expected.M11, actual.M11, message + " (M11)"); + AreEqual (expected.M21, actual.M21, message + " (M21)"); + AreEqual (expected.M31, actual.M31, message + " (M31)"); + AreEqual (expected.M41, actual.M41, message + " (M41)"); + AreEqual (expected.M12, actual.M12, message + " (M12)"); + AreEqual (expected.M22, actual.M22, message + " (M22)"); + AreEqual (expected.M32, actual.M32, message + " (M32)"); + AreEqual (expected.M42, actual.M42, message + " (M42)"); + AreEqual (expected.M13, actual.M13, message + " (M13)"); + AreEqual (expected.M23, actual.M23, message + " (M23)"); + AreEqual (expected.M33, actual.M33, message + " (M33)"); + AreEqual (expected.M43, actual.M43, message + " (M43)"); + AreEqual (expected.M14, actual.M14, message + " (M14)"); + AreEqual (expected.M24, actual.M24, message + " (M24)"); + AreEqual (expected.M34, actual.M34, message + " (M34)"); + AreEqual (expected.M44, actual.M44, message + " (M44)"); + } + + public static void AreEqual (Matrix4 expected, MatrixFloat4x4 actual, float delta, string message) + { + AreEqual (expected.M11, actual.M11, delta, message + " (M11)"); + AreEqual (expected.M21, actual.M21, delta, message + " (M21)"); + AreEqual (expected.M31, actual.M31, delta, message + " (M31)"); + AreEqual (expected.M41, actual.M41, delta, message + " (M41)"); + AreEqual (expected.M12, actual.M12, delta, message + " (M12)"); + AreEqual (expected.M22, actual.M22, delta, message + " (M22)"); + AreEqual (expected.M32, actual.M32, delta, message + " (M32)"); + AreEqual (expected.M42, actual.M42, delta, message + " (M42)"); + AreEqual (expected.M13, actual.M13, delta, message + " (M13)"); + AreEqual (expected.M23, actual.M23, delta, message + " (M23)"); + AreEqual (expected.M33, actual.M33, delta, message + " (M33)"); + AreEqual (expected.M43, actual.M43, delta, message + " (M43)"); + AreEqual (expected.M14, actual.M14, delta, message + " (M14)"); + AreEqual (expected.M24, actual.M24, delta, message + " (M24)"); + AreEqual (expected.M34, actual.M34, delta, message + " (M34)"); + AreEqual (expected.M44, actual.M44, delta, message + " (M44)"); + } + + public static void AreEqual (MatrixFloat4x4 expected, Matrix4 actual, string message) + { + AreEqual (expected.M11, actual.M11, message + " (M11)"); + AreEqual (expected.M21, actual.M21, message + " (M21)"); + AreEqual (expected.M31, actual.M31, message + " (M31)"); + AreEqual (expected.M41, actual.M41, message + " (M41)"); + AreEqual (expected.M12, actual.M12, message + " (M12)"); + AreEqual (expected.M22, actual.M22, message + " (M22)"); + AreEqual (expected.M32, actual.M32, message + " (M32)"); + AreEqual (expected.M42, actual.M42, message + " (M42)"); + AreEqual (expected.M13, actual.M13, message + " (M13)"); + AreEqual (expected.M23, actual.M23, message + " (M23)"); + AreEqual (expected.M33, actual.M33, message + " (M33)"); + AreEqual (expected.M43, actual.M43, message + " (M43)"); + AreEqual (expected.M14, actual.M14, message + " (M14)"); + AreEqual (expected.M24, actual.M24, message + " (M24)"); + AreEqual (expected.M34, actual.M34, message + " (M34)"); + AreEqual (expected.M44, actual.M44, message + " (M44)"); + } + +#region Double Based Types + public static void AreEqual (double expected, double actual, string message) + { + Assert.AreEqual (expected, actual, message + " (M)"); + } + + public static void AreEqual (double expected, double actual, double delta, string message) + { + Assert.AreEqual (expected, actual, delta, message); + } + + public static void AreEqual (Vector2d expected, Vector2d actual, string message) + { + Assert.AreEqual (expected.X, actual.X, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, message + " (Y)"); + } + + public static void AreEqual (Vector3d expected, Vector3d actual, string message) + { + Assert.AreEqual (expected.X, actual.X, 0.001, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, 0.001, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); + } + + public static void AreEqual (Vector3d expected, Vector3d actual, double delta, string message) + { + Assert.AreEqual (expected.X, actual.X, delta, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, delta, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, delta, message + " (Z)"); + } + + public static void AreEqual (Vector3d expected, VectorDouble3 actual, string message) + { + Assert.AreEqual (expected.X, actual.X, 0.001, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, 0.001, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); + } + + public static void AreEqual (VectorDouble3 expected, Vector3d actual, string message) + { + Assert.AreEqual (expected.X, actual.X, 0.001, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, 0.001, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); + } + + public static void AreEqual (VectorDouble3 expected, VectorDouble3 actual, string message) + { + Assert.AreEqual (expected.X, actual.X, 0.001, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, 0.001, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, 0.001, message + " (Z)"); + } + + public static void AreEqual (VectorDouble3 expected, VectorDouble3 actual, double delta, string message) + { + Assert.AreEqual (expected.X, actual.X, delta, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, delta, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, delta, message + " (Z)"); + } + + public static void AreEqual (Vector4d expected, Vector4d actual, string message) + { + Assert.AreEqual (expected.X, actual.X, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, message + " (Z)"); + Assert.AreEqual (expected.W, actual.W, message + " (W)"); + } + + public static void AreEqual (Vector4d expected, Vector4d actual, double delta, string message) + { + Assert.AreEqual (expected.X, actual.X, delta, message + " (X)"); + Assert.AreEqual (expected.Y, actual.Y, delta, message + " (Y)"); + Assert.AreEqual (expected.Z, actual.Z, delta, message + " (Z)"); + Assert.AreEqual (expected.W, actual.W, delta, message + " (W)"); + } + + public static void AreEqual (Matrix4d expected, Matrix4d actual, string message) + { + AreEqual (expected.Column0, actual.Column0, message + " (Col0)"); + AreEqual (expected.Column1, actual.Column1, message + " (Col1)"); + AreEqual (expected.Column2, actual.Column2, message + " (Col2)"); + AreEqual (expected.Column3, actual.Column3, message + " (Col3)"); + } + + public static void AreEqual (Matrix4d expected, Matrix4d actual, double delta, string message) + { + AreEqual (expected.Column0, actual.Column0, delta, message + " (Col0)"); + AreEqual (expected.Column1, actual.Column1, delta, message + " (Col1)"); + AreEqual (expected.Column2, actual.Column2, delta, message + " (Col2)"); + AreEqual (expected.Column3, actual.Column3, delta, message + " (Col3)"); + } + + public static void AreEqual (MatrixDouble4x4 expected, MatrixDouble4x4 actual, string message) + { + AreEqual (expected.M11, actual.M11, message + " (M11)"); + AreEqual (expected.M21, actual.M21, message + " (M21)"); + AreEqual (expected.M31, actual.M31, message + " (M31)"); + AreEqual (expected.M41, actual.M41, message + " (M41)"); + AreEqual (expected.M12, actual.M12, message + " (M12)"); + AreEqual (expected.M22, actual.M22, message + " (M22)"); + AreEqual (expected.M32, actual.M32, message + " (M32)"); + AreEqual (expected.M42, actual.M42, message + " (M42)"); + AreEqual (expected.M13, actual.M13, message + " (M13)"); + AreEqual (expected.M23, actual.M23, message + " (M23)"); + AreEqual (expected.M33, actual.M33, message + " (M33)"); + AreEqual (expected.M43, actual.M43, message + " (M43)"); + AreEqual (expected.M14, actual.M14, message + " (M14)"); + AreEqual (expected.M24, actual.M24, message + " (M24)"); + AreEqual (expected.M34, actual.M34, message + " (M34)"); + AreEqual (expected.M44, actual.M44, message + " (M44)"); + } + + public static void AreEqual (MatrixDouble4x4 expected, MatrixDouble4x4 actual, double delta, string message) + { + AreEqual (expected.M11, actual.M11, delta, message + " (M11)"); + AreEqual (expected.M21, actual.M21, delta, message + " (M21)"); + AreEqual (expected.M31, actual.M31, delta, message + " (M31)"); + AreEqual (expected.M41, actual.M41, delta, message + " (M41)"); + AreEqual (expected.M12, actual.M12, delta, message + " (M12)"); + AreEqual (expected.M22, actual.M22, delta, message + " (M22)"); + AreEqual (expected.M32, actual.M32, delta, message + " (M32)"); + AreEqual (expected.M42, actual.M42, delta, message + " (M42)"); + AreEqual (expected.M13, actual.M13, delta, message + " (M13)"); + AreEqual (expected.M23, actual.M23, delta, message + " (M23)"); + AreEqual (expected.M33, actual.M33, delta, message + " (M33)"); + AreEqual (expected.M43, actual.M43, delta, message + " (M43)"); + AreEqual (expected.M14, actual.M14, delta, message + " (M14)"); + AreEqual (expected.M24, actual.M24, delta, message + " (M24)"); + AreEqual (expected.M34, actual.M34, delta, message + " (M34)"); + AreEqual (expected.M44, actual.M44, delta, message + " (M44)"); + } + + public static void AreEqual (Matrix4d expected, MatrixDouble4x4 actual, string message) + { + AreEqual (expected.M11, actual.M11, message + " (M11)"); + AreEqual (expected.M21, actual.M21, message + " (M21)"); + AreEqual (expected.M31, actual.M31, message + " (M31)"); + AreEqual (expected.M41, actual.M41, message + " (M41)"); + AreEqual (expected.M12, actual.M12, message + " (M12)"); + AreEqual (expected.M22, actual.M22, message + " (M22)"); + AreEqual (expected.M32, actual.M32, message + " (M32)"); + AreEqual (expected.M42, actual.M42, message + " (M42)"); + AreEqual (expected.M13, actual.M13, message + " (M13)"); + AreEqual (expected.M23, actual.M23, message + " (M23)"); + AreEqual (expected.M33, actual.M33, message + " (M33)"); + AreEqual (expected.M43, actual.M43, message + " (M43)"); + AreEqual (expected.M14, actual.M14, message + " (M14)"); + AreEqual (expected.M24, actual.M24, message + " (M24)"); + AreEqual (expected.M34, actual.M34, message + " (M34)"); + AreEqual (expected.M44, actual.M44, message + " (M44)"); + } + + public static void AreEqual (Matrix4d expected, NMatrix4d actual, double delta, string message) + { + AreEqual (expected.M11, actual.M11, delta, message + " (M11)"); + AreEqual (expected.M21, actual.M21, delta, message + " (M21)"); + AreEqual (expected.M31, actual.M31, delta, message + " (M31)"); + AreEqual (expected.M41, actual.M41, delta, message + " (M41)"); + AreEqual (expected.M12, actual.M12, delta, message + " (M12)"); + AreEqual (expected.M22, actual.M22, delta, message + " (M22)"); + AreEqual (expected.M32, actual.M32, delta, message + " (M32)"); + AreEqual (expected.M42, actual.M42, delta, message + " (M42)"); + AreEqual (expected.M13, actual.M13, delta, message + " (M13)"); + AreEqual (expected.M23, actual.M23, delta, message + " (M23)"); + AreEqual (expected.M33, actual.M33, delta, message + " (M33)"); + AreEqual (expected.M43, actual.M43, delta, message + " (M43)"); + AreEqual (expected.M14, actual.M14, delta, message + " (M14)"); + AreEqual (expected.M24, actual.M24, delta, message + " (M24)"); + AreEqual (expected.M34, actual.M34, delta, message + " (M34)"); + AreEqual (expected.M44, actual.M44, delta, message + " (M44)"); + } + + public static void AreEqual (NMatrix4x3 expected, NMatrix4x3 actual, float delta, string message) + { + AreEqual (expected.M11, actual.M11, delta, message + " (M11)"); + AreEqual (expected.M21, actual.M21, delta, message + " (M21)"); + AreEqual (expected.M31, actual.M31, delta, message + " (M31)"); + AreEqual (expected.M12, actual.M12, delta, message + " (M12)"); + AreEqual (expected.M22, actual.M22, delta, message + " (M22)"); + AreEqual (expected.M32, actual.M32, delta, message + " (M32)"); + AreEqual (expected.M13, actual.M13, delta, message + " (M13)"); + AreEqual (expected.M23, actual.M23, delta, message + " (M23)"); + AreEqual (expected.M33, actual.M33, delta, message + " (M33)"); + AreEqual (expected.M14, actual.M14, delta, message + " (M14)"); + AreEqual (expected.M24, actual.M24, delta, message + " (M24)"); + AreEqual (expected.M34, actual.M34, delta, message + " (M34)"); + } + + public static void AreEqual (NMatrix4d expected, Matrix4d actual, string message) + { + AreEqual (expected.M11, actual.M11, message + " (M11)"); + AreEqual (expected.M21, actual.M21, message + " (M21)"); + AreEqual (expected.M31, actual.M31, message + " (M31)"); + AreEqual (expected.M41, actual.M41, message + " (M41)"); + AreEqual (expected.M12, actual.M12, message + " (M12)"); + AreEqual (expected.M22, actual.M22, message + " (M22)"); + AreEqual (expected.M32, actual.M32, message + " (M32)"); + AreEqual (expected.M42, actual.M42, message + " (M42)"); + AreEqual (expected.M13, actual.M13, message + " (M13)"); + AreEqual (expected.M23, actual.M23, message + " (M23)"); + AreEqual (expected.M33, actual.M33, message + " (M33)"); + AreEqual (expected.M43, actual.M43, message + " (M43)"); + AreEqual (expected.M14, actual.M14, message + " (M14)"); + AreEqual (expected.M24, actual.M24, message + " (M24)"); + AreEqual (expected.M34, actual.M34, message + " (M34)"); + AreEqual (expected.M44, actual.M44, message + " (M44)"); + } + + public static void AreEqual (NMatrix4x3 expected, NMatrix4x3 actual, string message) + { + AreEqual (expected.M11, actual.M11, message + " (M11)"); + AreEqual (expected.M21, actual.M21, message + " (M21)"); + AreEqual (expected.M31, actual.M31, message + " (M31)"); + AreEqual (expected.M12, actual.M12, message + " (M12)"); + AreEqual (expected.M22, actual.M22, message + " (M22)"); + AreEqual (expected.M32, actual.M32, message + " (M32)"); + AreEqual (expected.M13, actual.M13, message + " (M13)"); + AreEqual (expected.M23, actual.M23, message + " (M23)"); + AreEqual (expected.M33, actual.M33, message + " (M33)"); + AreEqual (expected.M14, actual.M14, message + " (M14)"); + AreEqual (expected.M24, actual.M24, message + " (M24)"); + AreEqual (expected.M34, actual.M34, message + " (M34)"); + } +#endregion } diff --git a/tests/monotouch-test/AudioToolbox/AudioComponentTest.cs b/tests/monotouch-test/AudioToolbox/AudioComponentTest.cs new file mode 100644 index 000000000000..059151eabc5f --- /dev/null +++ b/tests/monotouch-test/AudioToolbox/AudioComponentTest.cs @@ -0,0 +1,122 @@ +// Copyright 2011 Xamarin Inc. All rights reserved + +#if IOS || MONOMAC +using System; +using System.Drawing; +using System.IO; +using System.Collections.Generic; +#if XAMCORE_2_0 +using Foundation; +using AudioToolbox; +using AudioUnit; +using CoreFoundation; +#else +using MonoTouch.Foundation; +using MonoTouch.MediaPlayer; +using MonoTouch.AudioToolbox; +using MonoTouch.CoreFoundation; +#endif +using NUnit.Framework; + +namespace MonoTouchFixtures.AudioToolbox { + + [TestFixture] + [Preserve (AllMembers = true)] + public class AudioComponentTest { + + [Test] + public void GetSetComponentList () + { + TestRuntime.AssertXcodeVersion (9, 0); + var types = new List { AudioTypeOutput.Generic, AudioTypeOutput.Remote, AudioTypeOutput.VoiceProcessingIO }; + foreach (var t in types) { + var resources = new ResourceUsageInfo (); + resources.IOKitUserClient = new string[] { "CustomUserClient1" }; + resources.MachLookUpGlobalName = new string[] { "MachServiceName1" }; + resources.NetworkClient = false; + resources.TemporaryExceptionReadWrite = false; + + var componentInfo = new AudioComponentInfo (); + componentInfo.Type = t.ToString (); + componentInfo.Subtype = "XMPL"; + componentInfo.Name = "XMPL"; + componentInfo.Version = 1; + componentInfo.ResourceUsage = resources; + var component = AudioComponent.FindComponent (t); + if (component == null) + continue; + var l = component.ComponentList; + Assert.IsNull (l, "List is not null."); + l = new AudioComponentInfo[] { componentInfo }; + //monotouchtests does not have permissions to deal with the hwd. + Assert.Throws (() => component.ComponentList = l); + } + } + + [Test] + public void GetSetNullComponentList () + { + TestRuntime.AssertXcodeVersion (9, 0); + var types = new List { AudioTypeOutput.Generic, AudioTypeOutput.Remote, AudioTypeOutput.VoiceProcessingIO }; + foreach (var t in types) { + var resources = new ResourceUsageInfo (); + resources.IOKitUserClient = new string[] { "CustomUserClient1" }; + resources.MachLookUpGlobalName = new string[] { "MachServiceName1" }; + resources.NetworkClient = false; + resources.TemporaryExceptionReadWrite = false; + + var componentInfo = new AudioComponentInfo (); + componentInfo.Type = t.ToString (); + componentInfo.Subtype = "XMPL"; + componentInfo.Name = "XMPL"; + componentInfo.Version = 1; + componentInfo.ResourceUsage = resources; + var component = AudioComponent.FindComponent (t); + if (component == null) + continue; + //monotouchtests does not have permissions to deal with the hwd. + Assert.Throws (() => component.ComponentList = null); + } + } + + // test the diff properties of the ResourceUsageInfo since it was manually done + + [Test] + public void TestResourceUsageInfoIOKitUserClient () + { + TestRuntime.AssertXcodeVersion (9, 0); + var clientId = "CustomUserClient1"; + var resources = new ResourceUsageInfo (); + resources.IOKitUserClient = new string[] { clientId }; + var userClientList = resources.IOKitUserClient; + Assert.IsNotNull (userClientList); + Assert.AreEqual (1, userClientList.Length, "List does not have all client ids."); + Assert.AreEqual (clientId, userClientList [0], "Client ids are not the same."); + + // similar test but with null values. + + resources.IOKitUserClient = null; + Assert.IsNull (resources.IOKitUserClient, "Value was not set to null."); + } + + [Test] + public void TestResourceUsageInfoMachLookUpGlobalName () + { + TestRuntime.AssertXcodeVersion (9, 0); + var serviceName = "MachServiceName1"; + var resources = new ResourceUsageInfo (); + resources.MachLookUpGlobalName = new string[] { serviceName }; + var serviceNames = resources.MachLookUpGlobalName; + Assert.NotNull (serviceNames, "Returned list is null"); + Assert.AreEqual (1, serviceNames.Length, "List does not have all service names."); + Assert.AreEqual (serviceName, serviceNames [0], "Service names are not equal."); + + // similar test but with null values + + resources.MachLookUpGlobalName = null; + Assert.IsNull (resources.MachLookUpGlobalName, "Value was no set to null."); + } + } +} + +#endif \ No newline at end of file diff --git a/tests/monotouch-test/CoreData/NSQueryGenerationTokenTest.cs b/tests/monotouch-test/CoreData/NSQueryGenerationTokenTest.cs new file mode 100644 index 000000000000..653a3acde0cf --- /dev/null +++ b/tests/monotouch-test/CoreData/NSQueryGenerationTokenTest.cs @@ -0,0 +1,32 @@ +using System; +#if XAMCORE_2_0 +using CoreData; +using Foundation; +#else +using MonoTouch.CoreData; +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace MonoTouchFixtures.CoreData +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class NSQueryGenerationTokenTest + { + [Test] + public void EncodeWithCoderTest () + { + // Added test to ensure we do support NSCoding even when introspection fails. + if (TestRuntime.CheckXcodeVersion (9, 0)) { + using (var data = new NSMutableData ()) + using (var archiver = new NSKeyedArchiver (data)) + using (var coder = new NSCoder ()) { + NSQueryGenerationToken.CurrentToken.EncodeTo (archiver); + } + } else { + Assert.Ignore ("NSCoding is not supported prior Xcode 9."); + } + } + } +} diff --git a/tests/monotouch-test/CoreImage/xamarinmonkey.heic b/tests/monotouch-test/CoreImage/xamarinmonkey.heic new file mode 100644 index 0000000000000000000000000000000000000000..700986b6469336e7fcd92e9f8438a385d57f8e88 GIT binary patch literal 880014 zcmeFZ1z43^^Emo$y1PTVYt!9GNJ^K|v86ktL|VF2KtfUh5kU}1MMMN8L=Y83ML-1+ z1wroG8;o-f=R4>7-TS}yxzF=^dG@?(X3flsch;;m@16|=K{U?(A>OV|2nPsU9tdaQ zgEB>vhm*e@k_IkTS4Vf>gCYcZBOLsHlz-mY9TA?+0Aq0Ubwb{e7Yuv|0({+>56eW} z2!9Vyh9F@G!l*S-Oj~zv1I*Q1A6p`g9BI{8^wxfvbM-e%WB61!@&Y)yE|BfLC?d>x(nf<4@SR|$i}A?SE80_B^2NdwpOpQO7Hzr2~dBf`T4crG~b zP-qZ3gaKhfSP(XZ1K~n=5I#fz5kf=|F+>89LSzs*L;+DkR1h^p1JOcs5Iw{IF+#^6 zCWskgfmk6nh#lg9I3X^G8{&a@AwGy75`Y9DA)p_Ei2PkW?7<|!ke(7EvI_`y2ctj4 z931@|ATfY}`GAN}nD`&+Bn~iqPlUIxHw57^BfK5FAP5ca;N|Y??dt{R0F50vU%*#F z9-jWbh8il&<`$OB*e}6&u)#Q}AZ9xUKW}9N10BEu{kS8`zpkw*&Z8RRPZvP-b>;wF5d}UqPAQ{x`bIZ{@>w0Skn$hVb)tw+mr5K+fd< z!K6_L!j#Z#!Q*ls>RCLTJw5Id5EsAVLcWA|C@X zR({T+U}1p^MxX*gnDhJlpMaCW&Vr!5^!@#Bm-hGfDj*1b4uX0-fdW;q<*LHafeAs# zX@?-okI?SkS1`T!=w+b4)JiY{*#16}0UgN!T1AH}z1hnl80@nO3?=znMHvPf6lEUY zK^>#O{RxLgj8178C+y^F61c0_xkn^lD@K@Y#}Me1EE_)NDn#YPSxJ2)0XSjBrX=TU zRA2c!RNJY1Eh{_zmYIPd(Uci(n|wD0?Jg;qt+^eV9>$AGUNlX1a`Zf$u+(J#5pEj_ z3Y=RQ=;tzc2e1f8^FKzJFR<$16EJJ_6jQ`1X<Ey7_Q z)f+8(j0B%SP3xRp46YP;bb1XgbGiPcwe>JEJ{hlE5pKl~gQnztb( zjGYYk-2MMX>0i72mmYpzd9|zYdApmh&zj7(kC=sc=6)C_f+YKYQf4BFhK5#&b_rMot{SYz&UZ-3h#goA1z2HD zDBA%(6POgT_#2J52iVdWpy48Xz5J0@OX7_PMu0nnj)Mb^UH|K|z*I2*ug?Or@IUlf za{t0-$^D(rk}Jc*A*Nz^fBYqJl3X7aAy&GK3KK<03;`V>v;XgI?9fXsG{rEgFmX}F zFux<&W~5opH|XZ(CJn{GMrSoiAfRCrehD=XsO3}9C}o|K;=zl`#Kq`Y>SOx%uHxVO z!M{4BmFat5(^fu(nZ>lT_r@GkVfw$Z{&)Yqm;IkRl^Dgp^l&e9Tak1x!Yk=x9!5U= z{Lp{nJO8ANQnx26suqg+Pd*E#1Pt#Z`25K&L0+h>5d(NA==Kl*sI77LFIyv$0UgBw ze48aTniAL=Ar`PT{;{Hm1_w>q9`pV29AuxOn16O@Oa-lg8EF5_Wg?v>J>iBOOj z1xZkl6a~ppkQ@amP>>P@sZfv_1!+)_76s{0kRAmYP>>M?kD(wF3NoW03ktHLAR7v@ zqaX(ga-tv?3UZ?$4+`?4ARh|yqo4o^3ZkG83c^uP7#$-P3lhPMPr!}EgG4be5X2Iu zf@vi|INE^|A0{?&4{}RG_eQvTIUoRazYkmNXsE)Mb4LLlx8VvPeF#s=;Z>LBts#4XeT9so}5hj>~i1j*omsN@j8HwfY$ zVGyGn;Ali!p#2#Tu^i%>4}ts^h+huzNWd>44x*Vu{Q3?AiSK}z;1FNggdoi(5a}G? z=wg)+WLyE_o(xNR2*Q20UYc8CwY1?^XWNbUf~ z;kf|X*8_3gAs#maL8c85^AG%4ECgwEfSB)~9+yJ_f)vk#2=EYh>;?Vd1o7Y@e(4QZ z%$XoMJj9=e0K5vsiU&9z18CX63Pg^FxI3sntpVc5LwvXgf(&OsRC$2oGZujMFMt^H z5O)HarTaj{d5B*G^Cbg;`125d0&wX75RD$-1Y}mgK3{;?^bpsU1@)dFQa!|DY9UC8 z2E?t0_y8D>`WI9bi?nw_eDJ)Lc|jZt0}RLy^1?v|_}~IK#S;*{97DyjD1My<2x4vk z@$F$f2e4P-)5z!@T!3HP7(^@!sCR}aTwVgKxtqv357hbtB|`H%KqnnH>}moFzhCVDQa*RIrk651C}q|1n) ze}#9{P+eyK{(0({90}*D@4%W#^T~wbdoSW6izKijvh>L;6#WG^t9)+IDz(!O>JecP z)msl-;jho6Y8#%9gkKTV3z5-_*^DnlQwTfTO!AfT<8?dPM!t*h#vSol$ZMhtQ%nu@ zGPkwEYp55$lQx?aKV#5q!}O+4{Z?D5{L=HO5Mk()gsXKbF>4`}#kO)duRMEOm}VGX6ymm=wA^U-2wyxcfGP4#YciU^!(|6e0)s)X96ifc z4c(Q2^o4mN?nYys^-9_5k{By&YvTU5YI*5)2}%sOpQn7vq`0x8eUwYj>fhz3dok3K zFymv%u>I_$3CYK~(XJH3AD!Z=Wv=0SnC)$(f}8ufkwWdIwBlS6 zDd~)8p4y3Zze(ACSugCZ=M^+U5od2KGJaVpJH5Ly@eZH!OX(J7%=}4F5xUd9xV>fd z6Q>ju)U2h*B?_F$$j2H~8Ty>{N~Cw@Y0oTFAOw_`4Dgy_aIgCWeOuied-M?hwbyhU z)N1|w)!DDXTB~8kYP)&XFWBoG$pv2%IJ^5bf1KsaO_o;*627z?7|t5qdGVSCC%Mz< zg&flf5B~l4BfMt9k`b)A5-|P`PglQEP@Ey;H1g3BUACX~Fma=`&t$mfq~qZpoT5PB zVHGGc+!Nqk!CX}qs?sHp>pyFJ+o6s1vaj3s-j+caueQkh~_D<)8=Dm}0&Z5!9n#>ecAWkW#L_0KxJ)5mD;omtuk#V{I?fYQ!eo5|?^U+V}CyJ{cku;;-5Y7F_ z7+f<^Fe?NnqP+dg?n6}5(8S3rmt>hZo+FyZZ6~s0X6WiwE|j7{vLhww%qpB0qc=HU zMH!q zBVF$B=I_@?PS7dicIt_Fqn&!35XszrtkpXFjz0a{-4i1AL9ly1``zDGo|K@6#4=6_`BDvk!D{b|j1KdDA{ed_n%Sw`X7Y~LLMB8c*u%Db zRWS`oYae;Ncbl)^1>8xUKhA0hJTYm&;TySwm}<;W1MiF(=cM z#Z|`wL@%Dv$eYXaJk3Yw(bnhpP5r_0xvjTk*fWn#GDY99%G_DZYp#9#eqXWE>19O< z^O>ca>?0IKEt-`RbZ`R$o?-e&?}wZH@or32EcR&QmPWqv@~1p+D97XX?ZpKyQXadR zI-OLk?ETXOdmBlzLrbgWxhDhs=7Zb{zjTvI83$@_z=;5WTv8rP$GPI6Ps7ntp8qbk($!Ut{&mj6-u2qoj;K2 z3^Fn?rrEso*(P`(=iz9dB4%^7yv};gTH&0hf=Zxj_!Gl;qp-wdnRmCuY|V58SskVj zlYSi0H;Sbi_sO|^y-)k@Ef!5R^gC1bR-Bs46zs*-yd?ykc9#G2T=P_nD%+~6*;@We z@NQhA0@c!e?3j=QAq}eC(D;YW7Q=Atvt|sZ?!@qNTx=u1TdT_Cp4u8SSd|ujRr>Lr zW0PJ1N@h`C&a(|DZdqL!8fnSNw*M+XHnA&+jYFrNIy>~Q?aFV zJLcM8goEbzr44<9B7>-goT7&$foZ9M7(!MQx6V7)voXb*Uc6;Q?XfTswEwIvXoCCX zsoc)D#OYWe>&n+ZNi`4*>(#dCI`F+#6SdP1yZ+=(8*|LcAW^vWIbA=(R1=z(PnbEO zow+xf@rL$!$X`DWCzjwIUzMvCeN=XyO#IlV&unt%->B}oUtSU)I>|~rCMO&`q8`%! zvdhuc-RzQC!&1lnc+OYZHJ>cdsV`rk1>M!<*(yMMjB)`x5vArX5v*O0eyQfv3$&c|0WcPUJst3GY zF0)fPF>A%bS}nflSAwo4jbkL+W+`WS{6VMNblub4`D_I=IQ!SNmG5hBXT}Cc&2wxl zBz-Bu-xMJ(OQmUld@3#No1QtyzTZ-Oi)F*1eom!WwD%l-8UC|P6$ZjhoOP)@72*8; zxAy|6AHmv|F28HJ_H?&LKu4#^U(DCGH#oal5eXBDkRN5$- z9eCI{>r2@Rswx@s#wwQA9$EE?70R@ns@z&>n)Cmz+%@ysQ;awFIwzbBa8HeqAj| zBf0vn{p*L{&p$H=%u3V9WS|(u&wPxt?sTD3IqKb$ARH(2;89KZnut#u`fD*%`aZ3E5vk+XyYL!Bz(^|#5rTAZ798+vljLm z|0BAD$Y=??%)H<2iiGpc>nnKyRKfdWPj(_Z`18y!j9ToZ`Pm{EKPn7Tt@v0xkPDzUhRpPTw`w1DHaUig^HYd^P;0aaE{Vr@f zHf-7S=2dz|!mXRnJ`sL963S*(5rb&kmm^{odURWWBMs(mvUeggiV>|6+izW*@T-&04+o z8{0PhK3$gfWSABK&(k#)f8USZZBex^Nb}TluTtN4#hG+zJYjrF0q-(QW=k3!yz*Yw z@gC6=d+X|e(MNUqxo3fTa(2O(=-jHTMO(j$LCVPiQeu&H^!A(8mJFvtYYf6gFA^Nr zPQER-BF;Z!;UTWhb~8=lt>>_m=?lsmE%l1@c0{vp_P+~#FuAhmcKLpJ@I3Q5o;Ad^ z?82a$$(e3M#ztadtI36$Tl=ohwYeRb;Y}R@TkrK1ay1RUE9gGYWR8AW%OTXosTp}w zBagiC*@SoH7xh?Pt68@1_-SqtF4{|IjoA?&nz&5^TyE5$Eqq%~UV9(H>64qhflqh( z^UmEi&K=FAhR0fKXU_Q~et+$EMkIvy3oRAVj>;P$>cUZLmG`&Z3cm-xIj-)uS&cw+ zA8W*Vuq@5KJoM&ThvX{7Ld(S$$Adm3x@x95n30^PDq~VG4bHrK(Ro+BLdA>l!|J`ici!z0@8EtZ-Ms6Hb?FNHZt0Ce zIpsnAYJJ{*9a1(Nn^%+VrWgJ!taek!Q0x|~EcZ?<0c^p2bmlF> zcdVtS`zRVMHD6vO=($tvlPcM3@a<#aadK&VgN>I$r{14a)HySnns0ON>*f1op-Y65 zIZu*DZ0aH# zT-NDY)7M=#6-e8qi_AZ6#XZRoK@`h@dtQ)naS`Z6PP?d?R4*5j1glZau@j<3Aqyp{Tuj=W0~Bu}k09YbO0 zgqQE@wrZ=LCG($Prx&_Cj4n85d19&i+vZ}}ax|ISIgJntc7)Uky7_NKawqtRjMlf% zQ%X}sj-8BVG{`+A%UdTa0J%kV?v3Lz>X3f1sh;SZ(Mz9u9#FY+xz&^Xg`l_))$VDX z8;U{qAKqbX^ayZHIV-4kqgoe@JU{~5Ch3WPeEXC{dr5?p%&SumBnV2M#Pb;6oy!Zv zr+A>Z9MXCtOvp5SJt#_QX)pBg`yD~!HEe(SK9Q)JOJ&s8i}#|k_HPopMVIVZJ=goz z^xDb8(L(ym*{z5USMoMxD)#fxS>E#=x-s@AZlTr6FIpYO#e{EiTlc4^ozrgxk-@tY#AHc&}ZdnIrVlTtACZ zbNPL1boaz;#3!na%N|RGxw7pT@vt_>^?JJ3QucGwst$PNuo2%Df3BB2W*O|uVc#EoZE3@~SKFfK{GT{mF zp4fR47ELd5w_kbQL6(|4cASG?dU?CcJ$5NHRh=+* zynci&O%cXjFlQXcJ1g$(`{Rq z8S=J~?yW2Hb?1(+vYQ%Q|3Fx9d!sniz}d?=B(}r;eit@Lw|Fo1qbNT6Tlhpusb>eUSEN(#Ufso;BN)}yl=_g~HK>>y#`Todu=m?q?LDq}t>mz-Z-}&e z)fPjE@4wkbblp=+ecN{Dn6Ni?<51tNU{(sGm6FEO`g?U*MM2o%h!onTu@99&Z>aN%*-qYGAv{a)zlBg z0VdDt>hJF@BP0|Q6eJiVD(L0wA|xy=EiD8W5fTv*02~5-A)fwr!2+IsYzIny=urci z0KN!sWab7lQm>u8SAf4fD=V_0pVvV@9i6=WUDfRT?S3}r=_iQHK5!Cr@bVD)SuG?i z2p2j^ft|M_;%Hg$Hr>e`yg{-9nI&F-E01bH#XZ3HxU;j91L)=9sQ=oHUrYzeQ1f;$ z9J!zUlsO*k?~CyCLpbQ#fkN3?|mzgdWuXP}d>pOcQ0ryodH@%QpYt`k)+Cue7b1H#GE z-|vsl{vU1T-&lkITu@R%L_}OtLRwr{S_&>M4VU^CW+WylDIzWd3o`EQ>8Z)T(R!&909>j4&{AR#U;3LfGw*Yg*SUq0kFJtqU~+!6jE3a%i9>38WL z^dp6|Ku+2J+^b1Qh)W9!ivUBClm-v?Z|3d)BPaKNq;p`6i3)<%CL%2=Eha81Eb`A| z78Vzi5EK@bk`|T#U-3%(8;Sp^{r%mu{LM=KE`3Qj)^r z|GXCfZz~3zt%QiM2wXx^0uF}!&nAuB3nWD0Vj`lVa7i)Hn#jL!wZKD5iAqa}3rmPe zN`Pq=6_Er6@Xx0rVc=dwfF$UmC>*RMiGLJA?jUfGPa!2DB_SmyAucH;42JiQVqh-- z`x98#l5lBBuscc!|Ihb=KbhFk&;2($F+iSajS!(u3aE_?4hM(9UuO5K_DFmFyQO1> zaP)Uo0DC+b`!8kxnfu5FlpP!beC-@U6nvfBLEd)YAJ*E>%HKqhhj$s!kgi>@shxX( zlY)piu&TdM|16>I?q&CzjG(xb2wW5#Gf;wmto*YmvN43`L1SRkfUkG=d+`Dalha4K|i{L!iiICg*o zixgO;sQ&(;_RpfqAT`JxVdop7Ex*F?d0np;OnFyCI}wVKePP@orX@Hj!xh};bH*tn?ZOAPBaQ8Zl?N%%Ey(# z6@&!JF5q**$I`=COj|faS4tg@Fw!?RbqY8G57m{_6;g9F*VjjKs`1%*7`pNOwM$2} za@eVZMgCiyigL>bR1gI#;K>R7jHnfmnKf7kzckR*MdexGK=?3XRK^b$sLOSF@eK^dJHg3>{<2GENE2gm$$^dJ32 z^G(P2S&qwq9q_==(81)OGLt}G&(iX*e;lnOx(jV$UVx$ z`zd=flLAG@06P0J!;o#E$AI#1W(KMc7~p&lWoG^=m;LCoFdSY6JJ7km4?$&UKjxCS zrwsY~57eCDk6ofZY!^JAii5Ghkds+?D2vR!szm-`8M19$&?7LXXvmD9Aus~u z^L7RJ7MP(QJTNet!!isH*!mCpI^h0MhJmagmQ$f;_K7It~PK zx_-0x zm@CW%b_!+&GluEHG-0YR30NMe4+Zu9FmJ$f2Gm=_EMX=v1DFm>3nm520rlZPgFnm{ z<_SZodtNFiOM*qg6kq|6 zGUN^(3NDyJY)A(Rg%Y3)r~sA^G(^GtK(d$~WC&8o@IfspWP4a&1S^1LfgRFfg&OaZH@u?Ogm!0+FW=3xDvlGd~AAcPA4kZ!ZT|5*Wx~#9!*ZjrNF4 zws06s6b>mhBbR`Xl>C80lv6+!krw&;r3esDu=;TK_cuV^C6VO*{tn1eq;K;9FHt}R z1dE3tr9E&@1BfH|uz(M84?t={-cf7+2;a_ZZ|C5~>&>wOZbzg4$KIO4ifl4dfrcZ3s}>?=rlj+H^Dka((!@*KCq6F`jKsoBE`Xl%m_vH z1Jon$_{fY;%XsA12q<~*4TF#$@hq8p7je zZ;B{U@>;zrH(Q1~14D#v@~R&_&d@2jJ}LhdRj0vl=@2c?I}7 zIQ{&(0f_uXN(bx*zeU-HEXV-zkMHCTDv;s_!R5bf?3dVKUy+mX-^wCeJ(y~l5D?0V zNrQ;uC;sc;{Ijit!Vi%kAR-Kx2GQTI3j`L23WEMJ_@8QiClv_hAoQ|G5VNo(O*hPh?o-4x(AdpQ0%G(Gwsi^xK60 zO$$Hl2Nn0IdpQL7{ggtH{zmhmV({I~p;7+r^AtL&;lF=nfO>E77qk1>rvo$ptHJ&l z266*HI5`@7{aP-6+q1uP3_L3!CgXbe3hf8>=P5X33p#uOaKQFg8#-h|Js;FJYsg22 z)c@Bf_H%egbpN+r{$x8`>_4jh+t^I{Jje@=!3+(j`tZP?Ay0hF$Lftx+os$Na`mF! z$~GIbyL`MCccDB>{wg~DX1tV`r1*BiZ=c?%L=g$hWRy9`>&%o3_1upmwf1LGbQ<5t zl3D$zVM|dr|7_bkZ!e{xEJ*zA;N#uRW!2vI65$!3@f^2#@Ts7mHW%(&IxtS2)VBVT?AMu#i>L$C8GqixH{^&>z;CN zD$CiIUb>_8MDK;_%=TiK&^FGq(AujT?Sq`mg16J*oRXZgvNo?oS`?i0$SC~6#4o;4 zvqQ(U>R`JcCapD!r<^2;r+wpVEWV-cmvXYEj|v#R7q$zQCU2BK)7we>USDxVjhJ`! zL?60FnA9cJb*X@lO&@(9GMPw|tXbE~IqE5Lakbf6+w{9JcIwY4MGA>ThGNR8c;c?x zCp1?o&dGQk&khI^l7vygR~a(H^E#r1?q;XEyJ3ErD7U)*QChlG}Qh_c`t2on5AcoABin zgnL8VSDEfgft*YB-d|KPva3>`zsR9ty+)?Qcr9|d^HsC_X=16MZ_sVN^*J(|^Ay<@ z_@a*uq~tE|40a^djHddA;nqE5HC;TlMbTawI7-KdeMhI5$BGkGSkSOAYaJomR=WRDPmevebQckD8W=Bp7Wb=S(%J$XMsCt~|DL zBWJf?JQTW4YV)qN|0@YqG6#>~^{xqxavuvDORMuy_UjoR^wnReJbfU9-t8~mUz`cE z2Q{nf*rN8;eyTvOHe3Z|` z|4JB1QgY5>`NA9O`%dkO`1dK*`NxE0AE=g!229lA+}|pj?_Et0qlz^fZ-h-Z+LVV2 zY76Dv#}5v<{u#~HnvEs=s@MRwibnd^@H;dkL5^q=39Vj=u8f(HpWS`J!<{`$G@ww+ zM{hb_@+6n;`1UkUN|kZlsWKT~8L2QE6+QWs`?Ps2?j_gj!pnHLbKbXysPX8OaD;Lv z!%k>-98-HT6N97CU8c_c;mT%ZSULZNsppp&_hbjtx1sNJVQ*FLygvJ|;BD*4bsV}B zh6Y!K82JllD#^kc^@Q${YBI-VU!TAkZX^paug$%s)hn>v7Ol+V z=G_8knmmOX>8~DyV_qkOyQ4kJ*Pr^#PS9_}4!BmO7a*h;T|dS2xHN>-c^%K88T_74 zC|ql2Yd0CFq9aH9>@}aRiBTktlSwY~LuvV~&xtfb?N_7j&t8^f&$`dx6}m$^ z)an+Uw?j7eKi3&dpHSfIiwymC zjSnBY`1YK*5nolRMNd{>D2<~@cwcU8Kw=dqWok>=($+TRYiqO{t88IG>xWl8x9;b~ zk2TcoQe5v-X1m3gqEwC*+?}pt>XE*v_HCJ=E8&6be3mN9)-9zQQpKU2Q@cGhUtNkQArkbenxK2H5E0XqH3mFrlSkm4zF^%*ub;+!v0?tXhU^Xs#3l5^uv zcX{ED%_Q8pe|P?S%wWaCJW@}b8frOC(of&h$BNVQnoWGTu9jr2z96Z%)Nt8o&8Xh# zWYx8Y>`QOVjZb?&<0us@Y%Pkzq}t48k_Z#wd!#H^ zRA{R)w)y&jo|iVO9o;2frASlngr+)1Q~r%NSBTHxsr4z*-|$8o%qyekd2URJn7f{O zQu0;Kl~vD%1hrH{x=Ja5UWSg-aMoq zf+AluaNCX=j4ehCQLGTXhkLq>fUm;8h*V?e^J@NL5F+;g$A-3wyPF3Kn0d{~_oB7_Xs z^r@*idFoTa%T}cqo!DwGQu>p(hmF4KzI5F7vhu(4E=73A%!R28$H`|}EdLl@$lDZ8zf&nu&NETZCF z*<~`sGo5+64>3j4CGC@p`nb!M)Ac96ka3KC9lOWeOH56;p7fNv+z`f)K7`&O%pp5` z)0$pqo=x`xRfY;bt?0=LDs1KUJ0B9$gdfhokSXa%oR|C@OhI9PvTF)^syR18OnTZf zw++o}&2xBX#0m~Qp{%_-S!XuaQ;+|;fxa}{l0b#6d|OY?NF$(g7QLLOpdo~#+YJAC zrAl0kDOGGUgCE+?DV#OYTlS&OLf;8A`tE+DnVwUBKwqj|^Qc|XLx<$+NB_+&)xLOV z*@@3n9DJ=o_Ok;dE9Vwq8BH+jmYV0Rm_l2)vxfT=`+gZCh9m@5Jz@#0uoWS=mXT*p zmh?+yznXbzb~#aB_}8T~kLPu=PhH(LP-gLU?Jqcs`D8i4IOX_e?J>7}i>}6M&j)m5 zavmpUcCV;1ikm--^p7lor|ug}JmM?#r1&}ZKN7!ReA3V@pz=ysdjwh57N!) z=~@pRKHU?#8$vIL*Fbru<-Pxj70(LFhLnUJ1V?Pjhc7%ig6K507-V+2CCqj-o0B)` z-kqQ`Y>M~GZhEHJHP^q@z@NxDRyIwU_r!ZMkdk2OdiUpv!r-=+;R2l(Lh9eq_&W7Q zX6^l77{V?WlXkhVDhaQNSHHDplWD@~iP0f1dY$L+4lUvHzU--65uB96S8+I_@RF)4vTyA(i<6-nc}vpmpAf>Ypy?DVD~aS^R(X!QCw%loGEl7 znpi|h;ib5C?OFZa=4rEUzE)SM9~tVs3S+n>tz$l?E}`nqy1SEy-2}TkXhWD}ib2%E zH+19q@J-^9a)}Q?{&88MCo;@$8CcR@C3&YY_gJy37fQ#9BsQuHAtV|2%?>YEb%CVy}bWUeRV`EM!>_AJpE^(m}l`+~0b^ebV z>)$uGre}Ml58T6I=)z8aug{YrtxSEBV7dLt)Ys*QX-2G!)HsE20 z`R#OKtCMLoj}lRf2^m$@n%#Y?Fo)s%kZboQr5=djYKxz#qT;J;fawh9@+Kdre(?zV#Pm7_iEvb4wJTbk}%V(8|_3h61Y3$aIXAQiR z)N;O%-#kTpUlC0HaEY*{rey@0;$P2Qbu6Fx&GpaPp`imsp z1+3K%zFmH<(;?auYcF7sU3p6D&WW+t#Wu4Z#^*ZFUOqf=Z#ver~#&rm>hl%LOO?`5DpPP8wJ08U z<>nZL3+(hcn`{n@JRV>q!*+Cit8_LruTAA?ui?A5;}I7;xmBj0jVCwQ9k1yrotof{ ze5x7VQcgN3x^TR?X(z9(civHUQ;^CvfSb<2L0S9F{LK9?#W;cjR_(jj)J_Cep59zL z&wVFxPQHKQLfd|kZp;Ye!{)mAQ0JY?9k<~NovAl)-gH5``johB1GOSaD?}8}mq&vW z#L%)#PNB`8A9cq8yqQEEyODVo{C+3Z@nms8*se}+1<1ykpq1;KU*79Bap zE-gj2&(aPPsSQ`GLws(cNWx>*JRYp;qe5YtlEou7mH`DaUSa{&JC?obiW%0b9EoI1 zHkVJQ_syuXan?tHp>m*i?dM$BRwmyL1#MjTOQeaQ&H@g`ghQOt^b+UguM z%u_en-|2t)j3c{V7nRv2@-ox+8Z>e;{+;u;8cFup`!eZGRVw3kov$rNv+t|5Q{-Ib zr`ghfN+mS4Xx*XYQ$|%q(9^oc{VqVRHCDg0kb3ag?QqG=IRiQx>5g}iE3J$hSoGg0 zrzDrKDGj`NQxd}4lBHk0aK3Zti|m9v|4P=9HF-g*i}qcj@03;NryaDkmP-3BFMQr& z4XZvG6h+Imt@2obZ7XpB!;4{YMYF(_#Qb`&-jLkHW2`bJ1}^pHW4JQBwDGqKMcJy- zd7drxHcg~vpK;xOL&#_)s^ z{%ebD(g?H4U{>pG?+T*r?G4@tji6;qX+}ej$KAXMnO||kEyf@BPrgZH{`3EPO!!IhqCp|~v-XI<@cJW@Q6~o{2RxpPF3#R-@6=?a6PYXk>O_YX79se)((`6 z7aH$QrGG3Qs9kwWMet>ACk!h)?+c?|wt08$Sq=m_f7N!(WWmy9($$*NF9Hk6U;7r* zzwP#EyVU`7EQ6Lt;biSOT$_LE^`ABUaYvU5>3I&z_ny zewj|%`JMvJ_~AIk6_g11zP6$`@3tO%0qcEWAERHFxJ1B} zjN%@yv`I{_1q()%C-m}e_|?6xS2s!Gpo`Y|?&c+~C0aJ%HyxH|Z#g#S)t5zC@$QEa zo)T)&y3(VITkWa&Ibsg{yS6Jj<5pqme)bM{R0u;vyw3fO3#^*B+VZ?BJnvpl2c6ON zHZEh#^m%T6tlgKu;W)hFZl;;Zb)GRDX#zlJLuD@yt+#RNR2YYS@e%3Pe#In5M zBNIvFqpQL%Vm_aLc>I19{*y$06(>AAmCMasDvYwN?$)=x?D_FHX!~ERzlq#=$mF}C zs8EDEW+Wa;9hNxFLF3`laxKV9>R$Yv!pe{OXirH*_CJt*$NZS7PdQpW^ZilIiRShm z&qRfi-VHpT%^P+fx007Cx{rNWOqfu5BdWhJ(pm3VJ{?O-`f4S1<1=0M6UOLZ_vxvb zJH35N*d2Tb9@%L2iRZ{A|(F$^}o z#@-bP514N{Hb7s{lyP@6bs$)k^fPf87u8u3%UL5#H__hR5X<(~SE26aZxD3uF#}+6f^ z7lj;Ooxb+SEGI^PoY&_wbAWp8boxe_J~LNW5^G^P=~F4xBrqzV(brw|wNJ{P~%)y;Qp&Q787D+QYraaHCAo_A8TMXIN}3 z7rM^sb==J>Ec|=SN}DPn*+$-vBqsM)iDcvFsGUi<+kFI}6t(%?P5B4#=hOLk4~yf% z_grLT>@7Wn!_Fk6shC`|dmPrQP4ubb-1FtoeXO_e2nPzToVnbRrtxG+5`;lbCD&HT z4KYhk!gfpVjPISX@~f8-Q;E}q&i!kx?`I`BnJ8lCM7YJvspv_=FtQ`r+-?ZeKKLYGJFA zo&rA8Eihi;%x;m5#0a%;88xE&(v248H0QGnZ)vaginh7aHk8hyk(l_WH=cqeMIF23 z!S!V!zAiR2x+k#NM~=O+Sia<=d37}uupFyRaHp$NEHGmE<%u-&HmdMPOt~rWlRJ`T zVRCTtG1a}dydqCGzm3T)UWg66PFP~Z>;3Y9k!I;f&hiPnH1a93@pGLixGXi2S?2~C zx=0Gb>!q@b>sRuVL}?1BR>Cp*uUR>&TnU+JxKG>=7=LcUXGbzMNOXrv?paYfkJ)Xf z2%+jTGJxYrsN~zcH&3lsBl`Oj`I4&g`_%}_Sc6vBu?e_eZGLW=Iysoz)@N*q=MPU! zOX#@pF`Vm7h`cx~F3sxk^U_g{#oDKI7V8`938KwfpGral!zS?Oc9+u=nJyb{m8d!P zWZV!JKSAbxVe!Vxrz5zfPLQ_)P4MVGmoA^hmJ$xpUQ?pPO98B85&@T~yUl3SH?f^w z#PKhtUad)Nqph!5J~lk|EIFLbJcNk)T>Vw< zSCSyQ!&t2xyQM$x%GN-=>G9hA>ks^|rwAX{YYQ_FcJ{(H&oE69Vo{%0-d5J~E!8yl zpKR&L>I-4Mzb@$-f_L}WQ0-(%!r)7Vi)wdx#YxS+%Z-xXFyYK|sF}IE$oAk2!O-ca zrkAMI_=y8luMtSO541G!y-%l3p47RAv%A=8n^so532RQYiHk3P)XEa5(PI8mfQG3Y zA)MhCG0?0wT~t51>K8kM7JqDbi;`Mw7|~I!;$UYlb zcSyQOrzb^9IQj^)Y|BUbocJTTgwHn}X2KQiph?ZPb2peR0u<#nEtS4gP-4q7wXIE` zk)Z03F47FK#DcTeG)ERRm@+5}o_ul**Mrw$-RW6dmz_nIr<;&bn+!Rp>Qy;bhhxVk zbFK}Y=P`U{`&K2tY0c6Ecg?sefzhg-{Mskcp=XYj8uu+vEJHPcF>WCk@%2b=Mtg7kq-QFH#)O_vs3;8X3Qsov&VqxDuFFY7jfL z>C`K!U_`4GwPM=FSemA<8msr}WavPhEp8O?yNc`#=VPtFVTM2#?RiG;v=oL6CHD2- zAduP9mH|ItW*y^0WJqv67}w~f8Cm^a$R0iSCKBs{wc2?6Lzmab>-fJug13kA*1t8; zik~$2gza&T;T)FRZuCi_p%Z&Tv!qF1MlR#R!q2UD-+N`}+?LqrOkGowahcRmZ*H8g zd&tGwU3BM+y;|oj(w2F*dtLn+@>;78`DQ|}dULKpQ_&pq9}`!jX1eu{^WC)_>a%|r z+yBzpK$Ug-($?25RRIcpO@W5OxWIu9@$(nXmXv1?ro;$rL}HDI&K=)7XOTAZk|o|N zM=epM_W}iB1a8!vLw?T?qggf-aRPUuw{x!ue}dZLYSH(6^qrgP*Ir=b*;0$*wPLz7 z=VLIieN!t-?q;u?c>dJOW~c!3DVULPXOnSe#T^@WYkG`356{zLP9(`U;OU9iovgF; zp6*wuK#Z9($n|^??@;x{GUa@d&em7cTG!DmBkIl1xZ+Mb$Pz2=dP;-RxdrzLB2GJX zHkKx~{DEhRaV=}DGIn~H=DZE-<;9o+fgZbX3ACwC2$r!)lENl2`K6iho8v+b{ARc1 zd??J~SFUVyC|G_feF$r%DF14(G&!bM&DpGs2+gsa!ZegS=Q){yQ!eXqabqjXEf6gv z=US(q5)1xFZh_wO$4t*Jy|!LIMjSLD5Rs~G#n}Azdn!FE2M%_uM8g$2yq>_P*l$ef zvVGw!!LKI2`Y6mHs;+AltX|b<%rLP_7004@P?~HY<-2t@D~!&Y(4=`qfun1B5HF60 zL9(0gh86AoXK`7*PFK_3edpM5@T4&uSCjYH55o2yq=+&MCHKKHBb96`Q*Kz(g-<8X zcl9YlOWmFRR7zv-s?Pd#!Ic;*-aNfd*7RvQsjE1Ne>0U9t8LMUj`$m)emVO#Uft7c zcjd31Uhj_JT6j^~;UJUKZsA7qj{Z{-umAb5M(@<4KU6Os4G+5SO8_v-W`t0 zcTM|@(Mgoo+$0`sC?TRuNmO`CaCel*z5er^;L)WnKZq8wgvTUQ*0n++&3CC`C^l?t zE$(@YF}nTrqLY~|ixXc>#E06xgj5H2wxZq9k)N(nZ{~2lvM}YP+am07mXcP3 zD-Uh$M!KT6kF>$uOiE%KBjMn z)7!VhG}-Sx^_q%WmNhZMjl5Lb(s6|s(@|WRc*?b@&E zl5`ku?E|LAw&^);s?S;B1=@+TInB-WWmp7b6jw*OdGeeSiRR^`P0+lht&^~BDT?df zBG$Mbv!LiI=`{B3Sut*s812moUAi6SQE5ik^w@93n)Gb%VZj%_61zSbX6}5xORF^? zBTQMk-7B-a5X-L^Sy-2SuN3>jWH+;<0s@;|hIiT(5A%EOn)p|1SV5 zK-9nVrLW&;9K8!B<3k0!cTY603h(7;+fE=1N{7H+P}SOodh2A0NOS*{!Umys%)UQJ zOQUX{nb+zDM(A6h7MN27N30gwG%*XsR0ebkVhSs25b~+;g#;g(liN84NV$+(P4R1~ z1ke&S%@^170q-P7cE!wn=`L(%s`cr)n&>Oxl+ayTxw#Y^eU638l3<`aJ7=JKD2dk zW!tRAF2H5>$imZOoSz#FQGpUbx|`T)Xfr!IXt(n&-lY~nL(X;75Jsnd*HwfsEI(U`+0~ugH<=-Oq1PD3CsHR9FE2!;?coXKXAp2CEhB0&Wyh1r~x+aDSxjfqg%n1yWY% zuOJGR`zwBQr@p*I1{`QanK#3}MHJOM&5=M^12dAc9W z3P8DV(&n!ui`b^YJ?xX2-=2>Yx-RN5C>xZN>CAGmOG* z9=(5^`|yI822=|W?JcMCU?|OOA{a^anxrkfu~IwrbMWa!{3TccI64fkP;_v+?B12+ zN>k>CJ(TWY``=#I^g6DnB^szw9s?Auu{6<|_&>;2SOdVDeZclSy!<7ZMfp`S#uSnS zeG501+e*?i5`>|mkdQX%36PNB?ozIJCbb@AqvrYIwh(f-RXn!9qEIaDk{CER66q|^ zBRXan*T?g<^br>I%jvN&(QPYaAU3;7Wuc=e-WkwD@VU;J?}lv@xdDI8)yw= z@$l!KehNs=!qBz!sT;KS-m>_IhKO4fc#%|YINn5w$R=xLUqT|o+}Dm2A?XEZU%v8G zVgKx1h;$7Pm|#h+ABatEDSx%H;5iOM1HMP@E#2u8SFFa zWbI_#2m!gsR%*Te1ZL{C*e!ajb>iTMu^72-5TgX~C& zS2s&m<7ivGrSn9e1>r_>sU$s8^EXrrW4=)r{diG@7wwxUTf?rNb_Cdqj>)De_03Yu z#R54&6Z_9~l*$EojnkqYZ9A{!weZ1S|I=%jfIZ7#F;@;a9RlDN>wfw;iasP1qyNEG zoBnCi`vS7%UGZs~*YIc0@0S_P5a;rUGybGk~16@W4a8CY5V32Feia z6&>P*GRCRR64i^Q%CBoOB z(_;}dJM*J&+}QP_4&PmooUbVHH|7irvZ~x@`l=F#wS>^Z%4-Jf$;n8C@o|YKjw_sq zN~bR?2fTD`MP0ona%$J+TxV^-uoOb?(x_@(iPI$dn@J7F{vZm%#h%3XtX?_OzJItu z+q2YmDCk;G^AYiCS*>(5&FnF#JsTYz1UC;|Q>AH?0A)mGsJ0qzl_~12q9XalZEk`% zw8l9}2!B9Co2$V5Y3oVVM^yxfJUfn+0Y^*PdL{}82mCrn^!5TbFfgp#uw}U*@-_MiaB$Qr)8XN=k(2MkDp-p^Meq9qiVrGPT6kmFP3z$VN7rjKFY;1?E z)&0fIQ9bQ2&o}wCM8VAaP3o+=Di(4YT;ZIv+v=-dadnkNr)kNr=?L zIzBXE$x|`+J^{J526WjFwmRGSlcC@JOntSac9W-T@)Kh+f^3b;96v3eCJSld-?Mov zTGvD(#6Z_L9~SvrXNY}@$V;WWZwP9TjO73}Q}IWBpwHdgiZ=M2xz?M<8qI#F(W4O> z(})r6e9`Z-#qa;ol%luP40Kk95a|+k4#gZr&d=3mFH7B`5cMCSD)M$vSKi6t&3YH^dlHAD5!p~d7tkH(d17XFQ!`Q0|qTY;^c%Rf4R zI=&aGmkK;>OqGCVs8`y?vG_@B$obfuFSh7Pti*dQCR(A*z&w|)z|?N@4bf*HIFaRO zu^cRbL#FH?=Jeo}LvbIi6|n*8pJ*3V3J#ajdA&T@I04yxEABR#Qln9LT^w>zZDYk& zR__x5y5z6LSZSuTR>tm1>PYh$p{=m>aq%Faz+W~xIAavIKv?)}x@0)+SuePTc!5JrF0H)m#K)x%EHx_zz;zehG5!p~V-r2bd{q>`{M|+5MtY3X2z)J{4!sge7;R-#$#BU+Tr!PNA4U)8C^StQQyGDZdKp+%$ zE9K0MM^F2T*~UGby2uxdC)4jym+15ppC-T98eD*%{g^SfzukjHP}G&h-jy z_m$LHu_*uyN`*+K+hA~hxujs%ft{nCE5DDQaHfEk^^(}<7G&&Cv{5_Q4_xGCrP)^* zwO@7AlN`y?Sow$$9FOgk*y<@(V0dCwBbrdUJ^brV)6#)g39nY?5$UJ6^nOH})=RIm zwmC2n97plgBGpb-2LkaS8ykw)=Kykz(_1F$89CqjI&c3dcba-aA0ct;M_^6x+raU{FOY^EAL6_XL7djPP)?Xd4hQkd~xGQSzI zO0Ea)F^iqno^s3z@$@8uW(xT~e!!Rju3``EJ9E9wDAHtxm=CuD#J$3>!D5^ zCGIxWOXJ4@q0NCi-V3E+q>&4~DrXU#@roANSY;*-!RuVSE&4w)EGmEN6r258mK@s# zClJ+;q_k`q7c;!9Kq*dJQdkD^Ts-nqwoV~jVbMx0QLXVF>ge)3XM^PVMvzE|JOv7P z(@l7;Q88M<2{o8TiUz;DT5W&C>znQB8LH(fFWmK87QA0kh!c%4kR>7$AxD};%UD9G zYSaeISjteA;8W3sAXd;K>7rEV^I9JtwP%8#=1CWLps6tvnF_yW}-v`@t{7lY!9*>IxMBMB>@~Od}N1=kIcfY z;?HK3RIBrp?)!Z)mM42H&nbBUf!JfdlP ztwc%tlU22|wuT8lpv~8=jT+{fujIfE%A#?$&Xz_^i&$70J(NT+PvkZu09Zn9^z|1h zbE@APChxN^y@(%hNV*3nPur1s(D7FC<$K79Y;^+)!q*W%JCgi5u>ywr^(lV`f#f_M z;{|W#-sMp&4U{hr=~RiOLJQf(g!0?vl{^$MPzVQgP-&+nszF{?wQM)os=08-|DlP; z;VzTePDGw@kyUtRgsl#s?i$x0*SrNXZZW7=5ap?xF^^ zL#`PHYA{Q+kU6=uU(ZQEfCdp0X80$~k?x7I*S073BolWbjVpy$aORe6t`KAqKun10 zUfnZP(O*XS1b>sV52mU38=sJPqsn8u;q!demS!8s1a=q8uT{g??g~2B?WV8bYsmCD za{zdyLk}*<4t8|Q1=>~RWEAW1DHIPUe-}gJ7(AZjm2H}6`4%1rbdRxVlED2Zx}R#G z6jFSNfEN;wN%_Uz9!!IEOl{O_L1WJ6x0zdA9Ar|<)?UY}=<(JgJEl{YEA zPhsVjrgYm0lNf_0r|&la6+rp&x+t1<$Iqel8Lv$csvW9zHl(?IXRd}hN_Kk_7r-G01mGPN z5qLg+&smkLd*wC+-Lm@NxYk`@A|B~(j%f(RDmHw}^wNCB4vV%3>x7{N8j5-2pK zHUy>09!;O0;JK>muOm?C5g(ROD-BZ{kbFb9?8+W_1JkiS?lD0T5}*_>4sRd5`7p7v zT|#R>cJb6!fY>G2GxrUfdLo0w6IqPOu4@5GKAgrkCg7EKOu##p6p$ihr$oC&Ru^Wz z2z*qVeH`XSU0DaRiUKN44aCE)0pVg>W2d=!E<2mJW zZb1xtqYa$sGjbunIXctCebX2s(0x-z6#BwzRX4FIL2H{YJjj%y;xUz&Wy2-WkR}jc z7HZwTzxuD36X6p;*}W8qPL>NTa)@v^7qWreEe_LMnGMm=a3nXCtn@ndi(5_~sTS-{ zUb-qB8NO(&AECMxyWfrwu(G_yWE}htt57$G0Vj&Wt*$*-gO^FSc+5oAE9X9I|`&3nf4Da=jVjj=i4L-G=y0Ly*tF=FI$cl1|!4^Zmmy- z4`}p6{8?_>nt@E(+gV7)>Bud5$xHr7tFB$I&<3Ht^V457Vpan(*UAtyFpT?T+-H0r45oL(}+GBmlz66UxV#&JAZk1DbFg-kb#{QIN@Y3S4pE7o}}_a=B@Lta3F^%S#lF zPB--xGv>hHrGPpOIU+&b?y8fRp6%rEwm)gNTjWGzb~kfWz>h>;40VOkHJG?QorT&n zti`~S5!d{nIKv^%!@)+$s)Gz93t*w7X^}}v70WpoEa=8xCy@!}?vk1pwO2pmAP`-f zSmxv3Yv8CtG=W#JxYsj6REYvK0ftCkAVpp$HIjxtYF^yCw@@cD2A*av`Ci)Pox>g^H5jL38B3#jd~q| zH0}f5_WKCod;DwSy=_iIZ`-19-S_K^RzD18ssF#xPgYHaOGux44eG$6YxRmE>guiiL%R zI#VOyF2#@n)raWpy!HC8((ge_3%Zsi7_nI^6pHWGEFMr9TjLsw(_v$veQ8cQXCtLt z!UM4e$EPxa&s=JWY{qBMqZNoTfw*Q;w!WmFZM+gLKBMD}EMW}VI7>h;%|30*WY^%% zq$nwmBdC6?Gn8Ol7NEnTk0OtDO2q90p}RoByA0!{aS&{0EJqutck^$onDlu(YYvvUjyHU)MTi(8+p$Z6dpUATey=&YhuiMF zb2u_Ib|CJSDK_KlPF;3AdRRyqb@Uxes+~)t^M7-tj`rIAuz>9>1{l2uqfi!P16en9 z&r4|zluGvyDb1#hhT#A{WQ?~W7jviv{9Z?T%D_(fn-+xI4?cRP@Yg8@BI)VGN2QOc zXoM%B?@YaIS=@u9HMdC|bXX!KECqu{<)cUBAClTK{r-xj;&>5R$5cTn3u#j%7FoJY zovD>70+3OR1Iu5^6 z3(*zI|3@j?7tj;ajFzS^!+SSG;8k;}B5gX*cuC`xE`v4)I;rcdke@5SZf54TYgR1|6%u^NJ`?m`I_%pkSRfKhF|90pq=^T3kOGADV*UGw#X_jZgffPyz9NK zgrZ)u@l@MS8KBfo;A{&PU0aD|z=A`xZt;^|%}M8Q zKp*SbI@B`ARz@|#PyrLvsOFiI`vTw&BXsjU0clBYaS0dX8u=cqr~C1{U2STULOSdx zU%1rtp?HqNIPbWEG%n>xYz`PfYB^Ry*XW-{^K{gkl)n0HeIop!I{iMi{EmS=d3A{m z8`s?hHXG0>Kt8T*aiNLx9V1ZcE5$H(+Vp={!YUK*pO{iL`&2TnZGHo7R|!PHdt75d z9MXZxd`8FTYLbJzT|p0Q-^9wNCN!*Qb3*FCry)d+Ak(0+JE!wEW>t3pARMbuv{T() zn&XGHs;MiQNtWSw*MiYse9}=W_j!Igc*;DLt-t}st>SqaE=tw?K@0B+g{XmAlmFAp z(lSlVINXXYCLpUvUv7tfFfvWF{j^4td$0kA-?c8IkTqSojC}m^i%<%-3yVYYfcFTx z-=RNY{`if~fjpa9BaJ7Z$B*yrdG7{)+WFAFuq7JsjLuEd!vg~oXdC8(b}DsaYZ3;P zV6{fXS=E8&FTY zz7F}uusb)qZHBSV17_6j%Y_M=6z3O-&V8!z!b2-@Hb|oJmS3hhcMX)ri|5Eff~pT% z3}`4cNG_eR>YZs8&Ke0Un3{xQ?(i8?31xqkw(%K0XI#-}9+MSI0x<2mkJdDF&tNdf zc*Mh>Yeibtt7yq#%dR^m@oLPurjxvH&p?0NdoW$z+LgMDflJ@H{Z^}H)_v7Z%WuYm zKXLsl9XX9ufjXbcuFTOj`G+L>g=267UvPMbw$b${FCat(YaTsd&0)8_zJcMkw5jyi z(}^nIO4Qie5x9CA+{*A9K8F)q(U^C&=FWKD_#lRohPcRaQ_DuJVr(Kc&({qKf1_+Y zAalhn%LlwZkpj%$SBy5;D^A%Iz~wP20HBCA(o6aUVQxU)X1o`(h@RFO80$@gDDxPJnbK6K}&N$$l(!t6svG+*}6($0s^L+GP>0 z^({!(0kEc)9*eYj6xO3s3&iXJVhd6(hT0B0HZW~c=^E41Ggsu8ebyqdMJq@S&tRyY zPH;Nt8vk|bk$!kZs!S6)jS^RsOTa=~6V@xH(!Sww^W{J4cqRB1i;UC~A!=6>X;iN`=VVc|AgW%RX|1McO50`tSeNByG ze5-GV`jckJ_4_2-_n>=Kx zF`A_PYyx`9z$>_0HNr2STeRkhS~trGLXp^?*?od=Wn;f`qlti;Bg*))ITD$tWbw(4 zrTtF};alX0SqgK~J`>Sgu_N95(w-Qs$p#b@-98Tx0Sl&;Et*$2qYE{*a`pk`MyHI@ zvlZ+Pu31QXVBvcA3k1+wC>4=O*xh`i)cp|}+ecxwy)MV;D6a6FT#Z+L3{zAv$h@HX zT*RXiC55O!CR`uc06(c2mUL-KVgS(RkN#O4&ISCO&R_dH;c?MXTZ)S>%`2y8EdBNMIm{mh|g0a(UO)=06pq;oWCc1Bki z!l~E$sY{U<3g%TF5Wqd*`Do^D8Jj%L^gAf_I%|hmR!jYD!0B^C>^JwGeb2;Nd`hfb z3 zU?9aL;Y66(I3^yo_@8OZ5EUdXCpE0Hu%Mx3;cJxA`PfqX_NBqn6xB#p9O@>00deZc%| z)*z&j;oJR0iC3=M{fW$Ym?8Mwa~8Tg02CmlSpPbpR*t15I9Y@}YNWWur5UD79%a*l7+z+Wgdr;ot>9^zRIQ4ekL>F2ABVBg&_HhL2zJ zJJ&wW$MUtH(vOw>!{d3x35W2)-l>1T^)XAE*r%q_B-Sjsf?8oHc&wsRQze@{yp$sY z6Sw-TiUEvq3DS2iLMDb@fpX__r*(JLUr{T{H2~%)-lW|oXQ3YJ3D2mytdiF06*W)f z=Ia&}S+<_BGgUnUIOv3qH=i@XVuf%2ymF(vcJ3dQsjM1!0*(xpe#?=n-akG%38=uh zSmz`SPi*rL`4%>2h^JI}sKN#iS#RXo-FAb5_&b7U7-+Whmlrx?z<>)Fd&VJ0Y5uB5 zKZoB6D^;Uh zgV>8Mijwhza%^lX^Fiiz%vr;0BbHuyL^{~Q^!^6z zUM46qG>iq$(tr(sR{n4%jimz|eoHf*ID<;mb@UT^*KdG<6#mj*>f;_~KP=-O_;>>+_Ic{-Cf^oB=(|;|nFn8E)Fu0JXMG?FT zJ_&=d0>b_Ue}f)A;(6$3Acy$&fvN#nxwD%SkO!noDOyFeDI9!v9EBZt8t=wXXk&P;!87=T1ElH&%{tjCoHhXP zyo`7vRDUA$_(H7eg)~)WHDY|^PYc5QS%PswmNaJ)NL+4Cj6}IB;!n|;_f*&OdhfW4 zY0)T)_Q)%GKmij1O#NAbA%i{AZcI_e=*}|+vtmqHGCs?kUM@bbJc%8m@U+2g%czsrN0o*>_G<=hQCA(%u4lTGb2_}mS z^yq*qUCK*$X;YL7e4p8ExhaCbMXcr~@NQ}sxD)^+o(`waYk*e)ZYoA8}gQ+z;31T9LJ)HO^TM z<|=wRQkocoew_(;QEbP%>D$(l7-u>Up~2sk;b>hi$2`#D+VCfjNSFe10z!TRy8XQ_ zLgx#u!H*JvAHn(iN!!U=XYsLn3DL;SzCjPyZbP$kZcH_BY?P#L59#q|OZuJB@mbsA zbCW*4D{&xNh!+p11%M@cI39?Y@4&QE$2+%P_TW6a2Jr@vxstMEzOwTWA;VJ%4#%eg z83tyYP7|cLA)EDC&Pqoo7mz@e}fUp%@S_S6SO zcnaak-kzLlB+KIV%-CrF$vfTsl}qyI?BFMAqZdctC1OZYlfwqclHa6wlg6EX{@y-+ zpu5a4XYxGkeW3vwndL-E3cI!Aj+-!+W>_V$NWnp7>xh%TF7_JO)vidr>m|jE#|vKE zAVZ^uiq?Dp*l>2s(H5QxewhLZ^!pgk)Wc1b>S-XxuWlJmZMM6Z}DGc z4t**3>saP+vcJ}BmBFXbnuu44my{!ZT#*F|Z~CtDM1%xhdq*2#8>wxf#?%Y`F5EpEXlGY`7Dz^1Irb(2{v0=^2o-S z``0IX8{2j5aZz&~ZazhWRm90RPFJ|VMwbE3KY$2;z-aH0)i6XE;LyYgX=^AVLu_*@ z&-OQZ*k%%1QB+EU=YWK`7W1$)Z*F_cjsuCfNsgke&6A@KO6kpQAY3LKT~)&~ZOt+= z3t6MjIjW12qZUr*8Pktz*2&rTS=7g}!g)otV0}lOP9R1k`{72jj)knjg}yeVlhD-w z72JFq<_>j{ja2t9M}N!PV|veZbu%W?P*vZdvBNSahK+~c?tfVK1n2*v9+|b7XHFan zt1=5uS|N*iVr(!TW~5xkCdk3!1{vtjt`%1CCoDv1GR;OO0dyIHYc~V(!Ig*&xBvuH zsD5q(&K;ivhU;u4q-*994>SK)Sm%l{XkLP`bk095g(yxl%B(^q+b7tUu{XFc%*7{p zsUkT{>M}yHJUZ&N!O6>cv)vs@pRZ6+CY}W*e$qOX<#iZjtzsnnmbn|#?&hNKt~ zf0*#^rWsI&)SPFzDmmJ})uj>0swZCjyut0w58>O^%xY21{$khL{>czBmunQU+uu&K zs$M1EDE~`O@BRVAchPxjm1C}X7R<(lC9o%nM1}QZ?k{+DX6=0VMh^1sc{`#KHwuL- zHB^o?7Oh3@z$P$CedFpeU;k9x%#_UoZZpAgB)#$$P_oATUs>w2LR||gbk+RIH>9%y zcwIsytI;+M1>K42NWJ8^v=l=?z2vfpx*FnHfCW}1IOV|mFZzvSw4lOyAX`NH_a8v@ z^qyRo3$qL!G*}Qeb?ORJF+Gx?u;YX*#|m&8IY_Q%D$+q%V6U#f-iW7qfJZGwg>pF5{-tyBTek zs^e2I-r{DWt_>{u$Y#bZ+-6waYOOwh6p{a|W@=`*R<7-4PzuJtSwMu9pq`I1VwX?A zClX6QC&SVlal~$HIFx5^yjOjlL`vS;tX*T!@&?&{d7b(-1Qvc(j>-Gt9g3SujYYe9 zcznV;QUV8nG{ihc8os`O@C zG!rN%ZG7CY2%M@!cepqyUvwPg0q}nEyVCt_LC=)1!&{*1JbZ5?oIf5Dt>`7hY(m#; zaDVne@pCW?oQ)0J*$$kTz+^%ftEo}Up@pBbh-VOn4B;H1ANP58$w6S)aqGL^Y(l87 z`WxU|>@$qiHSC$eyO3QVc`injAIMsvM4B8h}c%<37Ka1@U=+WeH6 zGrd`;D1=RN&T5zceGJ@ZQ|RX8$^W36Khl_Skn*GGoPCkLTZ6055kWhIDI1t`k@sLv zy}R<0(x$uOL2>$F71TW<7y(om;nK!5?-O-F?4)Eh{vx#Hj{>&tm zr-QL9N*0>OwT($@##dARiRN?kQTAr91w-j8MP7WbdWkgOflw8kOKvB?27Ft7FRVcd z^+oPtaQmMxNpt?BY;MQ{s*(RE`ahDOEs85m)QFecO?MwJ3OLcCKP`l@9>EK1PD8~> zd^O0k>-ZLGfN)Lk@t0v~XtH?a!>ncvx+sa+k&rH-6WkOp8nL=pteb^#fyUUxGe1nK zAC8Ri_3OsCFMX&$8}T}_7OfEsY9C!aaP$Fl0^?z??>wn&i=%G0AjZ!LcUn@>2sV;x z(d)zMBTKHA%Ob0yRO(WR^Y!8zA;z5rqm4=-c>T3cRxp+JCD3-yl?8d5BkTNUz1 zG1Gt8$-tMjK{y_)rW${`RehL(z5<5IN#MBvCI1mf3^QdC_ zqhgP3Cx@SoD5cXbF@?pHdVZ68OD#(emi3iE9 zdsn~Z*0Rx?iS*?2LdhE22qu_3)+R7dAyVZhk?Ub2|GvykagXe2-_4GyuS7MGn0bBY zpQlXTZIcO-sGk)*_sM#CV2sj-(bw#UAC=)5p-dy+ME18wc8I+^7^fmF9%VqyYOUkA z`B{MIqV9^;+quZR^}YBI$mtRcLkn=)Sndsg-k#{Jr^Dyvt(u=0`-XzbRjn%M=x4=m zxZcyu;D#EJH48#^Pm09>=N&kDnZkDt5GF{#v32e+gsh#NgEcIvkqvMJ!h6fQd;D&% zS+bPnJvI_}xOCtoemLAP1g~rvRdl$)qsp~oZ5qLX1Z7Xj+B^_>Jod;G^Lt`b3Iv(x!*N1nv!nVMQCxF&1bc3nO#W}7 zoSO>N0M5K|=;PWZgio6{8s(zcK#Q2orsnI>i%3S|A>~ntW~sJZfa*Qk6!>{Ud)(kv z$xHWgr4CS!y;GjuanH?`yVvu9C9BVT6+lcVtzyWMdGD>o7>93*UIEiJsddtd1h52& zs%u4k#IHzeN@&(ftZFAtxIUVD#f^K9s+%%qJIl5k|=Ktqp*qZq`IA^As^F{RDV zD8{BJ`GS2n^qI>%zWpX(IFsYLLtLysZFPW!!(k<#__*z+)wbol)k^k=-=Jc1IyNDpdf+-3I*;mPW`T%_0N;Mz=UJgh)-9V&j==e1UgvX zP+eX-LRA|L-$GSp&pqqh>?u+1nh@24Yywr5R;)~#ep_+@A~OB)1(Yg~0mLxPYa zDW3W-?17t+;gtudVb#I~{m_&Y{L{E^Bl#j|=EEA^_2`>RtJQ%Q{pY;~g`_II=aF`2 z7+!!PtKHAZyt8`=zEw;HTK}t`zMl?X4^Ud{$%ILaSygCumNa8AcF{b)arqlPydGt9 z`$CFIq2Xvct%AJU2>!wL4UD-*A6`Z#5I*4iVhve(bB4&Us@GKwukN`4%r4|ejH`P4 z#n6Tk9KBXe+XcTF|(LBT}v(M`5GM4-$gHQE~ zdDV!w!B`ze`G(-EF#IL-rMT^9Oj4=;57UL(@UK)4XG_d-uPDiYdY3kFLjjz+Zwd{H z6bKX^zEBP+tcVd5;N6r*u%r6LK;`l*f0EB$Y!&f8%49)%xqXzeBv92P%jv*wpjun$ zk@v7lrBJ}bi4QldA8Dp~Kyz1HjNvA-FJ^5LZWMde@}mYv%3sKaA;~P|&zk4lo{y>E z8um1!_;Wp!k@&J08(fZnVj~;YdQwj)lqdL|T%w+|YizUZ@EL%D7AM0qK37DX83XYi zkJ`=9#V)5JC?ir_*OTauUV|t>tCI9>z;4w{ zu*t9AP95N|o7rXR*RcY%;(wCZ8e1%t>>s0En5?IP9MFnXqx-L;ggFHN^ z^tt>FtQ(X|iwLb3YN-k^J+S34ajZK>*l7dlc2!P61nA#NvW9uvVuXu6R~0=T4;Tf%6cnNNS1N(tlr1O_X|riBHW4?Gz2 zMe3{O)qHBLoMyoFQbL;UNoC$`Y^hWl9sqvSPCaQ%%pI>`V_$;%UIEl)Mz*Z3uhmyV zMTdwqo?gS|%CF$D)FCN2<}3>+H@^;Flqt`Jq+Y~9mXfzLAf{H>cib8SR)o(b9S04ODZ|4uJf1ZP@>0?PDg-V1gvL_ZjPG{;*7|-d4&& zdPFzoSvv(bDmEhxWaO%um@mzx5AmxLx~OBDQwcidX7~lUpZTiGl(w05Qnc1H z?W|xc`&nBwU_s6n+k=u@koVvKK~UgA#e5`C_z`aeho*l5wjNX<0n|2eL_5MsgSeQ< z`>Dw)Rt%{o)$0!mPU@c^Q;Eq-^I?nv$@`iBX*(@{{yi9Ft-1oj0;^>hZ2-8&&Mc(@ z^tr9$*-R*c0TT&$8i{uDN&&pA?Ulo>S#L!)Swr&un=|_Urfe)|%LPaeU8oE}C7_Xn z{*o~aNM1i<{cz9q?**pHS0nOGC6%Unm|%=yTL-ZB>kF47~ZppS?kBGmW1_<~wz;|_&F#P2}SSyEl#`<(KI4nuy75?7$l7hc{Ef=MA#V z2t#M<6D*<41r>K;-1#E}&Gr#hH55rWcFi|9YbG`9c2tjNHxmzc*~fQo0n=$Iuhjk9 z6r9;{$;TkV3XXgyT>G6)#|QHiYCWq%{>eGBh;>Gbu1DFZKT{*H)zA^3{vf}%HXEcV zUbF|SYUs{L&7mRTk$U?wRR6llSerOE;mMnmH|YC~G9DI#PMqU2nk43Yh$1x*tbKF+ zGsZ&u<5jNezJ{4`2De7B0`(LkV^j1~F{KrNw?_l`H>g?sKlS{ojm0|i4+gjCZ@UKL zYlJiM4}exzGT@El&nZ|i$fbN0*wx)sG!RfR)6}!)OC1+2hd_84?WZ= ziMK8Xh*`?9*AojR5vt9lwj8%P^Wp#YvdA_VfA#!=$dcO3e}&#^4&;53!0 z?s%}PR@??IN-+Y^sYH~6JEYOaC6(1DhY(mckTvMr_lrtp;dFfUr_N;%I;xzWE&%V+ zr%_iVC7rV0jj2x)GMuG-ZHH%IHNbW~C8_X4wLFa2289b>pyt$i&apQ=Re_le9 zK~$jw!c8&_d;bZCbx~lqq)D!PpN@?gilAO6a^nUiVDuBS9>N_F z9zEI4Cm`j!^yY^lGD5r>2yj_Z5GZlNoIZ?TAWxt^C|agSj!N#EMx@| zdx5FwA7^1V!DgxjcUU$7(^{H1vIoAKVaDru0KaMvJ_O3@y^sebHXH2rS5b#{P9kR7 z1az;jp~B*^oB8RgaM*h2PW29QYOeD1%0hfn%n-*c`=a;OkVqYcGDZ=o)DP0Ct%g1fU+(Me2$x7zS!0JqY+V0)=pXAmWnmn}hU0d{u8ol!@Uaj?r zEP$tp6ZeciEhgnM&{03(N{XTGMK8r2>PVz>Savw!d{3V(#-)#uSnUH^ zIOmj7>eBq<0#1@jdYdUiOEaDe7)wq?vbVl=0K)5N7VA7@c;uV6`%`1Sg0(XCp+PZD z6u4NBEC$aW4Cgg+XrsILJOXCf>JxXGQWr7B4!npM-2D8$_VS2>b)&Jco2rQVK?VJA zueOpysuG-pZLoLq*S`=YX$ij1JL>G~ zi9;h^bMQKM&=$|nsWR&)c6=CFInm)-9;cbxcbA_4$O;qMMT6F4G2K6qK69QOfHT2D zbmH+v)f;N~FC;T>K}2iPq*<`B{Pa(`=@O7(;Hj#;3Kk+m{2`$n?S%1t2gs%y!wi&6 zq$ie~3O23tQJpNnp)j*PBY!f3^d^#whZlf3O5*1r!H-UlN`FkbR+6d4`aVC{HJ=X@ z9~)N7OXkU9PCW-v6Kk69?X?U7o-2OrEOj0vTt6WDBO`|-Rp7=W2exc-4qFM0&OSX> zxMdwua|_Kyx0Q|Nv;h5~sS1&~^KxFd=GZ1`M8pmWT~K&zB&@V5*V#Z=<;RTW)9e60 zK)}Bhic~P2H#}pmZ4XeFvEU_dLre`F9!{g}gRCV{d7G4il*U*;;x?H7D*gz1R$h_} z7sIMq5kkiHeRZZqY41p)fbwLZu!4#|4caP^nIv%d&YVT-N)OoS&mZ_*c}#6|^dsC} z@R0(;bRTDq>fVK1+R85>H%A2{*W5-HR9>9c#xG{aE7=80R2jYMUFex@Pgz%$3zyq2 z(%r%NDd%|K_-ZUMW%0@&r(F!V@9VjFoji(l9~6R>^B9WSsjC@Z%kXJCiFDHqm{z!u z5%4N4h^JP1b}BOIW5f?k=-o>SO?Gg)+!Pn4`>_hYTu315Y42p1_(&0%ISLQ{Sei4H z>2F*T?IVX3>T}X92~OK>F#LICMWXf_RzSedZB+eU|Gu{jd-Z9rWn56v_2(V=c zC*6$^V0ksVXK*#^BBAuPU;PZ_4%3N&EM^d%E3t0Po!+OL+FbMu4g+i4Ww{flu+Gwf zXcca5v2EQfok8c5#^E)oLgu3|^U7&QB@>MoRXX(CQP^&}(AoI)nMHNAi|Ks=)px-k zB@*%z1;lFN!~Uvr>z=J#9V(@&e(}dq9btJoB(5e8o1q9_jN{CXphY+e-D)o_%YHg4 z9lY01PeEcvumM)I6^R;wdo4POL6 zbp9&0QSqfgYgfDK-kI+>7IU1=Dw@diIPL_P!jOujg&4WwD26%LV17Y?g9T4B1?aiKVVG!iqqrm1RE>Lzm<7z=bY0#B$ zi4}L1H-SeP56JK54)O}xl)Yb`pZZ5xO}h`w6?SBA;PYcMKTN1C$aYECo0VEBr+n+# zX99a2BGon@MK^TjdwDPBg2}eL5`Sjk{S_=J1HG~HIBXQ&?^KSqO9oN+(Nu}Nj2_7Z zQ1m~jZApa$UKA;i?_|X>=RrF!Au_*l)T^oyuq3EY5C#-7Syi(EO(LmnU-hh#b-_3$ zg%}>Jpu$UCY;uE~rs|g~Ix9fdt+e*u#$K4Gz2_)b3}apy?22uMg`8FAS=mEy^-x-g z#fsr)0cBM`2!Ex{n6#{xRhLw(EK6JwhF$hv>Zy%<$ekW0J>f4+%vMjJzU%9&45MAW zCTee&p3vk37^v`r*w-Z9KAF`AA8aXW5n3Cq!b=a4kA&|Ie8I~|9_@2 zIb=LR%!Vf^@Xha-V$sOs`cRmdpa6ZCJZqhN&fNo~Y|OJqS=m*;Ud3*QQ;j3P`*p5G zbCwyJE;VG|;9&124GvQvdLRS@!&e^`NO&5&xS zMcefF2v#wdjy*B5_$s#IMzW-8X~6};#s6xf;b2pP%%W=;Z~GX954w+#cUv~9e~&}= z$2iyHIw#vs5D)^`-$a>BF%3O<2auKapl{DXHZbPMBSjV97S25iOq#oaDuiKWy`ecO zlKY}QO9)>!sKyzN$n*3KqVEWtrN{{Os2|h8$ zS5@9Qi!l3b_L_vPq~j^~jcAWanEx4Nd2TF|NTq0e+>SPq1v<{h?%A#NtNc1n@11 znsMdd?0hZ9Az?*e2|PRag2}WL;)SvfcFG8Ml<;uay8DAaqp_j?Pklt0lb*%^B{P4r z?c5GyozO6pre)fyZtFzgvC0pKY(n$(TDdUlg`0>4pTzZQg;(>^u@&S{@F}~C)@J_C z9g_UFYzn;r6fp$Vp^kIK&B;AarJM9s;!*cWAqo@=8u9=oSsy`tl*aQi8>b|ux1dMt|;4Qg-hSVD#3{%9tos2cXRmyR>^iQkR) z9p(!*mEmRB{#Pa~c^sr|Ft~&Pa2ArZmN{ET*-1t`+M~_oVk8mkp?&I97Is5C%;jCA`GaR$+BCW`vRz^}TD;gGKLle@{_Z%LxzRLB9Iu1w?HAdqWtM zujUS2k&n|6qw=%Oyft!1f=S2vF66SUj`HaePz(4-z{r&O&vf`i8~V#hfuT}xpMd&< zc;3K)`H4kt&UN~DY^BR-d4kLY5WB!Gp1#SQ`Lt~GQN4EIE{Uv5XYF_jAu;eG&BF2X zSip0`8aA#3V&zYYd? z;7|4luULEf#_hHvQeoS%OR>HQx?ab4JpkzJEj(EGd8(Hib>pyzfnhboU8ntSItf5u zS9=kR=}$@WmzCG!DL#-nPNXX04~n;Sr*|1ldh=k#5-CSHl8P)I&}-71K|zF;p|Clh zJ`>~l9Uww`3E3#l!@H4QQ5e*9`JefM_P1Ad5;24>yzJ>WGp-W##XXLi=R}K2WD(!| zET2%z6i(ROWy5geg$xRJfJ|ilt6Fu$^-K5XG&9{naUPRTP#n1rk4zZRlg@4SM|)!`spmpVR&=Mt+z!d4SNz_tVlxVsj)c-L%f zmR=B|M@M>MR<~-(?0Mu@`%PzxU>jCM1<3%ataX@c?qKVZ@+q>NG%G&;=`$ukKa6hC z_zlVh0Y<69c%B`8+Ws^<5?Jd~X@}=b4|Cwt{2hcMa)P5cSd4Tz+r)F`I5~@G6$cxt z2BPVCw*>x){egFQx8H+ubv4Azc?c`GS{PFMRO`rVvKTjQ{V#k5o0m6!Vjr3a;o^4H z!Miwrr;JF$R&o%I!NcsR-|(21o>vww<_tFj3)+bHU?^rNG5SlgdigHjvdB~ov!RYa zB#xb#sw@C|OO0c2B?!a+_ADdYAv*&E_}z_h0!OX9+nU)%5*EokI^Uz78D(PN-!> zm6D~jpo#365*Z!uUJo_6G82rAx!{A7&9ZKi9Pu)seR8D^J<6Gl1j@zrt!;^ZHKx5b z2=xvLGy?8k)H_d=MB0fBgATu%%NW93kCmF7s!BqbMlrtx!jkC`mWR0rn$4le9`Ez` z68JK95cJP0b)?2%;@gXhjMLOC5(sPs7cY&2Zl5-ucHT=}HvBrLzyo$TvAv>Ea&zzQ zL2oGKnElubjU;7t-}v`{Ap`iZQCWcld;BG~YUwbQO~1YW?>CGef35)_e=#5=|hb^yB&k0Vl=(g{V6$1gq0C#5d2&6}m z4V-oRMhCCyykTCwv{klGJIRzT862Ftk=J}xK8=qky~Be90p zIWcEw$Jw6aKJ^;Q`5ft$h;Cs!Vg^^#`08>mWL1IpedT0i#Qz5HPeWG*t~MP#r0a~; zdnn~o57@&8<>e4_*%oK<-%)8QN~OM`e0`WsDQPwQju6;k)sym7+%e6SH(%pSg z=~W8rWpn~vPI0sT4X6G#VC4+dRqG1ZE&X>y*3o?gcuY#g2eGW(X=IwOdrWYjixW(R z?WudD(4Q&2gH9sTU-{#VT*lzv`B0L%W8tET&~^5%^kPdle(Wm_U1*ymWa#hiP~ucz z>CmZC`+Xt7&=8X>lE86AcIOC+M8@ z!`#=$Wfq+8a36U_;!L53>f_f!z^*9$u7lfpK@gxf!;e zU4elxKWv@ao4XRN)g)BZH@4=-Hb~8sw7cZbo!Tp7a~xX^HhqPZ#-g z-dfxTSg`OR_HwVAA1Y~M$8YD=3Z}`s1MDI!8ww#$Qp<)N55o*U7McFO);!9Cxv>q@&-UUdNM`2J94&agHSx?1?MyG7mSH6))6bvn zNAy<~>WK=SoAj-O{(Y6dZ;DYbC-lprVF#F*Al0(5<5Qu%jWf&mp?tDvFn!!3s)+LWtDB4)N;=jV0{eJWaD9D?{Ww_Tpmy#1fhyRm z{T5_I!XCE+eBb@heIClfqs(@|)z}azNHK2TPjkSNQhN(|-@}QCqmN23wzLdI?0!-~ z=ra5w{g{I;0_1!#F92`M093?>`a_K{OQ0V=ZT>vs-+Q%ir`A&RlG7iKUfc?X$^s6V z72~zsW*=iuMxgO$dB^X93`q524cRaDZSZD#jrCP|t*>q`IDFETn1k??kD;Fnc4Dx; zC7|cc0MH#uUz?R+Ovn5>6IPnoL3C()p|l2d{G%O7k%E7b5c}FJh`;~&MpS2teV+c{U!XkW9ZIdOzJ}MRRINW%Iy=NcLhb(^ezTRJaTeen#mfA3%$QN;$>OaVd-5W!s&VtS|U&8DkDQ`Rnsd-EJaqetF13OU} z9ORWY{~f_oqQbYxBqCaIdggy0$*TLSFi33RA&ca+?LbL3Baatbe+-MmlA4#nxxsG| z9j8(YC006oQJFGd(w|>yidh-;6%I(sw5ZB>@^cMP314ak+;V{P@1bU93mjI&<2Nqi znCoI)W)mgiXBTI`4&lV_x(S?6_#bj2b))$Rl$4nn2NfZoWYKj4oI?K;u3WQ>q|c4l z#}*EuTDBR^RXG{Awanm1jbF^U)mBh@+G2m=0-g zTfkl(iT;k)!{NT}uHMN2RWOL}VroSJr)#ztz(NdH>EE1W;;uW+O>uWG#LUyj%A$B_P- zrwHZp^(18jHuY3$ozu1;lh^}%S-R-R$fgtZIQq-9MArCPO=1UU4 zTMyX3CkePm311wdeMLM#1f1Gn|_WN1o?0Rl$9)h+z_E=;Q?hxDyr%IC; zd$mu0J!O&xCQF!aB=B@Y3o{b(r>QA*+?{y9z(u%opop`4+Qc3 zJr!)29+{Q2YPw*LAR6fCXJ2eXYcRe>V2;$sYJ(}U^y%oI42W7XRe1)OsY)=(@=N3T z?>i>_-{^JRSK+Y;fw8lf}t;KxI_(|Ee~b72BUJ5g+np1r&_b9laKCQ=FdQDD-QFtaj7@i+`)?1P6uC%X;kexH&Za3C6nZq}AB)yRoC%P={B1q0Iy$8{B61OXMZ4{JB0=lpT zv?*v*O{(Vd^NFMT!5HRZumFeseWbdQn z@}6{EaR{<}6@16#m-OClO>*$YKUA^p1IE8wQF)g+JQ%#^Vk?xD86Ro4z+Jn6ef-!> z(+qbS`le9+_$K3WCrE=7Wo4yLi@N~1R*PpH6n~uV?g@=u<+rGG3p3-p6U+Kn1vaLjhMUgriub%_H;7@E~RK?%9B-_gXX#>S(YRutwlrk=YDewCAu zq!0umA;&1%Vt}e|DK(;A!6H2C)gjKB{%|&#yEDpu74~s*sm;|7MDqrRH9BZ1J4{Z& zLygT1SjY&omqsGYIolzBgWLip4eicZjA`tibbUvXB2Nk; zL~6&>>(q6J6!Hf6%fj)i!5Rug*R=ydp?t+GY4)~)c4fR~?#e1r0w~W&dC=W%IsxBr z&ghSo-o6@9v}G3)|4OL)ggWmTWIX?3bMaLYF&@e`VC>!C!xfdtRHj{6robS2#Q30o zK1+ag5o=5uG`f<-05EAPi!{;;-GQPW9}e0xK}bgZdMCn^HE(%#_eU@2ZQFsH4eRwo zGSz`^*7=%-ydu|)eeI8k1FADFZl`(lg-8T6-nZcfYg>{K7Zpa}YZm<{5{qWL+rxdE zGf=C9kVx}va7Vbr>Y4s`QXCQM-*A_LmI5Mb2)Sb%s6>sfnO8Qf3*_*INh01XFj(Ox zTVyHa*g2K>88}P}>~PF$#;+k7F8Vp3v%o(R>eeCbwNv478KspbIMAIrJ`=1X#TmgE zUSeNh7HF1+R6tX3s?8sL&$AOSH!)df(dvYOH&s;e zWG%!XYOW@AzMT8_e~OAarj`Y%u?yGWRJJ;|m zV{PMiaS~QtfV^|}xm>!7TjT!E_;J)#k2eJEhl-EKMXY$gJcyzHJdTweKrh${-MaSX z?mhRQ>n42byAAmyMw_UniE(JjvaHKZ1v7z-E`a>9mc>;j2{-Cv#mW4NsKL!a>Pp!|T6TznL^ke?}4{f~C-jyF9h0n__G z0#hIJkz@%h6P&PY6_)(nqA+QaVdt-FFuKQPh zLQDiZf+yEvd|rD3+#jB9$dw=O?ZJQfj}^i;^T~%g_&wz`Tc;0fEW#2ZI6~tPt{p2k z$hj(2`{qcj0<#2WuUbNYg+|2~g3O%h_})uVIu{QNp%=Mi;-chXbrYW8>Ig}ZBasT+ zU0`y|w3T1nb>k|O1?AxMeJk>)_)kCJDBDjJ8hZnUrsml3kCQ01I*9X!9qT)bwi2ts z3yGd_aAOI+4(3P3x@G3GpB#Qn&k3}|u7?Ee{`Gvap-VAcB@8!OKa=|9ClGY?`W&fpD;-W%H*lq6Tzw*L5lR1JyeLC z9cv$N5`80cY*uZt8ri z#%iQF_+Z)!itBFG4|n&@3peTiCB3rw=}LwDOj&Yc>2%D`)-tYhx1i)YEMvR?L-3J3 z81{nzaYJUI>$ODeRQ2g#@}KZ?Rt!`oLch^-rj)L@qau8D({jHAZFiXf5Nn zvKvxLQ_4Ux(;n{4nVX%7QPq=HPVeNNzjzD(zahpP9%!#l{1mhiRJ-vn9mEs<|AP;D2983F^sXK}xV z9T%Irc7`@NP&lje7~`gx`HZklRn}+;7ny%enw%FlRq2!w%`dUBM*NHcY+LsM0h#lx z8&)hJnTz1jHJ;^%%B(Py>%!8%p#4}SV|j9P*ifg1!<^drCvs>?sw&FIC7DY|KxZqP zV`8HqE;sXkE)h?FUe;2^9LNBDX5-{@xBfD3>0lB*ER=(Gl(kX~);e#Gl_IrwY*Qx#Ty zbw=lJwCQSRnQq|@#v26JM_qe(<*6j5Y0M2;# zIL^g^KQ#96`x9jHyg?{%)cIF$)IzNBtGN$ct#Og%M!^s+1OUk?`3MY{6VvP$q(llP zMUEt~Z0$XOOQy_l-_Rv^{kFW;&(a3~{ua$U_UGOp90a}uRLmp>Veh-f# zL^s(*xD5p6BatB8rK}@e;#iscG82$87;xog&`dSDQMY8uoy1a6uU9ekU|NZ_*N?N0LE%N@M_{ zXh|BRD-NG|Z?!9l)FHTB5}o2cFkA?JVVOGI9*!xB$eLSy1v%SDk0xcwN_Bq(2WsIs zH%}j|c`qW#CN%INS;u&=uNV9mG(qSjh&f3{>_koDKUNA5KlTL8#THY&v5Lx$X2%4K z)9;mQzh3pEm1=G>SWu>KkVp!7;n6Ppf#2n!+qq9Y5e$g!mJ$LWrmZd_cY~p1qy3R? z)qGm{on=r4Fr+@l=H2a*7N%BZ*KsW;Sw2*4T^udF@eX*qK@giTiRLKhCG%ARoLyTj z%(tOiH;k;YerD;4;f{;|qp_taZfbW06!f{>4lS=Do3HZAy%q84 zqscsKOJ-QIxdngtg)e!IM;6$7-SHVZxs5sHQAB$U(=kvjQ1Lt>?)K8#_%cEtT?+gr z;u(l*{ps{sE6D{QDGTzoxmtsn+*OpEE5K+KIta1au@TZK*BI$1G~4l%00U<<=x-*L z2}D&-XJf&$P434c=I+N&?4FrxIsvnWKUL=DoBSbTg=${(JdM9m#^ zlZrstxO-hzPo=Lu($@#>-5JwB_38kxRlZe#`CfQEdxT)@jr|q4W3zFvIA(!Mb?kmh zn4k-1;sTe%ONiTopu=+D`d;ksl#MaZww;*HbayQrlTuPtC;(RfL$5b`=if$NPrDJg zc1UD))QXzD50Er*sXU=C>_+=*o=qfSW;6TP6Os6*N`}=*D&8e4SD!-2Fit_g6!H(1 zTP9S(1!q@gE6`;h+)#L?=UxO_ENbZ>Ijs}(1ahE~hJ3_xcF^p(dGW%z+HIV$&VYvbgJ#p}CeYp1(B*G2qmazhHIpQx)YiPLDZ;?X zC_m_rdWPp}_u*QGx>q#!A%cSy`6(AJwRN>7de%#3-N{>&TqY|5qUr<;1yiVmn26B4VFXyp$i`zY82}6H>ceYMi6vYLq7Lyfu3uZKn9kZnY()r>Fa`K^+JGB#%t?m*skbW)O@wNkOr~F28C||Tl#m)D@j8N# zh|&Hr9eS=Z>CN=b;wL@8%ZNZ%m{*lN!xtN^<#77wn42wIe>15ey6=N^)2F@caKFxR z%u6ICvT9N>IiI+Q;v>}~xxKEHzDcZ#H$A+Uni(#iL&_$B>*#nMyReFcV)#Yzx{{C~ zh13}J`cbEei9{IJ;&0_Gjy?T7(7tL%QDxQUPLOKLe%k`I`rC(49w`P3hyWPV*Tz-p zd1)-CFoue3<<`9TpJ}a{JOPCOmh8K+MR`e?FdCHsr*f=&J%fc-!$<9}z){RgfHgtM zYuT#y0hiOb!yZ7ud$O=rDn}`Fj7gv_9rn?Y@R;J_bNq7|9_o08 zJQ#fiBiw*054~|3)GK9tXER(Z`|g>4{J-7-0B`1iqK-2ueCTF#G+mCN0f0fEtIjw( z_`pTk6)A4Jj6(^ws(=aY=jz63_C~!LBP7pAiR2@r-mf`oha8+Z&={)&~4F% z#`Udv#?w-0f*uxCEYAIu#*?@Frmv1VQAk9?va@968xUQ|$T8vSJZnDS>qf(~GU2)8 z6*HC*+M7_jd$)2(4shk&q_hoL#5XH6^Ad$KU;8X@TZASB-J|?uCL@iz1TwqVD9r2d zA_MP@wDXmKqe2)8UC2WjI(f?T1UTU99=NU3q8u~s?T-f5=eY(+$pSiBB23Px>x=Ut z#~Zvh(=728qh7#7cduPMM+unSx^ENb{3+Wg1cv>VB-69$KXcM-k`ee1a}2ZB@h)&c z#b}kjmIWvKAlQ_~Ff?~!ARx%mIAdb-1b1FECVzqXq|=$FRpQNkYx0hi;QeZ_6Xqc? zUumSO?o~Feh+=;2g2%a4_)tfyMQJF28cK=zZ$K1JB1fE8N{diA>Qw`d8&!QALnU++ zaTz=BfxDVdRR2z|9H5d1I#-xT@yNN?8*X{0^eL(dNYa@=9A!j1jXZVpCAsEv@xowa z9+~0Zb;U^_NH6Jix*T9$7M)3WEZV)9Y^+I^M-X>Vbr~iq87u($i{-leHRRh0)Z^>= zhK>rOmrP-Xu0UwLLs^m!OW#R5wG6R zv=62gTG$AFzh_qTxPoiCg@d+fT099d4*}!W`;6o5kpyUp3%#}QN|p{!#O1C~?1`g! zxM}Qusu%;30B*}SL1+w2)hFjY`gI2YIAR4djc+!yVA`RUyWB=$wcs28+95A93W}|( z#ul$GHFOn<2Cz%A=|I%B>dx>0uMQaZ9kKc~1Rk&4I^Tzf{$YRl<(aKuH2Eim4OTNNTWmE&`&Y|4kpcrVnY*HFX9C)HC zD?l8CDZd$y&|b?-vv6qN8-Y1GA`bJZt2ZaHZ>*ClF6!XX6}kb?xJ`9KOC^TD1@REP z;W#2Z?;&tkBhh7idtkbke&(Kj+B5KtfyB#gk@W#?&L?~Nfc75{Aw8892yZCk%10sf zZwHd9Jf{@V4g(8{ShY&JEg=pn@pTgk?nei9@<1}~Mp`{l3g{-wF%hFuLE08ZA5v+x zx2dpPq^L+NLe9=m_CUS22BT(7M`FG{dQHuzT%%;mQWBE1lc$%QQ8N;=k(+Cd8;S=J zrj6BhLn3#4dGrufeU697b;+%zLM+o&#D)*wg1A|&nE&M4CLY{mc8S|PaOM7L>#|}p zn^Ad}1JK@ko{FZM9o&q37O{;aE;?tzX}T~8Yn%SZnmHQA>t8hF#aC!&47RAmR>ct{juk>={_E1sPZqul*dWrG(-xouuw>$6+0FPEO-?^ihzNC~kE>Ud|1H^yvVpyu`DIh~_; zWzP4hdoIz=s9BgZmPe9smf7gnb|v9g8=O7%zPe@}-rJvF@6rzn`nP)uWnx%$M+vjD zi|a5ltV9bd3>pv#ZitH*>hXFRSk@FS8i8=;@fgr{d=yfbrQK9wUJIFcv3_HYO@F>c z7&L9lPP9slt~EJp#ND9QB_!jCNVNia%PD^CIgdM~QB%U?KWr>K^MkpdSHuID%Y0EH z45$;r%#+A-Fcan@FL|4^!Bv&hHZ>yA-{bjbixkNde3~8zfhgyNQfHLP_kDXHXoQZo zQ1JzWQ`*Y?zC<6U{I09geJrA!=KBa(pjCRS=1uLZ^_x`hC&TX`twe2R?wJM?K_Z?o zTFgU#VP!7=-n*LR1*0lY>fXt8tDRX%Xr!)@sB+)U?!Iqn80pVcKm!~L@Q1G?Rc`yi zV)hPKlyYxOCKs~HB`Uk~sud#3B+s@+Q^Y`n{>>ttdc(AuJEF0bgCBjTLx?&Lb<}3| z6CX!uu&&IV$i4p5W&0T`xG(4j5Y+nLmZhdSg2h_eWDWU?!SvUU>#fKqdXSDPFa5b`tP?a5n!7MVV|$+Z)NOJ@9X!?l}kscue!fB)09 z_UtEjCpIh2kfOi=v0(@YZ}LY*5d}1g@Yvfn#Y)?(WC$P$)%;SHPPJ;EFsjR3Rf z!C_qwz`jvq!EW#Zf@&h;!71)x2_oyk94;S3datE8U&?nyGUdNZAT1rcQsIZw8tJ6o z|G2Y%mmroq=`Mi=#*E>_c~!>@L}Ux#CS$ns$f*f~P)j7*AczT2wxflT*~(4Y4ueAy zo*i<2W$&~;y(y*2)b1h2;mcmuJWCpBHsb3CQNg>0pDk(qW&FDE3)n`jT=HPaw_z7! zLKFx8I%b$T1l2(6&LQOvalO%R4zCLoG8QjIm5s%??zRn zv^zntU-7R}OP8>6-pk$O9uZ(s<61CpwTfI>xKRlv$Pxr_JmvO}i`0~I4ZpQO`6K(7 zHMucx$rAIWg_$t}uW;YF1C~%-H<>?#Gq6rmCSJ;r@zQ~-Tmw;9yZ|w66P14ryEzSW z6|Xpa?EoAObmV}+a;hy*gx5C{la;=$2;20IC1d=Blg) za9UgF;@FUCe&|S~4fE&z@+&pfC~%H*G7pXdYP9e`prkWWwi+b2#cvGa#w{N7_}|$) zsKsTyM(Yoj*i`+XLgMZmJ@Tu#yP**k@R* z`pX0x5dZ5YYMtP)KFoDgJKcAu{JMjnKX~q18uq55G~T^j(%F(G7bEG9ZWE*tF9exe z<=9o{vk=;CyO>H>qdYN{>wbLTR1;INT=UbTtn})78P>1W85+@gPbkc!99mJRzJFtv z5JSk5$#r$ZwmReO@=PrmHNu=JG`t;Nuwu}(L`p4jg7At!k*~sul~2H@bxc{6_$RPL&&_*hnZpQ_JdR56OQ-3 zXTjQD0!t*;T3KFL=c^;)ko9LoA1lm+&vDbkV+3y!kNp3(4T4QN7g2gSrSvQ*I3rEl zmOug$UO2E==h~?dS7Ou-?Gv$g&EX*A3knui7+(3I$p$f|4mfN`!V;2zaEo{})whgo z_-)20L)L@AX`sy|jsEqv-cK+VoiJb+k3^Or+6=dh|3K_a>-s5zwSi?`=z|coofof3 zY|8Of#28>=v_#y0oxuVi%G<cGBoKxi;vu-MbCX;tF1CVS^{ zVTf+M8w2CHwPWxEai;d0rGbBK7wJ(|RZ%C;-MQK@L3J-;SkCinR6|bGX>XhqVYB$p zwPp!|yg>Q={$Am7oRZ10-cg+-Kh>Q$;VX;AaDWKY9B1__g(3ZFLI;2c1Cdl~KO?1| zXmVFd-@H?3Z)y|5!uDf)9S%8g+(G*^v<_=BfD@{1wYD~-e3M&L{T2NB^< zHJUjk{Aio0yNN$S%_8r>?OJI1Sa%#r+qtS@MVPl3l)j{046Bbte$(OjZGSrki2fAT ziTmlW@QB#0oYpZ-<^2yMK4N$RPuVN#xtH=_iC7n5H$+@GgrCS^vBtyGx@V0ZSh0Qh z2k^YF*EY_$W(H^-FB^D&-(t54?Rwk5dA!hNJb)njaQH9Zg#r?7o5s;pJ%-T>^Jsjt zMOv~xr?rlP2%Uw0VQ#ox+_J{tTX4KGSGY3Q5>1uqM`d|tFw3z}rhqBafCo6p%;ZN<9LaOFYob#UOs5&P3+Mqq^mTNcV z2{1ZDLy}B$(jFQYXL7t|h>URhAo`q>d+Hd|&i09T2>!<#5D)JVNaOUu+Z3JTp3D-QkaFnHewsXVge{HC5}PmK4neCMzDhFY}bdHYDN=O5n#AkU`8S_^bwvX<@PpTU$?O}EKgvY5+1q z?q4^vBC7Haw)l+RRpCPm3p^eX8_}Q!&)y#2?b>7BUMLGMXZM=#D$79`V6)!G^-ng8 z4)Sy|$Z{m$81v;Y=#5#tHHOcCVUPe3GW*M>*}YHY(=bVsc*dkCwVbG6%y>~{1md)O zi1khFX@AK@hk2~Ik&be`OWy$(Pbi}1*4gW=-z2M0zs)N= zU<~l2TLF(HGrnf;vwp=zm%Xfrm6m(3p*V`-nZH;C6`V;J(?6>9S{;HIH% zG36D^si9z&NzJ> z{BaM!tz(>hmwcHxtNz3HS5k9i`6W(X?%)ND_l|MKt0^`ZVgqyH+T9z+4gmt+Rv~VZ z*lk2sNF!`WHY0?Z1eiu8iCmUonS21_#G;#vs6w`3zbnjmMSRtekEiBc5~L_j+)MRZ zRO4b*HCWK4$_#&9UMI%wBXg7c?42)^6)5Sd(m>6-?~5xO`VqPRi$1y85kben@nbuG zRZ%IRJ$Vy!nD)=rdB$q8(e84UsxLSivQQFO1e%&!+wGYeB&-rtjf3I#BDVCnh`W*E z1fDNeFhVLpip`vlb`8wQ>+JnTv#Sy5MEBZ2m_=-0TWeW68X95uK))BeQ-wxIF9y(o2D<~~cz{xC!Ss`G4W+JRi<8$b zk!R2iRwj#4WN3ey>%WDH<{$t)K*GOCvbX}AXb ze|hC4od}N)lSa%2Pmd#lxV1J%Oc6aQC}h0JV8-fK@Yv7@2qMg3(fXzy&W3wUA1tEV zT!vgF%P}GcKkSPPb(R*zETxpZ&}ibA=o~&fEjXOQHdOUKLnf=e4Q5-GdEif_XF~KA z9`X4Qg0wN>_-AI|axpXW*0A%VYJ&e0kdr8AJsmVL)sZT^QC+<3M^J6b5``<8hJMGS zFYcp^$hu}ztYQ*^uVY==`sCs`Z_P1$cO~34C&(ffatZ(Vrx|2MRk8Om?n}1Qn z6J*ptn57gviYn+w;6})PVaCH>X?>ZiQnqPCcd&Q}L<06KV!;h{#^5jtUeehMioxCqQpx;7xGF z3yUBDEy+?anYn)e2E)wnwooXycyt{FQV4@#iX+M-oZDXz`u_2FDa3Ef9%%q(vV3qN zA({Ae^PL|<7XZXgG|gZ0$3)p6*=|e<3W9x9N82_&w4;|n@m*|u#h{}5N=J~4sQxfd z?Z>PXaadRvC;-?9CjmdOboA@)-ctZy{(T}&Gb)zKy1U>(mPM3&ToYCP1^f#@!l+i^ ze{Tc_2S{PTpMsVMrk;oms@HApq#Ly0)KsF9l!-sC6~#e6@yj#-iJ%IT#T`_Zd<`+N z5Kv=EmMyjCP?#vmn;7z4v0+JGUK{jAQ^rYCo5^(8BK?$V#?mGpFm%?3XZ3w{co0KO zaA_>|F^0WLBt0gDGeulustkxqNe~!&k(H&**^~WpWF*!v?RvKhhZGXz*{-+xn3;iI zV$p++hsajAlvLg+JHQdHsHv+Ae3?WGMfYB!;^5-~mQ)U%2bGY$h+AV-i{@ssM(f3K zJY=0z%=XzTfTxi7iGJ>%j`EYcHYHMRA7I+<>(TX zUq2*uvH@zIYR3Ev?;S@%hD-&ytf5l8;-aYCYHdMnSmU#1;rbO++4luiSh-Tkjv<_S z{+?G-T>b2%H=>3ox$wY?&y1tO?};8VP^dq3=M7XDF>GWD&K0>up_HK2+uc&)t{hJ zOlumd+`qj?+^e?No8?HFjlQ-)0G*m@bhefh;SWHuB2#YZJ7Q#wmQl#gVnG+hh+Ub% zlta@u<8{0U%fYCu1}WlwUms!%xCR>MNzuJwZQw9f700Jw^Wg@~tTn zFi;%?YzjrjYr<7fo$>s0`Yta>rKDp zeB9?9GGeYMRHaMulgFUgLEk&O#j42ya6D;0Y!lxoD? zEuE)__Dn}pzj+iUl~WCdB)VF ziSxp?#ZczNA~wXz(79ehwyNxrobmC1SOhO%FsF*;htA44J0jEN%Y1QjJoT`tvBq$U2I^_4T?!Z7Gxc3o&>#ik;_fRz3mhH0^=)+>a zFRpv37&Y0hG0pH-$+xk6GxumMHD)jaAEnVRIc|t-E3uwNOWpyLeq_=gQBf^lDgIi( z7Sx4r%;M@T=vxJav0lt@&uNDE4Gv}&DiUF!hCzbA76D^3Dc%s?w2EQAldw1rElDB_ zOuahh-U@M0uCk51&&i6O%ZdN}FXPx~Xh)n(Cv#In=eWky%4>O;Tg~9?Sz`{HO{W?X zcT>HTsGQDmjezrm@*l*;1@li0?Gzm7=hI7@__PYrK}*WXkbzTo+Q{*$AzH>pqw1*D z=Zt1-vb0tnVQ?gHL_F1!R!UtQUbvgs##ld)a(Nsb7xH)x`X~@kxO6T7zS5XyKn|4a z>hhCN_1b>;qXD(;xFepbR=)5z`2{*j>U>CsBqLDN zD>NMNkJiptpZij{_iAWYky#4?_B3N1?=E4fs5{%3XkTnB4DJkwX9Z*5fg4%wg&TD5 zN&Y)Xl0UHR=BCctt9XcwxUgBS9P{-`q$K-7qRe0xhiP>P-vXjHd-Wi1)m3Cju2Ua(#&K2s7&wj> zmPXyh!?GnesJK`mf=3=tjCE%E)zx|%Td`XOC>fmb$lvc!C+1}?k7I7K;eNy07@C5t za28=d*NWmA7Q?oz%u>OsUYtZbHViV(Q}YOQ8o`Mp>RmEu}amClL| zqt{&MXXpZbHk%!!aGGjoC|l_9TyFw8yIJR4I*~<3z87 zmE;tTk;4#|`BO_vz~iMu2kQfYHSD1{4*=+D z#0P?hX6&@JhHSG@0A%#eq{pE@HlQr$UUwKpt;JFNO3Ezk001^(C;_j81#|lM2eoRO zR>in%`o52=Y#P3^Mw|tdFqVsRB4PYGGANeA>p(DHFtp$JPRVC@32#+?K< z;&k@1yU&|VwJuz_>eNeOs=CuqA2_+TFA5V%wHw3$!p*S|tt0U>3f#AMlFu@d-g%=& z?bH#pp2~Rd2AAIBCnzJSYGf5B6e}@&ONYPX*-uwDA@=yC^>HLLrpRKi+yBrjlCeY+ zgKbfO z`*y9MLATje{v~?knML_2r4~OsSx#M=!if7e?7{GJjEKYA&)Td3+5IOMzqn?h(Mgdy z=o>Jh?kP1b+QT7VcCabz$;4sXT13-I*=WPcmbQF%Bx=e4R)F?mj%0gYV1@^i7sS_CAgA5u>O4s-jR`|S| zTC$Wt2SlBc^EaY~jU`_qGA!{8fr{uBh=gRJcw8GX1JKP&CSttPgrOeR)v8_vO*~gO zy@Y-I^X5BRFke!<;`-_JF&B`8V%IHdJ&zAsOJEV{xgEv^o2?vR+UxkwXxF5IjFxtIZhTrb0o5eNlD8@RlHO zFuHhinuB9Qsoe*utkj3eqEH2cfEW}m0_9OS-7#t+hp zm~pv5_&7JtND2IYOG5e|Y?Shk!;t+#4cC%=)vO!pPI- z$z@aMIZE;JMCixAz9>8tGt;TR4j{5=M1ytQFsURS9ae%evD+tD#VqM51a@`oRytbX z>tj#6zYM?WD@ov}BuW?A4pT!!wt(Sbs_$!i0Z8wfx@P~A(#qz+`EpAk2G$eh zDC+{Qyc_ad^OBbtdCFp@ZJqhc-w&HswI`Q-Av%qv2V`AWtK6 z%A&pC9)wNMI&-WUjpV<0ij0r@ijd?~%^kIDJ9+a{oE%r8mLl9$NNlTYV?^u1J?2$~ z(RR*M^JhL~b1xPXMTh+Ewd9I`j>|r;DpO>2lD~WG4%m7Zc|SBj{bY7WFoZ(%iuFyE z#7jr~mxhbACWfJAU%euCl!|(l?NiNWQVQyZ@e>CI0oRTWU$!dkaq zH+FLikwZbd8^!vO)quT%#d5)W*Z01CR`$5rSyku5p-Og^Anj^coyPl1a8EALp>a3Khskm$=RFr&J6Nd4@GvLZ-}u47EJk-TsZ}Ht^e--`gh+_?_aVEGBsIqWS!t zg?+VaEzOn=gDzCy=OtK#MfF@n&G|BT35Sik{@)XjuR-Y~yABiC= z;ZMKP^$VAkkyIPeF%scPpwLnoo1mvRPQy+`Fx_gG=(v--lgaCtGwTWyt^s9z)F*a6 z;p08PZ?Yc;J7Ci`TWjmWlES5sjE?DbCp>#?<{v;tm5l+ETUb3%+(+P@;@kHSIm2l6 zOdHrFJvHIO*$88*S=V*yc_3TAPI^JkV00KRbq>gADHt9tK-M#=+6~qy%x3*;B)-@N zjTz>V(b>(lKoNSPn>UacWwxn;of(G_(S437liMTuPI}G`CE=)us5yCkd)m1hO7K0f zY({_ZZ?+)eDz;0NQZ-K<2dJK*X#AE_ff?1o`FAHiNJHZ2w9)-)tHN`=q9kW0a$M#M zGF;i4jKY*RO=hMDcY02`Z7bml8Q)jq`T+-BerbW0*13vCrwprt@BmRoTHVpvq~%t` z19(oR002avDfECu=N|G&yWi)o^{bKHM7!MtNEgOW(0qj#n+g3LiW~f!D5Fqazjly< zF?&aVmDM`Ys10n_fC>%=Rop4N+Z^);2=c;CC~(c>y`juLIVG=~U5@2pBxE?T9-LG! zvJ&t<+uJq(qBrLJpnvsE06CX9`2r;?pDsk)EH{LmoS8>~Cf%t1l2#w&z;<5eN~$!d zy3L(eK)V?$)9jOWKr~^TqsCIC)o-4aOQtb8ia^NYt{{C?283veTnTWyLrGSER9s+T zsCp`5N4$uRj+zIA29d;wVNFUHM~2D7E2*rQKXqqD z^>elL65**L%PR&g9Jjy#+xX4ES4w)Z2=IQYV6f{uc#~^a6{^ltq&NW~=OzXo;pMDXq8yLc8GUR-%F;nYpRk94 z858eON->)Gd=8Y$0}k6bY~-4~;}f6w75R+jCE2VzrU~G&RBUi~lE4uduA0?3&0b~z zbOpZB1*a`;qW_cstl>h3nECO`FAI9wE6Z|1iOKxDcDgNutC>gT<9e1MP_964&v=jv zxx*?$7H|%I7fH8W{}qimy@3}=6EyglgUvn*y~eRByFtI0y9|D-AHO`cdAc9w*Rn4- z!gZM+5_Rswd8Mxg1K~BguyiYCX~gOAWeM#)-mic=Q`-W=?uXQ|n5PnwL&f^(6TBNz zsoceK;K56K>H+_@nKbSWuPCyt9$3)%46{V}!|-;^{&~|qu5GU%@J3kBnP!?SfIuL# zOe3xv0d={x-$C5Z)xqcov`UUy5Gp~x+UgC!H92cSkNy`IHA=Z#D|u2TcFd0rg7OsG zsA_a8P6IEMg%3kU!lXXkLXVP_>T zuD1qA`02$aRWR@YefejpELdx8V-;Mfz<|m|B03xYuWq}L{Cw+gO_`!aD?1C2vW9q;XsT>FqpQ zi$k=s_fd1Z0piC2zd~>6-;u^~viR(MhG0=qdt3GZAuX-#bi(GIWA-^I4hRPMqwW9# zv7=JNCJIEuukX|3zf**&@Diwxz9KOXQr?$pKigVWx08bumZiMM&VwsX89RXK1SY>t zGhibXKh-*|tIpdU93V~y{?(T|k%B=PT99uVaN_I21lG>ug(?+i%u|Udnc-~$sFs1- zJtI?L)(t=oNX~<}L$NH^4iTMo@`{PY$V2ht7hw|MC?t}Fnp{|h%t<0(JL9_?hl?KH zqQ=RsZ_wiHn-Rt9n=r_vs6)Oa+-kcfz;ScfcrAvFrTIhTT_8=P2ir7CH(6nX@q-1l zIS(F_n&nxAz_~YU7*GBCtJEJxfyaMEU+JNuF`f=+zUBxM{ffkTOHm|-V79!Lv z1M9ydR8nzRTy8Qf$7*H?Lk;EhR{!1%zgE3D3P{WXZW6aTIjpoMp6D8V0;{c_>Mq6oN;G5V=FX5o4DXqKBMxms5G8c;U-FePYV~ z5t~4}$!i5Wb@@QRXQk@g$j3TcG+E4FODi5EURP_>RV{=+SMVz*i`yLoCVAI0a?HE! z6#MgDS+PhN3YyaGay))M5(TWl+!fnQ@d=O3Tn2IqgO8!vraH*%36akrNIQ{8GbG zGa;Xk@+)zvm+ry_>ZmLoVmv$cJHY-`KI`%2&WVMvgV!LgrUQN6Ht9~KnK*)E<4TNU zE~XIzH8vv=7DBHcpl~1w*g)gn&RCbB&=va{d_nki<}u^KO4mGJ_Pa<_B|9mHb)H~v4 z!YQUlS5Fqln4pM(^uIf(DC$aM(rwEAYFfT4hO;@aMAI3(t2Nj@;uwU!3MvI{C6bC2`Ysa2JRn<_?w6;Y6;Zb0)3jfI?=B$;5dUsC!TJApV&2$*YYl}y^_Iy zb8~UMF*4C2NF2*U6T)f@#m0!CUNS|3L+d`G6Qbvkgmrh8YxyrV0i_P5SxtkFGkBfz z(Tm7ub%s^N`F=nvH$9q$bjAe*fsHJN%5Mw?2O<`qVnhq%YbSd3vhc1^3^?V@F~VDF zF0X^Mz~)qa#2-(Xm8{;j2aGwEDGNGWJujiLDf|TO1!oc>NRtZ5;dfwAEvfcwZ7r1L zgFHppI*XD(Pp!J8+pxPg(t$Mo_GgFH}p)b4wb$F#H4oJ-5m%H|{3g`c*&8~u1 zGACp5WVl48jED^a=?cGelvCy`c5+uRh zxLN?V2{F9Nv`96I7z)ccD^)OcL8#PFC|P**iZbmx>%y$Oi}p_liDH6F-e)E1NHW4L$(Nf3$jF2;J<0Ii{gcx)X?9r5 zi3W+JV79arQCk0+4XHcBOQN6NLwE=7H8xHDV9!BC#!0&VPZyv2A-z%>0=0`x8$ATxpzAy^K z&1_`1EA4v6aLw)Rv5nsfcx0Ti@Rp&_ZiStKq<$9YX>=>2xeT6=<7Wwm9>w@rl$2ph zqxEC^xesMr=45-d&g>xuWgQEoe$M+H0Z#;i z;Ss`UZJ0}uY<`bR$H|dqMrBL#d9XlG3Iz%m+siSH*$7RTn|w7dA{iqJRZ{QbBbx-j z8Gleo4op<<)rCMi{nW4KG7;%n*E-P}oR8_zW#YBYpIadW&8S@U2vv(|JsIG$pF`se z&GXKy(d5zPWnp`qOQL6982KKR0&7wk*RLiRZj`Deg@PI|oL-J*ADTVWfqvA;=GnIiHhY*&_gxsu5LAnK z%F_92uvyY_XOD#055xsznyZWXP1Eez97cIuEv>ap>JfMPF`-@+)vh24tIPWuYkzGV zSf71^P)$XR)csap_7!?l?4J(uiz?8qJcomHMP53JPS4+s6g&Z>P1MY6+>8}#GvNw$ zw@@%`AAWWrskzLIWx`3_w%C@vfla5qED&#ahgR>gfOei#wuzlwfY7^D8+v=icxWg2 z-;bY26tdsW*BAvYlnt9OAoBT#OzY@^m!X{$_EV%`cGB-}~^heY`YDa{VTbI9Sol1+DBCcIgn4A1qr(-*wyc((Fq-UZO7DQR;1^EX6lbuMtjb(!oBP>P0ULb-KwrOmZ&bv7R*VTehi9hHk!Y^= z*=2Q8VEpd5xiE{HQ!>&M?~QS@Hbcbfr7Cr0p*>r?TwJ^RFV%#dv&2I#9F2-0#f&AW zX1bWhOI_(up&hRB81Z$`-&~hl!Fjp39I>d(97sc9@MX* zWsmLu&HR6jSTx808X%jx`M#MWWIs{tJ0^NA17AvTjnqNY#uopLza)40rTl`r(l|E2 zsuj|4lf1qvVX(*z%m^WuP$%JhF9D8oX(QFf4pu78l+Ir^a|ILJ+kzuzsi1e_EP4fb1nhyBf@Konpm=}>8!se{$X zs~K?W`H5B=vbx^%BG<5516;qMfYaCz+CT@mlfN@(qVDH~*-HmAsVuwSOTBKLM%V^7*5OX)2Pnxe+j#1sw3t$1 zw;*>fkimDKb9zI(=mOx`g*(DTBOzlrQ#4nHCluqo&q;nLdJkN6 zaeCoMb#ms)x?`S8vpuYD5GV|c_{k|oNFU~{QWa)l))k?maoOS?K<{fD1MUI+fc%}7 zf=b>abChcJxfn@ECC5qnv6UD4P<9CMnWlB-tnzLA)>gBNAI}+k{gl8-PHqE{&YF4H zV@-4t+$u!+JTblo0DhVfVqsN)`I@yqs}iyN*V>baBO_jl!iU{-PeBAZ;zb&PZu7%AKuV z5JCe9_z1!cWs_w1O5nT7eosdhBVaHh!6S*`1*1S4&2++!p{1?~kL^?}=# zT_~0PT@RVD`A5YI5I4_FfYNc7s>B`DomoH~W5}PvZm$CpRhsz!D~u)Dh;K&vpc&Dk zJPu^`D65d_b0@Y*P%J7O z|IJa$32xV^_`53Z#gy|&J5S`_BbiP4n-n}Ol7##ZR$Sw5l~NX)pk+W~Fk9N!@Z$?0 zVWh$2iD`n`msJ7U*++}(FBl&6X@ipJSp5FzHuXPg=+W#OagJ8Y`ywFLPPc`Kiqp!! z7AnN$PGD=+j7k#8jGN5O(AFNy)6o%^#9Tb4uTJ}ntdgHY)P-fu<7X*kc8Y9(6I3G1 zD4KH>43%2m;f-Nol?12QtR0lPS|oQaY5ER5EN}Q=)Tt+7+qeU?<wgcy3$*xhXTE4Sjx{`8`y})+uKm)CNA`18YLLX<_CQXq~TB0 zW8(UR+OJ%FRqZRU`~qCbS|PPIjVIW5Z8RUc)XJ zTk7j3&zpM)CBDmws6GckF=Vifsh9YZR5ENgTelKF>p(FXEdkg^__rw3gY_ORXlaqbsvo?sPR zgH6TIkya$wh^z|~&rlZ!3{QoQQ(yRt>j$e7k=4aR+NFTrxwKI1k}XeTOb3Kp%cJe| z^RnZ3iBCY#=aZ$Z>?%GG_mTWyZ_da@Kk3YzxK_82*Iy$82U6n0BiYDZ%zdJonZPZZ z91I`GbN!SBS~=*nc|(@mK_c2LC`X1#4#YEfON??k3V=IHKpH#=vY{q=>ZTuSAmT@U z2xf{0zCPCw+MLkDlT7sbxch^mC9n_nHZ+ki)gyiK;XPxfJu39lW?wl^n1kwl|Lk}U zYx1$~?G#eYI{}TLAzcZ(OA)*KrarOGjnVaB2*qcV^9;DrMBo@Lvz zl2DJ1NKeJ#{m$Er<|o^1s#a{o7KY#?+YNu6{PfEJKDdh*DO>4^nX1R(rUT~*c&ZY; zPJmd^IVL+-$YUH~wOZfRKFGI76(HiBikX9=Q_i8-Vnatst{O-W$R*;sM#rUn^{hJ7 z%h_S+#gMyzvv#f8fz_)l9ybRH+*2V#Mf!4LJw%kAu~xHdmmH$jB%^!PS{=51NS-+v$F5x8un zbQmgciev&)X^2COjj=5fp-r%07M*z=n-pG5Z-=gvfpxS`xP2*-?3p$fG^{X?RTS=% z&dOi18=jH z7?ZdMf5UqY@3$>}K6^>m6tyyjEp=S=;4|+2^h`l%KOM_= z3=lWJKmN7)=tC24ZcjL7jw23hgeIhW$~kYx7VgWjo35VC2j$rNFIk6fSyM1dj2{^8 z#X@wbuyTBnY;q~xYTeeG?)2m}Jitw0;id^ZDUs?4W9|8>o_xCfnhZX4Jx((}aX4!! ztHYg}AQ(DY#mw9XsS{s?b-~1oTNNID_S{aBlP*V%oqCqnjX0%it44tsz}+X8HTrZG zn^zfmQW}CX5*|x{|I7k(R(;aXNMMYBxXZ|B_DWAB_ZZ!sC-i>QQWy9Q%OlQDqV~9h z3!_!l8s2Lci(9}Xz{N+U`Y72E2xj|&!GqBKtLejeDfwf2h4YqJ{$KgHWAA9;!2GQX zZuG=tF!Ojxb!Mc%P!#(_I3#tS$7NF`sz=Q{gHgF$vd1qFsAE9LAtH-2-z1>Bgm;Tpz`2bNMewO)GzI()A0|;u|dn zIBZU$HqqXve!z*FE0VYp%6~-NLO?ggzC6kWFvc(6<(?0a-n26uw|!I1QQLjNcQvfm52lDfQ`dorl01^XyYFWERoxcQ&g?ZKei9d8&89^d6z zt)K@dA9r~vrw5$3!W5dv6X~0@P^7T%^Ja52bA{&z`kd}_;C0M7sgb7pVn5acVc}Q- zWHbi$saUq$SD`#rNle*#9)sxW7#qS#wNlWD%k#!`FU{$jCA6#uEwyGRTyY*rk83_Y zY!TsV@~Dq($ge#gk!TVL`+TVC%^@xvXF*-b)22Tol@c5Rx6X|>+(4qnVk3!}(qVmE z-@rE@R&5Ll%QsfTeyS4d0$3p0O9hM^-{j}8-YWU$E0#Q>MR#?~mGokVmeb^$X|h+U z#>}<%Ry>Kqi+$NwkTM7nFL`D2O}yF1K3DK6ogS>P+w9Kf#RblV2#7UoR?$PnifX`) zd-=S1kA+OFp(N?J)<^(mEdHA!|5~^Wy9tm-{pJd}E3f1y2v=TZdjV@INy6+c>k4{I zOD1dSoKt70U4x0Si^Gblm_-2?8Ht@FiyxEFbq;3^;ZpO7UWt{m%q7tdoPTkctuo!__Tj?Extf%^U;^9Qi}Z-fGr7k+=HlD z%9@-N7q3{bEQDR*oil;}l<`OOY{f}rl9z@@t|Kp1(%Uqfz4%)o;SXOG3Hsoe2h^i~ zxaatw4{<47H;Mk3b%2_TWetBpc3*{n3bSCJK8rJ4r>r4Do<1NK=l79k`?+^`$pYnI z8apGxzv&whe-l#G<%v?Ha2Cod8up4@A_f!JZB97NGF}(R>Y>J!5|Cj-nW(AU2<+~b zf0N{W@Q5CbpAGc=aVy&^V)LfmBC*Q}QXa-SB|UrB1YgjZc_DYD`eiw8gSvdkCLZEM zbt!{V)_JN*YloWrP?XSc<}_`qU$zhKH=uSQsLrLOM0zBD_BuCA*P>PXE8&fCp;P@c zc&@9f`%phsrJ?naENJ+MhLNm2bKA&^ADTEu*DY~t=BK4yVcs9A?zL}fuf@!juIQCp&?LuCQ1D9Yc32c9V55d&M{ zm$Caym2YpRv z*vx$^!uT&TSkiFNQDGlS{GZTt@I?}5xje-_mi@eEtWuzJ^ZFumNbuV;T7v5jr*RwzBPJAf_-k`PZ3ai=9d+K z{e+$4LR&=w!^U8ML9<&IG1x6Mb5IUi*m{6QI4OCRuvPmOJh`yLuS@#r$eq zy8Jk&AT>6NTl5$7VZUzS?Z~P|2r)@9u7CHjUNw%t(}J}n>VJRi59~vtuQc<3m?h(L zrqBWqTE2wST___R4{Z^T^`o7iYSsWohZ$FbOQ;0qmZUKky%owBIjP>O;N&e!#an{S z7Qo1i_z4-dv1j=@w2)+)_eS0c>AjuSaZ4dWSBMD z$Eb-^hFA(RW_k!loo;uB#fCuTvbabden5rp(>0vdq}1RRmYXOBQ}3o+-oS;EfQ!@i z2h&$^b~L)8^PLuC?pxr$%J^lYMnY*``w)jVqp4a}+Q#(tx2dsUUc2D-kxEsp+pRT; zN&y!ZmYB3IOEb);!Y5qOTfyPH9tK@VL3&x+2)wW_eSPp7-(8nmei<2rz<0g)JxU+4VS;18NeIiNWIg#{OPRa9M4lUn= zu|IUau=9hx<^>*@g^PUVR}TXT?D6sK>B?Iza2obtxSFsh^BPx1YCp|yp^Cz}sB~(hV(}WJi$lf=g% zQXHJ@zOb57AqOVl&)#UV15ENjRy$9=OY%HxR>zjA#UqZ=uoUP3)v{EDpRTV2oQMI+ zp42puMGql37Ze+kLYi5A@($P-U#g-rR~$0uV_V_OSlcuJ8&;-Hp4be!1aYS*+=b~4 zuaabaAW39-0;p3#T-+^VA)n?Z%h1{+c;07W^`f;;*Asx7tfwhp$U2X^kAPIbrinBo8!wB zfre!ySS;1_NJ~Hfl{TU;98YwoStKYBz&>WMGI}xHG?T)4nG?Z)#g6Z#W$*OEZjKV1 zzIZ_T8Q1ZFMz|N92>@qU>L(xQD?3D?#rLvzBgV`WVzH3-cnT08xxV~GqxNFRay4@J z*4LUSsb3pl4DIn&i!)xZ)!FB1Y)U}BsZ+@;fZl| zWd;nb*f9-yFv@(CwoVq3E2{5O7)}Ydq3i;{->>scg+oc5S)R>1tf7&va|o1QJxp@0 zJC=+@JBtEQAO`s#WHXwJ03m8k%nTu*g+n>NGuMIB|KZnh;PW*VhNo{Z$uj3u@*U+t zg!(0T5$)0aq*K8kMJ+QX(S7}DZN5MkN6CdczsLQU%q6PhSF*8I@Kiz~-A`o4;-8D2 zlY3y-X5+d6R3>|JQhhzmEmomfpzzM2g-z`2~Q@AAnEO&T$3s*a#kCl9P?2Qg0fKhC>uw zhfy<$yjW&1%y%x$qO5;tC$w+riO`|QWbu<*YANxibC*+IIV{o;5M2QPx}m~WGMFCB z!*qxZ4hLppY6C;DbKV#QGFaB+pJY)H&weP4mB}xX=j!p@E7~hL66@Gll5#9%gaG>Z zYjJdiCH5u?h^5!UPgaPwt+SPK>`<^&2cR@vSN!@jZ9qvZ3xFlHGKl*WA z(_Qcp9!@kv(2?S-PA>Ec*sl7NIS-sR6z3+C*3eQEHk|5KP?Yn0Q_mWW+v+>VZOU$osqstM7_^6H_Cy(##y|o__msqigw=3O( zdq0jrmQSQnf0C{c6wXAHC_GSF;Ir9Fs&t{IQe+@~)>@7ah`{*}l>87^B?@_bZu)2F z{_cV_MF64W&(a2(GvI3rTiW;#l_8iUkhy3LnqLe%;fX<8Jg11-4&dTh~^DoYm&Tj2~QY~myulEpp!=p0o zC2$D_?#OKl>1|6agaMg#IbTUj(B&_5{5|8x2u#OTJ7s2$twI1sP%Cq$$u5ce3pk}9el8(5Ns#W~t5gXJF_C?Ufw-_MxUpS|dFr#~8DA!ix zCe#hoz-~i3r@YpRrYPtDS;AXPRIsEy@nBsz{dJhWodPB&cE%x52KtmicKU_?&n}Bg zefe_eIjMazsnnhUjzu;C z?bYt(n;rTcX4rIukVUh*xE1LHyB+`mEpwrs)_L1Z|0z^r+rVLwlUn+lvW@VE7iZ}{ zj~`5d#?!l^QE{wRM_0@cgwYD46I(XMvYF5ma5C6Wei zd6Vw6NTKG#ggMc@QbxZ2wRRC?r@l&OGm3O_W@oqe_-NljE7g&|MBNwnrKbW#U4GFt z)f$p;m$BO6EDGQJeuOL{W=@F@ya87Un@Dc;$(Yh~s|}qrfoN+Lzrm|jsa^R}ww&G? zB)u9Dt%MAs7G=GwZiti$TQEk+a)6cw3O)Q&+QKZGItK$&pw?;rr2Y61)b&om2D!f4 zDN4SZ=FifsoY#Tuv~fo~v5=IJ>jbc!F1P^j&hO=GYcKM)eZV5j!<7&$A2k_{hX!6> z)x^V(a>1g3&;2|6UD3$8sHvCwda4l^XM+n_F2&9AB-OP}B9(D6YF1Q~Yl~&=8E!`Y zt`2qKpJq$*88@3aiEm+;nL)A_flfn}6l z6+}}>(l@Vxs2LOdR1Z>%emm~=RW9?O6wf%H89~SE$#Xe~V^Bt?`T&ZK@~rL9>XDYp zIgrkyf~EP2lZ%sr+RFS-fuH(1p{xP4O{lXl2g!<6OMMl`tSmtd%K-J>hBzLZ{m!Iy zd}%VV_^gX$s{2P}6=3ahYtw@ligI*t_hMSXE?~S$#?s>55bBmKy2g__wHh%GHX^b_aE*@g#; zoU3!QN=(r{)(O?RcHg-+a@C9A0tmbC%#I0USz_}k0G*?|P#m|Z&F^{Hu7dlpLNGU^ z&K(bx`@MfrV`Ok1l-^~9WWXFUfq+I!T6<7#$$wxQRL05qn;hpi77-YVdc`m}zi&Nw?Au{QMmPJUzQ5mfF%C3sT(+xS?E};Q3;L1F6_|?nCXZ ziW>4HEn*ybpsSlIXUGoz`g!@UiR>d)jyP?kf5sA$N!arY3M((ga3`}}+raH1=G*>U z$w<%rGc4wQ_W*Vb9__?J#@(r3P&S2cL0rBxqgev&sBlX$ka1 zq|y>Phx3?L$pI7CS1>1>zuxXf=gb*NXtAHp>O#1S%`jUtSf3UB8JO5TnT>#VdzX;k zW71eESOJ$UN|OZN`_SfP9ljL|N^gg|#HjQQwTYN0c@JjQhi={;ew!kH0|T5mO4Qf{ zT+z~@TEbyxWT>fXLJ2ewsDj9TWwDPjo9HDR;*$z4eTnAz_fz;4UN<3+?A73OZ(ZwGIY3sgo znuT9^+osZF@N3w{?72nrHz)Zv_I%$-l3r{rOp8MzMp=8HGaf>|6bk_kY~HwPhA$W#$y^%_6c4>(C$EM5>Mn}uHy%hn{@Z1L}FA+&4ak0=ljRu z5X;8kPeX0B`D_b!h(rfEo~#B>lRH(bm_dn}`k81K!~u<4I>yu?6uxbP!`}CWa1(hM zoj5w?C3g{u7TL55Vb)FEKQX?|YBgZgeAL@@umRNoU2*BhgB#Wofiy8;f6%ltey=Mj zE@vO+uJy`{!09HV$zjoH|=1ppYkhij) zC$xmp#*L@}we^ykg&eu)Sw25NEr^2VF~XxD5%GWk05(D>0k4DwaND-eylfio^Sx?2 z4vDSlTLybaV;AYu$bZ{Cf8RDI_NMrPGx0H24$$nhi2IA|E$SF}fc4lt%!6Q-D3**O z{f7)}`&X9@iO%q6oIWoe&*Fbl!&5l6^C78cJkf&du?i%2dngt{D-D-&K3|MVO|axQ z=pm0?R7e_eO`WGuWzCZCxV_Z_h(xS`OB<{X9V86(k(cV4nXu<$jy5@(La(RIpKhIP z-8RdQOwj-=I1sf8wQ;&h*k()h;oBPYN|sVb;Ufw=?M-&JJC|8^H7)+pM>{{~IMMYG zGt#j15};-t6eyA&k!Mp!v4b6?DpmCvhPOi5lyX0o!MH$vU~zt=-Rz^$Qap2D@bf2C zEoIX>LVKkgN-WJE7IikJ{tF?)$D>XzvqYaHr5zApzt-OT z2O@t7lDGA&rig-Fff11=(Ae-tEe553srE53s%eZqGi?1IASOX*=Wi%Xv$gIFh|qIb zjmM<))|re}^^4Ijqo(=}(HX`~gkz2s!!!P3HdyTq=E&%Nxbar;mjdQiCtmDA45G;l zz;s57XG_sVhcb5xEj#>QH~s#lomTU&m@yWwnHJB3(8B#3{`t5_F@Lh8Y5;0cY~@5I zJr~ld0D4AX+22eLN%Al_{Uv5Pym_2&VXOAlazWKlE4^^Zy)b{6A95~O(My%tS>X>_ ziWk%70Yqgdw?^{&>`6xTggOY!IruR`?t`Z1&dh~}Kbx#X08W<<)lIPaYW5a40YrR! zCJ5lGh5Y-UH5<;Tix1psohO*wEfqi#%yLVnR(=As6^f4UGO#(SJo zXb)-w)b0ENt2;T-^Pi5Mb{!1+Gs56``ZlC9oB|r!!4Pw3K*wN(vXvbHaZI>}PL^0+U_FqW zwanf&IW>P-xlzHIRiR{bNDG&5S3AFy)MGaoI@=&0$I5F?F#hQSzt_3P%BT(ENHyZh ziEX#N^g19NGq3M$tN0PI9LIULL3OuhZ>6Ep8aJ8qs7Mo);fGu}V1+Y;SeyXz=#Wk;R6rwS{QI7W{+1rOm^D3PTUx2mb?VVri=H`rVumVTE)0 ztf`RHmFGKak7B-TMpj6y0CHee_|pA49lVY2mI$z}q5o{A7@Z@Cuo)FN#Cx1UEuFT& ztj!|_&O7b_b;ks#cauLWQF;Zlx@>Rj)p(hnFJ|!Cu%V~8<*~Vd68NzeWx+>UYO~%) zXa6#aF&XfGi2Sk>rlrlglB|vsNI4ilIwT(1-fSc2s%T$MjxK?0YUV^Rq1J{Gu zy0was=(PD_k88}{jsRgM(Rq)=eTP{~SEEKS8ZWKMeuITPA*x*4!~A$N!`%uMBv`yy z#Y2%)S+JfD!h|cP8s0I1LZ}qJlp%Ox*}B{rT8G>EE3aP$!Ob?<=V#lJecLcZK5svx z4j@uA;8Ur~4|!No0S>9yiRWr|1pU~HnGbIeL=sZFlK|w-vte^rg$CusZ5${X&XYvx zLO7wP{7?Vfxgr(V4GMN!{Y3B1IXd<*d#!RkZm>iTM5f@yUUZuT#|)9te{2dc7!5x! zvsZ+7d%U`7XUesE?yP!s56DFfY|^rnFu)8&)|~?EW|JRr~6-W zYIZ`AbY60X%(wgkkLHao+g*(|QHNe|YIYT%X6wydmj&r}zw9J)26~(Y_9$lNef1*GX77h{Rj1);b~bkj~>K*g@m6ys_Ch~rUI4YZf3hJ!b!LZ<4=CKBk! zw&*x*U?*JRPMDANaXr1E}N=b z+I-K?Z;1@MLl6{VQDUfWBHjjbGTYTDqVZjc%pxN^y8-!~erP$2FibD+JMUtO7)gUWY6$;{d~=Igwr8ylvi7Bm_p}B7?+@&VX4gP7IP+P|Hm^R@I-)f0u_ES%%XlRvaQIYddiS88Jm){Qpofr3lkh zCR7BeC?^p*=D>1^AiD9vQ^-cf2rYmINNgj)G4oHDg`OHuF#7OW^g zB^9m&8LU_gp2S~PeF!{(@qz`^m!D)A4`4H$MB|J|cc7Cw4EacSA3d{c0_EN?L1CWl z&{8sd#bo$eCZ(Qi3)F#lt+V8ngvR=76E;a0A-tCWBJgKda{~+34X5{Y-T6J8(5vLE zq~q3*hTiY_2yPC-4HDJvye>x!w;XEkCG`(7o-pv9JJZF?70GRZ4d7VDqegg$(VuUX z$SSz7V~uJcbaUYN_y_=3tZdisek(DbnRbiHqR)Vdfs%PgB^J(vasMQ$S=M(0w=t0D z>SKL+04$KBd;ahHU4ppV@!Qe0{)&B&q>j%*xHwY>zlY8V=lNU6WU@WG=CZRAyc{?I zLz(->euX^UiI&5zE8(kAUFLBm2Y|{tg_@5|Zs-9m^Dwn7JKSBk=U06km$-a!2paA^ zKOjA~p%^6gPs^(XItjfV#KTP8xjSkl32x|0Pq18f>4{-K^%3F2R)LuATfh(FajeA- z%)ip{IU+_HrmF2*#ymU-DjiJ}>%)Uk7I)5HT+HwZUt%bFZk+!yq7v6?jf|YrLS2%G945 zA+#BuiXq%gg;_z-I4yBjN3=XqQ}AQ3UdCaW2VxtelP^OU(#?XW^fe?VF`NOx z{?%viNCT+Fj=;J{*y+9|xT~jH4NgLTlpsrV^&)cJ3b?9c*T}N(aEdCe`#5x>aFpf# zIhXeMwmat{q+%`E+0R$NkodmJb{6l*+qBqs%~0bS0Wx|992=02S>|UyK9Tn<6&Lz6 zf1~Rc0(dB_@?&oaAIe+(iVa+=)Jpo7@!{jAzPulr0)~;%#TE~(#Cxc=_4ShCaxn6E8iG1 z0`k>?C~OXrlT5ruY=#@E8(iRZf41ifM6zewzV@I_f2SAgFB?p01z4(5Tz|$$Cueun zbtK`9>VoZf-K$fSh)ikS5#!YE_)%9Fvk!stsk)Vw*WToANQIC3C4lG#OwbHU$qcIjjWydnL4e^>X_HAgzP0SXLa zAUMPTm}eD1hV_dixJw}i@C&B61{52rW>Mpxp^dJj$8K+U0`bEA%AGQvmxVYyRqKP8 zm3=huC3kLSVVZ~=4MXmwd6|}4#v?XPS->N}<)oQv$6f7~o zP?x+Sq$F2i)kWcwhI??XZu`r}H|hy?;br}UnonGjcG5McjE%Vm_lb{nJ;L5OGfGG? zRhh*a;EaGNt&3w`01$wHHFhA*?uA`_YCJMylH|CTC;c**Q1{W@U`Mu}NvlRu4zdadO^F{ud>yM!g7dTqaVU+Nzug4o#D-~Tb z6Mphv%)T8QB(R}C#~udqVCJiH(EC>B5e#aT%T9-$t=M^><@wf+b~_IvqCFj)d#11P z+en(r`4)@|uX~(fAW+20CgJuGkv)253KAeF|2aChT(rG_XLTTQLH<`b)!@h&<`}6a z31}wi+$m;*D=KP*cUY#VWOQ(2IlR|lA@*~L}zat)XJHf9yKMQ zS@yWaZjz-7ZGVY(`_vGjuEzSL)f$ECI(lT}LW$xK7itvHSynnXQ4+RFxupxX16ZT? zIwi)i3kO07R;mk;F+G?!aeWd|D)5-VpuQ2h-ppw1fb>P^94a2&z;)U_f5Qea3$VxL zq%1x%8S`0dZ^~DXAr>&P(^ZOy)J34jt!7Pwd@aKdTj*Ph>;NlS=@5MuaQ2t9yv;h zQ2)DR|2agD2@W};Y-CFt&H=gW&&{kDTl;9BnCx!8K8*K;Y_{JTFWX_@3R{IrAK5U3 z8u*YXjcw@1%vJgiDP&>JCQ}isju>Ua5>mh96ebtE#k^)m*jg$~e}}_F!y~Tc7R8+a zZF04dAy?2ri=wzyNh^$0BXGOS){n2O4E@&mBRJ5*%!Gf8 z6Tb+`!HXZNFy%E>u_}S7@M63vRlX`UyNf(q@WVM(u*soehG^ zR_!`fsY<~1;8>?4FVr5*>p9D^cY;~bD(ve^zUoAsU7f`}k>TUsisa5QoJmkgVMwSH zM%j>tSTmJhNj3U>w|yW}%5mjACnhGpVRxV}7Ca^gB_HEt6iyM}S4s9>TkGb^LLfS3eQobpau9D%4 z5jR=2pj_&XK^YnX0CVo*#{vZ-+qkPAZZviyex$NcYJmJG%kg1+*WX$wC&`Ee_L+UJ zSDU3jvw}q+syeo`2x_CYXOo~|jlP~}%wPID^~8SVAr#_R2NN0nZEkJCEOVBr7UN|S ztzBpuy~X`qS{##L;1GsTi^{ErSFgh3EWa>YA_z2U~ln}BJ zca)2$m`=e(ypYHc`k9Z?*vCD7U^_CC5z`z5d}2iZt8|VEohuRji2^Dx=K7 zD8K`eIs7m0iF%PZD+m7gr}SpcGOV-)J?2?7Ws3qv5^-+Pbn@1OYA1uvzU34d;O0hX^ruN6p}f{vvwQ=HbDLw=bwb zr4a`tfG#m~KFq~p*^nlxB`)zxMZLO+MUG+OLjamA7psBl%@qbq#%z*2Oyxy}Qr)IW zgh7(}?p>Kp`_lEwAH`H(dd8Q*%VG@fA#`Jkw{Qa9#8 zHmG~97m}1Hw?6jv6PVN@(l|>jo#Ln6K#;i$2Hs}bEZ_7)03lqIN=8?oiqLBAwDIDv zPaH5{-V^`Ts$h;pnBSeaRqvPXq^_()_LwPwp#jN?v!iiHBC^%^Nx-9r^aabnq_YRV z3$@mv8$*b?G$CAM{=`bfWa28HbtafbaL+3M-BpWmHD@rE633TRk=az>=$-jHL;G|+ zlplf~7}|c=gJ`fmIh!FJRM|v0()ap2Yv2rdZ}Srr(J#8((*v69-9*Ku*npv-qYRyt3xrGF`zD(37s4(xEO=e|(#Et^Z|RHK`+FEx z4&bT_8al~)AG1UtVAGaGf7!aEo=7>x0XXR-q61_Z6S>D)ngPayYHe?~~ppC|X5THLkSlJ!)+>dn@ps%;WW z6si@JS1gs7+VSlw^7I!g=<#tthB^U)yYwy&=6flcZ3o+G=Kj#iw2MPRi=v-}rJLWA|i|-aKDJeN}Ko=D&au0I*3CQNA zGeL~R4J2uM0JAWdjkiHtWOa>K0mtn>nGL6m)oIe_0|aL^_UbI1je>oMiX0m zR_l+3J#;D?bWR0Cb9vNTJ@&yu>3KW@aro^HlB#KKIs&1Lt-gWEwaoFoAL(+n3xhlY(3wO5Ib63Gs6~PnBPd+`2gj;L+ zVKqn|){k{qs)%5-X__-gs{?kza91FihK(B7a{@G*h5QYio(dOZgdUbGvW+jdm~AbB&pql`?c_HV0)xLq zcCLlo<XZEs)%}n6Ibo{CZfFN!?W4d~Wz>Crd;=ty$>9snKmY zmEEbb*s~)Xt>iqk#T|7&H|QttpcW9T{a*|~PJr(@dwtGkr}?}<&3V6a8w2}5^4 zZ;K6EEOvl(-&h^}2qIG^<$jW6prAD&=@NuySsc@t@RhNZQCppG(q`ssTCZ66v~kKi zjLS9jCC_s_AD%lI6A}ZCfY#^xn6-yw4$T+yqti_bbvD=osA1?ZO{-Z+{p(*_Ua6+q zhybUiYM~123q}^iM6I`5L;S)R0GB03rc5A{EKVRX_bL7Q$%WAz;|w@_%3wOV$0l8X z=w|vcj*a=})zXmr&s=;tX=z1B;q25`vX3Q^Jdh$1Xqt{ybt2cb)62&PkF$+BFDoP; z&@v>qB3X$9?9|D9v03TG8wmPKDp7w|{YH^v?q#yf6bf1Y>;bk3KoWm>ix9{&EXCoEIuPt~TQ>Hckf3UtFhmbgUaNeuix?w8xxBAYZQdt345uSdryuqZrGo zVwK{BQ-V$&ItPc8LSV(Fc9V4;CAGrCzN z$cQ_rBV}n%;g{pAyMWL|nEb!Kbq$O;JC!+$5ml=hN{l`BeeXrU6$qKLDX)BkGvVq19uh8w?}f(<=QTwiNxwa}~nooe_M+m(%6 zO!4+Kd5vEsvrIp%oJQ6G-wc6i|Ks1}>1B&01z5i{LQllpL` zvzp8uioL%}AZvbyV$7OyJ)kqN$1}peMKIa3)j|8$E?9}TA}uJqXnj~Np~#-ML-8&k zaX3MK$hlZpydQ*V+z`!}`V&cl^Lp6uUWhDwB#lOA*u^ z`EI&tgrm?5>E{jFEBBMUMnTxQ@hjEIcQ3>h*$b-<9NHhhDjJY@z1BpL%0pDu61d&^ z)?Gt_TAl>;0T|cxEd-cyd;cW{3^Da`3Xk{Sa@_EPVyk6U=!?X$d?v+%lt#4L95Ulx zi>CKdtI(A{A1#4 z_Xd*y&BFg+y(xZck`*X}$f!!l-y$J^%&w=_Q!#obEoR;L;9q&wkW+*DA$$@u55GgmY^wA3VvR-eFmm_Fd%@Iv)yoEkrOnr z=l_)C)Cf)$#=y|GFD;D%a%k8TFKokD+&$boqO4a|vcTbKH20}W#8C^n;w*wl%ZL;%HRxaH zO`?}-Eqp_#>E9yezfnit^+kt_#Qov*PA$h;16tNO>|W!ly>41slXUXOK zUl+oitYX1U=O{ zA%fYEh6IA^yReY{O(&OK2s3Sq)UdBv3#pR_Q=*qbl(cYC%S}koF>{D%3Daun?p!c2 zZz2_Bp|yYA7W+MxO9xVk3oQBxNm1>+v6O@S2})`6UPLZ}U7AfEhMZ*A*F@ASq_<7pqrpj|WqR~TS7Opsq zaH%$jDlY(Mrf}a*%u=j%1gJKu;xmap>4DDk2cD*XTYpNba=~ijJaxz*g?k{i9kgex z$~|F8Aa)s}kfQz%vV^29%zJm)5_Hk?f)hCtzX3PNNdbVtz0lF9Dcc4h@S&X10oqw! zyPi6iuSMcL$3#Hz#ZCdRE8&CdY&uU;8a}kpY>?Lh+$WPlp&e`lfw2T0XD%$(wxUs-;S-nn1?3M4n#A7M6tYNL zC{Q6RX0;c&8=kWq)4KM9<#C{-Cb;ZPIttj@_Y20PXKrnbPZZrjtI zb!amVG*pGJ(?p-1uW6Ido3gCAl4$kz^iII}`YGNN2Bn=lgL;u|#qN2>@kc;&OBfnS zU=W-3Cjk9plgcA?`5MfwIYha9^>edUzy!W0wti0j0QjL%N#CETegl5e!0@pPa4yv! z3+9&=tt*nPA;Z+ET*JG9s=j$#Q^(e7Tjx?HUepwDic>MFr*$v(F1&KBR|^dCTVxT6 zQjReF*i~j>KI%YgX38!!c24bYg}%p(Wqqb_r4;a5cW+kH5#Gr%(3u$* z#tv4A%YJo5Sf_#JToYEuz~JHR`#7h%b9OLcKr?P$XB)Ni<>DFn|O0LGa_ZMvL;HWrJc(N zRppce&;48*u>R@ng;WP!ZK~G9#yK<@eaCwjR2~~46cYQc)ee1*wMh7gN2=>q=Bc^! z@+=LVF#F7wkNKya)$D2q;($^4yjrgI4+z*_7gVg*&J2}&hA=xL()KiNeYxbCX-sTH zvo7KD3U;T!FRa)754ElVE%a`?6KepA7NzZG|62}pC?hIr%2$MGCi;n||7`C>33c6- z_VD`)^go#lp1z~&?~-m_ro01%M9G6dru?3eOrHoPU%G7t_%haxiBXt#ha6i~r#kuy zlR~uBuxzB@R3CUhSY$3{2UA-IM#zdt5Bc0z5z#-i<6QJ`iV}nk6&Ret^ywW2F|pf| z%i{bw>{C!n;W_^t!Av&1`-Y4Sz3yX>Pj6ln5|v73!LUNSc1O}Szs8*gdD$^di0rJw zrf1c-xBHR5di1W^C7{2k~ORB+dYUX;l^WRL4A6(0X3 z`S2b2#(Hp1F1G5b$5lIDHJckjXcO0}x)@uqkyjQ5mjVUR4+kBvVgkEmeO%);52{;xDmObX^ zwF{uoqAN|fLUt{wLWedrQHki1s?zh{7@zv?IBj>;xVKzr3Jg+u0e6`17%JPYUxt*| zvOR-LxFi{T;Zb~lZ~p&pIJS$&hA2K36D3<#AZ&S4I_X=>b1<_hq{*)q)k+QJo+X%6 z(+cp@zJu|dVL?F&qV=&|sYuw)f^1wxHJmM=Bsdb*_mxfJG1IF8*#Bz%&tc zuT;pMvE1q5e|VV%a&QkYeTV)Pd?E`tuCTH=9;tx^nX4f^FLYMVSq&<_04$;)aE-8V z@4lA~&pcsvqSurE+@!m@+TvtxTxkV|U(naA6(%V0!Nlmhawxr{Oa}zi3Wl5ZI;IQD zb*Au>^1m$m;#_hJBZO0+-5rx{MAnjnh|P!`j%y8lzh!Z{bxE4YgI-J`P&1t1fXH8r z$fR0=w(TX%zV;Zec%r*g4~6QwF}#$XD()id=~1M$rANBR7#k}|8P)Jp($n>gI#3}du$xMAA_T)L;5-&^U;?co>D6ykS^2fnkI z=)IbX@f%F(>9PL&PmKrdtfNuzb!O`{(6>pjdPjx%YTARbn6BLxbjmQA$l%-p)m;b7 zF@nA&Gko!R$B{DS{Dq%RQ1R(JARACYiWDQ#0F}I@&d+Q^Mhr@Q;zU?5g^YGLnlX+c zU9aqJBI&RipmC@V8Ks`U4%?j}c-8wA0})+*IPPjSh2&p z2fp;BArQ!dS;iiX=H0m!R1w1K)2T4sPnu)k(r0h-E0CDh zTLm{cvO36(h*hqgYW5ro_`f#7Q(k1yzbt=`lVA0}<|7W4fEtrjo4 z_TawjR&^B_1yq!{A{&blBbGXMv4Uja&R{N^g4+SDpZoBA9VhWGOQX_Q+oL%-o<$yE zS_yk`KN612LsBB`?dl8!G8j-@XjhB=ry9U=lxPAGpQeCSoFm{m=Dgh8>k#tumc8z> zyPQAWoc_`Tf3;Rj$)9!i&!yDu?*kph^(;0H8t~u@TD&Hjo}~DpZ>9Q(#`UPdp#_If zQmZl4V+3)ArH)00n*Ie}U{63%NiH6SwHLZmD`Mvj_U~7$XGw72Qcn20M#)8z2%|DY!A84=+ zS0+_u0(S4sAsoYQ+mElEE!GF|zj@GV^;hX~#b0z3_>>_Wj98EHd2bF;?j1W5Wv~QW z3ga~Xm+4=RYfh@3EL1fhOHPNwFqDUgBV(=3IDGiGBI}9S3*{ z`)FBl!^eRS`X2Z);k4BMJ@6tV*KY|^(FBO5D5w3-Q?HR>Ka%sTpE)>V|JTC%b|C!z zt2%_Q(BujOr?Q1raMUcOv~PH|+_-S}n)z`KU3AwC*4RnmaXQbKiBf%=jYooNyoFebX}28QM5X6=1n#-4^@bw~C7mCUn-&Q&r? z)pV*}!VQ#MghE|o`cSE^e4G{&)%$2St*}xeD#EM|%+%v>KwZHM!QOZa6FS-<=!qHS z1FvUns{OIw@D9mhZX*cogIW6e4Fe}eNP!#Tl*ZNenI2D|-$k{97aIL+!`DDEM z7@N>Uj}N0@cDO3vN(PrWD0LbIhI{B=lNqyQqV`;{D;J}t=YkV9!xKpRib*&87Jt!z z28{5}h*FJMsJM&(+&Oap(qzs$-iZ_|@;Y{_t%xD^@nBUrI!kO&KV?K~+t`Y4cRj3? zJND0K8>S|;P^0Dtt9JDj31L_et8{S<hm$ji$;c>Ks`B($ykkj4F5-C zv8$EwcsVftp$wV_$=rIP;E8x+LRrwes1x@3n^$(K-|Xu)v?#nI6`3KmRck~4HXF)X z!FX~Y(XNifgl{#?A-5azOn~srL@k)dLwFP(8?TvV%330v+g{WDDT=&A;i}@oIm#2b z90-y?cxyK)WAyrkWG(|X&>Kj~%<^s$cv4)TAQ^$573gR1E&T|$@Dhno#!09IY4ll3 z)F%|Wf?rF`7~!0ljCu`f!_|#uLz^A!FSne9pU4_vl$`QJMc3`-0nKe$#W zT<7q z49Caa?Lm8DS?ak(QoTQ?jL9B2fg~eSSV#ySYFv`cj-ySYK<0AE3k6ZElUfJSO0Cew z^d5V)rRd7JJo{{KLne#GDOlE&<^Y#t8Xcv0b<2&ZZqceR;`uY2&?gTbD_ZJ-#IsXw z4NK{F$}Fp+^@UPQf?^Vn-??-&nN)Hgxp?Lh90$0bkMC|sF)8-a8*9D#;K4_myi>dJ z@|y6c{CP_eIhlp!N4fnRuR-_uf|!2(AiucYzhE>nFcz|?O?mi~Xp)AB8MhR`gLc;6{oQd(lkb!4o<`H6u@f*wbazW-wh9^LmadtcEs}e9^69wFS+B&Ajsg52bZ_@?5_y7PlaVP<=gave5 zPQ%3PnG{^Nvuj%B!A6_-BWz3j^$})XEdQ~qd*%bdfO)_g*>SP3sLb?XhXQ+S zHG2|uvdM>ZcYC5~STKnlCD5{fkK#J%v~y zL&70{_ZIz>jmKxIxY4ARHy>2db#VH764{w*S1IU59pFiM}KiOe-7Tfsw|w;gzAgx3a;=NT?SkR;7q$%^nj z;@A=(=w82BW*JFtfK+ww1k`kh^dx!ih4}H0{!fnsMbc%3(Sq37c!m)<4P6P(TN>Rl z(A}NetFEeCIDi6yV))y9j{F8tqVxp>e_R&VIQ$Dl)5~jkpF&CiCk&~xc07XqQE^5X zV%4Y9AEq2NHx7@r^?C()2H`3P#w}uh@v;pmKLljII~JulI;qX29Ctcl&8pPX(;;bM z?YjeS)E6ey{d6O2xn+}tsGtkMb+e!-dseHR0XT-0cduyvoNId<-~N$&F7Ot;oqiqoM-!pI(QxT zUcIX-4?N7`RyA2DQ^XTS_#nuj8G%gh6ATA5LHdC$idxG8xYH^;K zto|_9Vy+;1w;Ss&Ufry6(jD&p@F0!8!5T1UWOUOM>5s5cvHW>}J(>f>vBkqQDZRv9<5R-c6iB38@cxaA-(M4V@>`_0uBN+U4O?g{#>PrcoHfy5K{in#bCY73_JSG z+R`{=PyP{; z8bFb4_;*YP`i($?0WEx|4z})YMCcs|l@p{xa1DXi42R3|_?Jt_06u=wT4}y)N^gN% zvzu2dUyA5qu>FzZi|&aKfFTv^jr2u^<-@qPIfCtoJ;>0K$T1Q?YL(0#7io5^-B+=1 z6+MTB!2l8UEhE2L{N=Ltv;1d(nr9hAWUuh!cHbY0CK3LZn9VN1x-+gFQ~hJ>9l&a# zu3Y$~ZvNVcQ*~$^3bf&SaV%RZC44gOy;*Drcb};K9;1u37@a5$$hZHLgQ$0)taNp# zeUUar?1y9v?T!IR2At6-@<5T3gdB^HtsY0t)ErDY;5EVV5W+JCA*bfajeb*p3rwlX z#F78SFQnJiKnRr_NlFQ#boU9vum$_*MTOq5O}%vvvtjeevhWUC;)0TiOear)JeFyuA^)ZQ zu4_CTc5XnVq$~&_m6{8qPOCLv-0`@2e3zx(Gjv=H(S^Xk?YU_enYA5}Wj$?tppQ?N zmbiqKMe?9@-tGYdfF9isFp-cBU3OpKVgNO#(dC<3kYwvU<333CBO2vgT98J?mR`t- z2GeU4^)|K1w=)y5Veb@|%T83aN*gCyO(=m_;NwLO;;@@+L^FG+m4PktN@bmt+> zq8426=Xv=E@W|$2tnnI9Bq#LhzmSRX2=C?#fn0gsAfIxBKEUT;3yZ=xLVa9C(D+7+ zd-C>18uS4wfNL*OWlIS=BHwkc6h6_{@zN_HLQ=RfCcIEHT$NIOha8N5k zK}rJZS*o$xqDhawzja?`Zd`i!s#J7*Up4zu!zb-fX4j+z_9^@&<&!zE2its}m4$_X z@|h7DvW6ckZs7i)w-CAtVWrTP&}Hu`(bkEcc=?kOBk}BM5_HL-;Xd*nr+Tks955%~=*l}kaEuzwz^;391_5j;twfs|l|LNteoiQ4P|P}FJW||sbA0|Z(8r{d8d~gv zE|o%<3s+Y|0nM{%8Hkk|@jXpH>T)_$%daBPg4C&F&403s7TH#GqN-tg^B-J{4O1Wr zE&-Jj5%?N+r@X6)tPVl-=h2!H>{J&XNH(WIw}9 z@WD1JLzI7m3rN`(uFEA6ED6{lxk7ujeL)b1@Yfh+nPNo@BMa|W!$G_)3CFZfe{|fi zpUYK?fbN?kW|cJpQ`$_Y88p9o?$U-_bYnsQQ$Vc0?=>m2YwvX(M>i=V>Ej(q6a)w~+n7D4O}bFUg>M^40Z4I+s0`I-BycM(RlqXFSk zPBx*YbyJ=k+iF*T)yjjyPGVC9AV~OKxvOHd(?>_1Ln*3}1Z$~j*|uL{m<|TBZ`?8M zxP01wbKszJarQRwj08R_D?S-L5;%J4fR|$|Udk0C<^i)dX9G@9O-tj8A(t0u?f<6y zHAA)y88;RIjV?(FxPH2CDx16W_ARs&Oj5KEvURLwQC!@bYM+fcu}m`FnWQn|^ERtw zT_m5AS<%~ifQZB)6S695n3Rz7BsCX3;X-jTN*FkYJUVuU=;8<5c<75B+oVV1VgLy) zN@N$G2rMUuKcEt17XY$QqTDqw+K%1;o}@91)_zDlqYr+RQ}3#I?!#&-v9DBhPGySh z8Pck95Z%0BAMbY(>#Ge0HcC7})6Hgjk0?`LhBw+T2u-@jip3AI37OIlG_=MCo|Qwj zc1RyN0${FjY+D7ZG$oMsrmJ%c;-k{HdMOS1xQcnL8ty$Tbc6UC-zmer`i1~bEILOR z4X+BA?BIY#M?OWhY4ywx%rtmJQ{2s%5!z$tU*i$h_crqKA?`1O;Y{{-vH}Q@*NHPA zzoXbhfQIE?-2>hc=pP1y{rSNDF`H=yF0Zw*ojLGB$n?!d)X|130+DKrQw+41b1971 zI}t0~)9P76H|z-HSg&woZxYbc#XjYTH*M@;yFEL$<4#saWB4f-L0k*TokGn z6}0T8x2)7r@j`ZsmFW#XzL)TuXd!(OfS@A-T-m7Asa#EyM%|~VyqCJ>xf4Np4+K0A zS)}jZ&}{B9SeU?0ulusZ6XB!BK_#X(#n6H6EV9iHZ6rjK=bEunD9;f%8oOonkwWkg zU)8nL{U7Y|2W&8}=6}=4P4MUD;Z&OtkCX_{nxFBBJ;l0)HIB8)7E$-ZI@j!4WO7Aw z_&purrSjYq&nC%@W^x+ZE0QA6+u|?bh$t=ixvtQiBlO$k!c9XyAJ1n@dF4HR3V)>E zU|@a~FSg{I7^mI&xiT;0;Ti>dKO?kuBA324nb4AC6I3v$@_}Co1HdZ7!b?n?Jz{4# z!Z63XY2q}4hc1olybfAOmQPQeuY0l2zWupK9)&x@`}G`!uKX^nspRS$XfRhIRMvd- z`&{|!MtUc)yri;;U-nDS972HtDqr&yxVH}1PTq@Bnin6I?3~bYglh`Bvw=`;&4;W% z)205PZRs0P0s9{RXQ2Rd%p5j}IF)>s28_!nqG!TqH#7_Q*h|=-uXbo?(7IjeTQ{#5m+_3Vq?EX z3Q(A2`C}1u^3{()mf&oK9th2td~wrN7fR8?ZQR=@%Fki?=LNPVE2P5G!zxmjeX5(D zhn0w0HHBE2J`eZ%O=+iMmC>+#MtKE_wU1_2nP-Dm+7A_kYWb3z0d1R}mOjkG3x8lL zqH8zw$J+^+r{P7s7>DyC?&sP-DgK!ZY>paBzN<)ahk>{RzS zYkLzGW!)-to0pIB1*SxD#_j~jP)LL>T+2fO4dqrar}@>wrQd_{R7HuFEk{prz`Pbg z(WZO2qRAUPmwE4OXFY*=cn$1J2Jmxk7!)5TENPSz1OG?)hz9W6f|*oczcnC&kr(qB zAptPnjRFb}7g%4h6Mw5HM_EIxy~pqCE+q)7us=uLEzE@u0c#Wr;Wc>-h=TUm|BwNE zLBV{|)EC%F9}ft7w)RNV9IwzhquevtJk})6H-A)%$xL)m%lX6`dpouVI_Z1NNF3kS zc}6YE4MY!=%5v|0vM@`l-3JtALH7|HcbJgooF*Kq#UxVcoB@kfeDy87?4XdMR`RKA zXE%JJ@jbRqd_5gr)on@IJ7ijOwZeb&+M|UwYl~gB9mEYq8153igTXF=FE5WY`P0!K3-4OBzyj8= zPsI)VYx)tGYUdjl-u$U~r%;6R&2o%Ly)uZ2q_VpEYb0H?oAlW&32Frx&BsWTN+u-5 zJN3Ar$$mMRBt}J4WN07di1SU>izL;x<3fQlByKRmXJ%snop;H<(B-kX439g4PG?mW z)>iXe0AgENlM+tGTnc8}ywvDW`iOM+74ZAQ9{Jy@kK69(x5LGpR?QQ=WBKILsxtB~ zgSeNC)eL|Obl9F5!}u>Fvoi<#{ji==;w*K5cNt`jua)|tiY8BF)T!W0DdReevyZIF z0c-*AjlQXATW=C@?P(_gmXFoSdwo}SltCvUh=c2&EEWV-?xy?lTDapPrnN;a(zv8z2rzv;sIxt~Y^1sxkKiQvBKK;>` zA-DeZCdCsVK5zg}OM5LDwU^bv50|SxVdMJyQW(h8n8t{G@Q8tANdLv^r0pY5~ z+S4cwE95EU+ZFOzzf+a*$pl5zV1;VsuNxvMU<-5BW&uQXoxJrpUFvO{ROZ!O$12vY z?j3i2HAr%#!!g81$wLZ-^DyM`uss$H9i_P{RuC#iaB5sp)~yd6%& znpkGkj8_gn<31CI_3@)W3)zPC1WNI6<^MgR3JpwJk8-hB_44pWU+Y@S6|m^-6~Ox5 z_z2{#5k$ycS1#~E9H(jn6(gyxA+n?ga5Hl3E#3z+pgfowY;#6xP|%yIa3=;wBZyT7Q2c~_ldnsNFEdtvf|Z|vMhMidTk(m$V$tn z{czRu#qkYbksgmvz4mdz0+R5)_oBhzQ&j|0_tIZ-0VL3{-XfzwVE5g!)Xu<{E)l>{ zWKXhU8*Vsv1B$6NzLyAOnGp`JE&%xEO2tT)5|ZE_vayO^2mHS{$i&sA`+mFx$J}J; zCVeYlOU@_%REqh^zt@<0EjP{O?6_HcGE4AHP8T#$I=TNYf=BY}T>V4qq!9m&U-3WO z;}jeFua2LOeFnBMmFZ(2iN+H=o4*lEBHh?QC9px#Q?R7k)4sgF^0<^3aaB5RaS}5JBb_>zu3zTZ$N^d3(vW?pf zWAEee0VsJ4h50}m`xh2FB%HWjphpc~_;|LU8xme@7wV?u5qF5$X@3!nPbDAq_t%?)pwU$nE9{+F znvv<^1vbv%7LD05v=*OR>8b5SG~HHx zTa87Rza(U-@awdLT#VGM`2uO$lBPWF3Z26WukHBYgJkv~UldiMw;J4m22x`*p=`X@ z$`8zO>n+TJ>40#Fq@nM!X<0zht=O*(I+csp3j{n(T6a<&k5ZpNiVqVr*J%(I-wB1Z z*j431z$J9quo|y93&f9ZjPr7|3xOkp&1BC5GviC!->~t#GsPA1R1$o&~W8eTx!X-{P0s1^4vQB&3%T_ z%C|D0deoK@IL9qO|L$%=--VZ$9{{w-%ZayMC|sGq>>`9IC068Nf;dY{A8jdLyw@@a zr!y#|tPhtN_tn?GC=eudj{*J1uSJKiT_WW#<424Y*L%82Vw;y9+cE|ehdNmBPoGt! zNGlx0tSmqDdiYe$(Oam6SPX)|!<|N*c)&@cxbQb?-d5}#QrGvo8&B3|b1^e!A{@xp zqa6*z#$YPV^Ad&-hCOaddN;uK{P0&LAYrgn*YM;kkDLmIioA&%+&-Ar!&wvx7JHZ= zxw!fNaj-Yat!z>c9lu{eqd7)MQ!Oh#Du<;Ip?NW{>?+W74*@UJc8glOEw+#YVBr{M zbZ8a4<2iZ0U)cIqFCoryUcW)TXuK-gX1#?BZ}ljg?UDM|T5?^A_c2l>$@Ntsg>_D% zP=&-JX0CwhA-fzTg?K?qRk6jV`TI(bSkhgcBRcGw{Gd`AkF#$u|L^;aCJqfqF)>p1 z4O41gPCspA*uzhXX5WjzEG9GUgP&$lTuaq_R!lO(bmN#ue0go>(1y(S!ocR~gvZ89 zzzNd=Y{ei0BPEFpG_9eZy#mtTMj`^Y_c!$t7)dN&vmy70KAmE<@+AVE{2jm@{PJ-! z2<4@9_ry8oO{symh!i{NYklL==%^FGR8dI2XB%a0+st*`ZRzc|S?*;d?ldY$lrmPm z#sbNXOZx(%8&}PBb2M5|MqsT6VD670S<*h1qTEJl5Y$RvXQvhhcAKDH&Axpr=rG0% z_7wL+b6^~}eZ{tr2=zN}HVBgfiWzCBd)-|^sqAWjoPFC0!DhP1?&m3P7eo-MrxKXP z4pHbzmZ>pWz5&r;P$8`Ol2=w}J!S^AsHz{z1EtHT`oJr}SuirNGoRj3Hfhdq54#>x%-K0aL%?HPf`al++cLF!9 zu=-Sy^qal6g~GzL4i-C@K8zS>AOt2ohpw`k*zxosr210yC-zjEXpvKLcKW5#yX2L5 zniFD=0#+h1AsFMunb{RiuGQU3yr2lB$YS-^v8LCW!%*%CWVANTB}(aqZThF{C{p)Y zsaA-4VPH#zN6Q>-PdP{Z$w0Qn1ZazlnT7KuWB%-8a{g8#_TiyJapxC#LzAB0C zu#${--b}SfV46>8lnGH~c0Xhu0W3tn!29bvzkUjV4^#r~tkrTsCJ!_Foyp!2VtYN& zLdse@Bo>18yCxkGK$!rIuAxsBMt}{`HuN2IScf!pXmM~+60$KYor}qJX8Y)2n-O1W z_jM6mAEk)KZ$%V-0zqIoy>Yzce;5;*H4bjK3t~kIGg)t~pAfVo*a}Ht!Dqn$?)7NG zMrZ8#RvGc6EU|r+96?)DkZM#1kkgMa!gvsC6VW#4I>9fNB+V>=r=;YprUid7#71Ww zfOF@wpCWYanhx^w6!1(3LU%zvT3%&c>*oUJx4a8Aag2WXafb$PkfuLC?QyhGQ8op%3}sKo zdB`<`qFc`&W-IXw-eJ58eeeigcFh8UhO!U0b}k5pkERS>K^2@GP;uW<+s`*<8a!Hj zix6uyqmo-(&=AEDDKKU|Os`Yy?SN0HaB6^}AWyd^nEkgq>J$oLBJ2CLQSck#C)Oxn z9kK>8fJY{T{rzX$`!79I+7!WTVgJ?M_OEE4)WQV1Rqd?mQ1} z7Vx9sh_G24w1B3ILGKC)4=DWHm6yBiDWNa#)cC&I*faYjR3MsXTrRxt!O!HYJ84l# z$BA?$yj0nn`9bmo$m!F*E6y>hg}uwj^Oozor;vviCBmG=xr^Qou3aS$^%nKVAUSTU z_IIQS49V@`ffP?$o5E^#K17ZzZ21gwK(ZdI?)xk0WsZK zr1^gbOb@zOGchf2yE&l}ElUo6IyvUDV%ywWJso@@k!d$UFK6vXJo{B>K#~(1DI}Tp z9J56BE5V0$v4?J^QPcx_G_>@8lOY9a07`YyPY2AB3S3+HOskfp^Wp0DbTFcx4l6$$ zr8?;`z{gnZXISOd*mj8VTl(B{r*KT=BD*jf>esu+{}Oq8rVg%WG9(W~eZH|9(PA$y zhafgn{IEccvVim&a|_MGD@&_0!-e3_yQ9uZ8b$Km)dB5?DI)_uVP!A{>U}L^YfW~f zyag0>4PP@?C%gqNuJG~cL)sp#3W}Ub9<2oZfAa{^zKu0ktxMB-Sot6Cd}xuKtIQ3Q zlTi?Em@Pci5Vb=)Jt8g^0aeB- zHKf6Ws7Xd9+HWI>(qb+GEKpX#cykU(ybIk}cZBF>y~BXwl%4?dX0UMG3x0R7!3EZK zFxeb$CGZReo``jId3yGy(0ZsH0giW2IN)^JABD__iOwh8)bJ!PBpz-Cqt2uO22?v> z-<)Vj?$ZB2gBafivxvhr?SKg+w5}`C7H_6mI*Nf3CYX1weIsMk6u*Z_t6>|cd%Qz$ z^G3hh*ghm@t$D5-E)0hm-)~4s=vn&`W2W)S1i>oHTkk)Z4KI6RkdkCuH3?j8QpBDj zn9`yq^yaqM(BKPbog1MSj?QG1VmJ07A)Q9;+DT{eC{Gl+UG&!yO2y8|Tj3_jXSP2r z9$;YH*S$8VA!@$U3~UyQUV*7Em^T~e=HOK;RR-#Y!PMa4_po2N+bR>s9us{#5U5Td zQ|-%xh{N{!yA zsmPzT1z6F`Xcwr+h00%=$jx(?PXEYDc3MOj_wNH>BI*~!3hbUCMj+FqNr7G^G7y8X zB$)OH6Re8)$u$D6*FG**LsQJf>c*nlv=_b&c3?e9G8e<`#0qM z(VD8so9*B7dk+jxG0%9z&Li@!`arQvb#FIJ;0|J#vTVY=KxM+DnmngMQ?H~_-Km%M zf7EdA+#~DDLy&BjoZlJMHF~A~f7SYRhVjgOd-*b?D82fx%5@8>ghF&pnLHXm}2cseBrot0%}-r10&+Q$$k}I;ZTXGnAzHfP!J^YI9{wo5>mK` z&+Yu9lb=FV#qt!x;*tF*+37Dyy8JFYthLzK$i>?j-(88~w;mhfCU&1H+ayClei!nv zb~5DlOdX*`cz#JCfQXZ=L4U&}RdZ&HjB-dDkq}?c=M~|ty~qx#JdRe#N+z4N+i@9G!M z`*eLxK1`yiN)!*n*hC1K$N-ltsA|e}?zziuvr>%=0RIZVw(4}(n_UjBo2FOk>Aggh>GU^ zOlf2t_rO$OKre4)lL|&5sbRVxUj=OG!Xl1YoECB6ok5nq6nT`d@!ipp85`thzFoT8 zJB8BPSo~{ZIQPw1DbrgI?FCu&OBUB*5Lc5FXKv$mUGTmcg<9BQKE&0{l#V!mj2njG z7J-Cu!U6*@Olv!O4f@3=e=@(L(n3#DZV?m&-l3yN=ms;(<~{vd4ZpuTc)3<(T5lx;S8{Fi*JhFo8b0eZcrn`+krp|RWOM^UnfiW3-D z0C=tWOIuQS#__Xta2%;ts#Oj}oY(b156@)6V*WFep7UNi^6f2O@OT27i z+e4U*CpwoAn~bD5V2N?Y1kw-O71G~>u^!}2iA>C|r~FabRW(YPCd`Y`q!tp4X1u^W z6Y63eD>3$Qf9?EcN4H|9sA#1DoI%^&_lC-`V2xZL^@KzMG}w&iGY@q|^7U#{xt?9J zDKpjT!O`B%s{bEZn+rephd`l&52QI40b+)g-TubCJ3<);sW-qFV3EUQf!S-qcOm?c zk{9yiT=U*=b&SW!@iTK9u82G0x+`7LcCU5EV_6pDZikfQ8{uDjURvsIXR{W}S-$DN z_)^O)HtRh!=<6<#wQk{n1WZlT0wh0pHr8qM>HPnPbEne?cwWI63p!}x<>*x(_Etx1 z*XVByt9aTSCTBwZVu@I0$=X7L&f8CHB)=u|C5UpQVvpt&N248_Yep%p)nOd?u@)L zx`^kY5~f93BU?N8tznMX6o^z4!BLPePS?GY)wrW){^$N$?+5?)|5e%Sj5kk|*h!)% z`<|1$NDtZj`X}*OJ+LXaSmxld_{0p1-$-V8E2eR6pJW%r-2ma2K9OXBg#4<=Nbl_C zJpnD=o{DGyO+uujY*|Rz%SC${U#(Z{8Cx(E z=ITqDkV2`8jfrQSPT;)!GjdT3ln=y=On2P}goC%8!6|l5Z9=Y8M9l&XC(juX zHt^Y5ZpVW>K(IUkOeUCYbyXKjEyMS3M)u;A4^}j+I~3dpnAIwg8_MLhnEqW}Px1GPg1>H! zcuRaJ(lX|TY8!G_K~R6GF4p6_ZNWzOeaoPN@^swynhAOf)>{zR8`6OiP#twx zha@V`Bd2{8=zun(>2c?K)1og!KC=l%gkfOaU1zzHA3Wpd#;fYZ1PF~V#qq!Ays9%i z{EzFyu3qK=+51k~`0tdt0WY+roaH!(4`tgWZS9>6XB7E4@GbH>7O3wCXB{MAV>{W9 z-?$^gyQ@F0PaB;)&!;$4a0xWeWW(^~!O`5guCA~7f%yin#wYW;3K-8$b#k zlxN;q#>eIhnCoZ_27=r9*Hdn=+_v&hI24X-elRaMCsdDXE^-i9I$1R=jt8urMGF*n zTgriz)+u?oCLV2~b8FX*vh3?3CQJ>SEw$3T6Ul@1FvwQpow${6)RCsk%k?iX0HCj= zN`9|xxEYzSU;+WU6cE|Fbm?I?@crdUd`Gd^S=Y!j=Ck$rmRb9D7Iw%wsJ^^5-idyS z_FwX&CWJ~!=__~paYdI>F~73Ns=2rInr=&AQtn`ehr0v7EQLk1d}ayWx5D#JcHI9+ zJJ};6P}@(h((GZIujFf=-H|Oh0wUIoLpq;=Q=y<63D@KWk}O_FflugjX=}e2K}oWh zbZO{qE0aELf~FXY0$DdR^juY9<~7Ogb8Z$s8E&8H=M`7MLu~%Z&vVRb7O$h{g;?K&pypF5nfgW z&hTo9L~fQNXnO#Aebd(}EW68ub0;@zy#N}IX;09So!Ahms)WG~AiQjd64@$Gx5Eqm zVD)-ueV#MoO|EAa?;+lzUSBYU~QMayRTPBIfhl(m)eO{u@z#Ww=PXcOE>_YxJ;Dj6I#eK|#` zGqT}|vZe_qsYN&;Qdb_{11gMZ%FLTp-M$Vq>5B8$1InmrjTJJoO(obkmx6dP)(&%O zDk$t+)@ujDZ4D(KpLd%VxEJzd?biyGus$;Ywf|`HL_^EKe&TsEZ5Il& zPNrF0gk@$He!p$2da-IZDhUWF*^MuV_Eo#!&@rXPj?Xl5MqZ5_dNp-lf zx2L@Z_q&_hdi=w;<8V64PqPsMkSA>}(iU z7hL)tOksTs`i)qNf~0szLg17ceQptr(AYb7Om7a94b?__gvfb;R09qQ1PF}Sl4Fj7 z1&0!DmcT+#u=EN3EKjonLfCl+tXW7oGpT2#O7#!uBoVhxNV1kJ9|lF-Q?;q<$odUV zP%LvYKNqngx4D*2fPp1~^0YiASn-&^S&Xcr*z3{7^-ET%xL}FY=y_12j_7gB@8Fd@ zSLBx;Zi1mQ;Jbr^`1Q$93?tLE(#&Bv{p3g6M_>M8CxEmD`AWG7h`kgy$-c&aAWmE0 z;1%8|JW@J$ojE z)19YE=e6Lt0#|hG&ul%IDq@PL`ePC_7!C0(oy#}SjAeLh^1h*PSzV6L1`E1!Qmpr1 z*%smO@wEiSez#sEMA6A`Q~?JzP;0UV5;X^0kb}7z-Kd7mwt{FnGuqPzD`!5m#&&qj z$xKH@J>J^dBJJei!6Q%aEw1d1Xr6a`V}?@-_SMp7T%^qhYSaUzVUo+>?BYW~+5JdN zaRDWD+48;YHFM=6M#<(lSlHpTCzMe8^ghGx=5fZiALoi$jQ`M>Uj`?$7zXmF#FbYX ziCfaSF&|w_;zh_*!~GHqKJd6pZ`)f!Y*A%-s9sDW-rQYoQrmJUL;2I!jsjP6r<6Ag z^&@P&eZ$FIT^fdzjg+P9*NbT7*|7fl2v;w43Uw73!wBcJS-#qYxeeKNhpekv=TH?f zsQDpB&LV`3izC-MxBMwZHGSUAUf)A#PU39 z6tGYA-}K5z(?PR!%eMJ1=i|Q4zgHm$(Nfpb9iO{{vBd_p>^!5YzI$YhlK$s#n(!|P zQ<0atfhD0RM3&j=CHL<5Y7Zxe-EIkrD>?{NMH$YOWwLt9JAPdu0^+DlQSxHS8Oh2= z^4>ChFFx&;mXMo`8D?{Uhug*_@G<<@B@J?pXCtGm6_Tp;+5? z3>xf(ztbel*R_s?d1mTmn4;DXxbq7@Z%1k~R&K{J#TB%3GvE_gKUTs3$9wL|(_l$p z;jhL{wTmClGJXC%cgX5pAOuAUPQ42eW4#xtkGxgePx2AAlba|xh{VG>%i+bK4QvSi zT?7x91mdzyqkne-PudA3QHESFByatqxOc2173#F9ht%r5aR*^b@p~?i9~@_bIV+*p zxahgvAtH}U-Yttnd8cIToM;>nvVcKLbCYW>lbdmm-eHW5M+h!e0q3G;IofU>QEN+bw$FjPnUq z{VLxst|PiBUpyc!m^G{ro_pbTgaL32`qyJSKuERTc)P$V<(K+2zwrVA6sT!2jm@TH zJX`})rnJ|2q&YQnP9$YD&%@<-Tpr%btiB`hmR(1zRZ00$&kVzK>@e7Us<{%4VnPmN zNezd|EFUGu!WDtxUR&;`^p-cId^d;e`d}q)w7-kl)iQ(u#*;&o$*#F;zBLa|N!KVz zvGehR&g?SoI-d@eOa-K2q6oL=k+R1^^G$1o#3U@Tj~GiSduqf;W=d|8Ya7UUoQ6Rs zpFOZ>MzVPJ*nquu1*SuDQB4ZHPEcRpzpTIpFC;Ya6%u=dF2H=lNT#XvDiDl(h?m6& zL;la6>8csj>2e0SzM#ntCLF$JBf$(;rW}aBvG)DyX`P5DD~?ZhU5+^Z4U%PvM-y=5 zhBQ+HANzBdBn_gvjU;}#Ol_raZ{plIqJsb0DfEmF?j-KD%3L~b)sc^Eo$`|ee{g>E zG!v{3*$?HpCV0a{dQ<*?v4hK4LS7#QY71fQW&e)2Dk>D-Q*zktKIQQmYx2660|>fH zWZcea0ZxsMz4y8wm&xZy>%M!)3cGt05@MBZ&6IQPi->@0bBz@eWmStBIci@8sLHtv{X4>e^o+#as!xs@;yI`cB2ofhgq|B^IliP(3;QFwr2}mT{un4E4m|Ge z>Jj02ia2?OcI#Kaeyfi6EI};xj4sLwlyX1P)iH8L=7$qBZ0gH&L*LqaDgnB34+5ug zNMi|W`e%-4-!(eJbt>K#&8| zQ=Bn^BTF;(x)!tZbQi<%S&tZ(g|UuGtw4>TEmfhyb}J;=VtB8t*1$sh^oDtALA*uo zF`k^@NKZE9DPq>~Ga{VS>PsmlUafYHirNqEaZ;Xv`wuu-n5tRv{@T%41}jQ#0V>g9 zzqi6=2MQad_)=lhtZJk)$(~KL{Y0ITsY78AZZ7`S$GjR%M`zw}d+TT6qj+`4-^V#= z6X#E&?Bh#0+tMUYH&D);Xk&bFT;{JH3}{VhMJxYm;qh1FF+s=f-Sj!^2z>KZhF7-+ zaHhits&X1?C1^kXr;~rwJf3KreF{=h#}?zi)+Cw1o|cp6c>?U^O1xEr;@L~se|MS9 zZi%5+4Kj`U9*RFi!2~3*JgkiNgdzOoFz&1!{ApC+V|d9eB`Y`Af4uoOJz$UcpkR~p z>|9@4g%eDP!M@t`r^<{tT{Ecyd*ZXZm8iSKtws|yGZYFqi&39YSppg_g!LY<pbBKs`N%lVEH7YjwV{@fX_*n(lKoYSXdulJ_=X&>#vC!yliZB@*9bFuMZ3ldk% zI?h)!-Pf_k4&c~O__iEf5KpHJ)g?Hzq;^?6M9Jy4xA2*V=Zj*L7WXzE1S7{N=~b>M zrE4DCSb4z%g=Di67cnoBwrr-s4TUEP)oxpPWJ-pLb1;`Ut(vB8^MJ3Vs$gpkhd_qM z_^hDWnA4zDSGkdoNF3+(A1Gt!>(?cgde@Hps+dSwus5AgT0#y>ltP~`!#_NIYB2Dd zgoPiuXkrnfm%cFT4wsGRJ<#JL(aFJ&S=?N0e+(WckSC0MmGg{Pi(z>@7KkDaV?G49 zx(5`>^C0+8SLAj%CPcYlC3v7e(#(P!|;|< zj4^#^O|-qn>n^$Ox};^FT$<2S;wt%E~6A&M9T0oK+f56DeGMWrjJ+2dpAjzhSGDG$fPS6IcoBbjeXXgk>7vX;XR z79(=)M+;x=2IjcU($0D}J!|y&p>CO5{RP~rpERC6w)wtvM$}c`(pv~$Q8*pd{i$(V z8;a@1ct#*Z_`hRNfVQjXwIF^NxHKmb|LfANv@IXdAq^jIU?Fz&ROZ+*316B!laE8` zb+r?b8XnjdC$xHU%EkbiP9-88@eU6SOKieZ#rd?niTdQ%PCr|VE&b-P%F}9d2KZ5| z3F}V?gcr#$sgXZmLK{?z`W=^txV2h_(3?>=i5Und2hdOh4G|2;HmSn&TV8s$ImxD? z#fFu_kZn{G~(gp7X6%91zio0|8HUlR3#aQK-XH zTC)K3`&7QC{o9#6XnioNjqfKB(I0gHazW;8Gl3jXO0BeMGi^9XG>TJXhgnCX5#w_O z?{bN{cd(7-1#ufQEv+x8A^0$UKkjPECPZj`YGw6J?RVN%I<~;^fB3hj4Vlvt7A11T z$N3w56~^67Bs<1o29l`P{fpvwS^OWFec=`VAzS)rOO>oOXJs*-UR}y=08I^77V&A3 zPOA6#=_IjyqgX-;87#0HBV&E;Y!XqtPrV=2v0|0X_?OFU2MX8zS;P# zd8SpeLO)@IF$B}h$AfI~2N&N>$prlI%rwW|BD1Ua6vqB|ep?Dwh%HCBFJ zn%y_Loezl`z3~yMS54kP08~}Os(rroB7)Pz7ITc=wyQ%00p7yuF4A6hI;v=HjJCk^ zuq*7OUTI%YQq&wm0oZrpxUNxpv?UN&qqUI1wMf4r1|8H7*5V06p?`Ux`bDq!q=Kfy zOP=CfiZCns#XkL0i$Ej6gw*4IMeE#n;UYK%;wt|axXsXfmgkmI9p@Wf=~=XH0?!^z z7P66)lq@v|ZhShg3Dc#wyvd*nLF~D%`F6VcS4__dOiob5$V&V-LZD^T=JC-cXp;oE zx`a!t&fCWvQVJj+!f?Xehm7IP2D0#6h=^t@_r;w!)fS6`PAVrP+tb~Pgw6gMm-+3b zdJEL16;&>qusD88)h6sf>`yW6?iMzB_Vv60FZ=BiK8Lii-|uF>tR07h+&;$r<`7v_ z@s2?+6CpP700u^&VUzX${_KwOc@>mN&QL@0bOpHOvRy`uL$%mXJgClgB8EU#ii;wl zr)CH){B*oq3v_35wAcB)OI>$1EtJ1{_c_Fp3^2BQ!Q4U-*Ulo$7^l}x3x@mOXeWYb2{pvM{>-2jz zM#@2j-<`SOz}a*7-08bPr^~qP5x#*&QWf_|ttL6vCfFr7elWS z1eEM*ZiskfPNUPg-UlrEAGpIJ6ZFHRK66qpY)4{~5VLK3{yqAmkT}c~JCA_qxL9Xl zLiT(4T3Y?m|1s7|k;|=#zK@rN-qA zTCs3juuYo3wv&>uT2x><6lS6dxJzx5o~wYVhijbR_{&FnkUDqH95pv{~~*XJd`)` z7HxXLr$LHN1CRd>ueLNfDK@)#Dl~qZq;W}HI(RzdUsAL1U+C6c$o;ZB;uR)N|8;AE3rT*e+yEyKb@_D1ZC`i&&SIT^y_#x z3FPAJDiP-Ocro&8sjhmk`YLOfF1m?NBp7%WlY){zkN0Z*sIRlC2}zhHIALj@i}|)r zrS7-J8MOqZ%0hngwBLbh=2EAu{lczmW_|_-WYhk@2g8O)d#iB7Z5T45^}9n8RR;mT z+ndqA;q-p{K?fZ>2?xd_Z@siq`RrC6pG*yxPsey#D+X^1qQ5m~En8 z-hDl0&^=2F2g0dzKd9b`r=yZ5_1USz9hKYWf(rkM4{UAEylm1yU^-FZZh3OwmlsDexFUb6D34q0(G ziV5f~3>E@ctaN4k{sM$rU?_yP+kGMc(BJTZ^t zNB|mJvZ;f0DRwU^(tvN??Gu=rx^b4|ZAdZk=MH)>6l)zd@;nUH*lJK3;&*iVJ*J7>oZ9hd_tVGqMlH*ngH=R$G)~GW zo}s*1R_qA-AUBY0NFA@iEk|W~Qr%ic%s@{lT>1Rx$R+X=l4N7RQmW<@lpT0|F!X@T zTFp9(($g~_n+?=`d2xTFJ~k!wrWg~CDs_+rHUrEU4OMiAa$BpeaxKj*`2oo}>S2Iq z0?S&?dgJ}qf|1h)$SSZa;#_z%0!#E)B8>tARlSL4iuFfP3Z@Btuk1a~$B2c)roYX#rU~SEPgayO$~H4S42af1sz)jEi2&$v~j z`M?4icCjZXTu4@yu@*GojgF8#qIHxsOaV#2!%o$`u(t_Rpf+K$5A&%c5YPorocTW# z?d6%s1J6U$mB}~P)x-B~gt5h+{0bO+n3jgfx*RCToLlK1;iz6ic-Dc71YA7n1muQ3 zu^_9HY~KXs|HGJ=)@J7&60aq>_sXUk8!kTblj|ZNngL^%PlQ@Ill|E?PgRCFp>r%b z!Hf4wat%2ky=A% z&qkgtwgML2X(-2`A2>scv7yj>F}jA!)1d&9<_Vg$U%p>@2tag7_FkWe+Ndg_qVIzX z#zA4UXeC*SlQ{jLO}Fd~4a}bPQFdA6$uo+XjU;CUaR++G;2|41c7-Pejm@pwUWxgl zxuECs#i~`6#1!SRyZx;e0^w{lE1HH<>>Zl(lx@?xilcPaqF*AOQ*8^hjMXE?S>6}T zZ4_`UxaX*W5q|DngJR6B@P$Gc^N3lWvmyS2?}k~6QSYUucSh>7SEmUr{vh^941Tct zPYzuW{B}|0ew7;3n}n!tQJS+=P^@YCnrvfPzJRWT#hNuF!Oi=2FlgfggCFvECL@J7 zLMNOAK@7_z2^5%!NqPoS>#eubo&f3QP}_fIDW@2vhh69%ICkPK{6YR}HM8>J2y9{4 zL_ADa5x`@AG)A(K4j#M8`6a=I|6JXHss@aJVb{@+dX#Nb-F!j(fr^Dc#5R1#PLqTX zoNY?G(IQjIAH&hgUH1Je*}&8|*!W+T8g@ks-8sPT%;@*fI+jwZf@M`k(R{51U)Fq5`dO z%%cm(FuizOG{^AE*H1VOC#T9_{EJ*G&!t&j{t(!UQqsI9D-4R?x_T&;EOk)Ad@y73 zE6C1pMt*_!7tY=1EqZ4wL?CRXZHaysd(NGn#JI#ht1?}W38o%J=qdSZbhK>Muicie z&f-7d`0As5z8Or%y}bh^tsUk#8|7GX0e`J3_o=Bh@I~|Rq zNb3NLEyBOe%q@26SblOV=EuM8M1C;t0ZQXNIS8;Z1}4nJEtDCkaiNHo%LrIe&Zp;o zQ@=8;c8{*{==C)7ni?#7F;# z&8@Ext+Jl;$8;u!0*}%tbS8;g#S@n2CiedY5- zrK(*eQb-JcnldWw%BH53&{^XT=VygE`glr58(3XbNw7oa4b_CooCnS+h=k#YoT~Ms zNv;jOa02QFXQr3Os&6jO!vr%a!P`G2X4}p2*2nq=HL0K#+qcPx9`&BrhNAk&U_SJ& zgG*p4l=BQ8&Fdy$O9FdTq_Pi@(!4kl@a`xZf58Hm@PnxSHL_jDpZA0FHh5`fM83$7fy?QJT+gSEK6Uaq~ z6!y9~OVYHV8iq{sFYr_+Y55qYa>r!{spS1UxCTJq7yM*|khAVG0{D=vVli%~i zvL`Iiv51V6uL2@(Wq=5Xb>U$AoLCO1M@=h_4%{r5V$;R5${n@DXg%*ltmJ2xuvysR zT0wE-qWRmWrm#$;E7J6V^G0{f*p~kc`|C%={0x;fcK^*>H1H)(=`s#>E9C~Fto4T4 zET4?nXpR>CS`+`3z^&RyMvX(s?Uyfk$#sN100s8oS(vrcD2hT>}tEGYZ)s!I`YGlrDmfy?#;h;y1S-#y@~1xfv+T9oz3TUR!^0qwF| zIG8vZFb_4$Sh3i99us5$LO{L0nJ+O8VUbs`zJ)pd+jSr}T*K?Nc}=%Sl~RX-?cL7G zeupmD(^3%JhL+kF!&5`5K@ruw5-6L8b8D>@Zy$4vh+*c=@OIMEd?EKG*dJ#1^2q%F zHYQ&Y{UhNASQ64~u@n`ba7nCpe-2XHTBPPP8{-?|SH#tI+2+Z=>73p%QCXp+&$B)m zY##BG9F6{(O=a_uX5@i_pDALB77Y)KeE%6brCQI?{2_zt0%KBLy1=`?Vu;8@LCHXwL z^c5=KCd6Wg-62DscT|&uFC(W?2FU!OoOu!FlsZG%JV}7_VxDP`&xFE5jx;1Ya09&F z@<;fSFrgwc1irW}96})n#xEhulmw)}sNu?|-+MU#VbpYstoDujf)HN=%|0B;v{Vj< zrlZEV0dT~3xK)JwB1!J=8_RCl$#F=n1GBdWgKkFD(uE0UhvEIyQ2~@@dtBwREmDq3 zTdMDVq6h0cBQqv%V|^YO5c+CNRIUWI^Ia62Cn*CS)<%mIi;FS@$TU@#oyu;;bIpma zwsdbb2XglBU@!Hw(F#55=-=d>N{H=i_&i^<(KvxO&UzSG$K`O7wH%)|kj9`cy)_A5 zpypHl#TI&)rwycyfwaIe%eUQsqIf`0t67n?vx3nDG>9cVimjv*X`C-Yws+4*KKZaT zn2p#K!MZtg9?SqjH99dIm6dzI=+mF7xMAgENWEe&>mEmd6t+&MOVtyPiww_4AL)Lh zJzvTmr|@r8Xeor)s2so5bAN&n;`3NQJ9Ag(x_})01mXlc=OY=ZQ5cVT3R3;L9~g7& zvC7Og|3DF>1ck)ro-h;VO=1zpChjFv5jYyvp39fi^oRww=DJu5KMm#j-tGfy4s5W3 z9U^L>!v+J=z#~9$Z8GZRD0w&6Jl_XHML%+W&e2VDYy-9ISB8CRHT2R{9QCFsa*LC& zMsvDqrmKeW8kErCz0-T3FbR28c}JU*PK(ZS&xFqG@N^&ut`2n7n1j)bzP$m^N)aYF z^Xqia0W`b^GI8Xua-D`;-fNMEzm8!%M$Wc zJ@N0nO0vTv;z8^$sgWXHKNXRJpwIabe~DOg(RjEC)*VZepneqR$6Trr=9?!7Q{Bw4 zf2>{lgw++P&Ae|aSddu>=KwIudCGX6(G(PB)Nw@kDF(hR&H9gj`>j0(&HQ9*#>&|Mc$ji zb`6sv*DBN*?;?~IH}^jWNjSWP+GjW>&R0Yca~`Ral-}5qYkJC7{_y;+wbD=*hZ?R8 zX#!P#Ckt0z`f@3Dm=Q?pSUS@<#Ym~TI~lS3t?eS`U8x@T(#h;WzkZ%U7p%3uUVm)CZ>hqst$)Qv>_!X^NjPVeHNG!x7M=A z8jIA`0hXzg?qa^7+UqnmzbI`{(PjcQ>I2Rbbd79xMFtAh@rOpJ>AupxMd43s!O~jY zygvOFqcHVkrvw_;xc_xS!!z=fSxAZcTN;aBUE%73_yW1p(MfQ-Htr_duo*Ne-+e!9 z?~|f_Ap~aeGTSLX0C?@}3vr2)w78`inFXoc&>wzBQkdgTa6-uVo^G#ED9!*LB4PhY zB6Vw%wFMZX3MB;BV*?ad4bugKFa6d_;KEe95D4v`OQx3(h5VQ8k31R?*=?=Z8;@VQ z4<;le5i#S#U@ft<=YqU9_0NqNW&M(2du!|OhVm3S1NFSE!$rIPK=C&axfM#0n8tT! z5`&`ij&20;)n!yN3619}1h~4^mA$6k65pm=8h6jNZJG%Aa`pk!vXrQpECzDLGdKc@ z7LzdW^;`b#g!fnTtVmE~f7@tbom=*GPd9@F@tBq&Un-*D>v4ieBctDfxA3j=&MAiK zw+udAPZ#@kQ$y2jK_6g_`KZYq1kGu$Rq|Ls$r*$E3{Ltbtt3O46u8QYKXK?P!lb#w ztIS+4{N|Fzbm;!xC;n7z^>w7964muik1)DKrXYjN20EV5tE|*nG*Kp%kRzUsYU|8= z$qBn1b89#9u}P*fWV|HH^>emzsR(dKb-WN9>?yMN-&Sir&@mahIj=WI5Bpyub=%&# z=V;mSlbn(ani!*5W1|hAXh?c_se3}CNzf$3RMiyqBj&4CDH!l1Pn5fMx+cuE=9t;a zGdqL@6>9kR5(zcrMMePPx(pm^<2P63XPgVa*US?1N0;Yq4ewX2p;+DkDDP3WFw634*oVK60W-ZFoidb-|vM9 zM+AJN^xmIMZO6Q$MmxuGuEr_K)38^;{aTgS=(q30`o;tl`!45r>u3Ep^po{6d#3%b zzZpn1{dMytvW3FrqXr$c>x9&SjQayoPIzBa5k zMI=`pJcPNJf!TYwKnJ>Ao4EYA6K-zZM23MaS$uYy+)ar|P9_s%OSvuq7jy1u&ft4>uhm z(+`lD1o)LmjJ&+~6F7As(xt3uiq<~f6bn!onfS6G-CK^+>!1{P@slp6zdIgE2 zymcUiy4=CUXnPsif^i?<(ZiwF0d0Lyn_6wCSU(EL-D%60q6It1`)U&1wLi*l@VEmg zuKih>4;n&5ytxSlKFjY&if3${Qb>Kt60{-cUJ&J%DS!Own*zrSh=+azVMQB#n*_0< zUP2v{--alwXTQRg=`sh zyXw&6%WjO9HTr;?>fB$UOWiUP+M4@s5w`fP2F5vkTe+Z5#oGsEqEe=;k=07D!8yO& zUbv~Ju0;xuz>cca;XIhc=(kp~YG2<`%VJe3sc*f56B4}W6@2ZVjG=jqCW0m9#3yBQXv;Ku6aZ;G!J?i^jZbyzA>xr#!;vg zK^^LdsTW>^yd+PQ9_m5asQ%o;I3fQkHx=ZZvEd277+gDaSl^oqFEYW?fPA1?#Puh4 zA6G#UHTs3{_BZ9)Q$T(+?94P4_nx&GQDAIoQU`_SHT-?=t(O`6qO_H^Jk7WH?L;fyC!x z^u2Y?W|s?SC-W}1RrE}svDffr|K*q^dZWX+rWSiH+I8+}hz$UOuJu&MRIQq^-6C0m z8sRhqboA<~0wl7&y3DcG}%w%tyl&qVtK$O7z zf!?!BejenQ=Vx2kPhWO#XSe zWB!KO`)p0FCI|$n&QxS#Y3Gu{)rb}YHF~+i*+Na)J12SyJo@=<-GM1N(7?Mcku1RB z6rs?AZj#Z58FKBk+4(Y_$AWVWFK21iu6_RXcM*e9L_U>Ej9ej(FUKcs>I1^XShw)Y zg>G1{3__usokDV;5I#VboBX$8Y)W}7XjD0h5|m7z>{+Fwk*(5i%4e&YyJr1)Eob$8vnmIsvP7l8=zlUSIVD z5f;Wmb;1COo7sVNTU}8_+@%fQ|4$7*W#S@pJ#$N6{uv3fq+sh!Bd8h*xXYc&W-Jf> z=Ya8Z81mW|$!eb$(Y7rv^Vj&koG)5s|ygLYzxZC0Hm>fZp(NwVl}9Q?b;YVMnuX+8U0mCW&?0dUj2 z{PvAwZ{XpXM^Wzb=`k8z5JvrL4*?HF`6!x5T1IwMJf*<4(W`{vaMvBBb|ue$ejH{F zh@4eRbnKp5mlzP2{Qu;&ddy6^!na z9TCUgC?jA;Q@BBS&p^0ysqg=Xpf+2iH{^q7>+8PpakAjN&(tEGWn3b!9`C4eza2Lj z_!}q5&IJ(;VP?#II~!{+U2yA9J~Xc6pcmEw^LXMQP70KdNdL%P$~cwnxJ>uNMF#s^ zM;^XT{lkw6tTYm z@dKXF{9~otMEbL{5wskPOtN^wIwKy`lmtDSI2iw`*n9PGs$D<4h#lEDE5yeC?9y*s zA|GDXgkL-3SC;WS32K$M8CZY%EHYAoC70pyP!^-{EcteltP9Rmkar}ST&>uu` zs+q(euUuzk#=esmDT%?N99q7fWfL(85s~%^9)BR1R z&(@xY&{G`{y>kaGwXU~9tLI2iRr6CZjEm1bDzp^Ze~kj0&4uFMkl7H6J|^aBg@;Uz zx=YgrtZI<+cDJlx$aAb?eg!cPN(AAXXk+&}K$rVe3jA%murdf>5&Lz;5YK=OO;+-G zD$lGo5484^#4^UkTo^=bO#-S~Kc z`ZPc^r#87v=%V529N&wjh-_Y4oxX|iEyboi1%M~trc=eg%%EdN33`Ssi-Rj+_s0&m z*u(|*h-!w2+HWSMaL9`e2icLIM8?9!6Fz*AH2w<2!ZCgjeVDa+_DU%KUl&urt2us+ zha+zH>K4|+<61Y^uu{rolTQ2249WbRQCrVf^_hwCP$##dz#6(8T7tMFV)M=d0M~Af z1`RGwUP+PcNOz0yKU$h$C}an0+6+H2NSQOD<6MsP!QYGo@qC#-F2*!3Axpqx395;r zRtBY2_3~3?Wh%l_q;8WZe|>{L$G_#~wWAQj-T`sz37-graD^$jS$tH;W%O@%dtuML zt$zl%uOy2&0~<-kh!&f0{T_JEMo~4@*}|gVy>ueiM~UmNav$EvCVb}PVzHdbDWZj4 ztJZqM!DhP?jKNX}->q=#;c# zWle-r#ehqU+y@S~3@4tCGH(YyGL4ZL|y*60_HW-DDgz#SAVZ}uF+vzaR<@oMvlL%WS(qaM;?d!r>>fXBT zl3hAe!U4lc^4NW`?E)eku)(FlGA`#r)alpfn23LhK^MMWm}?(s39oYCUig z)t*58VCK*%FeQh4=Hb$^maJLR$TzKQl%-st`=WWfMR{q;CAFj&K*d^`#C?Cwh%gbz zmRaS1`i1;L<5JTIjHF%R8OYi%ko3o(8^yu;BU0vG_3pjb$b+p?&}qYKeVgb%D zN&#QO&@#(~RENk5a~F;y2)^sWZucWh0oK+}D1UE;vK&p{6o4Nvlb?}@da57jgy)MM zh4(}FZyw)v^KhKfW#C>6hU!h`O@;C)4+jANp)SU zVo6E?5chqYD}&8u6jaZ~NEwwNSu^bmH#aLLo?rcA@l%~fddoT@;y#(G5sX-1;rpl$ ztHOZSQM|({Psvysfg(mF=>7o8g9gi8QqsJ-3(iQH$GP?ceVL5zmm~r|{W>h#ca}0? z%N_8LTrtAm1IV_j*gO4Y>`6DTC9}};7z=Sr<`gW)On|9qweXaYP*H3%p<_;ftWMqF zQ;^)2p`V&#=QcgnSc`&3#uMh=5;pg%Psf3kF1pA<0PbaZ$ll4)PE-&xpo#k$tc zxh|m-X?mFY!En5cKJ6zw8FIQfM~F@uh7~n7jBqBtF1_b&(#No%uoiOk*9YKJjIkw% z*;?0iC?0B>r>DIsEVot&LcZv16J#C0gnOSVbo7mukNrnzW=ReP|4#z7D3pkHjC%)B z5A4m3aUF?XUD$0casH3u#LY%U#CQ=fM)jt}|O$C10 z4zzeEt=VyJl;L)-<0(K}U0r7}r3H3Wvd*SXQpltw&en`yPUH!gL}ryb=)CSgl^0i$ zi<9hGHEVkEel2v!i{Jl;pbaUOL_L0I{ ztLG*;KH>0iL{XgT8ccY0KTnx*NGCdU)Vt@jKCQM&?C-RB>N9+v&33jSOL$x)*p8;m zmDfVJRSD&L-eBXmJoG`^!h||p`|=6H^<_K{@&eYM_}2l`dK&1vP`Yrup6y}kT(utJ z4~=l{aKVp#KP_yDghmkx0p((`-gMaS0XDpvGE-#>I_rwv!?aVCXiB@dxBB!_+R>_P zpITe{dn&iPGbfA8F%^n)3;~gXS4yq*X303Dyit5EpIZLND)-2X%;W+vm)+|!qQquI z;=x%{-0o+;ELE+8G%QuvUn^5uDN*XV*s-UUz9>^G_+R|8VC@{&X#uwA{&EDMdukAy zSVUQv$3Si*zgmbb$FieB}g^rVek$)xJXN96j2YQ)DNC@1{&fmurmm(jL8L z*W~yoga9j?v6)IVDKTEwXuV%8vK;n{PPuDne?)Pd-TqvRmB75WS#54}UCgD@d%Fvb z1onW?Tp%U`b@Sj6qdOfE%sPyq_>EvEV9MU}cVCS*tVugBLTe}&EWqE2vI3#(Q5;}8 zmh{-%NT#t5^<$-$*5L=f7N}|asb`fV8XL*+^wP>Zusq?-+mc?8+>5IbdmtsfD_u}$z{dWU928HnRr|w;Uxz3iZf@E| zhnCW}UB07~v{CTc%M2{V}2Dk37-n+fMtnF|M&YI|de40u3yDx`Hk%5{8Ep~X$ zk_`&DYf27FA*Y}knR77G*q7#k<#L4ZH?SM`-l8WRU|kn3<_-c4<#U$>90ib33;GDw zu`Hc&QJH2-g~@fJ2#Mq$4t2Ys_(@=y<=HWD!*6=rDGJ3tltkyO3vw5M zFjy|xG7)M=+FdWUqpZJ09xrEmNk46BmZ^tig`GwCcX}CpuX+9x&PFTBU%jTX^)8~+ zRE#+_6NFo*GN0{#Xacv>6WdDQ51#L5y<{ z13#$Q zlsPTzvA+BJOk5g(GPErBFD)(iNhC{vHqJ~nGUT|MhQuBYi#)V)EdSYC3?0>kL%IiX zb1V-171wxx+`djuL=*`ErUV_GLmR0*PbTPN`GU(Q9S^acNERW)=k-3KuK5`M1DXgn zCu+!rK{7XHA*D4-h4OgypfQ90h7O#4w|a?WAB}R*Hy36u5oDJl)p|U!0uR9Y_H^nb zV*O;Quk49%c@R5yYohQ6>tF=2%C@xCjFgK5H` zBdqOBWZ;>gm$b^Wqv`*9Tm+R9zJ`z9d2r0=lz^^eUP1LAU9oM=vbx-=&^1X1tAKYjFPG2gvfbqadI&*LG@Vhwo!ZA8qs{-(jpI*8l%N zWGJZe&aYKt-?|Fr#E;@2jqYO+c-i(siMEijRy3U1F*O(;2|et%+7cSh=jpCYQ*|@j6aSk$j4dg#{22GVb(g<%Sd~G^ zqv<#^hE@Fq?mQVsw&02GozN4l*=~}adaNlM>z^((2}lmZxBc?HZ>zUu+|^!gAjE7? zSL)!dvD~O@c%H8zC5}lrC{F!+>&osqs21o1{$3d1LU{}JRSuLx%r4}n+2SNgk1#cz zN2ncEd}^MjhgOs^pV9NCA1E*Jzc9l?RiGP+o- zb``tfmH6D-0-z-$s`^xVkeZ!jCorgmAj9w+aZw3=G%Ra59$_-Ov&>$mN>|MtF+tC$@LQvYx(9;j z$EP3vg~^l3>eDB z_g$W!Py^qFFaeCyRfIIyRPgxZ(aX0d3I*QvK8w_;z>qu0hcy9{N}+P(IKMWd1j)XD zlCIYx^xkoctbuAnJwpw?S@H*sxVUhAPxvP9Z#vw^6cXo4 z^SxATW}t|RXWW7T>?Y@+4OZdED%!}`V+&Len9tdhk{O(Axd zn=oI&`(VFT5y$5NSrnR?@2lkSRQ6G+n4VK88M&dJT=NmM55l;um2Eb1=ah8ydOiE) z5rooQKfiL33cE$1dsry{?Cf2P5lK`5Are2DX)93dv4{;JE;7=vd1f%(itXIYJr> zmvUqB;*{f@^S&d4c8!bjBa|UWn{`C5dXD|-l=WRC<(dD&Qq1n3e0Ow}S#n2^%6`qz zXh0f&#_$~BY=p;#qKbFMkeSPIM8SWFMi4X)Y_M%IlB>t@u|%(4dC@Cl=D3jP4^Y$J?J-M6doQSspk*!7f`$-I{vM=RAE zDdvYcS$lFBn0}<(JY05=orYpDva$_yHFyW$Hs68av1hxt7#>-mH=2AF9hQS9*}+ZE z4?RRQnZ4Z5cJOfx_VhMbmzN_KAKHHa&)^L(cjgqQZ|hv@dC-YA--=+24$tw=EJu03 zg>)Ck8^xHQ#WqVH|A_io97=zI8|RQ&YBcq)k-aDtFL53yIogM!qmDKHB|t zkJyqT+?;{$(E#j0Nm2q4+EIh^(xK@4W=UqibO4pTy z7QWlXjX4__6w5bip1;G0-yiVBUX>4DJ77ve7NU7kGzSlbDVOgb(*oMo{!wDm<1|e9X(6N{!W=-&6jdNHJ z_N>wBnF4Fi17AhVFPZa35yNKc>*ZC7+b%B^~s&XE*<`IG2rj|F!(CU ztE_}t*Qj*oNxsApNQ4E}c*o_ubHh!ZBk#+Oe+2Uu-BOcGk$ZPoJrur-hrmy6b?@#B zs`xMtT$#K9qs3h~{%Wj9Ol7dg^O|QE*9t@O^?6oCw4l;v`(ERnnjT0BAo$j$P0n~n zHg_NoSi-(I9c~EEj}O7MJ$h0JQ%eQuWlgC@%J)@i*g^r$jMPlD9N_<97k>xEBk8mf+#k(fZ`xcGqF6QQ{sCIF$l()`gB#KG|K1 zfyI>@Z}GXTShcb%fAEdv-&A|Cr=+ix>^0&3bXw0Or$NI8p4(aAW2x3kDHt(;tTH-P z(i>!wCSL@dlk=;(9jd`eX8a+2jBgYYs2KQ=2Et1tzTgyfOV_U?A8}#*3;Zg@S-#em z6kdJDqnA^DtU|*cG<%bo2B8&kiY8~Z!uB{EW-ME-`nHIx)fZ$?l(>5C=D5949LBqi zHbTuV%+j2noIt?tY`!6PR{7~RB>^UQR40ea_PFT0w0$$-aqmO;x2dE>_McE&J-K#84&&4kIXdbbh>kF z+DNxV0j)Ligzb61BAR~AkH5)HX5=(o3dy=VAgr1w&>^V{f4c5OV}#{u1}qlJf1;lj zfwnSRc@UM9*PyRKECrqgv~`C4NOq`(0aU}mHZ>unsjCq_)VjESu3LKVkK>Kyqg5}5 z;~Ym-ad9f~SF4JaM6SIbRU@p@{HHSOD+|i=xK84?WWke$*`tsCQkC);>jrGBXX-$f z-5}^Wilbskm(r+>iy1$^@c(FvJK5D4oaA@$5k*toEjW$6$Mc$#_kaKZMJ*@+uY?84 zxbGh$)L@O#VkAXKK?$KGI)<>qMva}t@Ac*RYdq$k0}60m5GD5EB8L(6pz0*VA%oxj z&{ge{XoUW3QKjCLkUJnah((yQ3bH$D{}OGK_w7-ad|hGlz@H(ToMWi~K7wy5946#) zV?X=C)WtmRveopjNogU;?jOmQ+TI%qAzjbFFj&X`*R^|k=H9e(l6+1XMnOShuIUQX zPded@WC;i}%IGuka|pf>>tPB1{vVFAgsw9Ah%IFjA!X$C_1MZ6xoI)g&&q@+~^Ba%E0#w%(33aw;@3O8S1%V ztbVsTe;a4|Z(#rrcK4M!Vhv+N!QfufAZ5sr`X3q8rr+qBN6V?cv6?Yj_9IC2l`sp< z1mK@Xh`(~@;FuGo?&COjO6Jd*71&1~n>5gIi3ye>E%+ZiqSH_!ZPJP!5-C0IYoj|N zZBt*LOCnd}!w)6Zabfx0n4KE6vad^;O2yn$?@@E9p?{2dTH2LyJOPUXu)WwZfWNq6^z*L^y(8K-<)Y(H&6y*2fTKi^8X3 zhiJQcFvouolr~6|p@2fQ9Z-*hL~mrvj`RY{W8y}RFus= zfpMy$Ie*FW2Tb8P#*Dv! zerbL9E)eL|iQ0udeH=|rF5}vpIgUYv^sfx+V)e6d29(XziZc3Ft|IZANF#$q;oH3E zN>Ga#tX-kN>Q}(Jf@C%CV4nw|Ky;*@eLT~i->wCM;xq0rNm`Q@kT%J#X8^MBLmSMD zktSwhc@9k{-VJ9_Rk0c=C{p;GZJyjE0PSh5`h%!2^5^e;Z7L{1xC&+vF~$~nQQ_uO zo{ebM$aCBhpR?4DNodotySs!GE`U5z+cxckIzxuHHrH6qk2J62uacI{dPFwm<^UXpxP|a~VN0P2zUPL4+ zaLT}9z8X?P*5GC|V4h#T+V62~N1U8eferu>2&xbWY`-&si@Tb|7enI{aBM2MA++fB zy7oZ9A#->h>h~8{0=*xEhizj*tcSO!L}!X`w~}R&WAP+6r2&|u0?Ljve9tY4$*rIX z8m(C*7Dzmy3nx4wPI%8brwzCsJL-OCkg1vn_Q=#fVA;h^3r zPpYFy+W$*oJVB?vMzGvB02U?xKHMPMgtY4<=koqIvOYr6&nmpzS!WO*aaXohTHD(G=8pEa2J_&V5Q9z@vvF}8gz_Q;?yn`wP ztA*Uqa%Dy&t78D$h!*6j^smO#6|kp>vF$hhZ%5|+^x1`DCqT#4#ar6LTE z84d&pIXl)9zNnb_imfXa^3{;?3GN#bG-XDs$YpL%QmzOz0kVTIrUeHmzi6Ubo2K$yAy$3ZCKM7 z9*pKsNoJRTt}*v5-`u)`)bPpVdaB-&AQMHbW3LPJ`K|PK%d?RSp;dH=1Xj+SmyD*I z{9E(7njMXhd0L}jodg~|Y9K=SJm%@y4aaI4+eNP;1R}XuAllLaSzDTS%p1#pDZP_Y z`g9KJ_LiIh*1UPD;*^{jqndJVuz1mzowWT1;N3eiY;#al@0>#il5D%eWEWr4OU@0e zE`K7`doGjPisWk~|BDI|b9Ku=ETQ9DyEiEd*zS8T48|6mwO({>B*?00+OQngi|MjS zUjY32vvk$a;DXk&!ridJdTW7$kXC`ki0rM;ED3H9Mp2YTv&wj>`N3{Jz;)NUUN5YzM zvswyn-2CjLveM^^iz1}uUbbLiob|Z| z#^Ro2o9^F2Kt~vhUD8QMRC@|`3N&H8!Aso!KH;1_-SA7M-DvP;!#1o3oflHKEUnuh z?t2m74aI*@H4Rb%mM4Y{5T<4RL8w8MYE^xMTRnkb1p0Yuce3cC(`*j3olMFWD!H(R zJKt%lEtDYV&=An7r}_RW82A9bKm)*XmG677vqG2--G&FF>>}o|lpC z&6#3kq6P&>{?Y`HDqm=vSP+?q`P1rl1r;>@g0a zJqV@wP2c?(>@R1rcl{o#)#SftD93hpG z!Lb2Er~)tenB0vyKk2D$2lZJr8_xrbbmY5{^=;@|LQ|1u7wfpo*I7z zBpxL>q%b7XrADZX&G?QZLv^_ib@G6RZ=n7*04xyrdDnb7^@CWxOo6+#6ZYI*jz>Du z6QXE~XTld!oVOfrDbsUg3Qr*AQXtb^Ka}$Sv;8G9QZiNhVV#%JMfWquLUcDr)nVet zkuxY*R7dq&ClRoouCf#CypJx1|OQkt$d>b*Z@r&<<1{8torc2x4RC zZ?1^J6htpmq&Yj)0@v1!lq^tgiXr=PwmU#r9*v^?Jf}aNIccc`IIGurj+T5SEjzG5 z2SV+*_DothN7Ay23j8ff>K_ewI6*`Ls>$2%=HaNU8~eSn4K{89-a-FjqMXDx;-^M> zi~;DjGBv$$C&J+9seG-09jhO+ed;D+YhFxxS(9gpGo0Wcge|&y5ya1Knv5CzP2UF| zE>GyTiCe|jKkU_ouYS7U?BA`@J8inofZ_v33ff-{Hr7vHiJ~Au2_lIMT|pJZFqA^R$k3gl?zqlB1G}D5F;xrJ zF-sZF)VZ3#%W;3j;L(B#lU#1Lq=u+TS_;Tr-|;@EV{2C})4m6-c@Mk<+v$P9c}kfc8EmBpW~^o@3Kk-J z`zU9|$TYNz-Yoh$>4X!$^S5+vBb${8-^|2z7*8uo6PCf-sv#n=uXdDGlX< zayCpSOlr>CuQ}bw>hRRc8&HbNfiJr3IgTu+ z$s9bLs%jtjee|xY2As7t1da<~k@0Vk?@$qRR(g}Z-@~BjrS0c6GpyLdEElsGs0gL0 zX0s4mVdidGU%vB9i&9^L1I^{gc35ho8oqNU{4|#^kaGwwp>1BP1HD!_@3l}J{D$&q zcYHj`+a7$;%v%$J*W0Urg0Pc*O_JGEvTT_9kwUC$#Nbf7HHW!Tn=yc~DXAO6RdR3U z;B~dD)wL0oTj30*%MZg{$qA6(b&Tg~5jQ3ivM^VcuE_Iov=)k z`EDVk7+9WFr=WcxN555^gt&LeC&d*dK)ivUaql(g=K4?_N7|%;Hk)Bel0L=n3zHF2 zH%2fORkeA)L;nF_#n-F=9J!xb{PMG-^fxjpwZZ$-`-xBvg8e%4SA1uJUYihsx zOV%_A;n2%gXY3Qx<1l*6mviAfM^;zdaSGBV(@%9Gwl0n9Cd?0+Rj+&FE`E4m-wX(7g)$eHm zntXKb3+HQ0iP_!>1_4Jch<%_BL_UP=1z2(YpJ8WoLY;vIk_1`NVMwCyVOHv8s3Mik zc@KZ`e=QNou#6klzld3eK;k}Uy1Iz;qfB})2n6|fJRw8{RY9ht<%vD*);Gy`9P}TV z0NgCBy(~e{Fn};G@0API6xmn+@t)^@zGNEIU;&v#PER)-=+GLkj~?mp#Kq0xU_Svg z$PLVLY!r$eA7b;jhFpq?K$wdfkDqaQq=wtgkpc&G&&ef5U{l=3b&y5eMyCUYr5>+z zoWBG7$R)>Kh-99V6gPn#fb8>rZ3#^r6USsZOllLD8v|Gs!WDVPs$~L=-ZqM6 z-Gx&=F>+M3r{OJTZ~8Sdo2Ie)iJSQR10bpv%}O-z`gK~@B+C=4LIhG!9?2x-NU)kt z1o$fPLKKIU_l9^%Z=njG5Qi|?4&m8xDEBw`=FawUQn(sX62B${uka3G?jv# zoi>Bgp*-i2QspIpR8!?Qrk$-F)Q3^k?7lvUH%eA`SV90HKpe#Saiby29s^>+kcaK> zBf?!$GX-K2Qj|cOVxJW=RBRV5iGoct0(*jfc7{uJUz<$L_5cKL{-{D9-ODVQL<<>V zlnzlz1m}2d2M*?H}(2oxILW`lTy=Gby#We(_C`lmSjei~M zrRx7^=QU_X9YeC3=ida4Xl7`bN3{_bq0^%Rltd>?C^$Asf<^)^w`Tc?dy+-#J~uid znkKas;mA2mN{PfCGE>AzD&2|_oWK|SPoHa$WKtyK_b-iL(9mwJd~5j?JMXu^kDUzV z_1SanIH(wKix|#eMtOo*MP;E-3$RIC7WDGw3+b#pwK`kiEg4M*m3s5aN8BHOyM*-pP--K&yS;ocw5&N>zg z&pQ3tMeuI(aP2pG4XR4|?6VObRd_%qpQf)s0E2*n168);xyrs>ldq;i;Ly~1qM^2x z0xb(<81~JAI{Nm!^J_jSY_7e4w142QkrB4%_gWV?P0baeyHvDCxiXzcXZcgjkCCin^(M0WPB&OdCg6O*HxW~uZt3{AO9 z4FKFSMOwczJ_p0p;V_>y|lBbXt&=*b{|QUgjr;-CUuG5 zgx3doTiMMx28MfkZYFtIsDs;sUD)Kg0-~a8S3-RCGw)$-Ioa2SOoAa$|1$% z!!6$FL`pRiRiueZLb^xCar@RgW;j-&oYmHAs{gqW9zgm2oNii|vPh@=@da*N2-|H9@;w)&X?d$E zDf3+FAENL}W!$oK@HsrU#TMiQ1*k9LbrtXIr?;}XcP!Jy zeB4Yo5b~{tGDGRwT3!Z1mbWBJNnhLr;zf1$mz^+ikuH*Z@@4BhZX8^8$;NEU`I>^N z-Knj{&Ir5MN8$orbc|VhgYUwI6U;~ZwV|fgDT}1ksMa^LQ(f6#72Tp6LE-=y56GMv zM8@Z^TG!d@(dccBV5bg0Y+&YJ{6e8VbuzW~fk3dKR7pFc&lrZ85cB)*mT=WP6FWFERr=aMgNd_2O zxFAb`9`n_Z*k`gT{$wC|gS|g3Y?eVdB65GSD)Z`yxIF#LF3@{1XnSFP*KR zmJcFMCdU%pLM@2QL%o+5CN}RVumn;ID@x5l?_VB5Wt7gJBS)+YoZl{!j2M6F*P{dJ zKg`Pcx)K_NA_@?$2LgB6G~&pwE4*!uYN^R~4yuAKI!HjUaL<+g_S5nz6eYgFJw~)A zVg_{F-Igel^m5wn3=>8N7Zyfo>0FPwqTRuT>1)fI67FI33-7tatO~B!iM`X99P%uEs z3T9t$GfG#-A>xya%yO4X(Z^}rO5;e&jS0`J&R4GGH+}4E#+vAK;s)^`~Ip4Z*BhK{=k0hjGj@u%7s&+F|Q$~N4*T4|^ zXIqqnUPjEQ8-t=hJzjf04s}0yhi+^Ts%4u(fk7H-#;;h`T{9k>BEA;A0xsTX(4*^j0IIq#!=`6pgV3@OR3n`->4T`=Mc= zASTk}UFCI+$*BH<7raP0!z1yxL|CKvucn#rS5f}|sr|^LVmkB>f^H`iEtmB3iR{|^ zXbKQ{YkHt=IU-?#SZbw2CWU@lMvc_gw2@mygIu4b*@?Y;md^lFK&-!VOFfx&sKJ!t z-X63>zKGfWimYxnua*#vVyND|<7>}0MhUt5w6hckSfn)6K?H|EQW%^nUmtOhoM7ZD zUQR6nx|VOm@6;_z``vl}cqw6~B;$|$$k?Q)cTO+OP~#)W6iu1M*(!?e&%n}-E6Xi- z(8X2UiIaxG+kB#NAadK@Oq4#k*FwyKzL*T@T8yqD7Q^i#fUxFAo zhsP{K$lt2&Du)?ABWGXJyjDBzF~zyr_opX46*nrNMd9g+>IVFIfsl|D5f0~03Cz;x zdcVJCs=21-%qQzK?aV~sb~_(qf~7{;aZu;<)M!{qQ)Z+p?4KJ8ez4zIo3#PHjAEVl zKpE9@mwC2Sdygp#EtQoZqu#0xpC?%=5C2m7X!mgJpJ+x8O2n3?1P*rztfpD`H%7&* zeuN<SaB>-GEv`q3B0{H(41GOBEXcCz0ec;#259O$5h!0opqxS;QS zodNbnqqY^jvV2Q}4AXd7^X_(jX1Y!N#)@L5e6i{>4orW&3F)R6@<|dN z;weFn@{r6c3*x~ooW8mZN9WwWKtr&vjY=W` zop{Xe97iQ;FbPHE{+=!#by+p_;4utQzuB&HW;KvX8jr?5MyUii3POmc0He}p;pkJv zaACF0u>1!DUnt#blvfX$kP_bHH|by;iVTa4bijt9i%xxdZ9i4jcU1l%fLH0ElEU4G z$lVBidB9KrdCl^U#X-Vh7H-;NJ1>gf$&|S;pCX~>1ze$7J--p|*INR_kUYQuocHsH zq`nEB_f-QldMEktG_ulr&Nl0$E>bKLSZf)Uo9_1rACT~Jjc!_cyS+O1NwXPF7!XGr{0C?Dty}@k!H* z%Q;nZ!8KRvKE4n-DwUP>lY?jbGZ?*O;Ih`z{(igj!g(A-J(3$&=N%?%A(mh6gw2+D zaves5w;lPme5EyQXJ}pL9_6}jFtc5QA6}sw$cBd1jk*iAr#AG((9&lD!0Nj$5{>DE7+`7%hmxEuQ5Gg^QD_v zhI^Wja6)J%TO+suX_^^n_Q<3jJJ5f|BsSC{p_ACzGO59s3S6`K`@Al43x$es!u`V= zs)NEYSZR@VFXNPOmPx1HNrl)p_P|U~@+z$mqFravt8Zx|^qgPlT(_KOo4{_gORg5X z`!EvNR3q6_FgD6l8K-K*Dk2gJs*ExXE&#^k+T8S&l*6dahPJVu^YYh-AJvN$o88zX zO>Rvep!sRl)SJZY!T@EJSJKQ?Ksqg~GId=Dw}oP>pKt0At!P2=C4J)(;Zw8yy2k7z z51H)Aw@*t!WsR=ew9_+vDYgOEG_=|!3lc=@J!x^v9d=$lrfReVz}@`;SlWUcHu$US-VUX_!D*W@f6>-daLgTXp4ul? zPnB!KZr?0}A$2#whFN{y8ttf6IRlL1i}bCWtxb2jRiR6Ci2ca=oMC(7n|gcmE8}ne zRnU!w39;i!EA{KJBl|JE<1ab$@?mLH6V3Sd49Cs&ePh9%9#>m29z~@l?j`kE8*xT9 z9{V6hHswDvRoyS(;haJ%njZx!Aaz^h?xkUZFsoV*fDN5?_b>%4CZ9Xja6fPaUKHZc zTk_Sc9}eNB?qDJqQFvkjr}VbJ4X`}Sq!?(d9$c4MZ2|{!R7(}Ih-$SRvMF=sff@Z>SWKN^ZqHahN(1OK8}H(MJnDUF=L6m2 z7tqtXVHps6m=4fpEWO>Ab{bB-MUEu|&Hs$$^L~_0Ag3Jj6%Ucz3uAa4?{dB5*!L4H zW;Ip3M`)iJuY4>sfR6pRWBLAVH_`*|&Jl$#9GNHZ>%y6Hem*PBe-ddiZ&=nzp@LRBz{FTA6W7hl@i7VMz1U z9C-#`%{bszZg0-Q`A0?NQI5D@_f5SOjFZpVQ-j>ub2^d2Kv)HFVHXjb?JosW9VCau&-qKBQZuj5mDSWPXI1jHAXah#OVjNL)Eetxnp*HqW zAP*4nE4D3oj(5|*A|ci;CZ+l=$35!r*=sc5sI`bBCYk2sT)@i^uY zY!u6IAg;T#O-q}zU%giqN}oDY%0(>ad6LtNd-ZjbxtYvigT^5_f<_`|!2d2u7AD>82n9^b zBx5eq6cbm`iQ{Em-?d{ntscfU>-m&ZlQJdnWr@iaSCj9+e%c)Vyg9ia;Fnj{PiTqm zL*8EWYF+bTB>)}yG0BYfehn15FG)>8M*q$xo+OAQ-~lLM7S!zkknGj|iIYV(c{+g2 zj&=piD9!9S4iPgc4en9^Y83309FV%u8aS?ZvLX3I#lWOc zIzZRp2|(l|ou)6y4A}yI2Bx*_+wPNkF_+EMhBI#>3*3<#v0Zm=3)cI_FGH@c&D<}Y z?;PT~Sx08sfg)0RqKI&JaGhr=Hf4@a$ppBLK_HRNHrOcUPkv2ATrx0w&)&IjJi(6* z0M>=(IWCxy!3wFG64$MHH!!Wo4k|3Ow>TH4uqw*dVT};^I1(5`EAe8tYz{2LW1l}4 z%4-f*reSciVY_TIzv7kpL&D72U^nljvri4ah$Mn<;O+>zo2eH_=}7o;bDOv9MyJ$S zr2%|-@&-VijnwMX7gsQNP#+~I%KI+rN~@djJZ81djyPJV8=e3v!_X~^`10`hud1YC z{qs%6Mu5sCMqn`pOI|=L<&DXx1fL1@3R#X~v&(@p(s>ONzkA^VEOTsB;!earz9lL!92^;cCGxN^Q=( zIgyp%erQtEjT}45c9eU<=@&S9l^F+-6ZjCJ#h=e?IDF9!NH#l9 zK6ukArF32V)UBYF4xKr6-Wa~sfN0fQtoajt zJmPMZU-9dkO6tZ0E& z7m6wkMpyv2HvCIVWQ9E7sF2;B{OWY9R=Rk*uZDKjfC+-3>|{CXhWPQI>IkZUT;}6!j!biL7a@j&NC!HJUBpgUEoV07fW9%Ta%r z>+mYSI1huyj@5z2g3uc>tH(2Lc-W5$V;~o5B&}$<0iOxrPq}1NTo}Ckc5aW!MYcop z1|TOQ80@<7OnZ}(nkKV1LvnZRQFzk&6DS^3cp76Q;?&Nx5utxX7h1|ZDcF`LUzLQg zMu*WO_~(oM491|gDn!(qtf#lcZ}T0RqC(P^VDTS48MW-)=$=k*h!8hE^Y`^?rC^nB z@&%&d#=4dKxN&aOf0Fv?g19f^_-sOMwY zt5v9r3K5$TQB7x7NFV7%xaTa7S&M^vvv;Vt#U-4cL-~c~{2EbtvmxgV zuQM%2w_R>rXcYD^^KJLPQSzi#it>h~CW|vSl7h$iT(mk{JgA#oS#t9oOe>hE^j9i% zgHgkmR9?2*oCAuDZ6HyWlombz{Z-{M3-Uf)F1}(~Py|n1Pz*A$*bb3&qoL3uIs4Q> z=GbYum0}@Ej;Cp_-7!GNEB6Rx+V!jZ>dG!7rI|KlS)P(3#-uMKG#CF%7 z!0jvG&qq6z2+U<%(Ad}HaEflN_Ex`P&=nLJh!CkiV$GXjJCvDB-QLnjFrHt%TbwrJ zgBQp$PZvkXhntd_E89uo&F9(<_T~TcRyYHC>B^~bLCrU^cu8oTaPA1@>Zz~n@EGB3 z(6u0&;u;Z{UCAciH*^={DB0tsR6Xv`E!j!-Avt`1{{%=1aZdzFP8!Ay(o}U}E8AX} zix1hOBsY@ofFABa5pizk`1;~}-2F)?;?a^i>K7uD2Aus3cNfjMJT04yT5A1R<&b3i@tV4O?Ws!7OjOW6n!Oq25x(Zw(B^P$sn0UZ zYYM#3!F&##FkV2_v>3|Cn89FIs9TgEiOc z7K>dMIdQB5(M(YeT`gt{^J^S+WYjG4Bg}%u+}qR^@%yeQ_#+HSCb-ABJ;>{k+Av*% zbMqEYt-p9KEnj}Gy9Mb>JcL$VpB()&e-QEXIB1E^&Bs;`7q%FZxVy4A0u@I}2`-7M z=&$Hs?Cx6MG!3h3N5P4fQ9K5}C1cm6?IO`Yt=Us8*+p0o-3KzB4iX6lGt>mB^-9#& zLWzB|v}9|PMZvt0*@Nc_(@^)7UKf1sOKsRv#mE4)0yu>74UjBM%B#+62Rk1};Tp~i znIk{v0i>Xqofkt~O#?98Eu);Nv|`gKiv8kQl#IUQg<3w_fF>Ej_MVfZVY27Cq0|Wi z1K1?ycI0#$*TbhKHFKp*2VD8mG3*FL5D>slkGnn9T z>ylk}9xsvAhW&DBeA3hn>}8TnuCd}X_5O#;qZ3+LW1pAol#T`N3Yf5EgsItA&?CJM+TjDL(ozXk zKPgY^SJh4Bzv&u`u3UKccrdhuC{=k1&GaGQjfOx6ANphYo4q%*8yP(@L{Fe)FX1s5 z6*#~$^-^F@SYKd6oPHaP#pWA(Sv`q>WMy%1$|*r0Qfn)a?)1iP)h!phQ4LEWHZi|@ zjRuFnS$#KOtvaC>FUUQt?WByRs=MnZ==aW^P zedlBH<|YxA35|5x_a zajdqKScU3!HFnk=v$W@d2x@}1$L9P92@XW_4F&jIPc;{Z3^RAt+)L276ei&V4M zkCEh4MupBXO%`deddV_~r^oov%jyk{pIC?v#5kqRYRjy}K=d}8>H7n@0eha)jTHq~ zN0ND301H=c`&$+E3ECD~I5P$lc4ur^AypJ4GnXcnMU2GZs3vKLJhsreC4(zt99cB& zs;Cr=p)o@GADqPuH%KW z5gQW+3VT~VG+378&Zxlt4ukJUG>lv6Z-P>?cVwng4V!^}J;V`LeRDMSr!>I4+7Shj zLXx4JS@YE!=^bD~g?{jQ#)dcmsw~7hL8k|%r&YOvXs0nkBD55xjzbG%Aux(74*j!G z|2TV-FQhPi&J(=PDb~-9EZPeQ)BQOD<#zf(yW-q)D|=ExOG4o84N;FE)=slw=RwAm zd1+@3S1VU6D62TSyI^x`*%9Rt3*W)s0OY`Pr=SBOys~YRG=b%(c6!IhZA3)p``a*< z@}@H&pcZejDv8J#bR&9^YU8?n`98fozef7E0&h~Rpt&MsGAJxljBrlJ6 zGV)gP3$Gmto>DQmLw+Aq?-mwJu4}wX7DG;6F3hTMuv)z!1qDAr~lNzcM0m-&-U67!xc#AFcC0+^5%HN30wokDh=#7v9$3YAnv-#U$ba_J(PCkyC*H-41edk+dI4}6?KwtYS8>A_{))zuz-M$=_fw%3AuA>i&+uEOFhjVIAPO8HDTWp^%+L$ZAIm#toH0YoMG2y;+?(dB9?#7Xz^PAGM|O8n!21 zkTw%y)7sNU@g0E3cKQLwDjcRBDWX6&CZVI~lAH_XJ+lP`jqD{1cb2Np#tKi!2pAGE z(Z$dFFGZi|UY#+n#mdh+oUaS!Tw|zoMNkHJ+3@z8R@(F+Kxzq`1QYQ`7TeLIX)8}) z@eIms0V&>K+6$us_c7}RLe-DbD(r$dfX-T( z6?AoE;Qb;O=d&I4+C6F`lO>d-VO+WF{+q29c31w83{?8!_6&y5{l!?b2i8I7*;Xu{ z_hZO-^W1UXnzkWe1#{=*{+6UWPvgUpwMpxVUhavU2(56#%7SA^u%Kr6u$cpUGF@OiNc z_7FERZz_&%Tmp#648zqe0Xm5RAogcCUKis2nPr*;7j9xyuzn1BpI9n*rLf zD-DaZ+%g;O&oYMI2kl_xhWj1_PcrrmUk3sp?0>r6s({`?-93EMAZmi3)2*^`z!!G{ zZ!Q5_I5~qLuzTasRf-Ui+q;iy@slLX3N(_TYBxc ztnLZ}xksWG-2RPX;F`n{W2Kiy_yMD7o8zJkfec6CJ0w>Nty<%PWTOZCM?mo@DMeb-HFFk&G?hmc@U=APM zHm?8hEaU$u(m}F(b{CM)Y29i|mlUSMp3^ixHmSnJlyEM`_;Rzg**?wouSo{kL{wrA zY~Y??aNN~SUZc^Sw7jGCP?GkfPI0262EFAB4OZmBW&t3^rXdc70Zkmnf)1dpfKlZR ztO9PDt7VyFKKT+yh%}rPq5#*e|Ec=t(9RpOc`!0;AtVH281h{3Wn_c?|l zT$U1IhQJFW?lf9?v?(9CVBn&+FLl^jV=XlTWmg%992dgjh#`-;Sivjw*(#^EAX$0_ z66?{41gJ<~w|7Br%bvoevLsq1F*KQNplgRq+pq=+Wl>XhH)coR={Pa&n9(493yI>x z=seIs{Bmn7fzT`oy_EA*EB60JhsVqT(-rvWAY=dE*RIUjnW8VuvH7KvdPi4~(^i}0 zAQkuQ5j`$AIhO3tnP-TH?)Fc;&bt3obGeP(v>UepG=5g;82=#`C|?z^TL{C>Sf*J@?)+QWfrgvC0Ec+6eB z56fQsH85ca1j%KJ%u&$ZSom=BA1JhGCrwL{jd)83P)L`B4P$yavq>6`!%W>tJ3K%y zpnL$kT^b6+E$L~Ots7lZ1T3n88fgKerp5X_R9aH|8+!vV?? z8e8k05a|DOOAr#r9A$t56+uM`kU_Yg{#4zAn`mkt4gJyTXo>=1kx#`)&V+2=4i=Kc z(Gm)Xf@BOnwgxvSucE34NX8OZPNx<{s~}DmT{M_jd`VTyWB7xx_e*(#ee5nv(M&G- zT9+bNQ0Tz}u165kzy8%#$ZIQ%EabLxwULd%xN#_9ZAis56Xb7?rO%>Tk#Oi8l*Or$ z)NTxLqb%?N=js(pLCbO^<++!G2pS-IAhLt5aqco%^YAc6x-UvW@MoGQ8um?n!4xsp z*f;1HUv=hPB9T30q&wDY9xX@#yf0=GJ|)UgWtf1{#&z4b(YO&>2Z6?3G^f6F7Znup z%Yy0f6$mm?wNLcb{&t`DJj>f90{{Y$yG^qvGIsoLH|m6=xiX_lxx@Af!OtNwU5D*- zbatX@r8oU<(dz*Q3JlBaPpcq9)aDm2dDg&x_s?FA0U5w9^i`3oxnO2+0Ro83dZp)D z0C;t)t-ie{ChJylTugJuSBn-&JWs`eA1v8#<9gY!>bfoYo`!N6?l4KZ-lLbOinQEB3?ZW`;Rvb98JziB=m&2G>sNW zsPX&QpD9rrw$@lJtv&>VIuc18M1?g5o7)ma)SVVJ5fHW=<1S?63Y319o4; zR_g7?K*1*%mP^8T9l}4NBt@~NBjQ_{>d}^_&?^qprz#tJV0$C~{UuDD^31C*eZES; z#rp+_L+!;LMPR6PkfyCCh{m=Fv&T;lKcUn+D8~N0anJWXK8z2CN=9C)Fx&oG&G+I^ zGRYoyrPbG^&*5~0e!F|$SJTjpr8J;n?uc;{@~7Vdw7`|W3A>%%)G>aT5{5PR9abs- ziHYjaHOoPD(i*sc$+ha|O`pJ!ml5~`-6%zcO+XCrU?;rFUvIg)8vq6{M-}!zH3u36 zfoD0aEQt#CdSx$49fb0;!)p>}VT4c9ALwR3F0`Bqx>?28l<;~H*>~; zc?eeAA|)2JOd`NZztK+dc%-Pq@fDuQK4Q5|ygVBBb$agc(nY&-Np54H4%esg^zM47 zT)^nQe`LnN`4jY4^1_Es1!E%&&xDr$(_=G8G>*Q#_z3d)STJs*^Bi3LdYQS=D2-w^ zIGPa5gujt?sAO()o1vw16!D<%Rm-UlBS|D_oTd7A0YW!g205pu#Q$$zSYJhUPPtlI zYDON^lJY`2{y&2^R-}X=TDjlX+yfaafLiJv2(t-Ps+q+Tu|Xuby|Sl*o*+enaikZ}3I?xEsRm8OrVi89N- z=OAR2i&NFd7ye`y&Fy8?MGll6G{P3Cj;fC?u3Ir?A)c_vMNaQ6m*7*3{K)9r0UzOl zNYeZopZ8BPFtoX?jxkukSS%EpX7cc7XJJCe*mFVd%Q>?B1#F2Ky$C#y4!*8Z5}J?r z0GI`+Q8qng4@fJI4&9u4XLk~mwHshWfCg0UqMH%ob9m?5mg^)tWvPt%!}G*)l95)U%! z+4Uw_wYZrh`BYGC_7cSLaRsx?A*;TlMi{4z1ZYpV8@cA8a!m zxM2fFp+Rd@QYcQF+usuPNlk2~wOXE^~K)3 zD+;~rjIx@byI$kC;K7dZmN2I;5>Cn;_r$l>a*5lzC%6LfzYx>-B^aDV(8)POhel>E zvd3EoeoREYsYdWZEwY0tHH9LZEY@Du?{mMv0024FC;_j81#jEt^}lkvw>8rB{RcbC zc0JF9Mw|b1HnnU_oL0Uu-^Y!V?h@$MPezd^Mv1N1Q3#RHLks!*o=Om zO77}(eIa|+qSKjGdJs6UsSK|cqoXGv^bo86?69LPAGL|4i%q*`r{=+dA@lmP$}JeG zOOQi>lz>mIVJr=t1}|7ZoP_FtRj&Oo4WPA^N}~m1K)ovj#B>L5tXj_=-eBIwNT~54 z8y&{`s8f|`sZfs}o@qb+!9Ed600DOj()XU6dQ?ja%+&FR%z11v#MdGpz?lr-jQUr` z9$kjso^hTw?7T^x=hQZjnlfrB2k;y4Ot9V#4wf&RgL)xaxESsg?S84nHwKM!Mp~Yt zk|+X43d7RbcnvZ-SPa!_NjDewT8r6|ascp(Ec%mJr=5wNleQJ0{lG`rLM4gkIJI4} zG;SxTja!pER$Y)MoKTM!gSmtdh+H)R1<_<>6;jlx#R5GdObKy(YN6{Lo;5cfd9H7{ zy^3hlTGF~alyUi7iqM$LP8z)Zff*Yi*-i;kUga)ay3K~2-T@GeaH4bR?|dMu z0$jfyx!o{uuP$=PN-qt!vqoBs7OG)S2rKWEy^K0Ir+~DEyr!QTFHLny*B1-W& zAmRYRF=-Lax55ZAZxdcZ2+E%E9Vf!Vugoaq^wpazb%6@cj4867t>$%8ez=j>+fzg2 z9L@3k-M}Lpj+9tb(8PkR;|k&-(b12UE`kh?Y%fWc7^21r0&H47q&BbJQaUYr&u-N^ zArD+Ej&o|=KW~SLsvaZ{r9_BjllKYfy3arGL|h6}sO>6o_TMJJN^!Hc_0+8pGl#*Y z1aGBMWa_j_iO67VwYTs=4rPn_aKDXW6z3K|t$&HGM51Jr6pY*ACs;-4BmVMCb+B>O zi)~AWPbYD|cMWrG+C!t~yl0>sM|sp}F$FHA@Fq9IINZtfp@`JQae^1M$8%{G?{hvM zFpo3%(d_@f5J*;ASGb~2ip;+!d*cU4Z+ErEtl^%0<;N&G558dnk*KB^<*O-?4@HeL z9NVqoSy!!MQ|s_zY#`z9AEK1&;4-T~7sp^~G~EX(2N2*#Pv&3L#)q9`@lf6DTP9jp zxe9zJAs=pz6)qIt_^@In^nUgv*_Ddx%auhjHZjRYF^I)rfh`^+s*iE70@yc4FmpXx zwNW%gQ5zov{CC{%R2%Usn)}7b*Gr8kH}5$!Jr$xZTNwqt?nVa*#~(m@!~AH6Ks-CB z{V}QG-kM9^GmlpEtbgJo0YNHW50E8roiYttU3UTq02@i?`N?;1Sz#3U!eH+T}oQO{uVz< z?Fu@!XZjH-dqw!q!l;P;ErPdhx}w^q0RW^&?rSXb{D5gU8g+DBgX^h8%Iyr7ZWDWfPC|-|DN8@L{?w zKptYBMrKAwBWsN@V^hT?)9rXHY9XZ2_8{Y<>D?21opr4L>;fs0XM*b5 zE)rb#K66xoa>!e?x#MSPdxUR$Fo&KwWT_FIpB#H4VeMmqQ zLF<1d&?x#$`#8|!RBq{*yj zf0bqOfx6SWDj2KR^Ew~4kh0+`c#(?3;&ZB}LwPDoKKQ>_fZW%#*NkgYR+va19bi*D z?VQ=q{K31i4;%^iP%UGcGmJK6C@#W= ztrGvM!ln2e#v_?&^I|XV4F?Nf=$Op_Cy|^~6|U}hlg%vk8aEx?Lu)jtw7=7X|4FyH z-+!;|0c15z_>2;w)%u2KhOhg51R`U4N=8~Lt?r5QJP&g4T;&QZ=|MDFz;ZEZbaAOJ z;~?fHDvxHUir2I@M&fCJnkX0>?SvaDKO=-!c5uvQ_G`T3y9}GyP*sJpbqja=MS}^T z(SSYGqQRrJFq>elN15eCPI35EBQXH~1!5XSp1xU&;pS-_*2;L8I{1Pic32GpB~e(B zVwqnVEPY_t2v2PEc2cfk*{Ut^>XWv=8#-z&BUxY2bpG*z3u}#1p1$X<*gp{79Uq{H zgq)=#!;^4_BI>O5Ki9zd5ZKDG6sFRdp$J{<0KG?0CSiJ&7ZsBJE0KbxpR-3M@$w)i zsRa&>J!7kB+k#A@OTcOx1Hay${sXwW_~Ls>wCO-*cx^62KtXxXhmX@A9Z1_hz%RQ` zGorx-GAq@3i^4KkBN4Kn7p`KUGWvx(?Q7t}#hw9O>5MaP z#yf%zP|C0nb-J`CbC~YmG&~6*23(!gr7{DOLb{MVTM&i*6u z59LxgUq57qbw|tPn2kXIuUihB`NE=U#Bh?tMb#C6R9!y~6WKP5XFu1eOYC>H=LuD1 zZduG}=Jynma|Y4UHkqsVQ7%y*DUe0lCl00yVZVSQZC~klg9jKF`4YX88FzT7OiX~? zSzo`H8E;CeIWT$WyZ&!C^p%z)L)Kk*2Sa$?dsmxr!Xn*_SB!k&Pi@O_ku~r^pTT)b z{sxn*>yCigV1{V?E3iVzRZkCj>f}kQB+A(eO$NfSX zwB`SKp0D50dHgN#_{dJ;i6~39of9pd6%i0dX5$^=W;)k1RLRl8k*fRjjcsjV>~aVh z|7|P;cs>XjkL2XY$u!ruVq>bhz2QWVY4Q^DT(m3ZdQ(vBv{Hj-u~;iU=Mge=Lj=VJ zdsmyRiM6LSQ&YvTn3}+!Cx(Z(}^=;#cvDtT0|d&aVvbiSW1bc*>tp25=(>1nYd@ChUiOXk7-Z zZ)+AzV#{^t zSc>uJWgUAW#}jteA}UR;-lMs{tGAZFGKa$Qr7t8%a4n66cz#3Nn7m(CX5sqX77X=N z{-^zC!+{5rFxD514QKu~hg@?4JBy3(w>(x@%Am5s#^V4%eOuK0y0z5flfw{`n}i#p z_hHK$Q{I*ysA%&9f}cNbE}T!;C*^^d;J*g|^S{3yVDOK{>CGmwoq*ov(~jQzwQvd3 z@&-UQ{G+=xzsSU(^ntuN9s%BAcBJZW5RI0ML4%cMGDII5#hfZ%YK|Q~;TVSg%I9u( zYS30^on&^Sw1+g6+H07?DitK0u((lD4f@u}V^MU6+3}J&OiZXX4P_4g4ujqk|7Zu+a%365z1F=DItRQe28^S9 z@TYwbMGea4xdcrpp5V%tz zI>}HOGN~PuLFz!e)UQa#F~IYVFzu!>2#F7r6-xRUeN4j1j~+Km5Ms6|&#uRTu1_^% z-Ud}>KnyH#l4?)v9=B2iYU2+`dYo|N>okHKXIzL+q9{6m3IN6xvXJCp6NVh2`e?oW16JDMMlgnz2>=i?2mSH6xu&a)eY1tcI^(P(|{Ea?gi2TvY z0TYXqWz$h{Q}oZzmv)cVZsB0Y2QebN{sM#J>@boj>n0Z&9STv?h)=K`7(5AxGVrA! zM55HCi90YD;a{sgp)4J)iv|~}^cgpw;jRT0-R^CdF~+vZzJE41E*9518!H7U&A@#V zpLt_VK|^HS@Z}<>TUZrg##AES=;aX`&pzD7$Iy(})PO%Qf|Fg)!-BA-qlzaLev2id z6uj;+Qzeh`$xQBS_t*riSc=7oCotBD$Va?s&vSvZ>UQ`#!~UjW4>+Wi*LSNo4{>rk zrTZj0Q!Xh7fF>glYb5NB#2XtEo^0XwwA@DPV6MOo6z|^w_FyI|_!aMIJwn&~k+Mgk zzRQj7g7xuee4$^Tkk4FK)sch4r`Xuhabp7x^s~IvBlSkOSvEQ$IB=$tC^T&=I1Cu2 zmv*P5k?uaRGSNs0E6C2ed;^36n(Ly$bbcd&*uOrZaY=m4YK!mKgsVA)K0y7 zJ!o7R&XiJTL>`%a!X(Y=g58U~QQ-;r{(ef{Mh8V00AD2xgM%8WyNY~B%}F(2JX&!x z=r;nRacX(@fW5;ew47)xDG6hr%g^l`eOft-oX2bJD%@Tlhs#M1bj7aag;j7@j$Y1T=5Tl9s%n&#yS0-K{XvIA%t2y7mW?2N zi!%QHusPBhD_<-%z-Cz>rgcJqz};}7kG7L8^pFSCb#eF_c{Wj8%gL~VhPw9Ccs197 zRT&GZUZkiin(I9UG6;s&QdUffSZ@t7j#}F^{OK{ec>W8FnVKm)bgLzxILu5sWQHmM_4xcyh;i6KY!5xHVS|>v5TUc=}iDjQx$$jML>W3)--j- z_s8Nb{F;!DoRMOyJ0o4&N7v_jX*V2mN!nC)K5MPN(^0TPj~U>`G47qO;N#B^MDE2| zz8*gF0Q(hhN`J#YT;}ARD}zY%@jEQ`cxCI;8qgLmX^nwf5q1=~{imyfFZrd%1~6xy zCRX z4fBRz8s(DWXbt1mC0Lrrh@UI`xM+gwAe&U{ez;UuPE$z0TtX zHFP{#$pKGOW)e~03550w>RB#>f@G@g z)@`Gh{+~Js+3bCK6%wr9W$ofW>&u)@e+Z6VoUK9=*Xg$5G>Jc@T?1YJASA( z3Rq@pFVakHDVOhSh)7*63x5@VPn_#5Q|4cMnfsGU$|1Cz`7ZbU?i2Y4YRQ7;s z-|G;Y(N|FsDFJXB-TTk!QvxZ6z~Siz?e`NjIly@PVnsM8m3Az(T`YAu>ZGn?VS3>^ z&qAkOkbBZoNi@R$xbj$YzBZp8a%$pE)8m)qdVs5@q>Az65E}V}70nuG_6ZF1$x511 z3RR%G_y7n!e^2^kDI{`v90#|rn)k>tZw9p;$rCxuZymb{5x9lhYxok@Xa-f!@2Xgn z7y86FNdU<}^4A{WH!GcQb^XPk>jFK9H;J1Vi`!oQs>5<3VGUJw2Q${ln5^GqKb5d* zxr)fYkngXlvUe|k&#mq5_#^BV?yl_S;2NMjL{(EKy$1&&1DkcC zDaFb9XR+`#0(cU%2plbQawMU|99j^{8lkk;I7(K;a7WoE(yp@T)3q`Jt8h;29Q>J! zX;AIA>s<-Lz!z^GykRWe95XOVG=8yO+KO>6Iaa!+43)4YI*TIr9AT2Q7xK&-dFmzv zCJzDjpqEpF7NFb1>|IlXys_xh-MqoQ&{R`$;q`|t^eAfg?6Zf^8oGNDUJLxDT3+56 zHJ2oOOkZdT2s9AGx=Vo&V_ZSeVKe$!C--UWp9Gzzqa!`qoD%HAN9Q@D5YQb$x)aRQ z`P)y?5paU=8kCkLEvGv3=$4ur-6#{hp-wEZ^i8aH!R$VGF@i|S2Cq-UV(^j*86_yG zHI0r|#Xs&uv}~R9T^H+ewCA*(X%#0biRs{ri3gkPzEYjoT@CV-Jn&fB-I8B|H3D}5 zD7~ZF1Jn1XMHg>F-%T<FJ0b>H)n7I{A2m+TKN1m8(_!ifOAtRp{HFc;F~+7392Fb*#Y(Thd7ufk9Z&Jo z>7|6ihygHOPm-JtA7cDA@a*{lk>pblK}A@*#)z5%xO)6P4MUZ{oLpq4y5%#ycxxwX z3bc*Fv@nXTNhd`pRU2-?3yol>kR87U@&*;P7z6+jJr+YA{#-cb$p?}zcV$PARcxAv zN%v`=R)I~7+c8rgg-R)Y@CZKWVwGOgFEa^2N4nQX>bvdm$ba+9{>Z1r**n3{`4`c* z;rc^e1~h<8J}ST9(-0IVosvJWyfP|88>(f5sp^xGc!?&kaxQ)Lzgv|#t#asvQnNA; zm2B#lD5{r!W`OWG%et6OaHUpO2jqjjLB6>_fFYH#ey?wnTWYem#NlIuJiss7QSu_xBgI} zTF8iA4;u%Zab9o{Of$o-fHRztYRe+ou*tm9LJK-!x|E)VTk5#T5mTYH&7XYl~30-&T*^y zmUSZ7I(uGV3!g%QPmLu1NyF|JeCe-zWm~HM3CBY!yO3)My}3NmaaVI58^=8cbM7nD z--0-$%Tl@^K1i{hiCkQOF6=ZaDk!Q>{@E--nk)#2RhUOn{f`=HbpxC8a49skk+yb_ z?&MxYJGF`P>zQaorL{aecoP-t$T%X(S7wqwTe6vo4Jw@$RfC%8H~As*FYWP?+mtPD zXak*@%9ibO2p7Z2Te>nR>v;o-O?#<#E}|iLE7DAt=1P5Sq``OVXu%@1H#W#jsEP?D zzxz6AJcl)ZrvJInEf_pq))Qvkm|?^dZLgh$whiP1KIu7aUEiu#zSzhIt5sVBA4*uL zOZ?hWUfFBG$F}SUDBzMPaEGv0m?^J!r{PsAZWa`qiuc0==7q}{ir)R6ga9v(>txcI zJ0M>LX>yc93@LB6zSYj~QSqjJpxY@Hi$cliQNPh3cxp=AZZ*7nQhhPfzv1GQ# z|5rdg%C98`VL<+YXqhl&CT=@ME`Wxok%-q3Yy~E1J4W(iA3HLt2SARipY)S0QtRFE zRTHa3G##R(2{aCo=!ekBFeSb1LbK<}O=a41(17R#1yVs^mM!lN+N1v3-eH4+SIrGG z8*KgsdZT97VA1s+$vBLK9-`6bXln(CAIF6{aPN+M({?m&Q=Y~Z)mt};e~0~+Td77& zsQR>rc^WPaKLuuELCNP;LD((PXc)GXvA=StIih7q0BQIh|M7HNCF2UxW?!HSAL;KH z*>0X0M%}2meU)rzp*hQI9M-S#N8O66D2sBlOpc&BS~ZRCX$1kMT;bD^65fW}o$q<8 z3+Vid8VV6Q50R>CyyA;$BKi9oz^M@rn$$krg5?@cGEuQ{l&}zj^cD@%#}FxZF!H5x#mU% zQeh`9{FM>o_&?CH^?N}MTm?KGp$BV!BXu;nV`_kwSz+`{w@~W#Dxyvw!JBTApxoo0 zibkr0i%UzKy95)~B<`Z4vlU~JUYvLdiQjYDcJS->QJXOA%o7^ErB*(D7`w0pCP7P1 znkm12>|YB<5em0!ELt~n$u$0K%UtxEz_c2go`J|=HqANQ!+r9sg)4k;-iINuTpOW+ zFaV{Cg+YkZ+3F*3-8C4T#n|zdXlBlb-^}cI6}Sx{S)nT6crJ+o|F)`p#tu0zE=7MA zFUa}|sU~PM^TQHtM6owNI7g%?d%)m1-?@{)?pCN2K%V63KI7SG(}}w1B+DVczMqu! zR_F+S&7H8 zH??7Ywmt}QKjdj?Wg(H!Rc#2Raf9s`qi_5cna1I;uYp4|A|M?svp(|&<6bq{#pV5g z*q9+~aKJcFtLhGz>qQk=PMt_lNVXozDQ3GJ7k}&4!^)P>IKf&6AiyP2@gL$b5&ntJ zH56Q)aoCMc2BQF_*F+JTmKB|68(hY+W(^$ktjeN#6w8^#SPBvq47tSs$KQE<(^63F zc<61|Y$HPp<`h^A)NDIsL&4*(z85}e%YSBn*+dEX@qu zFA-k);WdhiZC@^(ao2u`d8Yr-iZ7V5LCC>{?cSaEpoW>C!rAA``?qcEi<+0#v9tV0 z_V`*Ir$irm-6z^RrVgXxbNX^A&cwyZlugt8oBsp-W z>&QMq1_ca}3m^-2Bt(jm-O_|mT1m)dKLk}%&jU~U(FO%eCFC>{@-K_oMrJpXf6t8l z+G#$yMURLzd8OdnLRLjbI^t!5il$aY(BueW{=DX2g#yAoek%Hf36Ig>dqx0K1h}b? z77WgbkVStXAC}*!7)~6+`q&0@$Zgw>X{S#R1}M5VXN4kB@uinsU`ys!r!h<@#R%`o zJR}V$4bGWtVPRS1GGIA%yodV75TexQr->)u=MAv3mNckgJUa;Y;sSq)F|nkhul)gt zpo(#HtiVlqExko8^_LD1AFfPh=>mBIl3A_4y6X2A_?*0J3F}3l$XoP0oWwWDNTJ7( z7}BO@Z53vdfwnDRDY?Wg322><@5OW>Ipw$;DuC%nMtzut(rEc%49S*Xb2oka_V(HY z!bV5_WdX&erSiMn+=`N5oL^p`X|_Ev z)rU^PqpBRZqSi?xwqpdA7yClKzlzv+N}}g5IPRtC@^~Z~#aLCmFVSO=iw`XL(Z%p0 zZV*O^_Af{H!t(s2MtCV3;Y1Dz}ii1f$^!JEU z|3A(CSIH!i4(~|F?v0uOX{D^4&KT3ID~VE*2_xTrUpLDnr*WEdwyY0@mKqrBi~$GT zPD8F-Tb-DvVM)~2{=y(-;OWealw(!x4isBdvsn%?4Y@9FIv^HN*{aXiOugr*P&u`%dn;m@DBANpag2nlDoR5RTga*WA$aoIM&X z=_N(zE~77(KAO#j1l-qry0DRA7q8?_gyUvtdh++36%4)Lu3uObUv^mdL;Plr6NhsX z&#c3Np%X8=-%6~6UMkBuq|oNpHhAka-=8TuY9%O#a0)$dGXP({$Ovh;R6x`O5)i-$`X z0UxZ|vzxtwEp#DUkfs)c00oB1|BIZsxmUwLJHcEXvge_Beis^wikYe&NO;?8?i%3W^NdGJVf$># zX5}Xj_)i&fi4sAg(qIk=(kTIjEQ$&5tSc2u;pTaX*go$Wcp<5gEs^m#lBE6_sSuo; z9QVY428+MX#}FU82azH5P4lS9uD^O>pxGt@wz_vgRce_tAa~|COc?bqNk_+P88M>d zD*OW4PMYd2uP&^u-Ouh~1`Evy8IDWS)R<#~5GHM=1zR-8Lb9#|s&dp`9L~cy_WprB zY7&kEXDpt<#QI{&|nDg)5+W07Z+vRcg#uL;i3 zH>_yn!-B+Tr1?}-J-TzW(SuPW4Wx!u|HEy#rU)#9LGo`e+!mt@JiyWt6xSLL@teWA z!xw*AG<@hL9m{W!ec$%LMqgzKemaovF6b?sd3&w4<&VQby}Pk2Gvkbri9-Ol`F%>@x0V?b z-1RN+x!=Yp9zNc=j37C7NtoLoeH528HITym#L2!r+L?^?o1BHm6XsvG2Lil z9}U+?|1p&e!u>bXO2u?iC;}~xue+m1;28@wte`4w06xHKI5>q2xjDGgPH=(-*+p%9 zo>f*d+8r?}`HL2Kz{c4%y#ny3G@KF@$9WF5|JRz7a-7&P_t9kn0q-bEXaC8Ny}BA6 zKwr9li7rI=$`;9-LaTXbDfRn#?oS>sfdC?E2eq}WHaoV_mS;M$M_J@n>*Yfl-XqR290yt%1 zvmg*su*rGu7c)d6n%K@%_SlRhHT$9i;F|Yte4{wARArK+l(a|Ix^e}Bv_^#W_G%0a zevxmp*6uv-a-wXhgcn+R8 zVK9a~twqy91F@0j*w_Y5Mt?3bwB(V7?jmJr_6_`OwhZJS2I)yHNON1vh^G>y){`if zgc=jr&m-`eym!{3#>gzcmTmng0@Uak7uCzsh$H}Tqt?*j?{saj;+A;=2~Uz+{t4_u+|ACO!9*z&iYy1AfA(LVsRNy^)e{y+olS z7-KeTf1NjC-2|y9o7iuG=7L)58^MTE9W^Wp2nt?gnq5rTt54;?s_az}P3L=+ye+eu zpHnH$1)0zl9h~t++rH%r)LS@BbFvELWuc)PwI^)fi5V z9DQ&(g8DGd&o24GsZKgl6R#S7R%u78p^9d-En z$7;pHS5nxGos!v%8}SBlW;jZ-FHolZox)n(>sH!mSg(L2Hg3ljk_fevpNd|`PTOsf zjZb!$a)kj0u^=|oGqC~%vDtsha();`!@O!JP(7_mzLU#Q`%+rr$v^=})g0JwA=4w2 z1-AnuBR)t|0gS3L5KkYw-u@DR+(ORLITF=Uh9@Ca zeFy6+W&d1wRsU6h+7@HAg*$G49*EjG%8Rrc_?Ku8lW3eG7p^L~`6Aq@Q@>F|tDtHa z5-^&8v?`Kfd$=cqiDwI|8f4U7Rouv^UBvBxDH8y7hK|Dh@v!je!k;|=N-!ipeiB>`2nIb_?k4!ReA z0~#ZgNHa5vlp)(h)t;?}SZXb=#+WtRa;>u}4H8qiWS4PNRA?v;*7;~&s1ux6;jXE7 zcn~iK%lK?fr+wOagf28`1M2;R`Emu^RX&qH@P8F~wh&e<5(@k~4H;5& zit@T1q`Y41^n#R{E<*qWdSet;q-|NRU+;Y}yrNx?^tInVn^#jM2BE2;1+O0^p?@W< zIj?0_wFhti`Up56i&MZsAa^;TzTb)b3Muhxx*b}Tn>8lp#x~-99uxt-eGfzLM#o4qlBK)JWk98hO0rl^Ll0O zd-gTupRqiYgL+srO1_Gspve}Ez3S|AdY`5+mWm7na0w8<&3d1w_!qXSPF0!f%{z^| z(srHbt=k_|A@hdfC~P4`$LyCHL&7k2^=O62n-@mCu%&K+tAwe;wAm!SkG=% z{`SkeJIbZLML>?O%RK<5h>Qo1P^(>--Rm<|!oyuBJJrA(qk~h0k1*3&vXRPNZ<`n; z@5i=Kdc2wP!OQ_lN+}O1CX`(WbAVW)CKBVHINK5|&uqELUj1;&G5JY(c$=}i-AGo% zUkF#&IS$?Ss-x(9m+5sQ;JDXWGd2zc=(QQ81Sy-sOZ2nsOlDFMXNX?Nnf++=0_^GUa8Q_G9@@cOUSd!1?o_HLPV1Uq1yHcMuu-<>WUi|AnH3*ffp)s zWaf%f|HF<|N=3@U`D>Bw1Y|>)(PIVFF=@69CewIWp3yWvXb zpFzK-H8_bse<3L&UH8ICxBl&VgzWo zTRKn4S0q^QTR8T)-e$OesPznebJ^tH!Gj82tXN{(8v!%(gqCL%NW%Gfd+>$3Vs;y$ zp&r}>(*k2}82v60Fh0;g{a=#UwT^=j@ho)WiT~h*>!};x-UAB*CsLr`5?h;*J@(qD zulsQEk;T;7PD;Xv1bL>27Nc3dOZ$o8%Z-|Y{g82%@{{$`zX1mLFd~4Cr5IUp}px@RnVztnsRtdC1^F*JY9Pw!Gb9H{sWoK| zDNVPF%SE)XAk_vN%g*C|=7@zX$KI97c_M?WPf<&eEm!s?&mY--fTe4r9QS}2yOX~` zx%C|+vT9aSNz{}!KO{I)r5Fy*@f4+7KGF_WFsH$Jld@ET^Y`r}^e`^V*_To5HemSU zoWqq2=|f8RN=h$&zE4aoqPs_pZ%326n4fwjG&KsVOCtJ;@(acdVbABVexY{Bd<1tu zOk5Zdz_fo~ulNTry9`qDrhvCdE1-C`#$qh)|P+#D=TUVc6 zQ8XvE15P5V(w@Z;rSkB+l&lfPw+vqwdeTZL$!`iZz#UWmJ!^u&3x`Fqi&x@JV@|IN z@_N-3oogzNI#DC+E;ZzC(0&f!D$5d!vcMqmKcRu2pn=I-Q2kgTKE&o?vg^)6jJLct z!EmBG&RVSF@q9D-lk3kJtpj5vH{ThnV3Y2;fy8_b=G%XP!`Y1H@@d#16$_8v@z=E; zGL8T1w4dtT{?o8~DtHAw#GEp%4O86Z-~zY?_l)(rDb~~e*m9L~5_I|B;*Z_txdZIJ zShYa)o9#W71(+Ui*aMb+9QPB&d(4to+k$2b8{z2I0!-ucyF)8{ZiZs)k^8Q&Th9^K zj8A_3>*0}^@1KjhQ5X@MIeh#~x^J82<*{j6PNPR- z7+?X3bDvLbaJQBN0^?kn%B`kHa}iXR250u&J5d z3nVM%zSKl-I{OUV+Po>)n|bDb+U^IZqPB!tV6qKQw#JuqiX;;`;^Z|;lGD-4Vq~dc z?8Hlh#P>K0Yer2KWxX`A`-hu7b~6)%K-%&TIvrR?%^NtDgS_l|h=ZiC&+TxX@URl) zW&ytC4|~(d6w>KGJ`|ZY5L-Bpx9NA<+g5HwMvA%_CK{m*P?;hta+o_HI;@uI^!vnL zF<5eFpqmUE$Hr|);zQc)OB?GFph)xjq8l(Oe%R6 zUC~I`8j&VLKD-x4iy7>c`bV}TSG5~x^_hyDF-VUB-Umf4d(b;jj2)# zF*t*mE7@1%i&PKQUvunHLf6I&%fG*SF@nD?!v9OUDx!rz8_@Q=eQ&QVjL{c67w>mX z(8Q>v*MfnA+6gL*^~~^nP7;x#{rz&n>@ZQyYsMR z%;P)a3&ql@fC}zZAt)kHxq|rP%IjYn2s|t0bwom4e%dY^!+k%V7x>5~l!a2IM>M+w zBg|PR6XIM&~q>lgd>VNXzg?rir2~xX=2A{yin}8T?`05^hK9?t2 znXqsjf;)W3;Rh%b^A*cy@YM*SMKm7#54(!$(qunM{YD7B`!FLh$tK+t`|I(}f38`2 z$+op;?c}0@VV}^cwi)WYB_422T@lGk(F)~BP0Yr~T9wUAAm3!_{aY6ycHDUE7Qz!Q z;6RgAvLamb9rsI1bp(9MFDxj$tx;kG>%kz?J$c2YbLkt)ghDuY$40?6;HKaX{FJX| z{BOFxV9pbrc$T02YbL(t??i4jpu1O^?QAX?%w|{R0$Z+od zpPR^wDWROXU$Q)(kRLE5x`do1EzR!Cp%A{6L5 zcwX#KroRj24HJp~+dIe8s4T%S`$jl9Wm~5-OT%;7N<3_;L2`AOmG}>8!X_<%OcV6Q@ z26`I!?6$i9(Ahv|1-XKRqUES_%yRYqp*g8zY3GDW%7OvTN-i>9ocx_PD0*Wz4-rQg z-fss^BKxKmU)JTwRaz}Qwa-)6U%aWD-Q-PVBd45Qu#?{#r^GtVo~!GttakD0u;wNj zl|^0DzY7p}0gWp=oTts0n9%|Ec_`gM`*jg zzeBDJyaCXUtoy=*z%N6t@1<@#MfTK7Z7PbjC?0mNt`_Uaon0)zZ*FnC*cZ5kQ~JBP z6uRTY$sej!_C#$o5%frx!erZFaG3&MV%VOhj03rWNOB%usppCjbsTcBzXXl~od+&%kDi5Zc!M(;X}8 zn`q29fl!DsL?R$HS_9ShkLH35=o3UE+1ZgQEJV3ux@%l3-;|z-W5I4gxxIfzqGdj1 z>A;EJJ^Fv=)0Nn@}y6zMXf`hLG{+4qq6S>+ZO|71Ie zG1SVJqD5zj{Zv(4dcR#i2@iXm;Y3iZFOk1+LMVxx`Mn@3WxRcZ_lOPiK@5I)W$UI& z)k|@+0PmL1K))wh6%s2Z?Abf&rZGVW<^rF2X&w0JW>&V5HEzi`wloJ5fPBqsJB7HJ&&5GMw zV93Ffaz+%Ys{Lp_JlmSc;VR8e4~e1wK7+htT3jR-rFR-XV|eu&$Uk@?UzbnP&j3Yo zcr5pmNERyZfdPKFYj3xXb6$FG+XZ(t3llzYF(w9#93fF_mQnM*B0cP^3l)&c=yKFh zGH}6`%X{v6dU;c)M{lWhF}&w7Hk>bj^h(j}WFsMzD&v|LbnI3m7sItKK{w+R6VhoW z-JA~1Fy*={w!LF3A25OALG53Pk6ANPHZKup!g!|=l)8&h;GmnDTBQc$-`zJ$ZOxef z-ybI`%BFF7%@~)P*rUhYO6m-}R*A6)%&Ju~m^54fIA=Hed=1m+`)8XRuP5$+C*T79*zfsvpWz4u{BE=@W? z)==EYJbaH?8);T5(hOVP4SSKLVD8JSql@;OV3R}UDGhJX#?BJJo+1F)1 zQqc{arXeB0ppj4b$r))oCAM|IUN)~WX_ofm{P-C!gz)&>01B>qs z%aeelTZ=d4cTt<|*)MUJJU$>ReAI;DuesZ8zyh-#)C!j7}du49?$B=L* zo!4k?pzbc2HmZ|I_uUudTGwqxoQ?zVQEc*SJUMTxbn1tA`4%_|EVTL;Cm~@z0Ua@S z0Si41Xxi&5idl+)!on9A`Am@WNRX5QAC{h zrjJHKX^WVO7AhN{$!ORGIy?45tjX4+h_w*D+4Ly#6-Lg53V6qv8{vP;H64cs*f(3=5@p-O4nH(OC{LA?U! zefZi!R&stq@+zxQZx3clu+pL`b~h?N0luwZRE({VTU}p#HnyQ;P|CejXq6DR7)~H` zV#f{4?9U!k1pGOEWig>-(D>dRZ{$L4d2=Qm!+;+ z)w{Y+t{)fu8F%ELIW4+j!8#-QM&>{_q~N?y13L^0g24g-5P#X~Pt~kiFt2C+8XrS+ zE{vRQ;Qp#KDk}v)9jn$Y&c@~HpHGlSKuj7Ny^uSc6=n_Q7b|P#9M|0KOdbyqmm~s( z4Sr3A&jG3CVsY}TtUt0Yj@I-1N2U^B_K(hm5OCW2w~tUG0tcS*Z|x>%?$o#AxC9W2 zw|#gJg@&_FEkWY=QgujtD9Wz5fn*;>?GB^V>Gh9olhi+fnKWv@LnX~H9Qptei%XzX zoZrcK528j~4d8!8l0Q_9`hykueb(3VoN)SQ>lBmU2jmAXQG({0aS)~-pZJ>-IECU$ z3L6XBz8SEI7`b^8;GfgSMObA1D$lgIEQhv;V~ip^13k;;XefD$8Hj6pm} zTtgHEj)|+!qDQ;i8K^C(JecMUmLrwen(D{`kGxx^kV#QF73cS|n=tn7=9agU)eSBa zgYa#~CkxAW;y#WRIF~@VST6T{z4KSDDV>Zv?s;V>7&?Z3hv^Cw0_%qQL*b*+s%9ml zgm!$krqDefQu=sPdsA&KZwXRxq(bZzL)nH_M83(TxnbH2n13+Fcw|&EX9swjZ+QX` z_IKNXy3M^=e?icUGoD$}twXXlgBAj>xl-?5JwKLc`p|ud%CC&g-R;2h(Cl&VR6la!7VDJ6;%gj2SDPIGi?U#R^;p4}LSDuKO9 zi{0O|pxV|~rr*P)xdywl{;BQ|f!AW*H@um21@0T+FZ`2%Wqe5&o<2UltgcsIaY$A& zU`ikR1RWh&jG|S(BIeeq;B|2e=Lj}r|1%0h96kb%5(p*nX!dS7sy6c;IXi`MuHdy_ zw&geVu>+hO`LO{yZ!$xVHTQ|Btqz7Cu@R5>@5#;-BO8x}Bw}En(o+D{3!7DN3r~3O zKZPI1h$H4tKpj${E+3}~*wpw{1OnRT(5b3l<^jHap`$NT9pjBhZ#*z22UAaF(nUHZ z51z(koODUPOehThn-W@p;liui>?g##~5u) z(<(!^)kV?qF{E0Is4aWcr9vCUm)E5N)>hW%+R>f1pVdPQNvM|S{UQhdH~l}Nk+MK; z6w!!*zLs@Zmuzs7oW69tE*I4Os-*wGuFN)2W}@ySejvG)M|7%AmPFn2z;EibneEv> z*|sARx<>CWDufRYz(d#Wup+^+De|$#R49{ArIrSPlgJnXl1~3?aBDD`$YkHbr7QI0 zjuC3(DX_#jVvwCY`*7ov{SAv%W^%lwV2q<)d@eu5!F7#>-KEKA0zMQe8s-sdjry++ zcK`#bh!rSZv+p;NDBy{nsH@Ai%jH|$+-ZO2d9ZqJI00+2t@1ss9G zpRHK3_plT|BLCH3t>|tY6s@2y14IGp!R;VZrNS({WVdFOowh)w_f}+*&~P(vCQ=0L@c=H+pvBRi&4};E za}_1a?JAPm!bVa($>=ytZN#v~n=!tAr{?#T!VYEYNER;hQUykA*%(GoY91}qs*iI{ z{6q>iE(S6bvRFXdmQp_F$?b~f1~!EvPgnUB^Mb*P|6S1lE0ois^oAzn>zWdFe!GVt z<6ZFM=1P#!iAX%^40A4WjQb8yCio3@(5=qhW3Bzy?S=T0j zjrdDm!2p!a7TPScznj)4lf>mszbxy*&Z5&>=t&_qWF?kkdr)B?* zvj_t&25Mb-#!c}yj?PC128xsgay;eaX6yfO82dxWYeh03@B7HWt}+Ek0?4#Ta-QoD zA4x~b4BKJS^g82`mkLt8IKEE`pW2?Xa?(1|qETIiqq+&BwfdndH&5a2iH{mw{aD+x z)bqL1Cp6fffpa+gpjvPQ{xhlKljUy$Aw&F?S=#^_m zoF?n>RaN@-V>S2Sgt)@wnucj9EDQtGt*U1>o2J~;!JJQD5g>@gai-6mA|bQwR^8|$ zPU88cj#VxXw&t=9Z_xBVm|1HIp^dII>+*!Zem`&9Ab_;*#0BeDoz}s3h8|FfKNZm! zCeg<-;B0jIFEq=Sjc3g|CCFFjovd3`f>+EjIbnrIh_9I|$*JRs%=vH8ru%W!VFt9Y zUc2Jv3>QY=qrQ(Ho=7^%mHVsSs5X#KV3j{4EKh)mtoPG*M2JAaU=9-IkWO~mXTP5= z39s@AIm#19AJbtzU|)74nHaL__Y~Fl^uqiN37il<^xO*~ZZX!~Y+^#ThC4o{T(5qV zbkSj?TTSvc6xQ+F%RYLS2ulmTMef)A!W>n6BkTv6Z|z|-PAhC1H_iPPFFkDrjfD;qB9uz#LM zUfoZBKPSabawE3HqxM07f0RD2I5k>S#jg3dUP@_^4(lKL4m!Q<5f|ne1aUMyfLu;d zokmjM@GRaHyg#D5CA!%wZHCe@)6Xs@1!{6Qr)CRd5b)?s{?)Yp&o3F~a9Yy48IiNW zhnZ;*gIG*l%r+iX<>4ntwe^0dYc_SFnr#(N6oBhsb>L3rGzZMh`*fozaK zoCe#tQ(5r$hzP+xa-LD4Lr>>yXjugn_6+0fb0GZ?7GDGv2>TOM)wP4qjF&VD_4B+M zQ`wH{?L*5dJm0*rEa^DE@jmAy=~}HtfCd{sMYB5=THoOPQEPuBaj0Mdn+$}P2!u1@ z%gCJqnQ(|9O~<<=R^yiozx2YLpcqV=@614hzUm9FcAiPiVt6{{-7BUgIM)*5^_mA_zURD1-tXVOmFDs@SyJ|d z#jH+>cN5jdES9%Z@DK?Zy+$+uHMzu@mgjSC<2&%ZUnp%N5-6)qKeX+|1IWHHN2XYE zUl1pG3{$xKQOTc4ux`oQmIEjwZ69Ocjn3i~ErF^2Ga@5Nbh9P4(E)=+r-r|z`OrLR zodcb>WkmUzkZliphe_}|+f%s&J>j1+0=`p-9@w#`0}SlCXjYOL}B&3w;~V^tR#75PdD>+!-KPW1Tu>(S3OnquR$%ZBTMM$_^o3HJ^)Y5IQnp4 ze6#6~+L=mn>_L!AG)S#h<-GqHPzjSQ#u9$pBVV*i3BOd0$LkNZME=A9PkSN-;x;_Q2Mf^6 zBEFT$-*s`fdHW$To=}vck5il6sbk#*_y)Mg(BsAoKdHms4<=IsQS0#^n%=!u7i-j- z=8{5>q9hoJBzHG?EZ>Y^beUB%{&BRg>#uoXL2;Bbbp74iQj?ihN}w;`c@)d1@k>-Q zL^tq#MPW9CwZ;VxSZ|PaRjeoUyZ9RE)YH$?dBszLaCXnm>OP?Ct zC$RFLvY!2pT_Gs6WLEMAzf&F`)xAyWdWR-V4o}xr?dq~X4L+PfK>*0YSV(1#$a5)e zd+>Z_E1$g*O)W!t2ph1m9_>-`W843<`zR$WItdc793R@MaSNo~XL>?u$GKlBeVXS^ zya-Fkf98Oz(vJB=#w-aBHCP7pgUg!AW6@rFu!UmgO9oc^75g$alUjK*H4MgfM^f_1*jOUr+8CTZrk6$&(3?F z!&yafT9!vHC~`+hBm23{R`f;IFN|6CKSvmcCX<^ji%>sPZ2A@l*Z7Lt#E)Zs-q5Q}=|bzhS){;eq0<{0 zBpoiVpe`K}%`h!P9jfcCW7+P8K`H9l$*x0=B;YWy5kL?A>o;~(#J|z2LQ7|L*)wnD zm_=<94;l*drS0*>?zx=0W;;f5sH)*3o*~6SEPnS7$H=Akh0KIR1k9_tbs-jGU>17$ z-Avea#DQrNpGoJL4Uth}L0jfvZ{sZoGLCdp2Bd|cil2n(H$LIE;!$&qaXQxhO ztk#ApJ+|=sn<}zjgJsG-TfmBz`=jOLM5R?tEY-deF+QDC;T0OSyc>5rI$dUc)CX)z zq<*0AX5_a*ms27khs7zxdyhD5hCTso(6`5n>FluW>$HWgMuB;PR4FhmkI+g?*vVPf zGJSvnL5c-x3-aYOGHg=FUHc?&cCj5GK?5#t@lBQ!2&>26wX|yIG}uK7^8#9@?MrjW zjgw4{^936zS`pYpz14XPA!9%ycy;7bed-G2lkP;Y7R~WxIcTJ%+sSUq?Tnx83+izb ztcKa4nQ|v|obPPmEz)&kXwCnsI?G&LV3}ajs5S8Yx<7`Zh@1KDcpKlDuD4uo-d=NPJ`6C!FqyQ*~!<`)oto%mm+0rS43j&9) zU~fz-T@%qt-#0#%p}RIM6Q#RG(;`kJ)|r(_>QlLCrCf)Ytno2S9VS{AuKp&`c-Ri| zGDLSIimi@|ZQD zhPxdUXDD!Zpo8bx2mb`|U@qWzp)d>LHXvDQUpx$V?5%Ut{TuM)h=eGE+FB7(OI7{E zG4^VKX*kD0ep-bwJw6+G)HEc;)$Jvi%_F;?s6K??nGC$%oW?5szKAyAM2j>M3BKWbK(>mypiulyF?7=>^a&40P<>Q&IOXW$VVWnMYtpmME0sKhZO)Oe zh!>3@Kmb|e{+}XMr<7bDn3fXYr{qXXPK$|S!jqNcXQf&XWP(PvQ41c7Q1^Ca`>1zU zFIoq^1(ei0&Sf=jS4MCa)|M|3oai$>^S1i#9>k|NXSQ2%dXF@wHEU)!y1%5GeJe;c$(V$lB1LiN z%4dA2qEc^+Wfs1q-j$7`;d(b<#n_CDV z2ErY#YTO<;9QQHBvZ%r)M~c=*%8|`GT5xEQ_UZ(0@m`pA@tAmPe*$iEe_iF#d00(I z*cA^{i|J0tjWbm+tS;}m0BuJn)tZ||9_JCdKvitKu*F5d!=`Z8Mesdv?~;_N_KZ)# zs0%%du$J_64PXC%u6Vjlmmqh%B$Q_ae*j#(@4(ojXU4AT%-M;9o!USaX9ONz2caN& zIC~Mwj8&z2Vo2!}Lz9$8Ot+BRpFUT-5e9=tin0sJBR!WG{B4tf075Smnj%C2B0Hl47?g5gRzy%?($} z>L?xoqRnnp+O~|mv&e7i4*XH;K!{56X+@EJE==D}aVlil{O=Onl|>KkCShCU|F10y zEicQRe%sx|YXwmSD;|b?fK4rS7}zm_07V!<^^o3Rnv(gcKB_T4D1MEZ4qs#E%rH7b z7oAlLSPO<0jB&^7?nn~DkLj7X%K5BabJVV*P-C3D^XoWes_tp_e0kx$6hU5=<1HH7 z=BJOev~+1x0>uV@ca9vGrpvZv#j?(BaAUW!EYu8=ncU$AT6j=<8yam^6IPI5sjMI` zJmV9P~Sp2e|S?geOHKPx@y~+VF_Ed^06%N^(yKz91v82L1Ia8H^X;Hkl%p_mXavnYJRU?$ioP-?V-^6EM zcoAzWDikhSx@7^#V7p|Y$2YLsvv?%(M~y)AGr|U^YMp${jH@RW)2H2zftb_ zgxaYU1dB?O34&!ti?!p%T|^TuNyHGAwiYuLNV!O+2C;5cHIIlw{aD0$@y+9&fbp(= zcy&+qiUAMVN^5?`&j9c8#E9AAC^vJl7>Rej%B1pHZ{u-;T}?TSuJ9{YRZ~F;wh22X zhnm~dlP8e_M)sozpq8Db%%|m_#x;LQ=w7-ECW$+nw~k}?zP>9@bl-5d`6q2*sX$ik z>*Qyjfj@D^jIj~ZWiIyA+}*V0FLvWR&Uh&R-2N+WoFhZNMx8U&G+-t3C$-xL{{i~V z63?KVN~7;_BFhQbx+pOyk>Rcn%IjsD@;p=czAJe?AppRnDO6Mnz`?Rhgh>5n^5C?z z=+Tmx<2H;baw-7G0?i%v$4lh5jgI2rcX%s$>gPgqx<+G@HzwX5gi5VI$TfT4Jqu8oDr*vxGNo?6`KM;skwcLXdujn+^WBte#K!kfe44~rxGjr_ zpAC;OtzqvB5X)?VZ(YIxgQSTmKehfl?x|sG3GPpk{1eC2E8?7p8BayIl?9m$~%w+1vq_=OXtKxlvB0f=B|R;qqg%c~{-s`jx43vVX>uQP_7tmlK`SdPvo zcdWtZNEx!F1I6W!^MG^aZZ;2@M=C2mu37)Nqp!=s&s7t9{FVI2(Z`xkEJZc!jJjnUykO)@HkDy6e6Q2CuZ8^eR z)CyuJ@Ml072MAmY>5B-x99`Krk^F5OIWqvr_lH zf>&qRhDC+!IcuCi=IKLMgmC7!sbS4I==P4yABkGg5_4xBg}Lc6Y@ z_o!z>()WSkY>myFQg2tfwr;~kjZkyK$pxt=#U`>={HNq&2MY`=iNjNQmAq(F(%EKb zn`lXPm*RmYITJ<$(`d^RLY*_c)c2A-5BiMQZ`G^>M9}#oTh)Hgw83h%OqCN&6v1B= z9sA+B+~WZjW%rjCkm#L=ZpfDmf`h0;Dll$)mkzeqjHUjhS$0S>!O z!9+m1^aWvqPJ}%)md2zxexq=jKks{|n_1cg?){;1y~du2vDX`^oYyZRO_h(`hqq%!s8UbiixgwpONlc|3-3$>(sjXK5Vz>qxmhEG~6{1 zrc$DX&Kq`ebNFaHUa%OyAd?a=aAA5CX`sg(qQ0d0`J??yK;X$ba}A~BHaZlEg!GM& zC<(DfA|-c@SsCD|xwuC@@ku+VjMLfekf~UtVfPiYxg}w7n;kxj>S(08E*ku z4w_Di&(B+OG9)%6Uux@#`z4Nn`!YNOj3gRmA+aPFjG4x3IHz_+0B2F(hO(Nlp-Ysv z#fWO|t1mV%X_@`{f|>3c7C}bu2P$Uv&ZJV9&;t82? z%yJ6#fkAokMw`m_buDzmGYZWbtgrv=)A~b4pHqemyKqhMi?3ez77KG%gYysjesO9G zF}#3Y6}dYCpu@0y1;V0ru~Aex^hK(Hv#GzK&nr&AEt+g2?cKlSH7>{pXCPfhMazv|1lHS~B+={U7TrpawNl)`P2JD(n5 zqzPQl0Y%Ve$b!vEY&RpY7;H6+Ji!@J!+r7Y@%*?hjn1lOr4Vj4}FP^%8*>2dIF zWv^OZ7Xr#-2_@&Czr#|E5-bk7Y=W+B$00DTKIh>Yg8}C6<0Wu8a72v^mmXq zJE3Rmfp7w1uM0FY7q*zSK%yX&neGHRcu9Vo+#0sP*)(!`nw>#5+nlN_FWOKfK-&!Z z6C<@Klc>hVQITU-(}|{6Kl_-BPa)nGbgSfJdDz`{jmk*G%FF#7i#~@IR{)}B6V{Ng zd_$cO@ev4DHFaT||7TwmVVYKy6y(J5&eWu&QeycKR4aK2r?tr~r1WR^zUP;(cp(yc zg}no3WZ#Zrmw&e$e92|dES-k8M7l6)9d;Yf^3^{j{KCNvVqsY@`1d)!{ol1+NhaBs zy_($8{hEyOGzXHATxZ<@kVKtQ)n?rH#hZGEmRIXSHPLUJ?)M8D^*O?FF3phUY^QO` z*f6I8tw2IJ%#AkneU}l~f8{&qE)PKgs@p!HRjz<>gHoxmh{Zk!#;HeA-rp-CL2YT{l%V=Ml_(m$& zyfTV2S9uX28jlQ&g>(XOr6dg$-^1$~btnCQR18TIGV>;{fx%IKo+-0$Vsryr>KUXo5A@1=W z{Nusje@ee(3sG0b`s)#d`v1yq1CM~9eiEK?&+YF}dn%j8M7s6UOJg}#omdi>2bTs# zl0lZ?7J71p@upN-TfkA1nw-uuzPcbpl=zi5F-3HeZYlgeD>#Z0;=6+vsF(yw%qa@klbqG1Wn|o^zWD#0RI4?0LJk;;j9r zEe<^w_2TcNLgDtPPkR^py0Zl6!mW1{EWx4ze_KghV!~BdP4KJkuba;XUG9OkpWItN zV-f8c056FctP$Xu&mk9tVRhU+Z}IZ}@1I0YZHy#Sp@MiFIl!{(7*9<=#>Y`v^?N=I zXT}3=7Yu77{LUFB*!GM;rj`H;B&w7ju=Y@WepJgL?p=W%-ae^tL*_zsPP))qYfn&{ zm9fJXT~U05gWbdbsf~81=ZQi6!D>w7+Oubs~Y!O#I zCny>44)`^;)74cW7XKO>eIk7u+K1!bL1UL)hg;C`qfhlo@Kd{R8IG)+pp#!_CxdBQ zS(xpLbtxhIZxC8jpu$P8u=fl{9U_*t1@h7PLWuR=klme4$wI*B6H&(o(ZiyaYjIM( z`{MXiPF#kYld2L>M}=EDY`^K>#jXT5TP@4%lw-*_8I3Z4yy4j?xfHhEVNWCy?t0<< z*t0&nZ_;6CUg^lot=_@-&J}EZNGvJkPOH1Yeff$w^{KoTT8fHdj%DOONjM!lM;~$# zWi9*!>9o4s#gNqQE%=DEee+MHG=gy9O_-JMM-3eA#AKB9!oz_9 zLix}D%`wub>GUU^5q$(&wL*OYY4cZEb!-6ORrF`t8@r|sxSMo|gHPWwk!4=9i-92s zTV6{Zd>yizbZ4vTBfHA%Qzl+h9OW@BfS2j2YxGfC+vYPxzss+ax0vSbJK`x5h%6f2`&?5-1$(g6d@~~G?;y+C%h1t!2^%t^az7q3rS>KE8tUJ` zGYM<5ztiVvaI4(^g9??5(jcvs&51&}xj_K)s~DOpw4ZuS;L`!*`=A@Hb3~bkKnEUQ ziogLBV#LsF!r@G;qdlD3nf;lq(|HFBocGzaBHe$8O-vSV;E^HT_PaFWb&vTc=rg3&hgV@j0B8ANzNzaCBKA`e9>VH=n^S5i0q64-yFK5{X`w#li71;BlTQcNRzmbqnBGivPJlk(M{X7N-J5G6B|qbZ`BmgKNI_&JtF?cr$yBHdOF@G zGy2mx5sR0RV?JZ_O}~?(Wmsu{o=y=|G8KvFAkboH?YsUWb7ZFk?cB_OV)i-OV?!M- zeaG)*!~BK!0>r$gMd`F0zks?v0v=NbD%t>6RB$Ng#Eaz9@$}uwmGf$0xW*z4hK~E) zopGaGC49jOYTS8#Ap7t;BoXwTC!|t`91eqWJgJ>>Q42(C3*>m>diV5BM?_^HtMp?j z+pxQ#q&Fjzt96aPwxc3_(Ab#sObVyz*(RX7E=`Sq^rUy@@zoTz9! z#ChATKA0j+s|(E>kj1kH@i+_i()S%-=bn33KiEK-ruY}2sckSSv(k(L1XEAG^Q#O% z%pdP=|5^XUA?e*tnikW@oe63wh&V!52ffOv-Gf^YP*(s8o>-z;ma1{@b7RR8(c1NB zJVBH+NOAAXAjkCeJ;jvK&em74cwJ9Pk)!u-9yJdP!7hL z0~>5M>+f-E=OqG8s>ARe7D7=oLKb$#`GvFOTg)RMiKM+g>ZF}v(tOJzPVok>Et#MzfRm$2H=x>ivD z40jlYh+;{;((+(>u{QTMW;(`Z7iKown zh7*DD3jhE%F(?7AgavQg9__5@d#2B|?wTgSscTy1sYaZvl4Q0;5IThqx|EGNWHo|y zUnU;syG)`4bxAJ}X@#7cd`MdjlsrjNtF*pVc9Ip&2&+5sCH5y=ZOYO@JgExm=!$l1>Lmm}3Vvm~f&J@1N7ahJ&@R z#M32;Y0kq5`VGu*WreM{_MiN7Y3lWK39gmzAQ7zTE3RXcNMvL30j3k+C^goLyOYhT z;+f&Z43c(m*p-`YM#l)f5off)1J1+FjzCG!*k{ttgag_1VR$pwHp76!uYRq`Iwi25 z07+qyZTd@^skOi%@b^dWzw6 z_?~Jc2e0qLPEdKbtw-kF?qE%(4zFSAxF5wQbr%oTL@XHXaiQvTwG3PDLuORmvDlfi2LY7>(rZ!M;+^rmUI4_x~f2; zw!2lxmM(QsNQ=@wp4jo!%L)G~#vl;EpiseK3(d7;H#p#qt+Id|k3$n3b@)`1IM5tG=1cU<-+8}+$b_Qq>R8o!F- zP0z5YRcR0e?Zz1}f7f`bpa0%8Sr=ylWT-bS8gQVb$p-te5PAX{zp36l!3pzFi?s$K zL|q{u!+uv_nmUGW8Gj*{4?Xe&$4=*l{2ga9+@z(oh^Fa}iZKRa%0A-%lkpEo@W3ZH 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�SJ8%AuE{$->J9#C(CbXJs9^*j1iv&PZgQ(zvv9|Va6#YA*ol1uP5+2XG={3kTq=NKWiL-x64Ko;cHcr<;m9Y?+QVBN)_z-9&L`WyfJr9J zrsRmcr@?k<%s7!dpE_Y)9y#e~Npu;Lp>u^{&Tp3JcChZsr?*_|-~}$c0wveNp1$O$ zLE=X;g4>U;q%VavSJ(YGZtFo;!Uk+_*_7P>Ud?U?C}l`O0U@m%10g`*3LQk}H}`@A z_{h%fIR5{nx1xFD0x#9b_B@!0Ww)pU1nL~WTglw}5S1yT`HZX4cYyS!5eeOn8*{G{ z-|gb=@sssRh8s~%3OL zE(;f-dCEgeiF>T{@?M<8!My!-HMg&1udFjcObxHF^>4$@k73yw3fqG3!Z~t zc}J%eK~K?k>=#vdG`?a}#H}e{Q*QY=Z^*6^uRrE&oE$h~vO|=%A zZrxn0rMhdF1EsnKJycP^_bcSwh#8{nVJ+m`ui_|6(+ZAi&`5K#Cc?CrTgJ=&9I&3J z%VfskBzk9MZlRfvazEB8D}epE-Ywp(D<_=FD)A5m&v7G^&8Z{9O%jjyPVhlMLd3Y) z$Epqyc~Q-T@7sibBZ>S15e8MhlEQ7T9L;*hwA4WnMZB`=FTI1)AyD2WW-?!oE*w#E zr`R|f3oOZzt_dKdo09Ob0Wi2i-9u}f9Rz=ZD&RLgqz~>Xu;?TLRkbn-d&2UFRR6FI z)mtfMDqbRHN184b>e3$#<&b8Y+bc`sbjbV`1~=;HIVVa78nqp^1EH4f{PYG-6kr#%SjGSGGd{Yyv)OKSI+;(j_fz{Rxt* zNT5~p%cRE2v}oI!gY;^d22bnt_3rb?N0b;&Wt#~;^64;UZk~V-Z=nE!j0Am8q_1Nl zvTuxDwyUAM0yzf0&dvm?E_wX`LqNR0k5sNrtB-boQhN!J^Ub1g#jL*&$m%jQjjiNg z{PXZi+_JVX%fhrCvP!2g;zK!EKyy@~C!S#J*<=mkst|Yf>g#FXFeF&TL0;;DX9CkT z1LsW7so0sqO;eV}wu%5guru{C1{Y0c2fueszTOP<|?F7`nO*x1Arw_e>jh=3)E zi~Q5MJWCSXdf4acgvOSp8dpujlSBOjn5A2z%@(*+(?v<+mk9KAEH%mnE|xL_uL<~Etha5HYHoO0xC@6ul+ z%qhFJ0Z7N>p#U@otw_}Kp}~P~L$v-P#4xTj|D`Lp8o9US;;@#Vx!lT*%JNszTt zW7tnNad-Rs7E}-!P1kEMK_+ie#N?Ph85;1Wx-6cOZmw183{)`U->KPcxB&PY;Qz6( zs(`r$WBc8WRF`5ZpPYp&Lw$CZr{3t&cSiV$wAasC;9y(n!E87ec~NfhgTyyttKP%$ z90rj7K0A`xTR1bk?6+&vpk}s#Xi5zye!%2`7amRJ7{Du zzGK*JU+a~*l{4cKrGAfR5m)+PY!d(F7=Cv%m+W(chr9+rv+F`2p=!aU)B!VjqR|bv z@p5_nU~c-qtYo5T=%P?3?$WhLUKdCzyx?F|Eal{pOeVZR*28^7RTpfia)_77p9O;v zP#n3CYi^lw22kLjalb5cOg!lQ zEyZOv#SpGe(P#^b(m5W>rVXHoE{TtukuN=N0% z9sPN{&amIShRg;<3(Svf9s_{no=A}$9<-jI$`)>GjdS16{w|pO1Uk4G6~C@EQe-S# z=S%5Ad01VkjN-c&Pfu==7%sL3$64vD!g2qb43j`?J%^ARCt@Kyw_Rybw!PGxdw7Kk zR_URQHFhkwo=`^6pILgjaR(M{HqhT9w=IsZoqDeek?-G3WRwQF?IW+wLg8c--m)F| zMOJrltCR9MC$3RFWToQLe^7`>d>E#ZJ{Po6ZuRs+Zy#k%*R`A%bLz}(fr;yeRwoXf zEdOf+y1?E&>cO~ba?5?CaC7%@QR@0ms`pHx0z}&z{e8`C7f5Wa%#*wCPI0JnYrL2vSC=`(a!IRw*9Ybrb&pB)`7G^;K54?mG+HM!ohC zo)Kly%SOUN>>&j@K4S-6iqNhjlxwv2nc)Dif%twZI_jked{*ZyBaeR8hdA=kTDidS@?8G~{Dh&Znsv{^K<9RmOs(~PX=^GOWaRi9YOd>F>o&sn?R6%@HmV2+r zE#4>PJc(zR~F31w*^RaThmH1dFQcx1@$$ngZS zdP4u828yy2R2H*T@j3l9a+%2~dF!)?)RHVDrTfQEu{B8ED;tX*$AUN}`XUQeKfs$0 z7lN75Q#DvKA5yF zH!8#2fYTDU0dIi(%4&>IR007cmv*OXSq7vdT69L)gt+JtJG6@07?r)tiLhr5FQCFsw zBxBQ#A%7#dNDM=hh2Ku_Xk=75O8os>wl$5WdssjZT8DUrz5UGEb6`k$m50a|{Netu zxOC+K*+VFdVz2zXACB(KpvUCnPSZul7wy&Aks-obtvS6lTp1vBX_$s{>9#*ST6{ky zBI*%&9+#|s(K5RbyDKQkxic?k1Ii*fU{N|RD#T&8aMDCYovauQmaPW}vn{p$qw+U* zKP8OBQtt09Q-NHAm-`3pC@pkKsWg5~3aVv~jVOVV^Yh2E^%MhEQV7Ao{do(&H&jm$ z(>P6tg%J~l8h%_D9sVhl1J@HgUO2U5&MAgvZ-twpqHxA~`3?$6Q)6=a+!64GlxBw4V6 zbLjFTON7UxUa@G5)5=q&sd!>0!2D)VI-ngl^>t}f$6yv@}r4kt33b3E7h;us(m=vFcUVs_T7U;w@gkaC+D zV~+p%Jc`zY{4_3tQ%OoI1*;f+eV=3zJKw5Dj|3lj8zRXRz`ZADbhThJe;|6Y(o~lM zzPi|YWV3Bfq+C?lt7^mjv0oqa;ylgTxluPCpG1Dzlio%b#Id|e9V}J>7sKy26L=3< zOHL~gyES$wou62BPwY6tizPH7qVTHd4gL{aP`^=-F5sQ^Q+jGzEYYLFYtV1K-%5>B z0aVA#bmzvP!0lBU<{Kl*v;ieH16TY-cWF3>X{~6L!5ee~%E>YP zh47U3Q;!4%^o#u9zz0#wC1*EU{%9bqKxnQY2r7a(t}p}eH++Jj!-jd4HEu3+bf_d< zp>EnuGXG32UQH7cj|vb@W_b2a@G7{f$?` zxf$szxru54+kQWxAIDJH(^*g5y!Rgp1l+I4H|3-anxZ z)_CL&05q#S_}bAopuI08LWfjd8~wz<6G0X~o65k7wL8p33JQf+0r*b&Qz|m|GPu@& z>(lY7m+02n@JuG_4V(mJjSc$z9h2zagg^om42YCcJ^8iQYz$Hw%|GdJG;oUtMkYGo zh}hOLS>qihfYUoLGXNC4lKw_eJ^8J@Z`LIYJ!a7$&ranbn0 z>2qH(_)HysUWe$7^3oB z*J;81lE4e5#?UFxK@+OKALL$&as=LD4W=o~@&aOWG)~xQ0fWAazyu4G)b6^X1Inmk z+AIeEie!KRBS4sU!>s92Elgs3?nWs#5KukWXslsffN~J?As|k1kM2Y*J37Ji24nJ6 z=6d?7_>S>Nz`}z=c!5cu!rNevA~K=H275Ax7;+c?yCwF6?lv{Chx62l!MzrRo#BHO zEmh9!Ekt<{2xrf70QSB5yG8{ zzReW8Qkx?4Gb}TX@+&QS%HR=Me-jVDn(LW{7N2kT5Hhi&tvfUd6Hf0Fz9pr$Y-T9- z?1BtS9tVuW-_aQ?aAdJdg{*k{jW}TIjN}9DcEhsEx|3aYTrwL-0u10db*~O#lk4Vm zss=aSiCg@P%-`JV2FP5yBPVv&2)@?~3*-Ct5*RDUDGm zC~Afb6T!_uo4AKqU{9p9x!7^1t{lx`is~(}dXc$yrf0+V%V!bW0q(5;#hI1RT#Xf%{LvZ zq9S!E@RIg4zh);;+?@s|X7`&)lDJ z7k2BM8j;+YyYKxDiNlpyLW6QC$$Am8ib7QWN4h$GmxQDhgF}HlkMNsAa+0`Bv1}&Q zCuMH3$e*LKjbOSOC>^>xxVq7f_OX+P17&xp$_~#n&S=)B$2h?9KOutNd?L-nH0G_# z3UqEeP?t`ZLCf#tP-%lboDzcVntV+=kCo%djPu6H7Lir~Uc`;(ht`Q>RWPmRcO_MO z)NVz#;HqLx_09xVe{G{mD7}PY2JS)* zZYzXE80iEC0C_Py&UU?z57K20;q_*_+e2{v`D#J~da>eR$gBXe7k9*vmGb`}Schn9 zK#i!HP#45Z2}wCtMSk0q-q6#SsAVJ2ulgiQgjcHw8&uy05F67)>;wXIt4O)=v4?T& zhaU~{CE~-qCyj?xXLoXZ<>8fj&F22V!BfA)taIoq-dRRSq4Vcnr^05?cDXo09sw-SR)IFbI4#xOKVX@5IgZi)VjwFa+?KK)7ss>!F^}6y6mKi33wvf&{e4Nn)_opPBYr_Gz zK;9l`TS|6ntg%_nbr6pP&y|Bcq&qNj@)Hf(cxata`Y&$ImjB(w`01@7Chk8Z2Je;L zWtDdy7L=4n;XEvWn6TJSE`RXDrelGwcc5h=nr{LN>g}^cIvwR$fzlU8k&wvMJ|;-# z?H7Zy6iWAYtC6)`ZcLM~%tmh@3ikaojkjgswIx>n56`a^g zBu+^xgoE(}4R(FB5(NACCluA430$f zMkId^`@UCK$Ix+}0%nWj(!Ib*geSF|t^KmOAO51y6P{p!DTO6;97~M{IwWFup-PV5 zgB;k@unt2{Xba>Fi*+)k?R=rt?Z>2-@%ic~)9wYqcO8>0ux%nu)cx~-DTA3kBP?K{ z9L%b`@I-R=l&arJP&(`wWT4?Utd(kj%O}IK!nsKUUV1YiNlqVTHCOSDGgXnf_M#R) z%n@jGCME-s)@*aekEvnd<<$qB<0mrYJA@zIP|aFinJJ9~fVpNxd~7Q%YZU2#M0DQD z`lq<-wZ)$_m`6%J!k~94oLme3Jq`i2ga05l2oBBz{YAR3)7^KuR0+R(KYA%k>Bk!@#{i5geb#y zDrn^y4#yth={Q)fduqUF3=PtCz~7WglP#2DS#~OD&tQzbVST+cxet-T-Y1EBn`K`@J2Re;K4_DfTY=B8ov0|vF=y90gI$Ts_EZ8RAasvWDVyMh=Y@8 zA3U(|ae1&EdVYg+c_fNv1HGPV{$%8hNkP_VbkfGO$0dO_6_h$FAQ&a06_-c%i#4Tj zp=kOEnxLk)WKG)-6WUksdjGtcBKb8c?I%Nj#~tK?I#NJgEcN`zrltTSRy0V5;6OkI=*R0K4bGSO;Nf1y-h{@uJ|IXGT#x` z!ikz@=@~eHXVa``w?EjX5x{3d09SVGAy-Hfc|+Y3yl^6`sR{E_43l?*>6L@!fDa_+ z*BCOxqW?rbm>6`I_H0?xEx}8m2FpfXw{pP2;z^YmgI1X-P%J9aeEy?fe5~3G`dG;V zjrfI5P_bK~vMJHOIu4 zQCnL~Q`aHtg4(*APY~NjhF)1LZx0(Ek&Rc?#mshioK@@F2ym5 zSZx-0;H!L|4GcUJ0X8W-6^_yY--dZc?W;e06BA$#hjG2UdYN@HMe8%gX^B&K=Vm3F zI>$&j7vXD8Nz8bjhx&FI{+)7+*C!ij6_J4@-EU;WA~(1@u$xa!R_(zb z)XbCIF;cDK*Up4RvpDFBOYh0AmaCF%X&v5f5e7NVI&=|%GI6Zi-+-gFH`|ro$ zkl|3L7@-sZXXX4FR>b7jq+yQ3j3@)!GYXnk`Ab^yhJ0;(zr6PGMKC= zq+--H{+6obeO`3E&BQIKL9w^R0?v?Tw&kYpVLnJhmjt*a& zYCh_LCGEd55R)q$GU&a$?JD#s==DOA7qBvyhIlCR{N-Af%tHuoU8(U_OPs^+8_*l| zt?)?60}ag2O3OAvG9WsgkqzFJXQ8}J3 z6in*{OytQHC3h~bV}Oq-ieT|K_x8%!_tw!*P0QJG!T9+I7OusgE?@}V0R5;S?U}(Q3`gWxOzU?=sRlq|h2&tdZ6w9u+ z_RkJqy_DUYiZdY-zBnavFh_JY+>`Qm-U&!n(4_RMA6Zc20uO}vdLRT0`;0WE(JF)j z&o4AvaSCNb!T`!i0ejrXeg*!3p2^g>Jj@TzQ9S?t?M)|QHSok64J=>sx=0ZM&=QHD zjUK}s1^Ps5!SvgkgiuQkLvxM9A2PBNjv>Ab?L0&lojexJRUrMQ7pTH;eNUwRZ^@h; zXE)o%wC(PjRebIKcpr@}Bi0&g4*Mb@rIiV`rBV-iUS#f+%2`O5gRs~$Ay+iz9WVmh znkA$m!VqQVj=1p39vnm3aaEBZ1H7ab2ij^GJ<#3x$u74Adt2Hzh729#j@PHO%uzN7 zN6me`9fwO59(PNK-hDTUkRJm!;_)yBWoHzT;eMb?RR-&`QHYA9B9j1Eolp(8Tt;xY z{$gw~?B>Xm^}0CEwQA!UxW4qHzk>nbz->k|h;GJ&X13re$4cA<*C9B*@KQ#BNtc-} zAVdvv9*55KaUES63*`f?3E5Fg5PxQ>h_s!RZt|I5dO7@mgGa7xYyC8>EonKgU<`%q;aEN!0{c_59xKt)#br^=sIm81!lK4>VbmX`-ao<%-Nn|1751q zns*I650;@jh_!^40W4#6Cmmfk+GaBS6+`!&>sh1o6ZZ>2T;_ApJnA^v>B$+7+jJ;o zx@1--n6Q@h-2kkh9sH zfB>K!yYE&;H|x1Yl|0L4p7O6+!}X`jbVzz9O<4;K2fi=~l=c-f(aIEADDM8LM!D4& zhJg@FB2v|%;sppp?HW6E;1x3Y>gYKVe}I6_IU#1ZJ;Yemm*c>6!pJVOvrc5uRh`u% z)->VCZtfdFL`L(FFVm$VCh3ch*(s&G&hLa~C5zZKBF7NN|5M=p` z#8-^ed!3jU2uYn?vNj`=vc!6&p zPY7pn7z#c!GBd9C41EAG_PO~1$@H$P+|7{EcU_D ziDyUp-!FU|G|j@Rq97`Le-V>Ms_xW>LyB=}#4}*cXPt-PMG4jiR>HJ4G9C>;a?i5S z;mYBs4&tE*gvQg0N^_6jc+m~AAHccGLz2C*O&=_~jzjembL9|z2cW(#f29{1vbG+# zAINivtmm*M7L3B?bq7YprWPFM&CT7Qb0M}T92)(%^7KpG@5bdfDQmT;IFeid8-Q`eb6U1<^c>b92*-C zL%g1dL8HAdt?l0?y|dWsWbbL$>tDFzA_t3>(D*Bm1%amhAgoUn2amP%zMcBF1U(O* zRZR+k95b3`v^zLho?QbcAANcx0idhYeP<7xj=|B8aSvW$KBGzD zkr`wXbYj%wow&JuxZT3z1`r>I6c`#_Ov+7Hbs)nKnS%d#b37yy0H6E)7#Bqv9m9Lp z*lV*T)r@K*E?EAhX}4}!gd$oH78nX{NBU44X?HuffI7=k-gkL?NhEyCIu)H`An-@3 zfK#Afw+Cvk8UFKc%*O}BRKCHr3`{2^_`8=t+Z$WfI@yF8y||!WA08&h-|FOdRVj4;^LbAH#6PFf@9ka6Cyf5gA9^8;uXYK-V1=6 z-<9(a>?<_dYGWb(+KM06T6?lMg6bZd@HFSLU{z6brP=E9T&TQ2&)gZq#s*bM;g0kM z0W=7Je4CK#oK+N-ASNqq_7l>A{SG>?hgJT9GjD}1`w?@NpYs=6-;^xQ@bg50CUH(> zek3GOaB^e=e^p0NIcx%oRl zEH*k2Vr|ns;ZbHuSb|r68G2#`%Q`Y9)K)DQc#qxprU2U!I5Z`W1NhN+_-ad59JnR0 z)Bz#|#QQVXsFBnSBT!J(8LI4ZS*5sbVAdWhc^~*>i25Av+4Tn^^1|gh=!3s27-{ruYU8p=;Zd2FfR8+aNndac!^$;MeaqSeN|a7 z$89qjIpsV&#SKsP?V}_mL&$sqk|z4YPGjwV_y&I0D{zN9D3}Iru3m!NRwXtPk&fgT z6l0ZNt?6zo@$B375P~K&D;!WXBKM%K+uPC^;R=cM-yCJf!O5Sy1`-82KEbL-d8^9` z3M_+#{Hqj_(`%k#LynNRgY^j})tV(lG=v2+ZvHR<-whDA0Ava7vfKia5GN+VPL?CJ zsrhWF)^69tMoapAEXmZqcEA?U3CkAW-0uX`Q5e+5tsli~$-V=vp}qs5PhG?(5?4fD_$!IV5fYm8kG?6d1^c?- zW_uJjL*is{6ZbO%$7+lomCD1S-Z1`vrncffZ=xee?*hG~0XZ&)^^za^qG#~JC7)}x z78u@)w zH!I!^Ghu2{^oP?-X{ed&j#BrT(sEKU;a&X@gw7}y`D2mcw)zZF+*$yQg@v~Q8nZp8 z&@nJ~Ai$n!(>&T`|3J$|mm=ZpBAnAhGCLpw9e_y{Y-84< zUY^k*_&%8wGqcBiva1|vycA%typ8zAmkI^aNJ&-kP^uTX3T~3>BYM6wKNc`J z+RJtHVFO1NoC-0L{~q<3y8|PZ;<*nyTTz3PT0&X|_{0HhB9I`0x=*KGzs%+uJee6{ zHq?9sOY&CIZgiPJ9OUyAXH;-0MqBPh14sGopNn`m&T zXrY1y)jYkk_c;<0qG%+T$CrNYvqEV=Isd2)Kdo&2l)6?-WpcNFeWmFj{@AqJJ%tvw z`@U~mSn0I;|t&7pBF^)%HspS!|Oa#+O`$CPM(BAs=^1L-+nUxXO*Twoh zQKT9M0})41JT2q@?sA^e*S{-EJ^KchJ@3wDSa1$shh{nnfvpT^%U(-j!9r*(Ci0hM zQDC)W-cQwn`e(d^_u3!dZbR4M=Mu#sgH%SX9s)g#mO_MSd}5`rSW1V}&hSd%&>fusP07w>H10C^COQbqJU ziDEoL!E6I?)8*2#1Yp{LNuj62ojQFw#TcyT*@<;|Pu%7B8~M%-OE0CXQ9mHry@mfZ zE&It}Yx~nZXr1=2{&?|A#sUtet|@kG;i%FhyW=>rY@-l7o)J=+=*T$I~M$ERAIlRA7^;p2t^s!QGL z!OL1HS|rI86d(*BU?hb#6-q0hIsf-8VYrFvWuMP%vGGnhP}oSHE8X{BgyFT=hw~|QvE^?@aMfNBW@bN zlyek#ROvIoWCzNF2Z=2jCu3)B%CU73@MDXCN%i}{v%|TQ zr9?w6om~jO=gN{`(oHu>2MjMKq+_`2W5ah(@EjgI)y0eDAXN~*a`nrbHT|qP-dx(_ zwyZtT0OLP-T&?B6-HmR|&`Ug2y_QZ_`iEWvRosnegF%$|3?^$~AB~4j^a=5>#xHsa ze_~;nd@Zn+@oU8b6I9PWjxf|@GL=-l(T@YKl!726wXegSnwRlvQ!M`L!7BX;jG1TGVf?%VS1;LPWH;-;hxhQ?+PApaXPvuc$|4=d16Jx z_`f)mf%qwCSXEMnB^EJ57bgYk=Y1@gX({#*7YCofnVevt+T zAxYf9zHXCf3Cz5NxtwvxOXll~BaGwow``%Og-RY{vO8L3Ps7fWc7^N0z-DjA`E~u8w1Rq5 zqY$;*NuxOmXR?i%mSG4eGU55mMZ2cK0Rq2oGWadkos8&*I`65PIv#N~E26hn66zjL(k<4OUj$FmRbF~xD z0rqk?AzUt2@5J8fL;d6_0cbFF+F&8kXr)fF!{#ZKj%?nN{B06={amH24^BF zbIAf9cSDMyR$ju>bf;xT$9=8HI4vt>ks;lW>=~&~3JK3`O%asbwDLYXy;{-=Yn;lf zmr{^PN*b3Rx=Noz9MTIgCnpoAaU+U4$RyNe_Ee)YCqT~wdu zent$35~k+0+uyymwe}cXE4B;VHrhL+h&rm;+QjkKwPwp=rKk9fV-*^TYlDJa3?zr?jFTJX9J5}1EDy9}V3 zyki4IiYKJRmZ?8d=v9}oqyIVsl)+yEq6`k~ubM*eh(pPJ zj$7q4aWX0RW|@>W|921|xrYb5aMg;Sl?)IVn-7Rq`a*A;$DG=3ocJKtBN<`rs zl@QDjNV|1>UmV4RiHVdn2#GdmyAA;Gx&RsV-{q(n*Hj9JfcJRWk@GUaN4DEY`eD5%9ONvLnCP1; z58bcZa-HzfBM}ii0!ClR1mc4{vMDJZHG2H_VK9%{X8QP)^i{Mo0YLq56hCN4wnImA z)&R~y&dyyYb7Bh&m!<<&@mq4rT_415ctCwnHo@bPDOa0|=oi@L{=@E^N1%3_k;P+7 z$+dpl@kqq!}s=j(dvBSr@0;P z!X*p{j(-=u0kr9tU;Tz;|Lr)0k~VHDCrHtNnLZ#>cz`-{EX%#Kda7sJm%o&8=_qO% zbRtGnTvgmEU9eR`bb%bwR}cs)4OcB}hi+!JRx}Nx0r{a$Rgs!G;vEK){oCZ@*_aw> zn&`J2zR(ckju=xG5zILHsOd#V3^!W=_;0R_2Six_QtTOiJ~NDi0Q_~e#)cNKRg4x5 ztSc-EY<@7W8e+Ki(;}pcLUmU2vi8i(ThoPMkYUZ?U_t(FCYF9mhf)4`6wyy`gu3{| z1Ru&wI_lWxwsF>EzaAs_ME@A?YT?#~9Dt^i9!=`x6XR0)$ksuh z`r1x2^}nR5@X6rC;$NZNUgEQ_YDdCk7TnHSj2t&Y;Ym9JFxvKCG%ae60CtSt)Nru;cZ8Vc;f4MPbW5SBX29^096jw*3lMMKAG|Q*e&(ZIz#W=F=s|tSz$cu$Zsa<`7(0Zs z!&x*mRCoyt+i@49ruXa6j=SD>{=N z=19Fl!?tx<<2yxSmfCarT9B}AVk?z;$p*@uFe9WVo9@)^+`1Eg1@)Y5H;(rfUmk^+ zV$+rrbviV!o@YDlPVnLaqy<~kVB!HKlnb~3*0Un*sB+!!bi53b9h!o-g&8g6I)N*3 z2R*}ac9{hXHAGhapNi&&2atA)r%Se8;Ute3S8MSG%W|Gkoj!pH_{6F<4@FWcsz<|4 z?!}OT)6S2yaEuPlbi#P=?tq&lI$#mMk;6~or&`ecx?T{0 zH(S?uM9a%Ljlp##J#4|07s&ItrYQbAi@~hx++#AQR}p=#mHCp3Ym}WMpluo!H7K*b z#e9$Yhv?KWwO>^&_6JmmDNmH^@O4#Cy@+r|(Qqc9j$kn?#@yKx%} z|MToS2$U@UKsidvz8!iNu*#9V`Ctp|&1mb~JgDwQA=Q(S70kX6ajsO3eBqR0rk`gh zV&1BK0j~T{d69(7K)J()#zWyI4XzN?CQ^7?oMkX6d3&%{%_F=<^bxlA_^o00MItBX z=3KoXf17~J`lf~&iegfb?5fU*eCCK0@lVf7oj7}U1)exVQ|Xox0UPaAl1g|Aq-M z>3M#PIoSP6Omzxhtz7wG4cNR^dwOg8xI9;-5RD1w@ueg(DFsQ<4X1iBP?G|fq&OTH zQJBX%-9)$=nXy^WwoUN-y#Xl$U4g+Luj>^p&?FyNP3rO&N*$aaKI!{(O03k3;1IMpelJ>emu4Jm?;h@aTlo2dH>5 zJxSpu3d6FU`Te_7i3R=q*wOeTO6p|}P2NQSTXn5lq<dQ+ zaON;|--)+c=C8cHP`%rig2i6$AgeNS+#@V)F4E%tN*;7b;+@bguqnRZph!XWpz6N$ zD+mZ5wB8X=_~;V#8IPF>mHX?g-uXvT3-jRDA97tDwCnjacJ&(M$#r;k_X zLZhv?JTrzd_>SB0|0)&VEqBfc4;P1PFIKXaY@Wzw=8yNuB)t;vAzsqD6|i9$TUMTU{NzV8~9Zi1;N0 zW9THACy=q%P`9-9#fm!wqTN^MTlBW{Esq7|vF(XY-(9T(L zg@F(Z3yZRE&>&Lxs-Y9^=oBwp4~^XLwrB5ak=rMnNloGkS3F9Z@kZ?d#d4}!98djj z_;~Cl7^udhi0z$d zoWAJGSO>(Ma7H_RceZ-|yN`>K4x!`oe&>`hXwZg9uivk!+|VaQ928=mP|xWh%p0^I z!OU0^ym&F`HxRc1NB`-&LSfM-iJHprR=8{SgBOu2B|f1Rb8;hbo!{qd z?_L>_8}KCnvbllSeo1Fy0@>~&PXt0{8BV4lS*XpQ!i-0C7PoNAzlCKRh7L+`{P=BS z?rYnBe}`*`cK2~DB|EjX& z3L11St$R;2C=->b*e?8j<8ebJ`Kom{ z@Pvip-J4m*VZ}QNd|g7ku`)9&(Pr=&X9k}TLS|uY8C)14hFGUGaBU1tmffx58T6+V zH7BC(3%rWzX_Sp7JK~TBoi2Y(-rW||qvq-%4u&&U!K+{^m%p6Q;yc!&CfN)nA-*V8 zK&1D9sTwhF21Tre|9Yc|HE6?hVoau=fIpMwVZV~e^R{?<6EfaTYfm=;zG!1&`spsD zva9NWTH|zpguVaEsQ~@s^%=4?L+DtS(E#9@Oe}8%6;$cFrIg5Gt6+q9#B7uKl06pI zV;(b>5tM~VgSf*cD4jQ4*bQ7naQDH4mU5#Tivv}4`nYpn^>B?F&`D~2*NbMrTK(KQ zjpr~J8XN4V3>Ua3zHgIT8~Q#dO5EWInACa~TTKW*-w*Ur24>4p(c+d9tCYgh8d^#=TOV?yG&{&7$ zAO&|h_UOSvjXb&Y*IoJ;p`bJ>AE?i}>;aT42UEka=3;M6W0fumHy%DQLO6~Enpqe# zRGsi$%9)7vb@X%yM(ar{LA-dw5DKdF{S9<=)XS$R*%#sX0GbR*#?R7bIs9NdiY8j z_dsi5&*TKu#4P?hGygC7hxfSr>~VDTQYzSc@jdkFR5MI0w)nI$)#%_-06i}z+d%hU z62Zej6yTqMHOqeGmx);Jhpi-M^A3}ONlW*@`?~G{S#3TLTSNa8S|o6>4SEoQW0DzIW|7zVx^LX%>3`o-9;qyzz#18s+@_1 zMd~Rd#w1N5)1{50>F^#M5}r!*YqK8T-28YbSl;6HckSBSOLWYNsm}7EG3P>CkP*X1 z+(v9Opp$>@?&0*d1G%by$J)>e4p0Z-F(Y6L)7mav*2GV{elwkSpF*z~2wwB49u^oe zs+OaZE$WK^uspgw1F2;6j+1C?WEfzp@j6oqry&5!1>mRLSjv1AIX0&WA&<|+$U}4z zL8VNLW&nB0dxJ5~3N9$?OguSr>yrCnL6tDj9uo)q3hXKf+mEctI9NL=U~j)EOjFXV zA!VtWQnf-#GYdb+|JY1UBC;2;G2Wf?Mg_NlA6dz0onq_Fu+Rr!PXLOFKmryv(f@B- zMpPu-NGMxy!5Ghn1rK-6r8Bx5NH*P6GLF0B$mYO|1Tn&A*8B)CePSPTDpiQE_+Jyl zU&JrshJ2462WaGP1^fCvYPlH$4bi5r5|J^N_>6RQ=#N*^SsYD3M}jl7W)6lXQTXRrzFP6%I44=9m&;muF7bUkvd zbWkYGBt})KTgK>12~OSj$0L~R6rNyM-6x!?x{L6~xI&8uwamo?*CcbCnf+Pdz!WZE z1^@Q}_{~!Z^k6aAlOVjRkn719cl1p<$7h_Y4}9fjP~Gz>2ujf3^$WLL?$cwv{+?~0 zx0t=BHLwc*H8@sjAm{w@!7lghSMG;7P zO@2+Jpa>l31C>Qa)rqHmFF7|e3l1{ua@!FmgrHxczgOh;lQxGrw&-WJUM*@T0JOom zGcNK(6Fj*fg-fxGsVNHH&LcY|_`1c)YA%stkoFDw!3PEgnm#~64c^!~99?R8U4;md znPN1MmA~jDIX+G=9H-lIUwKBrnqT!-0vi_*0t)go8e^8uQ~(T=@gz+1h%iV}kcX$q z*K^a{%b)rk2%cg>FfA&tDqrZ%BZd;41f#?SGLQ+&s%OtMLS2r7d<>AxB&v@huXqD+ z(LHLq05_CHGu0Ii-%ymOkplYxPoNw_jeW99LvDmNi&ayvnD7Hq@eF~RiAtYKhqRnJ zxb_ir`eN`axcSm3R%JJAJRRCElPo-G66Gg;Jsv?FqD(&-N(~g=3J0y3spj}I>&i|w z5Jz~k$J%GH!RrLzAOh*2SpC*vft@HF%1<$KzWV<@DJOfiXdoW4LkrSB+GKMH8Aw&` zgFioVKS$83DF?s4WP(to!C||Wo7(8fFORu*oO?pCQ2aaFY+N@Xz0|-iuFcGT25V~| z7C&8b_&$lG=M&=!=Q3Jma5r@&-c!ZfwL6a&Gip_Z`+7th0c~sxVXXm_08J0N*vo35 ztAl!OvvXy`(V!V)UK(KHKc8h&M&IKW&^l4+l7EaRQ#3dk3ESD33aoR%9QQ9bhfl9% zPheB~&NNZ4HeM;wbCXb<{2=lKVdTuty68Q5PVbs-$rFDMX`v`g(8QH_7*8~s){-~v zX8yS?G4$;U@t@H>EwL}{IPH>P;HueQ*jq;7|MwJ?G+dzO3G3wTieQ;149IN9r;B|J zx@m=722<* zAFMX&K|7QKEzY81$%d>t%a0E~C{8L&BCmK(c^?x=6q~XNx3t{3 z$$$*%%zm*;)L&kb-lQDv7~y?WN=bF11Hxqn?YBwJ_BI3290l7o9-CLI!t^Jjtaq&T zwKnxV`V#z}+?9`r{&jNTFfb#q{;_GKU~hApzNc8nn^m5(6s0fBpD$?LGkK3sj|&6B z1Bvuf&-}-)XSqLz-8^9J1t(83Zob{>+-Yf}jRR#LR`@4A1>_mt534z;*0I zm9lmH_8>IFUVV_Pdsol1DPn;nsByw;AkUs%5)*CFdUfNj8R79pMgK*|IJr6C9{#s% ztw$BQmdZ>M(L{eMUpDk$tZV*^N+m{A~~O z3-z|j-3~!u)7UeSNB7)v*woKy-*fAoLZ3EmD>QoifW03fF@HZbIgsf-5o6D6s0Fh8 zE2w#tVZksOX;X8+nBI8X#VE^|s5Rv4ntl%MvQEe_RFenKh@dno)0oW>r!6)Oz?s8a z`?|@*Fu%f!EHnGGAVva+bbyVt@177r`M6XtIlK4h)vSw(zW7LI0hX2iRMYVslY;|6| zvi~gV)mrT-#!`&O!Kdd1bn20Ax5Ugx1UuGc(@RjL5PT0ET#-+3)CBjkraVUTmvT00$Rj zf;fZlFha2Y1kcxH1iAQA`k6sGEb>WNr+{pYx2`p{a~1nY)RFk33P;CGd^4xKeW3u| zUYEJbZt|Je>17C|86-jUULFA|6|%>ZW@sITNV*?fK`faq7Md!gu2sw~K_AHI-zAyY z@s%ry(c0(b&5$h7@&j`1$9g8aQk2JJQW4P&t<37L^&S0rRmGc7;PqD)z*gs(t}Zk) z;1A(mO?21}OB-f>a5=6*i3;Z@nd|MWx}VtpX&IdWVQffAVKx(2#DLQ9$1vWnnd)HD z$pH{7PVL}{J$~gheRcF>rWEM6#QlPqu*q2@YP`!jTb8)KO*dbj;;tvS;Ylm1kTSY# za;xwIx5fWurb*NlK56v){YoP=v0!nlkDkLv$;RU3r-J_IoDBHQV7}S)cM%hOH>+XS z_Oz>oKw2X!suz2})(>yTHh>=H=O-Hu5v|Jfb(X7N2O+r{P$el3v)tGAzT1j)D*H*smG z<1uH^*t$@_R4gXX3eH#8A*(L8B%mFUtH*3_i+x3=t_WtK zq|z4T4##^IErX2;Y`MEVXmRo=zsIrPYc-wMOdBj{{MloKI&~P0!ZK{$pJ)ByUv-e z|7owxw{gCZzwmcBu2y&G*sBH8C1>Wc9KX7#1Nis)AP`oSyuI}RQ@gqiG_O}8u1;Rc zSu|i-F$+5hbm#^Faj4$FXYt%+fiRb!zyNXot)4Cri|N1Q~O2ryt{Mx&F(8VC@K zw0Tiv4d%G3!S0zpEk|i=b6p-!pfQ2zIS&1g7v(5<1UU9GlcbT0BoK2 zLc9f1+6fZQ5DUREdv0pTG&9IQ~CC1*`W-iN?m6kUhi$_c{`W z8F<1(bu;^h&q4k!$1WDb8MNNP5qC-Ch47W2L$L|7;M$Z0Pu&z>efFX<5WF4{l zB7Ovp8_d7qCv19EA9D9|-&<%6QJj70jTKr3Qm2%3TIRj*B2^{J92zPAqyZ7d;SKS( z7#!%(gO}!zzE)=(eb5BdB_z^F1E#vdWVb-lXrF){C~&6xW%};QbKPGp`dVP=D07px zKzX8q^zuBR*!9?%NF8_($tMS!DFuZ&3)Gn^KB<*G9+55KRGvrdn!sRk?T-Lgm>`?% z?Dcd(Xt6e@{@wp5VSXBpr^}%$qmnG*!yDwWvb6$GUjnny5?7V|yp&^4-4%o$0<9I{CTR zUjZ9coK8Pu@342NGRxgIL}?YENblKB^+uG+4&e@+Lg>W(C=U2CibiQ<7-5Zq*_alO z)pO+;bQrpH#0+}XRGQ1~FK?7Xxd1}xcTdP7JaF+{=2Rmz30a@5=s8L)QZ_${bo0bR zVN(6&T3nJ=c6>QcGb!>hi*VaPpw-g_;p4z+BI|6Z+G~~=iC+yL$C{cX#WF` zGgW2HtXI(wJ^=_p3k2EmzGx{&(#0I58S>}I;(AkL(X4=eXZl(E(j?iZ&Tav|Q78jQ zMTZ?*v430HaCh(SCP0GYv0I&)pS(i4&&7kOSvOv!OSEh7*M$%Y2;D7lg|PT#*T`3u zZ(O-$39O%uT{G6~XesmlL5{7{Zblq2fv6r7!eF~Arac0PQm6iDt$r{d*GcI1!&@Ng z0^Al1Zi#v0=!BP)0NOnHx-~JaFwWjl2w9FdZ7%`{k&8jvgv95ZPV1_WLO<^>M{bS0 zF>B?6ESMGVrO3ZPNkpKTdA5=YAFVr9MQyZ-Esy##=wn`44b?^^fPzd*E+mI(r-d24Dx( zq?82r{NiDwW)B_j?Wd~SLNH*)Og!$Ccl?+qe4MiW(lQQ3F@t^e-y@TkF);@fW5wVF z8m`OsX2K@^M>gFxug4<2!NsSQr}O&;L2xhCrpIJZU)Jd#*&qw4g2d+y?}$3yfp7$= zT-#ObhgAn!WnqB1)024jbeGMeh$99@@UzX49P%*?ACQMW*bnm77LT3OAftTLKsaIvCxBthLt;iok%b6t}r)v#uFV0qls?e8oLQA?jy5 z5tE9*H_OBj0Sq0vF>eU1s4+%?Eg?eJ+1>3~^y7ua?3EqGknJz)d!Dvv*3I$+iKbJa zyADevQ|OOdBgBGBkFsGrGZ6z;M;2fU;wh2h8*}se9BAhie3Z8QQ^Rx1IWRZhPwf6b zMp9`q7?E!3VK6?;F1Ot_aU(DX`UIxMxEI-iS+hkbEzSkR`=X*=*FlFtcB|SKtoc zv0^|Y%oEm=(28#BtU|w7S+90{Bzp~BnIzG(Ji`GDCRt%udnfDx+oJe;X4LA#J*cTK zg&HuiX}y0LN+Qc01{0iO6lK94=q~7BavoH70sAxvK+n=c=f~FQszm}k|BYS?FdlwV z5l(~&;bltV#reO+dKD88$UvL?IzES=&%O|GpxlqzUbZ!%5%L^AVF`-PdpD+tRfs;R zitORvCJgS4Ac{*5#N?p6E|CeCgXkOXL<7jxb5Tcs&6FR1bD$I<>zNf~1SsJP%B4zUiF8@}ltzr=bNG>g-wBmYU8FC*B~w_9^xGHERQVVL%Fwb(pDHj_sVOHnmxv5d$utLHZWhuX`(DTyaZe5d^#{uT=3t|h!F0WD7#QdG@g2*j?s|iU_H$MG#@ax8*g7Jc(Hp56NkOBsh3t;(+G6*6 z2#T;92pfx3bHu{(PmD_c)Q_M(`5Cf=YLFl7=?iHeK?ehM|1zq0_m%Gg1}C7GV%o?O zlS-5TVB>o67bS8&tqg~D$1=ypqOxNwLg#-`kkFPpE!1#U-`X40b{8nWs3Y3A*EgRJ zGYT!x9$Q2Bpo7`G#_@dRSy9*#7H!6B#|qIJAMsNRVj58`4a}9aI`kVL_RMiFdpE*I zsftr3j5TU(57FL3K93z?CTnHVQF5vBk6)R4en4cnX6T{i>^LLwJ;$9iPIshN+(c$Q zS|m!Q3X@o(nm_0&XJC16!OI)g@_`fpttgFd^=2LeVvnvPKLpj;!ZS&@l-f)h41d9g zl=LhIc-`<6&A4U=eIx$~?$bgrpgKDWvJ|c*n>`Y>C((bjNTBAp^l>tHl{%+hMEYCqd(x*O8M#0I|gnD01#Fxl| zj#Np~0=}ek+s6Y8C3%4=t1)MvCz3ra{e;hK(ZPITt9L5w!%#FL_&7AF9OsI@SWfa5 zkU=^EYcBCHwI2`LaWqrTcHm z$&^=h>hlPf`t}T}FCM|7g6y^#k4aBLzm@5$2lL=<&u`?7EN5--HQbX5hzZ z&mfW)5y(I$mQWoA#2}rx#9l_g0V7d!8@tD=Oy^APA-NLgspr`x?fY@DOC8K}QYifl zp)TkUrvbHlOMk|^g}bo^^-oR7m8_!))My1EoFY1@66iIFga)Q%R%V`B8(2==@o=NO z<_#*EeePwZQ?0is32!N!bBh5a&Z3oL#DVQ8`z+Z@)B=Xq+>O!})1GkHOuI|el_1S) z@=>EP%Xw0y%;sH96}mvnUeHd~vpWyiKs-DAGOZN@vjwg9$!u$^Ug`=cqgcvn-PQlozhcW^ zAVUuaHncAagbEt$Y`g!Ymo9Glw>JaeLn6b=`(7n&< zyKPH}LqCYcz2rUnWr*hN11QoPC~^%wjc&ozZ?mZ8a(!4OvGto2m4-`Rxzy7^cYCQD zUD0igwF&+&C-%Q}ix3RAs$izV371jjveks{h#dnJxm}p1A5G0DK8S(L&V~slYA_>e|!$b*M7U?OcU(} zpl1~91cPVo4o{5pLpzRtKti(W#l4-fA8@Fh6CNp?Rk@(d3*g@aB*?>nKf3+jHji4j zq0)9A!Yrx8Oix^wZadjv4ThT`Qd|(%nZSXOPQ zS9dCa?Z@~L@} zjoc6-t3fp~tPDfI;?enT4MRrWVt|m>Gksq(P=HqfqBQ}^8xt(oHBggDl zL|8r2L-ET?{S#ii^4gq&z-irjW&eRl`0>&QhIKjHEX!5 z=oA#lBdR(16JNwdks%UE54L{vGT}9Q_7IDz%It;gHNawp(orQkwGo(azI^{4&w3$ZwqA&O}9&oLekn0K-Kwu-a9$=6w9S8!%<0E ze4&E#JF~JFn-{}yL#p{zlX(BzgKy!qAiySwtf;f-L}9GoJg?Wxc8loI@Mfv&dLSak ztSDM!q{Qi`0AnsE>bw37L<*{uWN(K`E*HZ*iK92?J zSr6r^Qn+=B@EU6if5)TS@ExAA@>k5vu#-~E42Tp+kn&anC23UX58Y%n!$91lIdWEM z5&-cQo3fs+R3C0;G4-;h@%+NNgusr>HO*=ty;k@}=QFa=Fb2u^yB@il2K;Ey*BJEj z8J*QX)l~NdFAMj6y;6u@%p#DXVL{R1H(|avKi!yIT-5uaaur$yl(ApnZ6N3FPGI>L zPPDpwg_PrDwxw<%kFiQjFszW8zV)XI2pl_UTSRuIT`F7n17F6Fj8K(td(Qq8hq|W+ zlaUSNV++KVQ?{1jfen*V=4$t(%G1NbdpNuSoF#SS6*exjVwRDEJ#KpXwUSbOHGp4{ zi|^>D=e*{LJ%Y`aUpqoD;}Jf5WF(iUZqlK}vLcE9DYUx; z!(u_&8ZJEY@~kE!hfA_whBlO|f~pEw9EPBi=65nQ?xXL| z&Gu0=p}NSBsLSlz9$ft^fF_;A3X7y1P5&@*=1J(5zXb?vx&p82S!a(R zg!%$8Ep|QWO|LU}RIfN1T1sf^qCy*7pDa6K)F?0QV^rUcpNtMh`YrlP6?4pgwPqFBGwq^opEU}(V3$j0hvm*_1^Uc| z3X2Nsup<3JuP10B9q?Cq_Lu&<=TPv5BL2;^|1fT)t zgxfDj56#5vxR36aq|yjtL}i~&bazX81LT;iR`U)A4ew4ZQ%gw>O&dWu9ZLv}Mu}Ke zB)<^K!p^476Yc3BU$C5UB@eKW)z)mRV}DV_3kRVYl`!NV5dMS3^v{dm!i>c9?(q-8 zxTxwD$yc@LR!q`CKIkhh>4~pA|3T4%a=U}S&|`ZWWP>8zXQ|+`!#5WB)W9N` z0NdGP5hV0DzM`Bc{E+M(tHrOM{O4(|V|jsaP{-~TKcSKo{g zqq8(oVffE(Dv#CWNE>rJmnHSTffKQtViv4?l#G|>FjE%v%|1)DnPc3$bnZ$*!d)BH zJ@td(7)Am}fl!sDZ%KrAIFRGNN@2kvE~4Tq5<5p|>z(>{$`!BEYIt9YsDP{p2 z^3>eYfaJYrN-jevTJO==mCpH!%zq%=T@F#wKQKKkWh;z1;C&7CAK3dW_3EP&w?AUVrvZB#kEJ-A0T ze0AG=#vXwcDlKe5a310Y8n5)8hoo^vC9|`jZweN}Z}6MB4xZg&wW5NolRN=@g6~=? zn_@K$!d!hOi!u<|n>;2QqM_aX9sfXIFar60eFTiFuutsb{`c3w!1){s10*uqh$2j; z+XrsL9egDenzPgtB1mYqA1~I2gAC~3$*vK-53weo44TScKq_aT%w*j;y8^1c-4~6;i$Kh_0?9l_!L}splbR>>&;^#AIpB} z0!9mzk~y1PhD4{W4IP)iyRrkf*;T0NN`SSs%@J0BzqF|2Rxw190|A==kI1g^pP<^C zXOL~9bR{BBmcmh?fzfL0VX{65Mt|ccpwNB=6YFFk0AIRn8)#UXuG=8e!@|HIP^3}r zz*O<*pc>VB%)$=thTq_u+?nk$e#df~SyiX<$6fp~s2!8a)_9o;KRp zqbmW(eYjud z`!F<{U0T(RETb4?Z};=EGwOsrZAAU3AZJ<%TX(GB?k06VQ3mui9T@miXY6>`PDpC# z!7wmmxnPPEKw#U-VmxPPTxG2ggs7zeH9z7?CLg5dEp)Instg4|ziql**rBT;1jqp{ z`p9Cb#cW(fht{WX&8+U)@PIiU1~v|-t>E;@AzU07u)}A!K>72|$*yL7u1D+wYe)>r z#7eO}%DpiaW0;ip^!&^LG1wu~d@JD`&Utb-K_O0sUl-FNG9Rj9x{}R~PfA^=w=72( z+h{R0*)H13)zVsyAtq&_o&J{2@R9cKzNI9Lbui*d#*$Hy%wAX?hAKm+Cc4+$NBQ<-J^CI;I&DnUt@^PVrr*ee8Yuk6%s1*gWGU-h z_h6(mHKkJrSAy|VOXry5knNAzLO)R`-V7*J$cSRZy90_ z{1A<`xL{clM3nY7md;i5HF5=-;;l?0q6f|}SYUh$PN_&p3ilnG0f(1IbOK{2=`(8n zN?heqpRpf)<>QwFDZk4!c~kIi#|q`;oG^z4*Q5FJ$q1;omxMhq;N;&RiATz(_q12EPWJtqg?M_N5WtMi3b zgH+&wDt8WA`H50QO z*N2|y@!vvK{s9)!B1OvW#AY{YuI6$HK2iimctx=Qg=yEC$ByEdlMW5nS>Oq;owb}Cg3ah5@}-Q53{z-i z4i=>MMC_B@r355S-O9a~MF2ftIJ)U4H`fy8`x@(!SRBr|B%d?Ba|oyu_IK4*ep8AE zaT)K{BHI*oiiA*5$vtF-EZrObrz1FLCv7l0wf|tCn(DRXi|@Iq;2h#`#hnhODkCVP zWp__YT^?oO1`HXAny_U%8(P@BWeyKvd-q zPkoQ70x0wMjvx@v`_hDXb-FAM&<2D2Jme{l3FMUt1e!4X$#n+tCK4wvfVptoOX4*{ zIEj%bht?cIn{-7n3VrjWnv(Tyrd2*kzF}}^AE<~;^98oJKK$D>?lKsZVx94K3?`}u;Jm>0c#cY`6N=H$ zgI9xC8uk^D z=tJy-b7$0C&3N3r3o1-ag9=WjTM}iQL?b@dVp77;N`wJ@38y!$l9l#8R6Zu!LhhVl z>b4us__}qk6Q{yI3D}FRk+*bo0g3((Z^^vGw76)(qNFX&PElq*aZD~9lb$BRM>YKV z(H`(%BA4}Xc{ z$ob}Cx(mC+>nE^vKtwpTP1DGX$l-}F&pmm=NU4optyA2e-IX1EsPd%) z$4;?vos4e*0*l&wETe(G;9r+?3=TLOsBcVku|^CI-H`9|VufMTxCS6no6eD)#`s!7U-0poLfMEo*j zKFS)wDEZ-$#4j7EwCtrFo}GVR&pE^KsG_d|ad{z^Y7yo4SxxO{c?IN`thj{*IRTn^Ecqq8vVBakW34(a`ntBih|a)sadu zwj2Y_5tsuk0gEEE_&Lm8d!O?dk0(_{K&jMqQhvd!s|RU^6?$NWG90ti!CS5GfuZnU z#*rjG(saHEij6ZdyJwT|#xa+XHQ&j@;djyfVQF8JCI`V$7AO@_@w!n@II$H8H3+3K|N8p*I<-8|zm(-|HUnq`mrHa-mw<12FV7t8 zChx?p(a-utov=&6U;L9hpo}UNOBPo;MRgCl4Xkgu2pvVoKr{H4wMGK2WoeffuFry) zaF@8O*G-4Ix0Yoo*@ST;z8|yput+H4@>Gn)8B~dse|%iTTa6Zb5$inPH70~F9YpuR zAJd0=C;ISHJCvcuR@uFbjQ>zeqPjY z&vfXk_xRs@O)EvLCmN3AI9*Zzy@cbs7P4ko-i@X!b*a4Tf#5}w_oT_n2i6E@nQWCA z42;_Fee4cHc@&0#)dACr9gvyLnTz_a&pz=#?N(BLn zR%Utwg%#*^)OMkc6zco6CSPf-2Uw{a%1 zRnwEH$=sv1dj-S!9i@aM5_=LF9=G@vHW_m~=SZs735Rz5pQ}1W89;~?5%zNS!TwPU z`Ys=q689Bf<2G@>)4++{_~!%)7-=4*Ihv9YF|ASAn8WtBs8&F?4vCn2TFqA>dT|sF z!3+K88fIW_E!{sl9rJK1OP^KdJ~)+9Ky}Rx9`{*;=&vm2KHuh1fPT8{Lu*0QvG2Lo zVnO3<7zW1OtLj;u=Un7IjVR6Agp7m$mGGJA32 zRl4^7GoxZ#>aoXG(Z{s?2^_L!Rtbs3bC3y*G^S_hs-DNJ74&&LJ{Pvtfe~+0dDPwQ zdpqcS!;zwQzh9CBH@5u0FVn{JeN2@f6s*3(@H7(Tq z`C#g)U+(48PdgD)Bi{+4qvDZOz&7IFqm6bNSF5rdDRNd}020yBX=b;)kFZH=dWz;O zbM)7&UrM?XiUu4^S2aplkV;jyO9MB}1_lmCvuy^dJ-78oYrHuQM2CM+MPV`+5R23M zBZyuC=x&a)jW;GnzKR64i6QK6p!oiAgX4mvZfB3?2E~CLK>$6^^X4F*+gyWn;|wYV7=!E1@u(S7+FtF z`+||1$u1IrRG^|?6DIZ=y1Y{Ji+uMJzd$+*S+C7JYoTZBO?Vbb;mZvdQ>#ylymZLT za2)?&1X=f_LPaZ;g|bwHWk2W`BXhE*8YVLTEh>DE3%cg zFA}~LQ0?af`enL#Hw=ZC(IzTHfK6^@6AT+!!RS}D!+tP6T9C^rv_(wZYV??oeMgWw zbT%f0i4CV6qMv&2Sq64Q^Q7oq{U!W`p35b5_V@M+z?AEd_{}9|L@yIizVmxvehdrd z{~Ll@GmpcmU3D8JMs*@qEgk*1fRiR)Hx(lg{i*K-_%^u8XfZtoqgbpR{zoxE z<^y`ty0QHAIjjMAE75}Y9e57;sr<%*F}TYiXi5|7`OL3@sA?5m=8`F7}R?#dKPUpkDD3mj^IM9EYMSmSw{_ zepJ^6vQDQNEMHPq{tyOeuh|Oafub{u@*2f$wyL*eXxrSRn4u)B0Ch!Xk1#YuhN}wi z1hKSEZH`y4Ljap>5|8A{RS#+4g~N}5+UnkK?+uG}x5f5vC*LMu_A)f^pu4kxs)Rv& zn+_F26R`YRceZQ&z)b>?x*@1aRM2tNWz6B?kRCx;a@r>nrM2nrK+LnT3*Di#T2$F| zReonJ?NEsZSRdz+w<4Njp+nHjz1W$**T$~UT-(!eblmB9t8b~2hI|hYUa*dt^zVV4 zTrYoO{F(79g+^y{$^&TLH)-?^Xm4!2S-fY#e&w!bb9={KYm46FV))H>??ZYoz4`Bj z#7izbXLj`q-3o}GsWqyiNPJGF_^q^*QSL;a=0M))=g&(vZnFJedpk#p`2-tzC3Rj>zAuD~~E&;v|g&?T;3Fr4W0&S{j?GEwbO~2dm zQQD%L`4O+%nNf$`li@(HB%{Diz-*l|`{;PShxJ8|sj}76VrO&n<;MbTDqo8xJtCfM zndK{C*bAgiO}vkocosd&RIv@ADPh zatJ5j002LKC;_j81;B_Q0iWyxeUJ70J{S1-pd0Rd&t^urq{yG$ufYHvdj&m3qnJ}@ z-(3g!$(i+Ku%$7r`CuI`@X8fCb64|i_f4bATnpgJ!PC(td-Wt9V!G&cqzL`nkN+jx zCo1;a;m@wKJ#Jl$SI)zC``>U#xx$UWkx1q)C>4@41AzA`I)G)T*}QlbhlM+}cW0c` z0iaXkVk9yzoPpj8XxH0`sI31aaXpkQSVPH&QZ8WK*tGm<2X_C$y+wRyCRiZB-09}% zq`q`nwPEGnre7;$rCPy0aP%e8!yVa>gUA}sV!j$tWBJHP-Ovnfqc*UB1_Ns5k+vXX zotT@G^DldA3M=)2RW2bO;9X*b<*!+iTdxX%S`Z1Yjx6>sDJaopAFv^_{`;OK8}n+b z&Hvk!9wc8)grw=h0^wT(UZ+_rBoIJun4_rgsmDHeL)Hm|j+6%eksw6A&VhmwdzDXB z>>J4&#xO3+hdfL5lbq}@CJ~GVE7+C-Iw;q;`EM^I+WqFnb94BRFZ522nw_`FQ8Sg!Lkvb6?afEWz^+F1<9^BzBZJ}@ie$6*bBKK~-uO>=u^5)TqivoG9GP7?|7XKl~hGuz23q%2yMD83;M{SSN=5(=#r%4;|a!NA-C!#*Hwr4eI44dK<#rP6AcikC#e#82|}hn|reOG_j_s9ImWztoJIv15__I zG?&$e>qV}n^eLm>VlY3mCOAA(avg9jvYWsW7W0#7^ds}~Bg}Pbvc@n)VZAIv9bw08 z8SmFLHp4_E`8myJb)YKTe&eq7MeTMj&jN?~Y1uh8Vsm{bOXOWJT^Ch+E`B>nCmhcu zTx}yo^Ml)*M;sTF)bkH7sPl!Xt|IYtOt47Hc}vt5u{xzxeeD{nyaYP@k}hb~R7UnF z2mtyd-ty3iRP9aUU~IE@a(d);RqCabsGxnhNnWWr)Y>KAuysc$p7UbhyWAMp4Lj>^ zSEl<3J1EP#Sjz$k0E`d>=VC0i`_WQl7f7+FD~phl5;;1W1>0z65o$Oh)=JUlw>O65tSA@0F;+I12+!GV9-*ueq5%B zv8oA70f1{O2q}fdobjnS4^K&f8_UZ&T_25GO`zfD;r8xfT`h^Y5@o_;MBBf87o<`o z=#{SQWHo4&6hF3>Hw$Jeay!pkSpFNS?X;WTxmG#0whw_ss9o z_oD0hOaVp@Z3NU+6nRMfSauy1Wcz~By%Ih^`OJsxOYI2sOEP$FFM_Kv+BE_A?XCYj zR=X4c)W?Nv4miRiUKDkCy}rs$Ta<=)sSi+BSUYE6v6PH`@X|WZxqn-EM`tLdwG-?v zjeomqqx=T@gb}NBT}FkSd%b8a?+PrboIUtrJpw5oUn+9@xnqEJ_&-Tpq#Y85U$L(y3*K~tW$ZP?I?V=9d<4S=B z7^?|<^e}l+2TQ8nzt2-+YVDLxNMqR|)1VLIhj#yv`(3={!v1O`5T^$T#rL^EYS0W; zX1I7#u$!3zA+;WL9yGCkKZcfAjayJejendG-&u;Sbv4J4!;w2T4 z4hodAQE~(^wvad^VtsNvbqhQPL&XNh>=4R{eIed`j)udwK^x5Uz|xksb!X9D4m?-| z-%-m^UOh31-~dlRu)jUMGVawFKEYcl+=-#KpbH|&B|{Tv%PTJQQy6nBV`i>NZ%%m9o?CkKoS^& z#lS{i_komj8|r|I9IxS478i2NH|A0z$~LLF>|>_1?%sTN9pWRzb(>fVaAu9vO9Fl~ z4^lVlfI9>sXaVP5u;>Y3P05#endN8G(mAc$MNcI+xXmmpS=~ajx7%{EcM`=liu+7I3E$)K4NB z1kT??>ZJ17+f!=YK?L6+q;OV1-r(~*C_X5y+N(r?O8&p-A)C>Nx3plFA_Qe- zbdpijZcP8Z1$hT30z)gs)m>}}Q)XerzYs%}f119;u!BbnIzpquLSiA2I&Q?&M)ZQFY5;C5xcg}Q)fy-F@{c7``Vm#q z9eKoy8e1Pc(T7e3g&{LEH0Kv;l6xK9;=f~k;yVagUgRiwSt$fg_`zR}C0v=V`EmCc zY$M{(H~;xc-9=)E#Zd?;2$5ahF^~EA=CPI+2!Va#yn+&0YwAvP&ukOU2urh3)xU?W z-z~?u7HK1(`Cjbao?pGD%X)T^rH6_MqQ4R(yIEcc9m>a$ODRd&*`WN69ccF?SFi5X z_z?biDqWYF;Bg!A!)45`FVCX6m5>Elp@~DoMT7_6T{v}ClF`qqF9N<2741*t*1mJT zyl$qZippV=qeIdA6OWeoKpz<{QrST{f@ODr@z9&Mu`B+^Yn#sm8fYXR=ZbfCPdfAM ze0yuI>GN9A=fnzB#hQsR4n`{P9i$r!mM`zf;1ap0{*lJT%W!SHAu3>Ee8FIxl9Cmt zX_0qArRqn;0~aA!HudxBIh9a0)_Kqg#{Yf<^f7J~>^GvlVB!Jti#x$68=WUxkvbxTbgT)-5MXcNW8CLGU1x&ddc)+}2`rufI#NRok%@ zuqTJTF_54{X%V@zrvIKhcY{TW!8;|z?gTwm{S_QIRztr}HYXJ9A3FhhyDEFLO5?BQ^Haut>C^*zxd-hCj9$y zG-Dp@#guddW#$(J3wGEqxb){<#Pg1upHmE+;1|Jd=|K|Eu!18X@l@s2jaM9gzd$t|2ES1GhAPqM?Ov~zSdy#?GaLg^ zn?bYTp*^~Ts0;&K~1)hi9<9*{KteZdAktq))W_sjSaQb8f6h=^0>GF$xZB}Bp5onCjZ z$`m{b$c&t%X0_fopi0o|!fC7uZ;I^HwF2N0HX!Mn_eU)GC|5gbsGP(vO5&745J{sh z2}#7Zh%GE)1PH`J8GWtzX{NSF3Bm}AXlnNJZ2(E_@Pj{rc-Mm(&ugPn&XGd3P@^jc zKNvt24SuVm*zE9G3O-p2xZyH}w(Xqimy75i>CRy-ir~t+o!9Sc_cjgz=)R;(5zxA# z#|(H*o7qypfe)3k2HXc+i#Y(c|9#Avr2cDCyN0eY~{OG$Aul} zG%>A0%pi*I!HjuFMzszV>xoKq)^84uSOU!;(10^Ho8->X9RkhpB$){u{SBi zg#akMLI!`d9bB9eVbxcHw{c*;v;yVfD$uNUQbs3r`(m49z9=jGa|SHS+0sHy>m0~~S4xd*ujfu2@^ReMXAr>dMVya$eS;@6-q(Z@AG^(%; zm&C8bB>z^o9<-LXK_bR}y8d*TRB!KQDyEYf%sZT5ETisn;y@uZOKae7>g{LRXwev%_f8$rA;7o4FyN2xW5XaeJ z{u}J>1(et#u#{mybPU5MlTr75s24u!bqbaa-TsI7T|7_C>Z>6(KK_i?RB(Qjj+Ht8 z`5mJTd2cgLcrGv*hk$4+4Kmz#|HW9K!e0K1sMF2gJCN8G3o}tMMo$1yg zt!e9TjIX+5W6yIj@RSWk5|kgL_YB#y;6*@x?y~;hBnhw-Y0sR??RHg+k39B{ZhcvX zL3!}6if z*jI7q>1RfYBI1XV%$zJ(oJ06sFe=5YSm`zj$hwR@M7Jm0?B9Wtxvnb0Rg*SKlmr^( zM)V}a^#VqU`GQ%E6;Hk{m%y7J_m#f2El=vfsCVAHv71L7==q}Cv0M+|iBd8f@HhU) zrWtgXtgD2OLxW=9W-7!%btDCq)p86dt9n5iz_}&PM7gU(1K?NeAUoBDCiO5S(C}Ed zi>B1`_oqEbI%R)EZYawIOE7-y$44x}IHPuLm0f&FD%q6`Q98MSA$8~_IELwK-Pq`N z(wxEqu5ESWg5qwJ_Yz`|N|a6Ll!>6$fQePu76Z4AF8Q|;5aWFHK#M0m%*94;V zEWeJN9X-s`D(qqjRhSPdVSjgdQ(aL(W$bnSoA+qN8O2_-4_|fXi-ZVA*%{w}KQ^c} zEvHJ17_UlbBILYtfY>PepCn0`Jm?aCCNYjh%iwW409+&bES)+j#J>pv_w;EumT$S0 zPKD}x6DKiN{g<-I_3Bb3`N-NRmf@LBY?aHC@%PAU=cSgG%d1B)jtwV0I9hO>c%*QR zV%mpG-I!w0*Z>Zh@_3y&f{2F7HqW2l;smr3W&XW?J};mJ7Zygk#NY0L|4|hOeMMNT zhY>|%s~pZKz@~MNk3V!*7>qyJtX*YQ#%8q%Dc<__;g*y2E$aF|Q0_$l5*j8o=)05h zrfgh69S*n^+p1jtgxLU0Z(Dfxd+;Ipm@c!ObLM_8!ca+cB`PM{rTB~JmC6UHbq?cZ zbfgz(Dq6Nf!4E&YUWj;0;^*5FAzjrOAXDK2|9V93Hwwu5T4WOUqs*8WU72GMaGHmz z`MjD2!1jqro=Sq6I@8L7K*jU&z05hHUSOsu1ZEFK$G@201s5WdJ6Qk=wP|!4N zypq$(v*Eg|F=zk)C@%YB#2!(mxr;Od=2nc*qIE{TGJr9+Lj%qf_N?hnYJnEFD+ea| z&svUNr4W>GG?$Mg16KDMwi63m!l{a6O}x-hWEzKa(MmWk5(6Cgm=CE8Q=dS0?5Iv8 z8IM11&C=Wi@ZjVvy(!XW4;oo2#UuF9crF(!O&)x|Q2MHt`zGb_k=1zC$F#UvgQX<2 zxxr`R!sL%#^vd~wP$Ju3WDpQ$fsgC*ZRX-shXk5odcU?bYn1j|7U@4HKEg(eQ-SDR zq&?4gwN!R>)JDym`)gIGYa6{<9$!)gYF5!WG+0wCUF^ahMG1Y^KK3TUPJA8zSC0~| zmU{u=oP_v&RJ;Rz+zF2aTdQr?0RyKHbivM(gufBVy8qV@!Apo~1q^kPPhUDm&^<>M zN4K{Qq@42{wdG|P@#L^CVvb(}p!*&=uWUdpHccRPTw6TAn+q!4yX_~w&bibSYtvNE6ov>BT!Jtj z4JaJBp6tdGb#TY9H=Et}F19io{6ant>xZWP$3q8j(FQc2#BId_y^VF@dr{LhaM(u~vBNKb@wwuKJ)#qFG0+Xq195m;e{lHfTu1nuO@{KBFmsflAoovuqJC z2fMEUJ35k^ADB}+77wfr4LR{ET-S7GEC9#7&u^5wcFhj(t~Y+=@KtsnnB%OP;TMKJ zU@V^t*AL5A@o}TEb=jH)e6!bZg5q`Q>-S;RP09}tY6xt6wE+4!1-5#*F>xBMdd2*B z$Qth`aV75sDwjYi2EHs$vQxWn+qhyyYuJ5NiyT=d^VgiDI-Y$W#gYzo5HgH<1_r>$ zdfEx}juB@LpjK~d8+Dd>?5)+WDR*>DkyeoAYD}p3D?E=^d46A(V#zVFGcoi5t6zXH z%^sv;pz}K2)@Q0k-Z!sxkZGeuGzx_sm=+l>NeB{2Vf4GT&EuB?GHXGG1MNh0TL-* z*7V)gr^2m=!+qx8SIuoYqyU;62n2>y;umkf7@XX}0qUdeFegMcyU+iOefIdKkdRAB z+U{!2iqt|bIv_QFcbT5lE-)-bJqEfjGAAohreVDrtM5B&e`?dKI4RvYjSZ6ACq;lO z;?yqn+rITLizm5R51nXRc@(W;c#dqO+0`Fm1b6gp^Nq8!dab`wm2V`O)1@TEYbTA3Iu(|VoW z>VkO8tE(F#7~jG;;4K>NqSw{>dyVc=T3i=0A2J=J3V0KYLE-DSSup7q0p+`>d(cWj z6der?7PxdPuqFYQYYW-mzO)5Po7jRNXT{qjnmfB+by1fyMwfpZ*w^pahxYr19NquR zk0Mq#nZ|c09=Bg?$l_dnIhx#G;cEG#Dt2DzkJuf1ZU=HHt$Zqn2cRpSBp>v(WUZHK za##{5ql9R0eH-I+m7}>iX<$J2(xM_(opcZv`+QN5mA=FK;|Jh{pW$89qPgSY8(&Tz zJSxN;{FHy~acQm-=%wj{rWAf|8qC9i$R%QKRu&GEm=-hwJXj(Dg#9poU z7$;vf@ADU8(3V_G-RfgTy;@I>nPhPZFO`8%2F4ZzSSTA5c4kn0=^g3$|TtjH|=+H-e9HirMlf+PH zYB~&kR9|{bC_|+3F_H5f9BMbR#&AL3yt(CfL0zAQ*0C+-dJFu4| z?MKjsdQ=V65g=;tdyZszFIfJBmjV2Gf)h;weJA7HiVIeXAdkqkE~OGCDI2?vnjH#d z^_AW^_Of$dUtjE&I7WoXd|OpYH7NsF{N|FuW%E|l(FjGDff?3$4EOGe^Tx|TF&L_a za=$x4mLhN{8M=fU*H6XrrWW*JJGenk5QMlOsznWkj4;-Y{1dh!-;je*ELVA9`V=4d zPz8*#bA>zLojmgZ=lV==!*9u)2qZ}Z<3T;Dxm%^MD{z*Ec-|HLzHkSJYKAu2kjHzlw-Y?JHkw-dwr&X1sBxq0ya(685xNaLSld*MsB zQh+|Xj4Otg_aIOwWU*P-gJ9Wh`=QbF>m7i(=y#{%&wD74PK#1@^Z%4Dnlx~}&$Vwk z7bSAZL6t8Yvo9@650N9yQ6?$I98l1r7Vx4rPF+pm+ax%6JI*Vj>|j%D0*&j{V1j_M zH2J(sNs0-;sxhwBc4rbg%DvZ^hKrYMk>KNyvqShX7Lc!NZyx~?J0pXw(E|+mIkGD_JHk$p0A6MaPYQ> z{4qy6d$KPS4R;E|!!6h+6CO^13z!KRyCfrnaB*12gz7O8_>7+Rg|c(}*62yxwseju z^0w%OSkW`BKeeKyKmAG*9uR^6T;*wqBk$OO@AWM*2iVoLFxWe&a@~2LU8W;{YA{ft zWQZIIzgk+v-rYEpjDRwFNo9Z9pSJq$#gF)M&G@7v3qzCI&4CCi=r=x#zPtJEipPA> z?yJsmu4ukLApodR10~FA;X%!via51_Q=-X*fQMBHpjX^ohU|5ppXvRaw(Pj5QJ)r( zz?zFE>y#_2*nNq@NuHp(HVgSU(>M$tPPizF6-x~^=;UBVLHDl?g7D0qmoPBnf)R=X zV@OuePO*9-shCt2?<_XZPN7~2_CR*e6@8pDr{Yp9+e(1k8a>6BR1|LY+1Ujb`dpM% zb)%_qPVLmA`*KHaskmf<%+%K=;NjTsAdENYyqltb_4H3S(*>SYz0VLc88s^cCX1ek zeany$GiMitzH)>I{jbGnC^J;_XOC*&B$2^t=ccD*A-s*jdn_>a*u@$nasj!|IKq5e zdj=S4E_vi*moC|rcC(h@wzl`hy(li$GTW|2Z<+T4!y!zr;Uo1hKwvtyr?-KVBZ=AMCV z83Fa9h$_M6tVRcpg+NoZuDj$8|F@30t&*`YZp(^y2-k#LS?{1N+tgSh#x)_nnGI}s zp!oXZVHjUc@;I~efgP!h(~@rccrvfa#pW<^QZXa_k|W731MfmgCtnDKW=))*#hl7{ z_l;HO+EU0Y3eQ(1#JNwSzsTcruvZz=Ejc=A%{2kuSJwjo9q}H1ArgOlz|FtUuC3!) zZypaq2vV&~VclljC!3sDwYdCMK*)p|G*bGmbpDLZL)Q1wpM*fO4ys%{xH({EQYUod zZ(wh7G*nsXM2J5a4-A1kQRL27aKG{81*R|0!mi5#MJ3QfBNQvepV*zJoO@ZIvFQ)|JjkVKMJ(r zcE^OG32~QwpVHX2$2^Hu!13rY{`-{W`(Xs#OkSdpUTd7TOE2$a;Zdn2%^uS?!8YXA z2Ec&sjQEr>YS8EwFW50{li_O}>=6MBra#z0Rz6~0#fErx$BPM!#^F?wYJ98c)8gQ5 zh2li=FS8+b7aXvMGc6>_d;)fVP)q<^+a01hbF)TpEJkVG8k3c>s4z5hI4e(-;sho? zW|bGA2W~l?i%)URf;W9$mbx4h#bA5tQDU~Pljr+u3+yBdrY=d)Dlpu%gn%3MOtIc7 z+>py)W~CN9?${gCC(?-B?vA(e5Q6E~jj*W=x?8tFx?%qe!tm|Z5_LR=H`T2l2jQ3(0ojV^LJ61aG#Cu~qXA6S(yq0I2?*9Z(^hds zHp*n0A4SCOKFBA#&y(*Iz4w68*ro!|X7E1yU@43xUOGf|Me7IG@bFN2HKb+c1exjj z3;6sqD(1{ZjGnXb$O4#;W;eZpwuLR>Xp=%27dZlr6JA$sU?JkxSgm7vC3YBcB6_2+ zc(4YrCixwmVbU+*S8h2>$`OU5>OjMYwT|&>4-fp*cGe(^todR$B%P{J&Z@08QpFz} zbTON1efbhZSXjZ-Ec-&cJDBJ+@PekPi1XBF-6J^Czhp{;GbhFx2r#%bQ7}tqmxb51BU` zF1`dG%|(+4Q5-m7*zN2<*y(En6?;!ia=_dcE31AJH3C$=w_s^-%CQmh>Uq#>b$3$!>R+gca- zSbQ<5P6UDq$$TJw0XWk< zU}y^XfV;qD=5F=^7dg`Qx{FH_T4we)?1;{~9{JL~!hWkcbi-oOYR~>Mn9`+Sn^cPNEyj#;QG;=Bp%zlE`{?sf?ho}F zpgMup{$K{ZS;Yj)?64^t+eq3$AiLsnFxth(c--!1u5xL@Oj|hEVbG;hz9}`hCB;ob zDiHV2d#!KC7p`$qb>e@OkD{KUghYVQM0bJzX9N*E_pPM34qV21J#jkUrNAG5B{|m) z7*bRl4i$SDi$c#PUBj6Trkx#3EjtD>k1)bUbVAM+9U0>Yovbt~nh5R z%B!n$cy}4i$kBaCGVDx2@m|c+5paL3jVMFiu0(5ajkX&1!i-B;W}e|V%8xorycQ7% zUQ{`Q%?$AjZr^h0P$*72@pwAMD9-{4Nt>J!bEw(ISRps->*Gq?ET5}XbSvT5HKrFx zIJ_#BeVf-Bqx=6v8l8$-Tpb_MuEIRLY}G|M&6FT|w0Xjaj@UX4t>DsuqAOMOKW%q^ zQ8P`~-a>6r(Eb)?@JQlr86IHjg?r(9D2$Y_@E?*mRkK*QUz;eJaskaR(z#vf9NMz4 zWZ$+Xv*yI9MQxtw=i<~Mc-8=~_S&Ck*Oe_~>%TT!{%*gyohY5a` zcF`5Tr5ohOpgfB4*rcH?MH*{zVMQ02B8|e$2ytlE^b7-FI7U6+xh+4AWdIyhX}_qz z&R9%ixf$k?k`G`3jVLUP*?JV@q41z%+(#`q+(iNMm0PY-Fu8v)nvaikgCA_8PF^iW8ofCr0*qhVfgKy zofRV1{BWaxj)U=avT*2a_tY)4hG#U%} zY?WIScZ!MHk}ViUDxFm7*>XB>8l1o!H}E2)kC0)RP&X?$+f?b@z2TGQ2asDeSOqzQ z;A^~?<&y6u0-R1mP1rV*Mu?teg0nYUDY`_MPY6gbgnO`yKJ5|X5|d&1>$hVrPEzfA zkHR2&$bIVAZ+1>Ag)Ue}#Vr}-*iLYrA@A!-WzuzDb15ym=TAEW ze&|AwQq>2y1RZ<)%lG<~W-(HWBw?*9uvS~1#($n%&IC4x9eiWzNoA~S^ZXFD25^p# zAqjQs1Y)GL@@Nb^u#XW&-xkq}w)w93yQRh=i;8bGPNlH0iIe7d>- zA1J3u1buzYdYOo0Siq2JXH=cgO$zl zWjQbN@vKwH2})DY{1_C#0xTua6upME*O8|zfD*t6-X<`ehTSvBGDLR$z*%QuxtF^B z{&J>85M!n%tFd>_bFATVcfyfk3h#i;3~i1q(BWl zrCrwWsvZbl(mH*zjE3TMHb>jqvgAg^d2ozRs-PHQjua@36&zt#G#;OM%7=_XLfteX z6ktlaXm59T<6gUD%eWW%cLyeWi!;jEM@WG;O*lWwHZ&z~Iis+6k6{GSKP9jyw9WKV zP>qWI1)>#4JJOTtG?4gV_IL$?Otr4}o=9*tCNgkAgEL3n-NoT;Rs{;k$lFTJ1#7ay zLVJ=)JuBp6+2uW!Y+`qmmh{qO(oxfTf~VX(M&@I;nR%;~6a3YkcZsXmalm_qtk(S| zdjJQ~LE(qVUnMD)(>}={n0HePBxajaYb}@3&Cv`_K~jMi550ZWp6-j0ykcF3GRG}2 zjS}W?>cuK`wcwDZnI)Oo`eK6-su`y$E8NzI*B-g-R8YH_;baPxt8Dk7*!xnNK3nB# z7UTaK=%rhG2*pIlX8Q$oyExmqm%`WJL)EGqR?1$Z9DEKnG-RhLBII)_ZQ1Cdxt%p}A7vH9U`V zU_Sq2i`~UXw~+(fWrt6;IZ#LLN-a?)B2BOV3n)@>^)S3oFjbD&Ta}epEd-8&xou2d z>EqH&A%d!WCeR<-!=fjRX%q<)>T0bld1|4Pws<17_#(uom`JD%rfJX4>8Gj#wW0}d z_L2{w-Ilg$IUmRc8pw`*5u8->@zab3lMu*As)^@ zd39)wtqXNMH-^JDK`Fv7z0t;^gxcL!6O*_w1x91G_7VMb<>gK2bcC~2EHXMdLN<`^ zv8<=}c_Z(F-qqknGMHxw{(k1_P7+aB$`O`LcISQ54+)z64sRmyki=i33?*!o^nT4c zSOVUB7HDDSoLcsx+rkCQ51DvjY64RxJsPgD{gnZRrmd9}v}W4B*=-G4z#3M}ZP{|# z0cSOoRGc)8FA*i%92i#Ih5UiPt;BfL%0!6!Ye2K?6R;^a#wx^iBEc)#(~l}_VsSMi@zY2ZHk3-hxF|KZO5sU= zGaz-sEE7hLtl$P4<~R~G15j9uvpNtU!UYE?x!Q5G7#8s?0&Is#Ae{2LoEg(r6tAJ( z)v!{%1{bebtYkd+({A1x;o)N4P`DLi%`x_zFtV^9Ta>#8$KCH;jFuuVCshtQJ9bIy z-%8O8o-ExgO1k?;r;0Y>udz2nwozRBMe4;u$*EMBTx%8<#Co%oL7H%hx)occ_G{XE zJsRcZ_#k_)!6;PBRT$yH*6pVDHi-xL1sRe2Ms!NHc5&Ou|AoScWBrwwK6wuI$7A6- z@tj|=5-LuqIen@O2yxMEz$Fp<=l-e#yT7F)2$UaF!1K_7jhfsI(N2IXB(#**nbApv z(vH4tB(oJ&O(FFYx|c-2nD&)ZD~yQ zszG=BCNHgS&~V&-JE{(Ia_!k~nxWw)+%1Hp(+HFk33F4}vAbg#f}(N4HpP(jR_K6! zlKV471o!b3>W;|}Hr0L8GJYt-AZ4#|vPoF}kq~4If9d^deBGH~2Hd~SBTh;Um5yg> z)!oQtED&xHg>G)FOYyF)hbveG_!{QfQnuX}@&w}oHY0YLmJHllBS~lYwd}40~YScifp$!;o*0%EzKHIj!#t`Y? zd9RPi93b5n&8B&s@L zV-wpyFPXM1GOr+V{clSY-yJ%pfXJ0(=A63>`D9C+xunNPjieq__v}nurYHUEYWc)< z2-u(b5}#$kHT;%2BzBGGZ42m4yhn~tMG6`0QYi(9x5`=;n~PViP_P@I+CKb*m-_eL zw;+6oeEiNC+smi|1TqS(^2g8MFd7m6aucD1QuEN85r^f8TPl+VW6kS*3W!d+Vs%cy z3}z~Q0<1KGEt1-rqYJ8QkRFvjWgHI2C|V;An_~_fC-LBdm;+axzt%!1A||zb72ye8 zEeO#WpSum!^k_-k|h|O z5O06~tS8+q%XYMZKD4u&Cn^8zfTe8MkohhJF!%VRC{x3t1vKJwt%&XtsW9wt<=|`* zDbQ9TRxdyDb<#B{oTxqnGd`%i6w%iw?Mb-|a5qVq(5BCV;IclU5&c10mp;uB|A}$v z8;a7-*3&OHb9OTE25*3hJ z)}kq93GJ8cZJ~zZrw!*y#5NzTicOa9fc zkTLf5uaAC3Uftj*wGLTE?Dvsk?z;{#&!YxEhmLr-2)aAL0KF$Qz8s=r2@CbL>RmRb zK;4$%9)1tFcK5&-)r!qjGE>m6!t(j%;id@r(6e z>LNO{(#WibPSc4f1-J&!M-t3X3J%9?YT;wUDSjh3@n7E`e_Cu_}EhBb5Y-tD~1i3vN zwji)eoTB|?d4Mejir`v%f8WZ1#r)pc5AvgkU%w57h}^7dp-nTseS|@I->~E07p1PG zLBWI`^^_P%Kjt$bG_7_Kb8d)eJxZgcj8cvfQz zQaC@g)C#Qx^Yzn;)9~HNUmY|+j5`~dFdf)3gaQT+l58~ z=V~N%DMvx8k|~|$WAkz)ew=yq+0v8o+hB;{IE4%5lR#Ux$}Aid2=^a2-L7yM);&>=V#!8$8SUl<@?_$NP`+ww*s}lGHR{R7OuyOABT=UuJjfQnV2w(Pi zu7VRSae_%RG+A$|pWu*+MuFiaDI*Au-ft{ZAY!{t^k(oAa7kZkB7ws4~j&>U^e=PEG?mBw4?+t z)V^OK-XQV0`^-=NkM&sw zcgEtQ2#C&*ZDXV%)w=Oo_19f-A~W`=6e`vVvC85xN>%dR#M~)wODEt^p8XoIL`01= zLh2&pYDq8tn_R62j(5L%QNR4T(azX+B{CAsGY z*ZUbfPD`<>e>YPmA-0v7r}n-&vB1&vGJR*C^?eVtW}?7xKltwfBVH-S#Gsz@zqL1T zn*7IbicvDbYVNF5#+x%V*1Ju*@L-|y3W?#Fg_RD2(altoaIH1{_+Lc3JW-JiDBTJ6 zonfczIEuzzv0mw5%P2L1j;Ma`-{(0-)Ru{Y_*OqbspVKtS`km0WPkgTpGb^d34&O| z<&3a+Gt?3}0GGLn^wJv--3o78Nwukh7k;6_c6MiHNnmhbLH7gVKAfWV^d6mujao0} z8!Fa_xzShhrWvUB8IRZ=F}NdY!z}-fPy)k#0wJq`9M%Ew+7=BuS+*M88Ke!`W zBBR6ayHb_sBbS@cyE^{#EhP&Y;J-SXivX{iELH3_D~cE+!9dp?^^_#4I?)AOG^--p zN84M*On$Q-(!3JDulA2vbzd6~_eGeE?;9|L0kDvk^8F|etTP_7vTI?~8vawP4ibph z={Z#b6j)e6NJM>P9^hv-N6bw7r?~(DQxT=hZw@kmc0U%{Nju>q>YQ9#1`<2A1|Lu;MeW8%f0F~xK4HU3~gCU}R*%d5Hsk(ZeAsf|uPVh3cF z5G5>;d{iT0TST%3XmOhVQ@T!4WD5=i{t$MTmaOqJ@oYA^7|nNkc9O0)9vbYDDwbYT zWGAH$8S66>TJhLCZp1klS6T7v*E6kPmW|xg2Ud=+_&o*vuE-0hk~NBzmkGMIjR&A9 zs6t{Ys_7p-=pNh)?~nsUeGI$%lt6o66F7MHYpk7EPADyhpf$%a(Us%M*&9>-_{u31 zI5Fc^IsB<~tU4RGzwl5>{cRAi82%lMlRGgYZL2C0U%XZs**@Z^HlqQ)BGKjMq=lz1 zbc|SoR(80-0WuvK4YMZzx1;L#-J0vKnOg>2s9_b_R{em~rCMw67v3~ab*PUr~fysrGgEM}fh8?w3S@@*-NQU4>=-bdArY85}WQcTvPQI5aAT zhy+?skv9^_1i_%mhe&-}4tVOTl{QslhM4fy-(+&WG!@HxiHHu(9RFQOHxzUkj?MIY zE1Wz1tG_U0#9A{T3opb7&9M7(u}UQVF{cu{#^DFy-x5L^J=aT)SDTPKVBK_*O~35< zIbYwTLJA#<(;7upUQI?YZH1sn=+fw1uQUD9OhY_x{+~@}vK0K4gD?--=qW14K%{H^ zK%JO7J0EeVt*qg?Y06qyjM~?5{J90rOdoZAd7;aYw=xPcUGchup6;rf6vBps$RURL z%WqM#0vaz{Wl%xjy}G*H=-z-kj77T5s@YHzCgusAchYMe1;@92sH2>SUm+;a7*VQj zJk?VyvVXz*Ee&-tt;*kqPO8^LrB&(Pkz1n)YD(IwI`f(wQ!*Vm;}y`J5s(sS5Wj;H z8o3~PQIo}<>^9rFgpeNZhNe`|b24Tu*9Bka+I~7}t>SaDEyx0!cVdT;1)1i90~=EI z?$3p+344_vxY2UM0tnNYTpGOv5c5jk>v!tpqEFX^X&GQmPCJ_JGp>liC18;;N?62n zh;$ceqeG}LDoVlor!g|tT%%j^WEu_^FEzey8q2t3SHXL^ z>DlInEi~X8eIEI1+hF<)dRU>W;Pv@C;iWx>fuh7I&!?s5K;p#TcnnK8002HBC;_j8 z1;5AS^B$|sfDbY9z88}CUfbz?&z47P-m?ReUJk((f_O*GW(%E+Vulv$PDea&2z)sp zXOpgu2Jx5HsxJxFLu}lqi?TE9rn4#1KAxlm71zAT$Bvjz`oL5Duu<2JzE4=HX6pJ% zZS}PjqB*{|RkqJ6vsb_yKmM_cFX6eoO-i>A(GFDs*1FoP@QsRm-9On+g-FsoQ>05- z8;a6r0OHasrJ66~3RjmN?J!MC7G}(}WT!oJ!aPA7$-_fdU*mu7cYrPcdt58*xN`4tf{}JO+i|A?bcX>A*^8 znH?WNuhDl#kQqfbsv78KxTV|uUlQEncbR)#>YK39BwW8Rf@w=Ory>uToR}0>5v`4V zQe*NzERB541lFoVkTChR2}0ez zI;q3=H!(}HWEjeu=8{3jAU4@i5tHR#%CRINU(PMR7`+@wE=}Uwb-MK8EQK%rpDca8$Zj!vCTzN_>-(0)Y zrOJWn!-r^1CK?0lq?LqJoU`=M@)``okfpFs+r23PmNt@?h3DY52Qa z%Io28C>5{p(2wrs;gbxtRpHlN@85}_(U^qSd+5#elDcuxHVM(bU^{qr1FzztB0;)g zgKx13R9tw=CsJG@R*w}b{XoCi>C5bb$~TbN|CYH1Rucq=a|AmgqL0<>49XPKYP+ntm*4^j4(3@(oMnm}Qh;R}PTWoLc*8fE?v{|jMK+I>35*faP z(rk)@pjZ2o>V4@1w&6=8E0!8gEhW}IEF_&L07LJaYmsE5L=vuh*N}F>1I1IzNoIfW z!^u-C8EUga`~AA0_&D@A%Pt*}(PN7sAF(FOHxh3)882ydwr2=VYb1?;NbYn6RWTPcd@ruLT%9100&^e;|lz`nr z{&>Wzq|W&^fjq7lC#Q^*B9dYsPV<0BTK>HlSoFM!!wnba@(cDeNy+-gg|DnbkVT$= z5|~#~eq1y){IU}xQ$O11Gc@Jpjb;}13D=h!H>{)xDR<=37HYE)CG5}dVRIqN=2rPk!Zji z^{(woh055366UT6OOdOcW`P@zn_DscSf4v23qJM(YD2F_&P;;i6J$FkZ>ysauwdmH zho;E&!%4$^K**fa5|RIiTcFUi$Mo_WZ=Ts^ynFT6#-6V2@yv*)l2iNT37_tKx7Kml zEV)DIbcn;E^;;O3e#c9>UU>ym)Cw}XQM7Ea4XoWfP#a2ET+$21$8d*y=m14Py1$_$ zcdk?oqluH@n7^e-{#-%JSo{yp%Di~}CF^Ne&9s5I&H&^v+dW{+H-^iL%sF8_L7Zm4 zEdZb_#8WfHOpcl;aFM`0iNsgK7K6MP0Qd7t6DjXK^2ZQmVvf&T@=GV=@N~_vJE+iL zG2~MvLQ`OOFjG4m%ISeulbzhP{$cY*I}ieF==Y#(MrCWz&G!Yq9*%ezD;s~=-`8sT z)lbeT9f&jAcV`wUxuOFuO|ga^i@+)knm0Kh@hp*eYslARN{1w{}`tY+t-2d zA5Hfnks%oJW|oizV!;PA5g8N-whQ~}ghwtar}6dcb38^!W>>}C(NTX51BtxgO;B6^ zN0x!?qp1vs6>?p$Pxe|hUK5^0Hx~hllsqNwMQZDvf^*a|$aEAymUP!(VDAc2t*NL# z1(Z>Ox&j}JCNU#kb7P0r0j#h(zqO=aIZP^@_!~X!h9q9+SjSF^n=5%kB_h#TmLOoj zi+N*y_4rxbB4?VGk?nWCFYh)6^FNbl#J%>yu)BQeZw>k$zpPsXtB|A|m`C&^Yn5y- zw`WlY8|@Yw^*-dLLm`DHgJcEM^*a6)_fIVwL>?9|*O$+^UJ8|@QXzY|<8d3O1&~ogW?mDLSz%~$nhJ^^q zVwL>LcT!u)8!IjP(z>v|O(^N52*m!bz)zaR1~Sra@4FxmBoD1=!3_JMlHTfkO6=nE zxdk10)<-o|A)|FmNl{YqnFm@3TQ-;l&JAV{vXOPWLrj+C&y%cJ_!V9*rh4I~8$bT) z_6~5a5XhpM@eZb~;JZD+dAvbn67j8`qawB#=@zH)9f-$+k84UJ)drBat^#u4Vb)CM(c+$}SI-7K^ zUF%qpC|^GqJ8VcN_e0T>BkybT63r@#Ei^5d_WWEe`vPZAxZjLga9;8W)8XBEKjQ!9 zQHvHULq@~Y;ju6+|9p3L6!VR& zUwXwg3*5qs<*k&xc6$E&E&vxKCmuy^X^g$z=44dPA*U!V;dXOC%p=$+kxH#h_nSi| z7^kcRU>3B(&M}e*?3pA)8E|#u800x*9zsH>^SdC&X(jv&uz?rIiq;q?Qs?YeQfCXj zvs)!Q+u^DTqw7=RLTm989vV{JXMjE&61x|2+@`ylBZFm&g1&Tt=i-t@WoFao@b6kb zwmxr>JS(E%ekPuJ7z1_1H;py%JxDhIqiZ&|S zAaMVx5?;1X2QIk*8^ZneS^!gSBVj8;3`*q%QoN<-SiHc)rl705UXu;>2FC(20TF;X42Rb&@@OFFCG z`E5fBS4M!A9*Iz%L(^54&@oqvC2p>El0B93LxuoQ>NbRjNeSf4b%|8z1TE+Dg#eqJJrPm^(g)A`o?h0GK=o6GJ zH%d74@Zvgu)J&wxLF+29gt4wQfW=})^0ZJ$SA5tXI=ZTDpe>D3O{mEBoeLpF_Sm$T zi^Gnv9Zi4np8%|)9M=dTSJc36y3qB?E?6uqr*9){POh!a^%roWS**Y+mo!$HOqux^Bx8g;6zx%d=7r9ZVTD?f$`)2xS_UsH<{LluKu z%FK#O2<)->AS%TiPWp}uAcgmmukuKZ358@BQ;ySoUh6MJ@+B7e&Gj_U4SwKrJ=D1c zq>O484guxD>}&$0u(g6HKM65>`Y!lvGRde6q?C_tfcwL*c@_$k%3J|kdQlov15~_M z>E}dj0C3I2!j~3&o|lisJmd0L**O7cg3aUH5OYhNCK&!O$@SuAT^Ewth|EQz(``-h z6DlSn5nn$vlJ;cusNdsN8Rb9Rrivaf_or^K9=Hv!LVfpF+8Z^HMTI3?zd?<-9Vt#} zVF1btSY!r-2agd32t-BWWm2TFJ?=o*b0v^20b|&gCX{|FMpO^#901yq=vd+AC6WN( zjhfAB9lm;EGTiPS8n}?4*O5;v9Y0K$+op?+;Fx@#p%`mI>LP*wg}K&3-u$cT43Md3 z6inIJ$yIQr!#*M2ZY@K(CpqvK#}>Pkr+A=lg)kZ4h0ba6LUmHab6D{Ew^3q%Vm6?eBwTw4cP4D_g14PRlx zQpavZAxe#q^%VtheHJ|RvrN;HR7{LJRe{FdC!kWLXEmvoLI9eaP}$h8j-V1=bxs5d?BBAK zQ9asngS>x`b%75ZSz%+W=(izqPB;ED$1b)$Md}GSSoNvpI{DTl!g5;sC=b4AiGtRo zFg#r+W%knWuBb3WP00*YkHpIR>8Z*LsCZErjkA(TDTTjreMxQcRvX915(I9f9KU-> zyGcNixW`pk@=xAC8Ev46ilUu5yP@eksG1)yu0rABodZXU;kBP;nAz$ott(BMBmdwP zExA3Uufp9&wMR)7X}37}6p(}>rJEJD<>zNNM$JpXZBFkZ9Ac7(0wV(aBmsr9o5m|0 zG(5*Z1jLm+Y-=vcBlnHkv`ueZmeGF!m>>QT!!1uSvh-1_6!X{Kr}=OZg6#`M?(?5q z?-WK?K0saz(jy7&^E;5%`C+_~Zrh-386hs4qKVvAbeAH76kI#`C%1MMI{0=nf*w;P z`dN)iIz9sb+N+pB*9v7C6U8KoHK!LRtF5JHEU`nfg7B^pulRa^E<85e;gJTR*6K%A zKK{e35kOHjZLVhnpKW3=3$m~+6DD1Hxa$1tZPW?EPXr)Cj$ z32^kQig+O!e0C;4GMOAX1}DqHS0~p+Pv(9Yqp$RXy+f362Qt(k2-mjy+2^`!06vNm z=oim|#n#kV-4)BvOJp^Ng?%Z+$=T*s)ABCdihfMN=e5#Q1plH3Wud<_I$y$*JeJcM zmk>@ewb^5^ydFK_Kg`K7hW$2)G=R=hQZ z*Bh?pf+cGxUh;J(aX(uuF`$J)?K5wQ5scii%>qGCUE3O|;A$-a7 zpKZ#-iZT>zb3OS_^ZM2(vLH8YF|PyZd!4@tQ@^k+$SpvfY1zS!^qKMW{vAk_lEJ&uLK75J3TQQCm4Y>8n^Z5R5 z>=vF1;U<<;bTloLa%I2^i_Sz0X-YA1WeO!W9X`O{O}UhdlZ4Tp^rnHZC%LiTakWI* z8`HOc>Qc{`JfZL9>IMfAqPo9Xz%b>YII9mV2A;V0lXY#3m7(;8KNAK|vUy+2;B$p# z?f{EvC*KuCRN#C{#zbKURTj5)Pb@A9jbqt236=0wG5Lp2V!v)l@TGW|ya#h?tykPKZ=%17r)YQJ9ezgU9RTf9+Sw5RDYI7JRwrf6}84ZVs>jT%Mu#R8^ z7Ogv#{KX65L_Yl9w_CuCl1r&~!klXC1?hmh+7QHVR%2-FM*_MHYQQtQDCG2ctnL=P zU4$|ygYR0Xz>-wJS%NkiT}At?RAd~$B^q^xeovQmZNKCg!f{_)sUZB7aZu(~P}%XV zfBXm(*BK%KMh=bX2KtE(OkTR~O1uJCel$hdxuDKhUk}Pyvx$vDs4nNVqW@sPQv%x1tMC|ALf zEqzt@hxqiMUVZsB8l!1qw({mh<^rgD?i(dmboiTwMlj%<6?nyNG6spz2xg$t3%TH}-Z{sNxnC++Z zzD7_PknN_c;>pkM)EgmC%f*W0;``UZqY+{?ePJvhD$+jgigvN3;i-t5DmB)4Op>eO z)lJ$QZ(C$vust_F_j_+mv&E)YeE_3H%az}~X??q3rBi5T5ha0Tl-WDneMU2)(%?nI~qX}$Vh z%P*Bu_KIJ<_x14CjYD=oCr{kXR`KATd+TKC@w>hDwGE&f(zVw^QfiYLg&{gQe}q7v zTrAHQ%QYATCDsq@W&P+-+1@s*Wk7%POH4=Ykb?62PZ`rD77jZ6R*kQ__1i|6H=e+v z;IHbwTj*VvL7ca`mION!Y^wvFhxVmkRb^OZAgUro*^NDZUME!L9Ej=I+JKeFV9f$s zz{^I(8WA;N0bu(C66zc46tXWGQs37KaI3<3Vdg*zMk~L?U_yx8Istq(Tc_4ZMQS35 zYqhw#iAh&%!IJ7>=vjQW8?gL551bY-_CRFhRM>YDfF0FxmN`C@z~D!M)Ou{_ZIK{> z5mMSTEqbsY-6tVR?H>RZudxmBb%+t44qHYeBPN{yrQU~k5RGT^c>+Jc&LxrRaoyM0KFStV8 z=(S&I+3$ZdV(Wed;Kem74o6Gsp&~20P(`|fOT3Q|+uvHs0Ff9S?1|~|gJr;x%pam= z0ar3f^}OIHL7w#kKSu}_JQp271{eG^&%62)Yolz##50maOB|TksSX0DQ7(9~@q&r7 zz&z;@SGP&5(}W$wwZ48eIvht^E?^g)XU%A^N7GuJbM-C~&#vI>CAuGTcL*;w!|LBT z)L^W;Ps*jd_o5uxAiApnEN7$6ElD#WmbwLsLQdT#KC51EGJWXF^yh5a`EXf(Gd#vq z&?oO{_*Bd)wvU0KSinEE2w6=Y;x?{_?@K20?mX4*-?A4n0s*pP?B>6 zK7kRJrn(YnG&j{!Ppxp2)_d`FIE0d~_phgzn03N}LLVEqx&H3wPZP(;)(8 zum@@wP!H&S!4eGKvfvLE#u>oWPB|nOHo6kA9*7LzpK&FVe*H0x{{&tGTg5`Y50jO^ z+t5ic2eY^Nh4g1M1}Irp6A-y{;Y2V@sRA{7Yj|?did_7YK*iW^!@W#D-oen{xf)sv zIn^9r7Mqw6nhzX?>gj{|Z%9V7Vs$NwQwcOkY?aP1RWKsM-Y)k9AYe2TTDLn}rm{dM zP|*AMK8Kt4BzbIJK+6Iwp$O1&DI@~3GU{QL%yB3ph{7KpU|j7i zpo&S{9IV#W=s^C}SMkdqe1s(Us5$eqKv8D%K`_c`VjRDJ_Kt zB&D#IA$UWHhSQ#1J5APRi_1bf>3Y55;0>u=7(0ysHMr2O+a*~*boWAKdfBp_S1Y_$ zf!$VHBNb=TDJDUtHzWko6T^GswmiM3or4evU(uy04cxYh7_2{JCysCJKze@{EM-8+ z+fum&slDuoHBEf}O5I}sR|M@Z`2|PP+vG`GsWTMUc=ybJC&cbE?)n!<5Fu_E9vC+B z0XSBqab0Tt)xpY;vtrf_S+}gu1-&A^Q=z3(C~rSXqr?maoT%>EjSP_*BHl6$Gwm?_ z0;~rv@N5Jcp(?*n-SDGy$n`?1JaxN*Hzj9;a!dI6^R7o>V?-fj?k&Beme6(+`Ah1OkmrHKI;E(D>^6E z?Av`V}YwESX-?7|% zsaDtc(a5W02l1y zYFW#}|hC4oFf{JY`k+KB%y`3oxL({NR^ z`JpWCpGaGk@=^<75fO~eQsB$F<0~|)vq|c2P**lbB;?cIv@XamugG~r)$RwD+=bv0 zaFBV5*L+ecT=1PPeyvIa^#E^9rgJ=WjAkeQuXeVQPY(#u_x29L^zb-qC&*||?HFH! z&MEsWWwC!-qf~T1{Xon&G=PBz3Wkz3rn*emY+|d2O+?2EAEpk6fO@~yHZR9tbM+AH z=!4e_Th8`_uT)IgzFDSPgm+jZd&%&bQM6%|K3TjGgy7hCpf6CSrOtaZsamh9J1!At zJXZBQ=Nn#zW`vc&LL1SglF1>oAB)N_IXOkd5g@cnl>cfXi?`n=8(%9{oe6F)s>34! z(OFMOOs*zU31Rl5yOaj(s!RhC#aNUP#9oq2#Zx8)|G)r?er>EkV>rS4j7*rEn^!m1 zF;1))=-IdDZGRt`35^s)kPGW^wEMlz&L>D#kZ%esW6^Sra^9th#SA{3Oope#dkI5? zo4*~525lNK*q+EeZsDLaU45hafF_v#BZE{V1^&SXN!Ny};FfIY_gZN-Cis=gl&FJo z^%-xF!MH}ouOT7=JP>P=`)WHm@@wBxwoVf~9N$O{ z9lEM7MrmR9Y1o&DlYo-D69T}xV{syEUb^Rsr!5+;3}DnJ5Mv6;2DsgUF(3tRZb`K? zmBUf@H$QEv{e_-vQ-G(fn2QBN>r&dX4n9uZg;bf_6i=}E&RZG}g?o@kj>X5@y(o*1 ze3~9|()z9VJi5gnwn)ud=Ir$R2y%6mWiZ~}fj@O-AkvB@*P12zI3eC*N_TypfC`bB z3v=F$vPtvD1=qH*CN0on`8Vn2d#n3{JPb{awk!v}PTmhKCAL4$hL$PU^*$V%neSWl zofS=TH>{BbAtSBT^@xzqT3QX!w4)2+WahTs%xa{70V3 zAzM>lo>R8-)&`cqHrJAHTYK8qhn8bKT>16x$%x1Ie)qh1wMT)6Ovb2_UR z?Hidb8Xu*YzdT(U>e$*qNk^b#&C})n#0Ko{Xx$s?EJ`XRtkB{9qO45nBwm*4d@&MvXY+JoeQ>sC`YsE(uN};gL-2$|j=~3^> zF$D_$i=7H+J@MtCurqolWT=*hOR`dGNI?5Y+g#9WeM>{Gx(?~sfcc=2bX%Lm6LIh? z0|ihYPn|F+Xw$F!P-t)(s&6stF>y9Pti}LhH_1vei zA%vI}(gUyowCfd9OG-O|n@k}DB}&R1FIbUOvAh0~LObNBCD4a~X{=?b{330kLKW{R z`uUKzWkrwg1+2^qL~13*kVTNxDeMjqK0HguvQAQI**2qR7iBBcY$u<`hKE2Ci<7*& zy`(xCHFu5xQG&<{+o@L!ZI24zZpDSq^pMpK*gR&sWywdxrzJX%r?)Q#M+?0H3d1h& z!clK7vuGBERAW7b8V#@5R7_)#`mr3xXO>wjifWWYHls1D(DrU+f7hw)CX!Y#HXE~368AD5Y3H72l?N^c5Nhyw6XCY zD6l&*8UVcF7Y;IvqLkAgVulOqT&u@(0_z5x=FR$u^72)0IzrQ}cf@_)z*rZtl8T?upql9bPSelvZ#R za3M{x2DQ?6(B=rc>)5GyoON5*Yhaz|`K*cDZZGy0L$1ivyNp%fEd`dTXp$vgGzMsm zikgG84@2x?H*Ni2HFv~LmD0}YeCm+}orLlnqJUhULhI)uEdCYaqt#?;p#YqoB(OwX zk3FKv3*Ih)J9H>65#G~0gOp!0-_YjGanTA3Wbt|ehNmc8EJF@#-Y{>GqPM3HbarFE zo;+1(`6Q-mXcr*Pb(S6wXjT37!mw3z8$E~^OlVC!5&OiLmhO>Ht)WkVZn%7joJ34^ z7dDPo7l8KXy6i44*Y&Tau3m1LJ`Wq{z`){% zxfM3`rqdW=KeVpCgE>|LOrmVEn07M?tdHboeP8El5vGahLJ5v^(iB{xep1Mr*_0ZI z+em0ZxjsW8-OnOMft#c>$%_~tE{_@a_^E4yqV{8hB z{kg?n!6R6EAEI@e_v0o?t@Ikf5Pc&;-+KZaG9tBllhCdqLSI+L>gT`F)G3e=SThCRb%saCb&y<*H>8~ zTW_@52%FN~Sy}D}$9F6UR(PRl(~~$Gmhci@ER{)T2S-Y!(LCHbA?^Pk(}-{~*a(Z4 z`+dyWC6{Q&@K$NqyO20b4HAys;jxz_Rdv-^Bp1=baS-8TM<5jMaeB0j@2np?C+jv= ztgJ%7KXux<9s2duihuS-wpK}KX|!J@lpFG5FEf}lm!8Q_;Tp>c}V~KAE=rJ-1Yg7J87yU(z=qm4;`$O_hf1BK3-xLn*cXX^T zl3{i#48`%1J$te?BCw>EBGX@0*znJ%y(hZn5Zfk+3NPqptN`Of;=h7+VN#@~q|Yo{ zQVW=FC;OP3h>a)4KXJa&gW2OqKuBa=iC(n-Bv2Cx7(R+`Xx=+Y>kQ!crQ1|X3uqHj z)j{qoU&uA9@$Uopz5a%uQbtcUha2#S_TMoy^Zu!k>&ca26=u;!;&^P5*%9j&MJJ}N ziMAs(C-dTKJd|O&+a2xuXG8jwR#l($ZmJ8@iXbh&qkJKZc0=ZCPQGIJ7QdON?aUGH zkd_hOyu(-TH4Lq&%l?21a1&_p$ z6ms47Lc^U66^QK2YvJXI0)Zax*5JCM;-SZcDebiog(adLr@e31gq%iN^dtY#S8am} zTz3zw!vZpU948Ahr8AG1gGWpy%3z3NZiZrXMiFya@+{_(^NLlaNM?~&itmUnC18c6 zvHg#mjTXXZR|}C)#UO1K=uNr}2@{Z=5S8WMv3tU(M(k*)4yO0PL_Aq~kLP_5=IY7L2*GI1s=46~oB& zK@4DWXxGT%spr9xT#*gQCLOC^{Cx+w6lc|v6aGsjb49JoGX`U#A9!C3L%s8))V}R`Aq~uw4D{@gFRtP-A9tv zUS_0(&7^FyTCb6EKrlLq*-(|)UN(K1=vtR5}iPv=6e|_^TMTEh%AnNlRuxb0V2|3Y-utX5ADEN^UuS~Jh$_y}R>6?0d}xAuda z-90PL>vD*Y0=eEFyBAlYROU@YN=-E2-amU(Vgjn)+0UzI_?35+#iXwYTy zt3Qcl(Q4s`o9y=S?ka$`Uu|rek334(`6tUOysC{wnX?3JRn_GUh&%TmM$s(%MRFD{ z;k}EVU9dFu4L1ig$_+G+`DjGJECw$A;5lqa2);IkY_w9tSHmL*+g4EGacJ);1b#IR z*AlwDX5UOfnxaIpiNmvbbkkxS8)exv;Y7L^&Y6X^#s#OZ-x29S-fOnJ>+)p19^8o%Tk0BkKbHJ35u010NDX#?5(a&O4hu1d$W=hHht z9TO%s9&uU6xCmav4bjg?@b6|7nI~qvblK{S7(Q^q%i;Dw2>lpeq2OoJ@ACdg*X`pY z6r4|Uvlx?XJ7}4A=!L5x9l|J{)S06e7B!Idjw3;Y=BmtfTIB1L9S4A0f!8c&m_>)YAPc^Ybvg|yh~&i(+>Zah6V{|@b@^(WqRm0j@J{r>=ahG=v)ZM-=94nF zLhZ_<8m`Sp7QDfW0;hKqAFz)P04e-l%2Rb*8ENVgI(2M~Gx=G(&Sh|7gD_|c-y2~9eAPFc#5^6S2Es5_wAB{)kuiik*?Vm))!(lsOSV=r++hRlS6Uk z{p1|!JYOmHVNZfL&N{64WH#sH3eyKuvOM!Wv{*~HgVK7TgBdC$9_<1w9K%!0&Y z4?Vi!j&YO=Dx=c47NDmKdQpuHL=iy8lad{vxZu?L;DxH%%Yt?x#HJf!3dQWaQfLCH z>0~-eFuL~&mzOBN)Hg$o2+EUZT|ti2u8?(g4;qVYGb0prvv=*Pi&Uasj~Ao#%F947 zX(|Akrg%lg)B750eYAiY;XGUR)aj=@i^Jo=c9huwDg$*dXVS zq`o)MZ6ZlN^r{4x1c<;~=hqh-m?Uzuc+#7D8nh~axAL|Tkgs$uae+3ZmChO^rnH&?ifr zsxkEGFd>GvqQVj1S)iM7wp#2GPx1x0qvi=xCnYx_GA?)wnXkfPH=XgaWO$^*ql#`Z zU=Z3DaXC+-RXQ19c3~*sQz2c2sEkI>R7eCzgE{Y)7^FGgJ)7_At}U~;%p0G~>dDxW zsYgGrQ1f8sM;@3l60^~RYnTiJ;ltyP5$ou3!~qB5p?cUq=tBaRE?K^Nzjg{i|H;m( zr=uGj;U|eYrnsO~iy#*MLzu)|3{ur!hq<{Q5cVM+ghcB?hD)mg1d+2k`40QQc!q@_ z1sqz8Yo>fW zOblTEb#!y`KXF=>jjdQQX%GLholhjxe7NS%^?P2Fn`A*uHEZ4Yl6v_X!9Fu*P?|Y} zNen`(z&mzRJ|OWR#Y~z!oD}z~xO~|HRC*-ZACrVr)O)RVF#&G3kL{fvq zt7E-kv{c6DF};Ik1B7|!PYReBKU}YIQvnAD-g%aoaVL+DK3U?<+129d8~5^jT0_Bb zRZ7Rd`}^^$*P|)qLEVvXsl9L>pC)&46$<{qM2*{k_Al*w7pY0aS@x^NO0R0z?LGE- z_(BE_X_(*HB2L$|kt`q2$8ctkx~vuen;#udo-}R-aWRqZQ;2M2`G8E%pVpMTwS{(wX7m?%QMg98b8E z0URQHo9HG_aC2_?uJa(_2nEf*TZAYsBMJqDnI}!71D!xaj3yOJ-V~slvT1PikF)TK zsJub0>DFCK>nb8G%&*)AP6|cRI7r4M{}pnaQ{z%nSLnsI+J>%1bp{PCR6hDgi+Ovn z{(;HTfQJByi5kwEPYHU2CkMV4HMZ^l2_5R{xCWV(1%HZeRUa(rlk2rVo53%BseAop ztQ!<;ipy-dnEA%1+MRaIk`|B}9-^8Fkd5SFVz~_l#Sf7weaO^Aitgt&8}!~Y*xdR-g;~i(asA^BA)EE9J|SGZ zWkPj_7hN+Ju1>V(ni@wl#81#cW&V6II}$ zt45I21=eQ;;W!x(gk|-}Y|Eo1|8Mkbyg4aaUwKC+(aIu+xVW*C;Za=(>f>NIn7ph0X^-6K20^2nGIH( zwptT3`OIyHq+{TCkulFK*ryjS`KQ%||K2ui$oj9MW4RYxf^O#2>6~m*YeLV197+pZb%gt|sr#8hRHy zU>D4R>`g_*p!7WAC%0O$o;)KbC3e}(1S_Gax6WQ-L&ct#j9!Au!|vYR|ER)4Gis6I zXLwls5VSX<=iWsZfob^q^}oY2up+3zH)OnO*yYDT_eicjGPxD=8@|P8{)jEr_Q=0j zOX}ZO##j>C?MwLI;;e^$eXXE*Fr;SsTy3))Eh1Xj_Jz#%w@EaSX{@K_rf%VQ$sMi& zl)0nPVIs+#MqFwT=PhVBGS`&ZM3^e&t6rb6GZ#+=a3Ymw7)*%OCbyYfGQa4wMbGR# z(}0)>GT;->f*mJ5ub-rkplY@+iRu4@>(tTWQ<%Rn8Sn5Dot#oPN@p0}NKqdTpX&u8 z(Use%EYu5wdNIDkW{ynilWqa&@IB)vX7C|II?877dGtb+6II!%9KB75@JMB+ zIAE1^4ng;2#3U(J>1+U%hWjFHM&=WrKt_UAnnE8McG|0-wjTjP!cJsD3n?6QKM z8U;4&$Q>X9*nhaIBdNrk8@jf&A2(+xyy^%?pTHTR*UE0yt_n2CBz?{{Rn))$06dN; z0k4Dwb)8R*9EBykY3I zy%31Zc?<_*P@ctRfoEF`+=YqMqM3XoC83Y=JIbtR|EX_OGrud1|I4dr(njgM?_b=b z8lS0!g5YnKZYSw(tV_F{U0u-Wn1@D5HjPld@|$ob^yCO*g&-YqH$cdmG>{l*Z#Oa3 zc0r(V-Q143BaI<0RlU5D=F8}u$6!NmUMVcy`#oV-rcOA$^;o)_Pl_Y+cR}JM`}0Fz z(nAgMu)^Mlz0AZ)j>`bzQM~p1#kB$?j%A%mId#T9Tbzvz{To~Hx0|@QyE-zu;C<5l ztIb7$-eyqyPF?#dyNNiSy;`i;BdC;6aFD=q5;;;Yuk;QyNAgRa-wluur>w)BK#I^`u^B2J{ZL+*{HD=pX8bDDp z31n?f30!8}RKopan(r3=Kthi#aCK<5N%$3c0Ro7(7w#Tjod9JVxF}2{a)$YRQgVn` z?X&8GA2_Fw9A~4ex}f{Nv_tB%?pFT;16OIgcl}Uf!)M8`Vs_PZ9Xmp`ZcFaEX%TzD z)tnOQN=1b7Giv~9YaNFyPg8a@nJ{=xlYjHV#SQKa8JKd@&xSG-S=gF!Ap++T9lC~+ zpr9Sb>{N5GRowvDt}YsOE*X(tJO6Hnc{qJyU?hA?AUADy2+sD^d5P?;1}j^31u$}v z`c*e(+KBOm7~z$$!Ev?vqVHEwKkL&s^Hcd-X=rJD{p8l%gmqAg{DH$BkiczSLa4=y zRnCo_46Hi!Ngc?-CqvOON#%EYObIfO^4s^0(E^H#7{Tyj2c5KJ4i1w_M)D5SrQ2?d(Y~Dm&qpiO!T)y@-ZDh&W(vR(6FKzs(3k)vw;O* zH7iu0S_IOm^P#}5pO06OuZDu@!_ft|0Lbmw_TxoA!-GoLH6moDPrdf$cNMwNWv%3U zZ=G!*9N8*dvplb29BMXHLi%W;;Z&O-Q-B*>3FKrCtFj-7bg6OWaa z>b-NeXH%|7f@&gEfULpZ$DdIFb@p*9N5o>_EBX#r*57&HxqzM=p71|(tDc8;K-}*U zS#q%Ip7vRl_vzYevUE#6N5~zZ9r1>t-8a+QXY8nJ`1o>-BjV@?jBcJu-l|74-9@;zP3gD5uiM0(qqjt7&G zKi%^eV3j1ef=3&)xnivnK{*J`OW9O{9g>nwdAGwmDYrvA`U|_=N7<$DD>t>`!OPsB zE$fXEWWK)XGQb?zm;XNuRg`N`Ea!|0jlA2#FENSFelY5np>9NWV9VkbXn9KvheZ(- zfVuWWUe)&gBKM{Ad9$*78Y8w!=_YUH+wCQ>1frTPlM=qNU6^{1Kvqi0{M*b=h*IiPeK;I9^Lqrb{a$Pu-yJ`)^&D#go zF1DtD!TTy@_oZ`mB(cdTNhqix3{F@DWmlNwipSVB%Z>eCS{RDDNcEgFdrfC&2#NYG z0Pw%qM`-ZqvUT~FR2DeCMH7N?UC|ASHFqODBN_!>jmSu@cC@R7p@zjg^_OW4hDHl50WaV%d)Bd<5dp7Y><@v%k3 zWX&7wAKXlrb70e*ssbdYn3l}S2hknSFdD+8QCiHJ0RH;4v>E88$)Fkucs>tc?0>4Ku$@10vOu1(3d zX38PJp+utWtsRP_L6`;f5$}-3L3+@2nkaDPC*9Ogpe=&;og(ND)({l zej%z%rS%~*i(w|k5aW~TnOv#YJZTZ_&nsU+S3B7t66HJB(&Q=SJw`h)Q(L{f%OS2 z*WfXhOIci%&va2rDbG=v+&W`{fs8=X2-L-@$&lQV5{M=>u6>vm( z|HNdM=7vEmQEvYfK!vMw6?~XP+UaPT6@i-25}_hqIfFUEh&0!q0~0j6GHH~BvSioj z6$%`c<>N5C8qPjE`0$Tk>)_p-2`3TxdS265bn&C|rWG2iQ$qhRFn)#_g>m7IzFb2o zZBs6!q?@xD;e=HO_AW4ByNBZ_^iYw8W4ZZ}QZ*miw&WYl0$EsXPUJM9x=ZbK0mGK+ zYQ*%$wsRPN2HApsO8)~JbtjUbp269_o#s_053FPcaqCi8yy7fOOnmeZ6Kw1S50KfwQ}0?{QTFPFa^Ewkhi2+9cf#jyLBIu4CY zycZVA20kt;9bwLqaSH2zSi}qfO+d20WX*i3B=+|xu^F_(9+T}Kp1MCznr|t#Y7%8x zNDQ%6L$RIB&wi1d)jnyyXq`R2N8m!Q4`#P}=A)*FrPANMeAsnci}--9X!K|>M|YRk zV=$F%sXm}dmV`(Q`8IR@hFru*gVsCTWgv&D!`Lp3$!gIVeDS{EZ*UFMTb0F-=&dex z6gpZe$OL8TgP!{gy*_PsAKO^?ILE(jFJ|-H|1^4};+ilxP}s7HYRFzKK;ofa&6cvc zB50-OiIfQMUw($cU6!fADoZWoDmxO7({~ww?{c{amlt)psPCQsX%u2XPUNmyMo}@sqIlV9_oCV`aQfL61nt{6tiVy!33=w~ zNUOOxJXtN~V!L)dvZgfa2EV&Jpol}omYFl^mOU4@P+uI(CSV&S&BJ=#PLJ6J|2_Y4u%L^JK*;LaSm`+H<0va2QDjm@=Dv9!?8sLAtf|gq$Pb*@W&CN+9 zm4wlT!a{3ypMiV88?E*RDN))=|ZLH+W*qz7%_*zt@s$ z5{Z;;iKa-k&C&sjL7pM);6EHs+~2Kf#X8-I_b8982`9ExI{uOn-y3hPbnC_1=NX%g zCSO)QqQkf3*FQ25)h3Ili(L%37o<><-20sUU{&&*NSqnLOtrdY#5`e;9AOkb|8Uvz zZF+Bq5t3qgybYM`N5av0%g=rKdP-PvkVrHC(tLlZ#rHW~B4gv%x(ihSmLa{k|!OZ&pSJD4ay7SocMt>Xs=ZbPk{cPp^eCSkfx;~S^^(^Xa z-1K3qLE`m^lM_Tw8qe#9aHE+{$6Ziaxo@0f=|@q3c`dEq$tG|t$g7dBLvQ-vtZPBQ zS*LM+2PnVnGQH}ix8#w_E*OI!s= zd+vGDIwW9%ReEJ`_c1lQ->WmoK>Z0ls<0QNMRP}-l+TW}dU6DJBb@X{T2;GxdDMP! zUN3z^+V54mQM!17mL-5yuW-0?+C$}c{yy;K-LTB!y+*M3?(0_psF-JehE*%96(D}Tnbvt~m) z9iBEQ(PXgSwE+`O>aNFfGUpOKhNaJgxawa@6|9D3F@ktX67A)>+rhx)juoz+< z`F6Q(vuTF#?k1ffUbcmQ65Zq`dhK)5lkF@*ZGMr=Ph>)QXT9%m+lP4=NzUig!gr*48OLi<1^C8{*QCFM~cC zP%;L%xz84Hq8qEoKXKzrI*@HES6n4(?oA3cX@v}p(xrH2!YmBTWlwEMXyEdO`vkS; zrt}YlsxG;4#DU4yl8(cf7n`B6FgYxg)l~xg*XySDPm8ZG0jD>n04}>~pua{d{*x{s zbD?C6m2m41P#>GJ>J>fhLU9u?u5(T7X#DK@aV4dgK{rUxW$8w)c*AvqP!y>9arA<7 z+_|&aq@|2p?TiXbl=#ZBSP~wgn(9T<4$k$Sz4@iF-NbGT7<106fmiAH^|1zUwZ~3) z=i3a|T&D?NOFzLQA&3tK5_ z2)$C5zf*B=)uQgGN&*I$;yJc?oqB(Gb7cH38@N32J&c@SPQMTc*)m}H06fLHejMfzTi?GMgbTRws zi*3d+wh(m%bT|glTn~8k`nK2A%nAF=aYPr^UTdqkg|6AjT+HTWv0LB-B$mu~iZuK_ z9NoVw*5N@wxE%05y;C35j1j#?)PG$$%-E|PAyWE8)Vk}hk%4u#)e-J9ODbk4@czIS zRU(=mkbaU*T!sm)9ti0NzkJ8ua<2Q!Ownzkgs&sw<HKzUuRq*z&_m9g{|D?PPk7=%cbO%sHI}qwJhyXU7jR zN1Voqa#@tDoP6z-`Y1u7sg^(q0krP2=G=~LG#ow9m*3{IcXh14sIS1W%%*tv_y~Efbs>?jSi1OoA>GZmqme9VL(E9qHfN>nWWjgg9e@ zPh}fZpEJT(yQ0_y+m4AyP5Z?P*ap~I1P?wl+g*tZiem23{~Xya$DJRw{tH<$29M%BUd8AtBl1SV!xpFG6_VxV z=oTCG^lrY1hmOuTza+=Dq{0_kRQO%E4o?Q#x*6A=gvmW?lr`o7_EbVqo37|zg!XW< z0;*i+6FmfyPI#mmG;kxh+JY2Sx2exB)4VcO{!QMXeUZ%k<;SKIk{dU zNI$B!w+&uG!Uc}i-s~%f*2@^L%z{*Zq{YhIooK#dgoG-%bo^?Q-KIaq{a+H9=`STt zeEaIaafn5lagNPng&C_bsov)iwwa20t%7Jjd}f@7*bOi~`0n0NRPH>GA$ariQ=x#YDJI?n*1P>v7H3%e(3&_a+~!qd0CE z9d$KZ)RLSbazv2y*kD{PHF8<46+#uKeP=@^)=x&B4N7J(B5~i+uoA~6E!_2-oRt$Y z+d|FWr0H1nHM5=ZIe9d^@O}~wlvCR8SMlIE1<(Nu$FCGH!mId^IYJ+m2P(hyT48|v zc}t%dA^O<JkaGABXJL-Ea!_d z4lLlyw#gE=-YVn;rJKw?afuZlsSJ)wg>qnkQgLjnIL?LWo3B`8r4iQt=py=A0n@2D ziWQFx7Hnhz8@S=vzFr#OdX%SSiS7#(C8RzB8QS7e+tdA;u4bJC;14x?dFT)$4b|(RS)Y)J8Bki> zH!THyPq<8tf;=7DErdH}(cbNVaRv@mRv#3=S0nHWV}a@?Ex{52d^U~h-X?>wRSN>Y zv%j;=q6=)=?oBWDR4x#K{)=S1!?mljY}3cw7}qxuHJza{msid+1LX3 z5BLFDww7=@R(=Kf6&S2uKCE{51NfF?{$4 zYwOm@%A#zJ&JI}esx8nMENzRkRmT?diM3Q+lwIRQ2wSG2hnzR%8>ZIiL;AQ_X(x^N zV6fmoM3q#3aLzJEd@<>X#Piq4y`b?civTY#TbM+QM_5$-pm7+U-w8jR_9hKKQ&3^V zL;LW~+kU5A2sSed!sz7XUWeoI$YWW!4!k4rXMWs-2s9E}2Z2UVmu>}+gkZ2ZH`GF+ z2kCutWuO1_dz4j|BbWJ#e2j#X6dNO=6 z!yeuyING-rB1w;P8sgN4bxdh^XO`}SiIt<8UkSR_HCx9B&qO_)P{kvZwt3nJwx%7NbdY55COXpanL+5WhDtNs~$P(@7#L3$0L80k26Rie*y>cxWr0<>#Qp*@~w=i0psB)ls*tVS!pd_kOU z2+~|B(@GSt5VcJrptpp(gHOyCS=R7e?PCkS?xHWc=G={aGVQBcJ0wVC*gEN%L{LmW zBf^-IK#6s&@!A}O_(er79lM?2d%Bs?F$-zYygOC-V~I{rlb6(>UdtW-v|i5DHN`+B zm{J`%fS%O}9SBI;`mty=w6ioIe;yIY)Ri!_D*-%aU161c=#i_42?3;Y_B@t92}u+$ zSD;L1t>3Z_;^RB>;#Tk`{$*Rbd7=Qu@SmSGM-wHEthH6E zGxAf*fUx0|`bbixcMR@F8T60xOed~IGW1pl^aA6%2cd@26LlwK2q1AZI|FcGJGW?z zDP{&VyH-hkrP6af77?-kc}|;uq*b!;a#DRWP;XOF9<+5?DQ5Us3hs2<9di`&F=0|N z3FpNVXum~(EIt@}m04p^wV;6P6F9+5CiuDqGcR!-|1=; zPc`^BXuQe^*7rX25(-yCvLoiS?Ut?}K?B8a{Sx!J*3ej95Bd@mf9`*Mcol(Z#ZS50 zaqXD1X>^wAI2CC>u*ut-me}cr**V!or=b6dQ6a(1N|L?Y;(AeHp%v(YK5sIq^D#X_p z1gVy5Bp*zK;Mf|!;6q4>2@kbJE{RCI`;=|= zca*kmg&Wm#WG=lk5)UPyI3#?A6o(k(f8_R`)s)xf*N$onli$pL?u+`bRy+bfO2od- z8BH>JiyyOU4uy^SppdH1e2Y-kt_|6Qu558G;6$Vdr(5vbQY5ca|QCK)@!-+p-qYM*$`O9hX-;#R#0VHemt z>m>kwp~9p%dhy(uyl(E@^ow-ZcKA4rT9gFVP70kKn=X=<%!@iCxyB9*L&yPgLpNg} z9u5k6F-vVAt2fi zw$Xbb+L)S8{z1a+tTmtYv6TZRcInbJ;L(tCZZ||FZ|5XkaLsxotvGa&HcRjC`JS!I zvkZ?jL2e|Yan`pkR34N-@<=+d@|qM13Ip&Cd&K8L2A6Q+7d-N;tKo@qLZpM|>gbqT ztzDhKoNF(_10>@ir1M}l6PNk4TI@9+uuiIBt2j$;6VWBTnfu)Z*bqwtik`!1*dPbr za34+!dNk4MPW0EPY4xQzFD4Z8MBA0SS2~u1S}%x;sLVbmqwvGnkc`+S)EXdngbI#E zS+Ye3zj`+n1dD!QO`<|+IT?671@&BIIm>nXn3*bK+lg)9d7;`KhIt=TE|czqmw_rf zt?HC*#ssjVAlel`-j{ex+RZmMy3gCmf*FKAc5Xi>({ z2Cr}RBegIU9;_lt>#VzF!ac?nOmS0S)|2Ga<^^+uGP0ng*%FnXv*jy&-5JyvHH&~k zd=6;7&<0GRPta)wOVZZWP`cZyF99jgFc6{sxT?lZwqb}IKw<~J=K-iL-aldaBw!?! z{jjFk9wvdY129M;hs>WEO@9dUX5^jHqc6sswXOg6E7tuqH6G}S!Xiz>m} zVo>EJFg=6H6EklRs^jweeV@!DzKeRP52TOcS$28z;k>sBm5FW5U--yzT5?$o`GwKT z@C|3(y9h`cT#~c?v^qPfnT9B2g79;v{9VmMvj*T&KWZ7P42L+<`2Q=*1m6SeB)`A*lAEY0Y`7;R{#`zN&^DhqE{DwS<{$MtckdewSuf7)1`|`g+AS#4M<}#>N zOn74}W*L2NRST+7oxy&P06z>y><9<%q_YD5)WQ-`F1w7`JU5JPZQ_wk;O-iZ&h174 zm5s~~qJeI_ROb=;`)R}us*uY=5`h>@9iRTT4Ec$9aUaRfAaGZCNez&vJHihXeLRyY z@)P6F`s9ZHO_EHHW`vt?%;dh7)D-w#Mt|xLJ}=~R`Zc<@8vbN*Az5?1D~9uztI*Vb zYh^r>l}~z5y5^A@`<=;`v=8yql#OU92G^7Q1*lOyYe% zB-2($j(U#H{vrNxI2T3h%hO6$_&ML8D^sb?N zP8SGp%R%0F#ikk02)mje>wW@k7n%8StQZp{64L;9rmfwOTmbBtXZgQ!0yrtZEH@5%f zYlea`CfKmN_g9mW1%EYfkV-&9^^FH05)Uz8HAhKCv_Yi}>bzGx?4GR$4zjIa=4fKn zWs7Drz!zUS@9VO%>Ol(UKNr{9GrHs# zBf6KU5dpH{62E3z$e<~r4g-7;^$-A;2&ti0u4A0Mn%^5sqksC@)z+Ji0@XC5N^Vi% z0`E28cs=dMA+xvm6JzIV=3MT}tOeoAIWM|-yHFut@2X2)I^^=dM7-aaH_MSd_-UxG z>jcs;AgxEi1bt;Qmn0?R$ubkg)icMGo&kn1>3E{_ujoc12^O7*S02Z($w9 z9jpc9CleHOpijz+-&nxm!!p;$iT1j7T#^prW2&xBAIekadD=HO2q{hUxDyH4A%ch2 zdYgJ}H+_)kAgE^izuXtvj@pG_7L&~&EYHkF5IKyo7F%0f*5rb$GT3VjU$w_GSKmYgYhQVMlHXg zRF1WyM?&*rY|@FdfTEps*Z0U-YX(mEb;LPHe>|GR zc?-o3ebFqKO!P`li`;D`QQ!y}YUtF^x<&G^7SBw97T0mfS9tkUw8|l-nR)d@4V8lA zk>pdc8>n((yQs8)7=R-9OzqM!DYEe#~4 z5Zst5m-d3!j-k^H=L@~}SSu`aIbxn5yF4Mn9Q4l0ct~P`)s6MxT6v}XeRNN|LW4k`-Q#KyF7Yj3p7n3CY6#B+w#H)Wj8K$KDjU1sSy@;E_r z(~Oy}<#u!FBmbe_thKF`F{|9;8yQC1UBu1+9Kt!~XOcZ%sgEH6IcF|WA6WTzePE}c zh38qY*gwv)h8t?k+am9HYOtiWZxh`noegKC9&q8sTD&DpIKzErX9W&E0Vn9TJeQDS zjruA+{VK*kk|ibl@W8auxL_Z?&0RW63B28|f16KT{XGrfDy1bfrv^hr`? zmd0Dgd)u28nS91QlSQXT=W&~S4Xf0Neldo*n|2R#3Y8j&_VgVFgxLCw(!$tOhbuWq ze%M1zE(I^tJyMMU)_|%tqRzZ2k^nJyf?06rTa4M$OG;FCF5v4X>r@R8CPfTtMuAnY zU1}tT6q#|%^I^9whQlTk&DzIVvi2rCI8i%>KdKZpdveNqPAz^DKb$S(%VQ~y^RBUO zy?ux~{3v|DZgKAC+v0Lc9-B_v7t!Vaj3zU)_xR=c6j7*oH=810moDKG^EiZhoa@nP zJbstz%*Q#aSKMJ;A@e(?g6s2k-FJW(?qSGPjy~-KH+Gs^&nz%}**ZIN%(9xBn5WTL zpqkS>jV^I7@;vSt8v;~y+bLjC{3zo4jI16x34809YBN-{4B{yOTs7FI!RW9<88c!+X9j{ zX(@cX^%z(!8V=fm6Y>5eD?f~-rgyC%Xp(Kwyqc&}INxHs;T(o=`s#Hk+Ir;QhZep8(d>6o*xN440j$=-cZ801lj@z3YO7*&ZIAS zKS!*l@El?D^pGy0BjSNR6&RXCt1N2-@2utS5jb2YGufcnR8y%YREsXcorqC}X4k1R zSKwJPxWdR|Eq!GcS(%hFuqznWzjp9<9-LOv4YOL2s&@3D#!n0CJcdn{`FQ`EAESh8(kT`Y&cut` z`LH6}%FQd8yyH0aPD6Us-k(mGIveyJ6x3r1n8DGuhdfT|d$o z4F9W=>g+-B>X3g{lHyFJa{TINbZI<53h!a2BGULzD%_Y3c{a8YsoHf{Fd$1ChIGSl zL-K)#8%$Uiu0Cw0l?gyAIHpdvv7L~?H5yP<-3MwV70&phYPsNI=^IKp2;}lkTE{1Y zz7Eb`g63_hKfV+u(iS@u)nWyU!p?uanH&o)6BzGEC^)w$%Cq6V(p8LuhKm-L<2TXfa7?(ODyZx z(lo@>2at5@_t+u-aourA5P~nYilCeD4?RP-d=mP2r)Rl_ddn>?Lgb61hMg0~J5xCd za=uuu%JVlz?(`>?qif28KYP+0+=e5zC?5=7K~w;rTsJ;Ht-Xq6u5UqE3cyqXH4Tv?}p>BEoxbK}-ld0|T=E)mYOl;^@( zP9sSmv7N2czD-02I~%mUQ?WcGAbl$*!g8Ic*!$=N4j2)0ZQM-TD_Dhq{+(v|SyROa zTXwOTBWSQTdzxw&cfE^7vA3(~wrQ01BQW42sGmXwF`T!FoQ}1Z%}I>$&D#1{P>J06 zbuG$R@`|k`t2gv$qo($Ce_Nu}f#Qmikbd0K7n*`LbBvnqRI=h%Rd&N#|P%DXeSupg67A_!CoKbk=oKWf#?#&+ceR(!~2+`Tmm} z*i%O60yXyxK9PjT)(;>5C!ozcPZ568w@6cD^Sy{ly&*wb>!FXBa7Q@2!p6{TAMka0 zRlv!_o|4%zMJKrotrodj-+6owm3fM!eIC7JyG8C>)CPEXOEF{(Z{iyn1xaoFFtvjhl7AMzB_#V=!Nd=yAniUeX#RF$s)f;3w+s~~DF zT03wryr*_Y;|8?sB{pjDcblOXI~c3 z9Dh0_6K=Kq<2R1*D98<}M}!3nx}YpLZej)uWeR9&8G-=B3uty-x^ELJ69mXx5CmFg zu`Vm&@gGQ}j;iPUWl9X*{7<0vOs?cgO+C1VJX z2~6F!k46X`IH9g`>Nh0L4BA915G~NOAhS;L%+W%Ipt595NnLO;O@#hicJ5RM#u0{^ zmKpo^dlYyYzj%aCQ1RiK>HU^o;I_**U6MU7#s43Tz_Gd<1lf@w27+%}2aDlU2I4lH~synb$IE;rJ&U|S*G z6Z-cdXEylb3#xz$)2d4;Z(fuHzmMTTHnG%Bz(gmPq%;ptekP$U>jX<nwTai-Beh9Oo#gpiS%CT~pm0 zeGkccf|>t!bq#+Ac_VR^vZvV;hk66N?-6)Lm*nyi`^>w6o0;aRl?T3b*b=hB>w7U! z48V0gDUkGqWFZHFEd`k-{}=oM%_SbZ+n|8UUu^<>da0F{DrykGaTNPU#&+B+&`_BF zt#l$M%&D2T!GLsyl()qn64Cb8ME6+@C3rwk!Wj3ZaCNf==VKAh@cl7a!Yt7_WPU{| zOxp4|qZg(b25LVubmBOCC(w@s$1t1il#Y3ON-ubvE}=R4+gPKU>@NGv96I(=5=qK} zW!dZgK7Aa=vSb-`)kJNkEu~)YZWI-udY+;hj=z@g0!l<6-_4zK;2HBw5c(8k{h84q z{r2}tnaQgh36HY4a`%{obr^io&dnANgqxT8v(s%ku1G?SQ}t2KSQ1hfsN4a6RQr(v zKnuQ|#S$xDtiSuIYwC%b0BS{&t8`^ec0Qh~d7FHQPwGUy)lGeps64X^nOJMD?lz8Z zj!;>#BF0rc3sk1#)id0)-zO*S8RpNl= zP4hsqP;zx|IO>~${aWFbje-K+YYB)>Mp#bOqW*7^Q2L=^#&3U%Dlaz|qW@vs2@P*b zw#&GF%C}6=dfc||<323#b3`l6^8@fez-_GwSIz9+O&Fm19x2tnkp`(J`wBrO5$$qP zI*_Q^SJ#Bb@psIB*?pml0o_*LQs@S`B=nK_frOK89{A01Va&c#Z%xtL$959AMJGV( z1cLh+6kr$FQ(r>D2aKz*d+zmK3sCz9Tzf;~(90Fle^`fG6DhUbd?yDkugYif@jURz zd?BnO?>n-5&(pQdpFX zl7TP%l?x%7wMP#SiUBy+oz{OZpIQ2_%VjB&LEe*JVCy*0PY$YfK$Xh< zO#<(};y!-vON11CQG}9~4hB+e@ zwLpqIbF5r|gqFdM;Sne*%yCDQ7=ny{O@^%cdG~7KpBg9bi=`DCS7>zgebC*QPelr_HYey zP9a}O>upuBuLljIloX|hTpS_0S@0FIIN@en)`uv=ROfg0q2w>CH{xYC^Hjwx+r{s2 zf&fg#<>Ij^gnAP2ye?KeVY^Fmb%b{BWH|xQ^XX=wuQC>N)3sC2q-ejn4Nd|WOio~f z?v7MVJr2vRQmAezq>+&6qHO(rU{P5ku)=w|EF}|WOkjSo^yUaqbp0*c_f?L~^&wLp z;Py{so<<-$WD>Mr?--TkyXdD0xy*dFUy>8W(y{EWg2yR<0aEWDxQ`q5fs;eC(vBeXY4s3{2TR)=A>OnbZgnXBkDmKw}N9|5{^NNJ|sP3pCol2 zyj1m~z88MmUbdsU8|R;saQ936il_+>`P2BT*Rz13qBUx?kE#4_g@k8{Z3~0PGd8ywT-0)tQ9Ol1%{LB)Z z@ClL=?FcBUly~G;Sx3WesP<($0Z0ZW#k)GQ@L=VC=m`0!5Pxq(2g-sWQpboZFTB6r zb8$B2V^_T^93~6_4(sP%ofxCvVWiO`bp|dJsswu@K^Jm$u;puIB#A-#A&8Ep2N1?B znNz-*^TST4-kZ`TX}mj<(1-gh}JF^=VrsW zTRysi)w)5ngSzq|R`K&`Z(I}))L_#>tPSE9>>*`yXbFnguN;mG6&Q8_%S_ENn^s3R z3tTp-Qx4Y8Hy$g|=D+&bBcS7sH$M(zw?w<)dwp>bw;Zi2?EVIr&6Y`j%Mcf<7Tsa! zf69H^?114Cp}3z`ip`}%EWiV~kHIvz6wRXboL{b^n}dtU|LM5^n>{Y#>(GF{&qfw8Aln&PoBXze?cdHSb7|(FShn^fiyzWi#$cx{inPs z^1MNkQ;bucMghD??0#YaZP{WcuTW>B83(tR(D&1Q9C7v!C|&zX2m#@aUDK z3q8!3$5?;|CNq6vS>WL!lFt>8beH_A{)~^c#uKQP6b?{QH!Svi1*E733t%yr?jak% z`9MPm4eNS8J)^ws#&7bc`1{fTX#B@Ouf2qa5x=$v1Y!ZDngxF*XD2E{2YaNXcLATU z%~3W{%7bj7kdd1jf-*^kq^WJ3o<0iKhSji|VibY83W@d~xv~$*P-+haqXX2KdFLT+ zws9*u4aSkv1*or}`aMiOrLMLA(&rv1wsm`jA= z)0x)S)|Vx|h`bG2a1QUXaP#5DL`0e+{Do#a0j@<@PK}q#6o4!d59+=WuV8UPMKC1E z2W-~eI~9g&1Q>LX7TCx1P86&HDn{TO)ZB3Oi3|a%|B$4rg9C=nsceqLhN{pEbuJnt z0X-4ZjXL7`d0+qlJfSE7uY?74e6NS{`hI_d_V=B)Z`Jtz_t!^kOAtFK>9c{hO0O@x z$`~t?5-D@Ul(Av1${(JR-jgznp5=wL|#()x=>s<%g%PAM%cgR_zI6Ud( z5Bh(3gI1!Qx&tN1r$d?Pr{nFYS=O!#sLRSaDgV=}{D`HgCjHW53=l2NIHh@6%8r~n zhLU9z*Y<+_KPH+etc&M51rjmJwjQQedqNHx4HB z`Yqv=ecGZVTVKWk3JOh0wNJ^7RLs3JUz^irW`0Pu8A_qCGVwOzx-rM8?6gCzE|lpc zbeGg?#o8J}QxV62;xAR&)t125Gm2dqfPkMmu;FeIZEDGXp63xk`{e9TNEQuS2 zR>@sH(hdF$1DW2@9Gr1U4OzZB05o8|!7CHv|~BzZe z_`hSaIf&eEO`IjqMaMhq1qiP;y2TA{&Ug*>*O%RQ*GHj~PZX|~EJ8I|j)xfY%ix&g z-Z&C`II{2$2pM%F+5f03j=u~3jPN67 zCVbsovaZ1f*l?iSN~wjK3mty0qRgg1)sjPWd8k{&#==`u{(TwZX0HOs$csXNL=0DklG%306;;lwPZ7NuXEB~ zs4Ojfo2jf8toyB>wcJh)JZpo{3Z(HO!0*WOQ(o`!*Iy2*g$t=0i^512pTOiASPyps zJDlMYFUKW-|Br^)e!vgg%?Hmo8_@pkj)aZ4p)Z9T+86D|BQamAVBwu{>5w@wnzVGw zmrFuyDfY>-i*o;sCE0_B1u|J~GifA0eq>|)G_o%DSw_lOMoE{+6i8)`;yE&#ZneqL zh(G4 zg9;coEfv&)Cfry18R2^C3MC|SJ);p?FD}n*K~PV$POX~c;ug^cK9pK!{R+yPahv-< z1n_(=HHhYiRaGC6LBTyuwm%|qt~|>vj=x`C+)8+i_@j3zBcM2tQ0G%Mdk3VWHh?+n z${`gx3u7nb(9e@S7(Iu}BYo4B?V$Vbhn5*@HWYZ^G}

sxhZln_((J*pxP-z1-p# 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%0Agh75%)N4K-jYo3hKW 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 u9#FFFI@q7QSAaVl{NL5Ee{6@ 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 +// +// Copyright 2017 Microsoft Inc. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using System.Runtime.InteropServices; + +using Foundation; +using CoreML; +using ObjCRuntime; + +using NUnit.Framework; + +namespace MonoTouchFixtures.CoreML +{ + + [TestFixture] + [Preserve (AllMembers = true)] + public class MLMultiArrayTest + { + [Test] + public void Ctors () + { + TestRuntime.AssertXcodeVersion (9, 0); + + NSError err; + var shape = new nint [] { 1 }; + var strides = new nint [] { 0 }; + var nsshape = new NSNumber [] { NSNumber.FromNInt (1) }; + var nsstrides = new NSNumber [] { NSNumber.FromNInt (0) }; + + using (var arr = new MLMultiArray (shape, MLMultiArrayDataType.Int32, out err)) { + Assert.AreEqual (shape, arr.Shape, "1 Shape"); + Assert.AreEqual (MLMultiArrayDataType.Int32, arr.DataType, "1 DataType"); + Assert.IsNull (err, "1 err"); + } + + using (var arr = new MLMultiArray (IntPtr.Zero, shape, MLMultiArrayDataType.Float32, strides, (v) => Marshal.FreeHGlobal (v), out err)) { + Assert.AreEqual (shape, arr.Shape, "2 Shape"); + Assert.AreEqual (MLMultiArrayDataType.Float32, arr.DataType, "2 DataType"); + Assert.AreEqual (strides, arr.Strides, "2 Strides"); + Assert.IsNull (err, "2 err"); + } + + using (var arr = new MLMultiArray (IntPtr.Zero, nsshape, MLMultiArrayDataType.Double, nsstrides, (v) => Marshal.FreeHGlobal (v), out err)) { + Assert.AreEqual (shape, arr.Shape, "3 Shape"); + Assert.AreEqual (MLMultiArrayDataType.Double, arr.DataType, "3 DataType"); + Assert.AreEqual (strides, arr.Strides, "3 Strides"); + Assert.AreEqual (IntPtr.Zero, arr.DataPointer, "3 DataPointer"); + Assert.IsNull (err, "3 err"); + } + + using (var arr = new MLMultiArray (nsshape, MLMultiArrayDataType.Int32, out err)) { + Assert.AreEqual (shape, arr.Shape, "4 Shape"); + Assert.AreEqual (MLMultiArrayDataType.Int32, arr.DataType, "4 DataType"); + Assert.IsNull (err, "4 err"); + } + } + + [Test] + public void Indexers () + { + TestRuntime.AssertXcodeVersion (9, 0); + + NSError err; + var shape = new nint [] { 10 }; + using (var arr = new MLMultiArray (shape, MLMultiArrayDataType.Int32, out err)) { + Assert.IsNull (err, "err"); + Assert.AreEqual (10, arr.Count, "Count"); + Assert.AreEqual (new nint [] { 10 }, arr.Shape, "Shape"); + Assert.AreEqual (new nint [] { 1 }, arr.Strides, "Strides"); + + arr [0] = 0; // MLMultiArray's elements aren't zero-initialized + Assert.AreEqual (0, arr [0].Int32Value, "a"); + Assert.AreEqual (0, arr [new nint [] { 0 }].Int32Value, "b"); + Assert.AreEqual (0, arr [new NSNumber [] { NSNumber.FromNInt (0) }].Int32Value, "c nint"); + Assert.AreEqual (0, arr [new NSNumber [] { NSNumber.FromInt32 (0) }].Int32Value, "c int32"); + Assert.AreEqual (0, arr [new NSNumber [] { NSNumber.FromByte (0) }].Int32Value, "c byte"); + Assert.AreEqual (0, arr [new NSNumber [] { NSNumber.FromFloat (0) }].Int32Value, "c float"); + + Assert.AreEqual (0, arr.GetObject (0).Int32Value, "GetObject a"); + Assert.AreEqual (0, arr.GetObject (new nint [] { 0 }).Int32Value, "GetObject b"); + Assert.AreEqual (0, arr.GetObject (new NSNumber [] { NSNumber.FromNInt (0) }).Int32Value, "GetObject c nint"); + Assert.AreEqual (0, arr.GetObject (new NSNumber [] { NSNumber.FromInt32 (0) }).Int32Value, "GetObject c int32"); + Assert.AreEqual (0, arr.GetObject (new NSNumber [] { NSNumber.FromByte (0) }).Int32Value, "GetObject c byte"); + Assert.AreEqual (0, arr.GetObject (new NSNumber [] { NSNumber.FromFloat (0) }).Int32Value, "GetObject c float"); + + arr [1] = NSNumber.FromInt32 (1); + arr [new nint [] { 2 }] = NSNumber.FromInt32 (2); + arr [new NSNumber [] { NSNumber.FromUInt16 (3) }] = NSNumber.FromInt32 (3); + arr.SetObject (NSNumber.FromInt32 (4), 4); + arr.SetObject (NSNumber.FromInt32 (5), new nint [] { 5 }); + arr.SetObject (NSNumber.FromInt32 (6), new NSNumber [] { NSNumber.FromSByte (6) }); + + Assert.AreEqual (1, arr [1].Int32Value, "1"); + Assert.AreEqual (2, arr [2].Int32Value, "2"); + Assert.AreEqual (3, arr [3].Int32Value, "3"); + Assert.AreEqual (4, arr [4].Int32Value, "4"); + Assert.AreEqual (5, arr [5].Int32Value, "5"); + Assert.AreEqual (6, arr [6].Int32Value, "6"); + } + + // multi-dimensional + shape = new nint [] { 7, 7, 7 }; + using (var arr = new MLMultiArray (shape, MLMultiArrayDataType.Int32, out err)) { + Assert.IsNull (err, "err"); + Assert.AreEqual (shape [0] * shape [1] * shape [2], arr.Count, "Count"); + + arr [0, 0, 0] = 0; // MLMultiArray's elements aren't zero-initialized + Assert.AreEqual (0, arr [0, 0, 0].Int32Value, "a"); + Assert.AreEqual (0, arr [new nint [] { 0, 0, 0 }].Int32Value, "b"); + Assert.AreEqual (0, arr [new NSNumber [] { NSNumber.FromNInt (0), NSNumber.FromNInt (0), NSNumber.FromNInt (0) }].Int32Value, "c nint"); + + Assert.AreEqual (0, arr.GetObject (0, 0, 0).Int32Value, "GetObject a"); + Assert.AreEqual (0, arr.GetObject (new nint [] { 0, 0, 0 }).Int32Value, "GetObject b"); + Assert.AreEqual (0, arr.GetObject (new NSNumber [] { NSNumber.FromNInt (0), NSNumber.FromNInt (0), NSNumber.FromNInt (0) }).Int32Value, "GetObject c nint"); + + arr [1, 1, 1] = NSNumber.FromInt32 (1); + arr [new nint [] { 2, 2, 2 }] = NSNumber.FromInt32 (2); + arr [new NSNumber [] { NSNumber.FromUInt16 (3), NSNumber.FromUInt16 (3), NSNumber.FromUInt16 (3) }] = NSNumber.FromInt32 (3); + arr.SetObject (NSNumber.FromInt32 (4), 4, 4, 4); + arr.SetObject (NSNumber.FromInt32 (5), new nint [] { 5, 5, 5 }); + arr.SetObject (NSNumber.FromInt32 (6), new NSNumber [] { NSNumber.FromSByte (6), NSNumber.FromSByte (6), NSNumber.FromSByte (6) }); + + Assert.AreEqual (1, arr [1, 1, 1].Int32Value, "1"); + Assert.AreEqual (2, arr [2, 2, 2].Int32Value, "2"); + Assert.AreEqual (3, arr [3, 3, 3].Int32Value, "3"); + Assert.AreEqual (4, arr [4, 4, 4].Int32Value, "4"); + Assert.AreEqual (5, arr [5, 5, 5].Int32Value, "5"); + Assert.AreEqual (6, arr [6, 6, 6].Int32Value, "6"); + } + } + } +} + +#endif // !XAMCORE_2_0 diff --git a/tests/monotouch-test/CoreText/FontDescriptorTest.cs b/tests/monotouch-test/CoreText/FontDescriptorTest.cs index 315aae54d43f..4b0bc7293f1a 100644 --- a/tests/monotouch-test/CoreText/FontDescriptorTest.cs +++ b/tests/monotouch-test/CoreText/FontDescriptorTest.cs @@ -62,6 +62,7 @@ public void FromAttributes () } } +#if !__TVOS__ // https://bugzilla.xamarin.com/show_bug.cgi?id=58929 [Test] public void WithFeature () { @@ -89,6 +90,7 @@ public void WithFeature () Assert.That (set_feature.FeatureWeak, Is.EqualTo ((int)CTFontFeatureLigatures.Selector.RareLigaturesOn), "#2"); } } +#endif // !__TVOS__ } } diff --git a/tests/monotouch-test/EventKit/AlarmTest.cs b/tests/monotouch-test/EventKit/AlarmTest.cs index 79a8311418e8..9ebbcc3b96b8 100644 --- a/tests/monotouch-test/EventKit/AlarmTest.cs +++ b/tests/monotouch-test/EventKit/AlarmTest.cs @@ -33,7 +33,7 @@ public class AlarmTest { [Test] public void NullAllowedTest () { - using (var alarm = new EKAlarm ()) { + using (var alarm = EKAlarm.FromTimeInterval (1234)) { alarm.AbsoluteDate = null; alarm.StructuredLocation = null; } diff --git a/tests/monotouch-test/EventKit/CalendarItemTest.cs b/tests/monotouch-test/EventKit/CalendarItemTest.cs deleted file mode 100644 index 19cb09f09f1f..000000000000 --- a/tests/monotouch-test/EventKit/CalendarItemTest.cs +++ /dev/null @@ -1,43 +0,0 @@ -// -// Unit tests for EKCalendarItem -// -// Authors: -// Rolf Bjarne Kvinge -// -// Copyright 2013 Xamarin Inc. All rights reserved. -// - -#if !__TVOS__ - -using System; -#if XAMCORE_2_0 -using Foundation; -using CoreGraphics; -using EventKit; -using ObjCRuntime; -#else -using MonoTouch.CoreGraphics; -using MonoTouch.EventKit; -using MonoTouch.Foundation; -using MonoTouch.ObjCRuntime; -using MonoTouch.UIKit; -#endif -using NUnit.Framework; - -namespace MonoTouchFixtures.EventKit { - - [TestFixture] - [Preserve (AllMembers = true)] - public class CalendarItemTest { - - [Test] - public void NullAllowedTest () - { - using (var item = new EKCalendarItem ()) { - item.Notes = null; - } - } - } -} - -#endif // !__TVOS__ diff --git a/tests/monotouch-test/EventKit/EKUIBundleTest.cs b/tests/monotouch-test/EventKit/EKUIBundleTest.cs new file mode 100644 index 000000000000..15dcadef57df --- /dev/null +++ b/tests/monotouch-test/EventKit/EKUIBundleTest.cs @@ -0,0 +1,34 @@ +// +// Unit tests for EKUIBundle +// +// Authors: +// Alex Soto +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && !__TVOS__ && !__WATCHOS__ + +using System; +using EventKitUI; +using Foundation; +using NUnit.Framework; + +namespace MonoTouchFixtures.EventKitUI { + [TestFixture] + [Preserve (AllMembers = true)] + public class EKUIBundleTest { + + [Test] + public void BundleTest () + { + if (!TestRuntime.CheckXcodeVersion (9, 0)) + Assert.Ignore ("Ignoring tests: Requires iOS11+"); + + var bundle = EKUIBundle.UIBundle; + Assert.NotNull (bundle, "Was Null"); + Assert.AreEqual ("com.apple.eventkitui", bundle.BundleIdentifier, "BundleIdentifier"); + } + } +} +#endif diff --git a/tests/monotouch-test/FileProvider/NSFileProviderPageTest.cs b/tests/monotouch-test/FileProvider/NSFileProviderPageTest.cs new file mode 100644 index 000000000000..7e0af258048c --- /dev/null +++ b/tests/monotouch-test/FileProvider/NSFileProviderPageTest.cs @@ -0,0 +1,36 @@ +// +// Unit tests for NSFileProviderPage +// +// Authors: +// Alex Soto +// +// +// Copyright 2017 Xamarin Inc. All rights reserved. +// + +#if XAMCORE_2_0 && __IOS__ + +using System; +using FileProvider; +using Foundation; +using NUnit.Framework; + +namespace MonoTouchFixtures.FileProvider { + + [TestFixture] + [Preserve (AllMembers = true)] + public class NSFileProviderPageTests { + + [Test] + public void CompressionSessionCreateTest () + { + // The FileProvider's NSData constants are only available running on device. + TestRuntime.AssertDevice (); + TestRuntime.AssertXcodeVersion (9,0); + + Assert.IsNotNull (NSFileProviderPage.InitialPageSortedByDate, "InitialPageSortedByDate should not be null"); + Assert.IsNotNull (NSFileProviderPage.InitialPageSortedByName, "InitialPageSortedByName should not be null"); + } + } +} +#endif diff --git a/tests/monotouch-test/Foundation/BundleTest.cs b/tests/monotouch-test/Foundation/BundleTest.cs index 5c377e1dc4cb..38efbfab9a55 100644 --- a/tests/monotouch-test/Foundation/BundleTest.cs +++ b/tests/monotouch-test/Foundation/BundleTest.cs @@ -82,6 +82,7 @@ public void LocalizedString4 () // http://developer.apple.com/library/ios/#documentation/uikit/reference/NSBundle_UIKitAdditions/Introduction/Introduction.html +#if false // Disabling for now due to Xcode 9 does not support nibs if deployment target == 6.0 #if !__WATCHOS__ [Test] public void LoadNibWithOptions () @@ -94,6 +95,7 @@ public void LoadNibWithOptions () #endif } #endif // !__WATCHOS__ +#endif #if false // some selectors are only in AppKit but we included them in MonoTouch (and this match Apple documentation) diff --git a/tests/monotouch-test/Foundation/CalendarTest.cs b/tests/monotouch-test/Foundation/CalendarTest.cs index 108ffc54373a..9426046ac29b 100644 --- a/tests/monotouch-test/Foundation/CalendarTest.cs +++ b/tests/monotouch-test/Foundation/CalendarTest.cs @@ -338,9 +338,10 @@ public void TestEnumerateDates () NSDateComponents nextYearComponent = NSCalendar.CurrentCalendar.Components (NSCalendarUnit.Day | NSCalendarUnit.Month | NSCalendarUnit.Year, NSDate.Now); nextYearComponent.Year++; bool delegateHit = false; - NSCalendar.CurrentCalendar.EnumerateDatesStartingAfterDate(NSDate.Now, nextYearComponent, NSCalendarOptions.MatchNextTime, (NSDate d, bool exactMatch, ref bool s) => + NSCalendar.CurrentCalendar.EnumerateDatesStartingAfterDate(NSDate.Now, nextYearComponent, NSCalendarOptions.MatchNextTime, (NSDate d, bool exactMatch, ref bool stop) => { delegateHit = true; + stop = true; }); Assert.IsTrue (delegateHit, "EnumerateDatesStartingAfterDate delegate called"); } diff --git a/tests/monotouch-test/Foundation/UrlSessionTaskTest.cs b/tests/monotouch-test/Foundation/UrlSessionTaskTest.cs index bc0f145a261f..ca276c0c90b1 100644 --- a/tests/monotouch-test/Foundation/UrlSessionTaskTest.cs +++ b/tests/monotouch-test/Foundation/UrlSessionTaskTest.cs @@ -52,6 +52,13 @@ public void Properties () task.TaskDescription = "descriptive label"; Assert.That ((string)task.TaskDescription, Is.EqualTo ("descriptive label"), "setTaskDescription:"); Assert.That (task.TaskIdentifier, Is.GreaterThanOrEqualTo (0), "taskIdentifier"); + + if (TestRuntime.CheckXcodeVersion (9, 0)) { + Assert.Null (task.EarliestBeginDate, "earliestBeginDate"); + Assert.That (task.CountOfBytesClientExpectsToSend, Is.EqualTo (-1), "countOfBytesClientExpectsToSend"); + Assert.That (task.CountOfBytesClientExpectsToReceive, Is.EqualTo (-1), "countOfBytesClientExpectsToReceive"); + Assert.NotNull (task.Progress, "progress"); + } } } diff --git a/tests/monotouch-test/GameplayKit/GKAgent3DTest.cs b/tests/monotouch-test/GameplayKit/GKAgent3DTest.cs new file mode 100644 index 000000000000..e20b39d8e223 --- /dev/null +++ b/tests/monotouch-test/GameplayKit/GKAgent3DTest.cs @@ -0,0 +1,67 @@ +// +// Unit tests for GKAgent3D +// +// Authors: +// Rolf Bjarne Kvinge +// +// +// Copyright 2017 Microsoft Inc. All rights reserved. +// + +#if !__WATCHOS__ + +using System; +using OpenTK; + +#if XAMCORE_2_0 +using Foundation; +using GameplayKit; +#else +using MonoTouch.Foundation; +using MonoTouch.GameplayKit; +#endif + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + +using Bindings.Test; +using NUnit.Framework; + +namespace MonoTouchFixtures.GamePlayKit +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class GKAgent3DTest + { + [Test] + public void RotationTest () + { + using (var obj = new GKAgent3D ()) { + var initial = new Matrix3 (0, 0, 1, + 0, 1, 0, + 1, 0, 0); + Asserts.AreEqual (initial, obj.Rotation, "Rotation"); + Asserts.AreEqual ((MatrixFloat3x3) initial, obj.Rotation3x3, "Rotation3x3"); + + var mat = new Matrix3 (1, 2, 3, + 4, 5, 6, + 7, 8, 9); + var mat3x3 = (MatrixFloat3x3) mat; + + obj.Rotation = mat; + Asserts.AreEqual (mat, obj.Rotation, "Rotation after setter"); + var transposed3x3 = MatrixFloat3x3.Transpose ((MatrixFloat3x3) mat); + Asserts.AreEqual (transposed3x3, obj.Rotation3x3, "Rotation3x3 after setter"); + Asserts.AreEqual (transposed3x3, CFunctions.GetMatrixFloat3x3 (obj, "rotation"), "Rotation3x3 after setter native"); + + obj.Rotation3x3 = mat3x3; + Asserts.AreEqual (mat3x3, obj.Rotation3x3, "Rotation3x3 after setter 3x3"); + Asserts.AreEqual (mat3x3, CFunctions.GetMatrixFloat3x3 (obj, "rotation"), "Rotation3x3 after setter native 3x3"); + } + } + } +} + +#endif // __WATCHOS__ diff --git a/tests/monotouch-test/GameplayKit/GKPathTests.cs b/tests/monotouch-test/GameplayKit/GKPathTests.cs index 1b70d1a295e9..611fc7138ed0 100644 --- a/tests/monotouch-test/GameplayKit/GKPathTests.cs +++ b/tests/monotouch-test/GameplayKit/GKPathTests.cs @@ -33,6 +33,19 @@ public class GKPathTests { new Vector2 (1,3), new Vector2 (1,2), new Vector2 (1,1), new Vector2 (1,0) }; + static Vector3 [] test_vectors3 = new [] { + new Vector3 (0.1532144f, 0.5451511f, 0.2004739f), + new Vector3 (0.7717745f, 0.559364f, 0.00918373f), + new Vector3 (0.2023053f, 0.4701468f, 0.6618567f), + new Vector3 (0.4904693f, 0.841727f, 0.2294401f), + new Vector3 (0.1252193f, 0.08986127f, 0.3407605f), + new Vector3 (0.006755914f, 0.07464754f, 0.287938f), + new Vector3 (9.799572E+08f, 1.64794E+09f, 1.117296E+09f), + new Vector3 (1.102396E+09f, 3.082477E+08f, 1.126484E+09f), + new Vector3 (2.263112E+08f, 8.79644E+08f, 1.303282E+09f), + new Vector3 (8.176959E+08f, 1.386156E+09f, 5.956444E+08f), + }; + [Test] public void FromPointsTest () { @@ -52,6 +65,32 @@ public void InitWithPointsTest () var path = new GKPath (points, 1, false); Assert.NotNull (path, "GKPath.FromPoints should not be null"); } + + [Test] + public void FromPointsVector3Test () + { + if (!TestRuntime.CheckSystemAndSDKVersion (10, 0)) + Assert.Ignore ("Ignoring GameplayKit tests: Requires iOS10+"); + + var path = GKPath.FromPoints (test_vectors3, 1, false); + Assert.NotNull (path, "GKPath.FromPoints should not be null"); + + for (int i = 0; i < test_vectors3.Length; i++) + Asserts.AreEqual (path.GetVector3Point ((nuint) i), test_vectors3 [i], $"FromPointsVector3 iter {i}"); + } + + [Test] + public void InitWithPointsVector3Test () + { + if (!TestRuntime.CheckSystemAndSDKVersion (10, 0)) + Assert.Ignore ("Ignoring GameplayKit tests: Requires iOS10+"); + + var path = new GKPath (test_vectors3, 1, false); + Assert.NotNull (path, "GKPath.FromPoints should not be null"); + + for (int i = 0; i < test_vectors3.Length; i++) + Asserts.AreEqual (path.GetVector3Point ((nuint) i), test_vectors3[i], $"InitWithVector3 iter {i}"); + } } } diff --git a/tests/monotouch-test/HomeKit/HMMutableSignificantTimeEventTest.cs b/tests/monotouch-test/HomeKit/HMMutableSignificantTimeEventTest.cs new file mode 100644 index 000000000000..c12fbebaed02 --- /dev/null +++ b/tests/monotouch-test/HomeKit/HMMutableSignificantTimeEventTest.cs @@ -0,0 +1,43 @@ +// +// Unit tests for HMMutableSignificantTimeEventTest +// +// Authors: +// Vincent Dondain +// +// +// Copyright 2017 Microsoft. All rights reserved. +// + +#if !MONOMAC + +using System; +using NUnit.Framework; + +using Foundation; +using HomeKit; + +namespace MonoTouchFixtures.HomeKit +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class HMMutableSignificantTimeEventTest + { + [SetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void SignificantEventPropertyTest () + { + using (var obj = new HMMutableSignificantTimeEvent (HMSignificantEvent.Sunrise, null)) { + Assert.AreEqual (HMSignificantEvent.Sunrise, obj.SignificantEvent, "1 SignificantEvent Getter"); + obj.SignificantEvent = HMSignificantEvent.Sunset; + Assert.AreEqual (HMSignificantEvent.Sunset, obj.SignificantEvent, "2 PresenceType Setter"); + } + } + } +} + +#endif \ No newline at end of file diff --git a/tests/monotouch-test/HomeKit/HMSignificantTimeEventTest.cs b/tests/monotouch-test/HomeKit/HMSignificantTimeEventTest.cs new file mode 100644 index 000000000000..c0f38185a44d --- /dev/null +++ b/tests/monotouch-test/HomeKit/HMSignificantTimeEventTest.cs @@ -0,0 +1,41 @@ +// +// Unit tests for HMSignificantTimeEventTest +// +// Authors: +// Vincent Dondain +// +// +// Copyright 2017 Microsoft. All rights reserved. +// + +#if !MONOMAC + +using System; +using NUnit.Framework; + +using Foundation; +using HomeKit; + +namespace MonoTouchFixtures.HomeKit +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class HMSignificantTimeEventTest + { + [SetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void SignificantEventPropertyTest () + { + using (var obj = new HMSignificantTimeEvent (HMSignificantEvent.Sunrise, null)) { + Assert.AreEqual (HMSignificantEvent.Sunrise, obj.SignificantEvent, "1 SignificantEvent Getter"); + } + } + } +} + +#endif \ No newline at end of file diff --git a/tests/monotouch-test/MediaPlayer/VolumeViewTest.cs b/tests/monotouch-test/MediaPlayer/VolumeViewTest.cs index bb7c8ce15fb4..cdda8d65807b 100644 --- a/tests/monotouch-test/MediaPlayer/VolumeViewTest.cs +++ b/tests/monotouch-test/MediaPlayer/VolumeViewTest.cs @@ -28,7 +28,10 @@ namespace MonoTouchFixtures.MediaPlayer { [TestFixture] [Preserve (AllMembers = true)] public class VolumeViewTest { - + + // TODO: Test temporarily ignored. + // Reason: MPVolumeView started failing with iOS 11 beta 3. + [Ignore] [Test] public void InitWithFrame () { diff --git a/tests/monotouch-test/MediaToolbox/FormatNamesTest.cs b/tests/monotouch-test/MediaToolbox/FormatNamesTest.cs index 98bf5af058b4..adf8cf046eed 100644 --- a/tests/monotouch-test/MediaToolbox/FormatNamesTest.cs +++ b/tests/monotouch-test/MediaToolbox/FormatNamesTest.cs @@ -32,7 +32,11 @@ public void LocalizedNameForMediaType () Assert.That (CMMediaType.Audio.GetLocalizedName (), Is.EqualTo ("Sound"), "Audio"); Assert.That (CMMediaType.ClosedCaption.GetLocalizedName (), Is.EqualTo ("Closed Caption"), "ClosedCaption"); - Assert.That (CMMediaType.Metadata.GetLocalizedName (), Is.EqualTo ("meta"), "Metadata"); + if (TestRuntime.CheckXcodeVersion (9, 0)) { + Assert.That (CMMediaType.Metadata.GetLocalizedName (), Is.EqualTo ("Metadata"), "Metadata"); + } else { + Assert.That (CMMediaType.Metadata.GetLocalizedName (), Is.EqualTo ("meta"), "Metadata"); + } Assert.That (CMMediaType.Muxed.GetLocalizedName (), Is.EqualTo ("Muxed"), "Muxed"); Assert.That (CMMediaType.Subtitle.GetLocalizedName (), Is.EqualTo ("Subtitle"), "Subtitle"); Assert.That (CMMediaType.Text.GetLocalizedName (), Is.EqualTo ("Text"), "Text"); diff --git a/tests/monotouch-test/Metal/HeapDescriptorTest.cs b/tests/monotouch-test/Metal/HeapDescriptorTest.cs index 40b583c4dce9..9b21930ac3e5 100644 --- a/tests/monotouch-test/Metal/HeapDescriptorTest.cs +++ b/tests/monotouch-test/Metal/HeapDescriptorTest.cs @@ -16,33 +16,76 @@ namespace MonoTouchFixtures.Metal { [TestFixture] public class HeapDescriptorTest { + MTLHeapDescriptor hd = null; - [Test] - public void Properties () + [SetUp] + public void SetUp () { +#if !MONOMAC TestRuntime.AssertXcodeVersion (8, 0); if (Runtime.Arch == Arch.SIMULATOR) Assert.Ignore ("Type is missing on the simulator"); +#else + TestRuntime.AssertXcodeVersion (9, 0); +#endif + hd = new MTLHeapDescriptor (); + } + + [TearDown] + public void TearDown () + { + if (hd != null) + hd.Dispose (); + hd = null; + } - using (var hd = new MTLHeapDescriptor ()) { - Assert.That (hd.CpuCacheMode, Is.EqualTo (MTLCpuCacheMode.DefaultCache), "CpuCacheMode"); - hd.CpuCacheMode = MTLCpuCacheMode.WriteCombined; - Assert.That (hd.StorageMode, Is.EqualTo (MTLStorageMode.Private), "StorageMode"); - hd.StorageMode = MTLStorageMode.Memoryless; - Assert.That (hd.Size, Is.EqualTo (0), "Size"); - hd.Size = 16; - - using (var hd2 = (MTLHeapDescriptor) hd.Copy ()) { - Assert.That (hd2.CpuCacheMode, Is.EqualTo (MTLCpuCacheMode.WriteCombined), "CpuCacheMode"); - Assert.That (hd2.StorageMode, Is.EqualTo (MTLStorageMode.Memoryless), "StorageMode"); - Assert.That (hd2.Size, Is.EqualTo (16), "Size"); - - // NSCopying - Assert.That (hd2.Handle, Is.Not.EqualTo (hd.Handle), "Handle"); - } + [Test] + public void Properties () + { + Assert.That (hd.CpuCacheMode, Is.EqualTo (MTLCpuCacheMode.DefaultCache), "CpuCacheMode"); + hd.CpuCacheMode = MTLCpuCacheMode.WriteCombined; + Assert.That (hd.StorageMode, Is.EqualTo (MTLStorageMode.Private), "StorageMode"); + hd.StorageMode = MTLStorageMode.Memoryless; + Assert.That (hd.Size, Is.EqualTo (0), "Size"); + hd.Size = 16; + + using (var hd2 = (MTLHeapDescriptor) hd.Copy ()) { + Assert.That (hd2.CpuCacheMode, Is.EqualTo (MTLCpuCacheMode.WriteCombined), "CpuCacheMode"); + Assert.That (hd2.StorageMode, Is.EqualTo (MTLStorageMode.Memoryless), "StorageMode"); + Assert.That (hd2.Size, Is.EqualTo (16), "Size"); + + // NSCopying + Assert.That (hd2.Handle, Is.Not.EqualTo (hd.Handle), "Handle"); } } + + [Test] + public void GetSetCpuCacheModeTest () + { + TestRuntime.AssertXcodeVersion (9, 0); + + hd.CpuCacheMode = MTLCpuCacheMode.WriteCombined; + Assert.AreEqual (MTLCpuCacheMode.WriteCombined, hd.CpuCacheMode); + } + + [Test] + public void GetSetSizeTest () + { + TestRuntime.AssertXcodeVersion (9, 0); + + hd.Size = 2; + Assert.AreEqual (2, hd.Size); + } + + [Test] + public void GetSetStorageModeTest () + { + TestRuntime.AssertXcodeVersion (9, 0); + + hd.StorageMode = MTLStorageMode.Private; + Assert.AreEqual (MTLStorageMode.Private, hd.StorageMode); + } } } diff --git a/tests/monotouch-test/Metal/MTLArgumentDescriptorTest.cs b/tests/monotouch-test/Metal/MTLArgumentDescriptorTest.cs new file mode 100644 index 000000000000..9b3e01c204f1 --- /dev/null +++ b/tests/monotouch-test/Metal/MTLArgumentDescriptorTest.cs @@ -0,0 +1,78 @@ +#if !__WATCHOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +#else +using MonoTouch.Metal; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.Metal { + + [TestFixture] + public class MTLArgumentDescriptorTest { + MTLArgumentDescriptor descriptor = null; + + [SetUp] + public void SetUp () + { + TestRuntime.AssertXcodeVersion (9, 0); + descriptor = new MTLArgumentDescriptor (); + } + + [TearDown] + public void TearDown () + { + if (descriptor != null) + descriptor.Dispose (); + descriptor = null; + } + + [Test] + public void GetSetAccessTest () + { + descriptor.Access = MTLArgumentAccess.ReadWrite; + Assert.AreEqual (MTLArgumentAccess.ReadWrite, descriptor.Access); + } + + [Test] + public void GetSetArrayLengthTest () + { + descriptor.ArrayLength = 1; + Assert.AreEqual (1, descriptor.ArrayLength); + } + + [Test] + public void GetSetConstantBlockAlignmentTest () + { + descriptor.ConstantBlockAlignment = 1; + Assert.AreEqual (1, descriptor.ConstantBlockAlignment); + } + + [Test] + public void GetSetDataTypeTest () + { + descriptor.DataType = MTLDataType.Half4; + Assert.AreEqual (MTLDataType.Half4, descriptor.DataType); + } + + [Test] + public void GetSetIndexTest () + { + descriptor.Index = 1; + Assert.AreEqual (1, descriptor.Index); + } + + [Test] + public void GetSetTextureTypeTest () + { + descriptor.TextureType = MTLTextureType.k2DArray; + Assert.AreEqual (MTLTextureType.k2DArray, descriptor.TextureType); + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/Metal/MTLDeviceTests.cs b/tests/monotouch-test/Metal/MTLDeviceTests.cs new file mode 100644 index 000000000000..082b871781c0 --- /dev/null +++ b/tests/monotouch-test/Metal/MTLDeviceTests.cs @@ -0,0 +1,36 @@ +#if MONOMAC + +using System; +using Foundation; + +#if XAMCORE_2_0 +using Metal; +#else +using MonoTouch.Metal; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.Metal { + public class MTLDeviceTests { + [SetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void GetAllDevicesTest () + { + NSObject refObj = new NSObject(); + var devices = MTLDevice.GetAllDevices(ref refObj, (IMTLDevice device, NSString notifyName) => { }); + + Assert.That (devices, Is.Not.Empty, "MTLDevice.GetAllDevices"); + + Assert.DoesNotThrow (() => { + MTLDevice.RemoveObserver (refObj); + }); + } + } +} +#endif diff --git a/tests/monotouch-test/Metal/MTLPipelineBufferDescriptorTests.cs b/tests/monotouch-test/Metal/MTLPipelineBufferDescriptorTests.cs new file mode 100644 index 000000000000..6b5808b408d7 --- /dev/null +++ b/tests/monotouch-test/Metal/MTLPipelineBufferDescriptorTests.cs @@ -0,0 +1,43 @@ +#if !__WATCHOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +#else +using MonoTouch.Metal; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.Metal { + + [TestFixture] + public class MTLPipelineBufferDescriptorTest { + MTLPipelineBufferDescriptor descriptor = null; + + [SetUp] + public void SetUp () + { + TestRuntime.AssertXcodeVersion (9, 0); + descriptor = new MTLPipelineBufferDescriptor (); + } + + [TearDown] + public void TearDown () + { + if (descriptor != null) + descriptor.Dispose (); + descriptor = null; + } + + [Test] + public void GetSetMutabilityTest () + { + descriptor.Mutability = MTLMutability.Immutable; + Assert.AreEqual (MTLMutability.Immutable, descriptor.Mutability); + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/Metal/MTLPointerTypeTests.cs b/tests/monotouch-test/Metal/MTLPointerTypeTests.cs new file mode 100644 index 000000000000..71286abcaa2d --- /dev/null +++ b/tests/monotouch-test/Metal/MTLPointerTypeTests.cs @@ -0,0 +1,66 @@ +#if !__WATCHOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +#else +using MonoTouch.Metal; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.Metal { + + [TestFixture] + public class MTLPointerTypeTests { + MTLPointerType ptrType = null; + + [SetUp] + public void SetUp () + { + TestRuntime.AssertXcodeVersion (9, 0); + ptrType = new MTLPointerType (); + } + + [TearDown] + public void TearDown () + { + if (ptrType != null) + ptrType.Dispose (); + ptrType = null; + } + + [Test] + public void GetAccessTest () + { + Assert.AreEqual (MTLArgumentAccess.ReadOnly, ptrType.Access); + } + + [Test] + public void GetAlignmentTest () + { + Assert.AreEqual (0, ptrType.Alignment); + } + + [Test] + public void GetDataSizeTest () + { + Assert.AreEqual (0, ptrType.DataSize); + } + + [Test] + public void GetElementIsArgumentBufferTest () + { + Assert.False (ptrType.ElementIsArgumentBuffer); + } + + [Test] + public void GetElementTypeTest () + { + Assert.AreEqual (MTLDataType.None, ptrType.ElementType); + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/Metal/MTLTextureReferenceType.cs b/tests/monotouch-test/Metal/MTLTextureReferenceType.cs new file mode 100644 index 000000000000..c88f89a9afbd --- /dev/null +++ b/tests/monotouch-test/Metal/MTLTextureReferenceType.cs @@ -0,0 +1,60 @@ +#if !__WATCHOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +#else +using MonoTouch.Metal; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.Metal { + + [TestFixture] + public class MTLTextureReferenceTypeTests { + MTLTextureReferenceType reference = null; + + [SetUp] + public void SetUp () + { + TestRuntime.AssertXcodeVersion (9, 0); + reference = new MTLTextureReferenceType (); + } + + [TearDown] + public void TearDown () + { + if (reference != null) + reference.Dispose (); + reference = null; + } + + [Test] + public void GetAccessTest () + { + Assert.AreEqual (MTLArgumentAccess.ReadOnly, reference.Access); + } + + [Test] + public void GetIsDepthTextureTest () + { + Assert.False (reference.IsDepthTexture); + } + + [Test] + public void GetTextureDataType () + { + Assert.AreEqual (MTLDataType.None, reference.TextureDataType); + } + + [Test] + public void GetTextureType () + { + Assert.AreEqual (MTLTextureType.k1D, reference.TextureType); + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/Metal/MTLTileRenderPipelineColorAttachmentDescriptorTests.cs b/tests/monotouch-test/Metal/MTLTileRenderPipelineColorAttachmentDescriptorTests.cs new file mode 100644 index 000000000000..db3fd3ebbdd9 --- /dev/null +++ b/tests/monotouch-test/Metal/MTLTileRenderPipelineColorAttachmentDescriptorTests.cs @@ -0,0 +1,43 @@ +#if __IOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +#else +using MonoTouch.Metal; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.Metal { + + [TestFixture] + public class MTLTileRenderPipelineColorAttachmentDescriptorTests { + MTLTileRenderPipelineColorAttachmentDescriptor descriptor = null; + + [SetUp] + public void SetUp () + { + TestRuntime.AssertXcodeVersion (9, 0); + descriptor = new MTLTileRenderPipelineColorAttachmentDescriptor (); + } + + [TearDown] + public void TearDown () + { + if (descriptor != null) + descriptor.Dispose (); + descriptor = null; + } + + [Test] + public void GetSetPixelFormat () + { + descriptor.PixelFormat = MTLPixelFormat.RGBA8Snorm; + Assert.AreEqual (MTLPixelFormat.RGBA8Snorm, descriptor.PixelFormat); + } + } +} + +#endif // !__WATCHOS__ \ No newline at end of file diff --git a/tests/monotouch-test/Metal/MTLTileRenderPipelineDescriptor.cs b/tests/monotouch-test/Metal/MTLTileRenderPipelineDescriptor.cs new file mode 100644 index 000000000000..5e8d7f66ba33 --- /dev/null +++ b/tests/monotouch-test/Metal/MTLTileRenderPipelineDescriptor.cs @@ -0,0 +1,74 @@ +#if __IOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +#else +using MonoTouch.Metal; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.Metal { + + [TestFixture] + public class MTLTileRenderPipelineDescriptorTests { + MTLTileRenderPipelineDescriptor descriptor = null; + + [SetUp] + public void SetUp () + { + TestRuntime.AssertXcodeVersion (9, 0); + descriptor = new MTLTileRenderPipelineDescriptor (); + } + + [TearDown] + public void TearDown () + { + if (descriptor != null) + descriptor.Dispose (); + descriptor = null; + } + + [Test] + public void ColorAttachmentsTest () + { + var attachments = descriptor.ColorAttachments; + Assert.NotNull (attachments); + } + + [Test] + public void GetSetLabelTest () + { + descriptor.Label = "Foo"; + Assert.AreEqual ("Foo", descriptor.Label); + } + + [Test] + public void GetSetRasterSampleCount () + { + descriptor.RasterSampleCount = 2; + Assert.AreEqual (2, descriptor.RasterSampleCount); + } + + [Test] + public void GetSetThreadgroupSizeMatchesTileSize () + { + descriptor.ThreadgroupSizeMatchesTileSize = true; + Assert.AreEqual (true, descriptor.ThreadgroupSizeMatchesTileSize); + + descriptor.ThreadgroupSizeMatchesTileSize = false; + Assert.AreEqual (false, descriptor.ThreadgroupSizeMatchesTileSize); + } + + [Test] + public void GetTileBuffers () + { + var buffers = descriptor.TileBuffers; + Assert.NotNull (buffers); + } + } +} + +#endif // !__WATCHOS__ \ No newline at end of file diff --git a/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramEqualizationTest.cs b/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramEqualizationTest.cs new file mode 100644 index 000000000000..e55242264ef5 --- /dev/null +++ b/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramEqualizationTest.cs @@ -0,0 +1,42 @@ +// Copyright 2017 Microsoft Inc. All rights reserved. + +#if !__WATCHOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +using MetalPerformanceShaders; +using UIKit; +#else +using MonoTouch.Metal; +using MonoTouch.MetalPerformanceShaders; +using MonoTouch.UIKit; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.MetalPerformanceShaders +{ + + [TestFixture] + public class MPSImageHistogramEqualizationTest + { + + [Test] + public void Constructors () + { + TestRuntime.AssertDevice (); + TestRuntime.AssertXcodeVersion (7, 0); + + MPSImageHistogramInfo info = new MPSImageHistogramInfo (); + info.NumberOfHistogramEntries = 256; + using (var obj = new MPSImageHistogramEqualization (MTLDevice.SystemDefault, ref info)) { + var rv = obj.HistogramInfo; + Asserts.AreEqual (info, rv, "HistogramForAlpha"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramSpecificationTest.cs b/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramSpecificationTest.cs new file mode 100644 index 000000000000..06d489e2c184 --- /dev/null +++ b/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramSpecificationTest.cs @@ -0,0 +1,42 @@ +// Copyright 2017 Microsoft Inc. All rights reserved. + +#if !__WATCHOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +using MetalPerformanceShaders; +using UIKit; +#else +using MonoTouch.Metal; +using MonoTouch.MetalPerformanceShaders; +using MonoTouch.UIKit; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.MetalPerformanceShaders +{ + + [TestFixture] + public class MPSImageHistogramSpecificationTest + { + + [Test] + public void Constructors () + { + TestRuntime.AssertDevice (); + TestRuntime.AssertXcodeVersion (7, 0); + + MPSImageHistogramInfo info = new MPSImageHistogramInfo (); + info.NumberOfHistogramEntries = 256; + using (var obj = new MPSImageHistogramSpecification (MTLDevice.SystemDefault, ref info)) { + var rv = obj.HistogramInfo; + Asserts.AreEqual (info, rv, "HistogramForAlpha"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramTest.cs b/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramTest.cs new file mode 100644 index 000000000000..d39388850670 --- /dev/null +++ b/tests/monotouch-test/MetalPerformanceShaders/MPSImageHistogramTest.cs @@ -0,0 +1,52 @@ +// Copyright 2017 Microsoft Inc. All rights reserved. + +#if !__WATCHOS__ + +using System; + +#if XAMCORE_2_0 +using Metal; +using MetalPerformanceShaders; +using UIKit; +#else +using MonoTouch.Metal; +using MonoTouch.MetalPerformanceShaders; +using MonoTouch.UIKit; +#endif + +using NUnit.Framework; + +namespace MonoTouchFixtures.MetalPerformanceShaders +{ + + [TestFixture] + public class MPSImageHistogramTest + { + + [Test] + public void Constructors () + { + TestRuntime.AssertDevice (); + TestRuntime.AssertXcodeVersion (7, 0); + + MPSImageHistogramInfo info = new MPSImageHistogramInfo (); + info.NumberOfHistogramEntries = 256; + using (var obj = new MPSImageHistogram (MTLDevice.SystemDefault, ref info)) { + var rv = obj.HistogramInfo; + Asserts.AreEqual (info, rv, "HistogramForAlpha"); + + Assert.IsTrue (obj.ZeroHistogram, "ZeroHistogram"); + Assert.AreEqual (3072, obj.HistogramSizeForSourceFormat (MTLPixelFormat.RGBA16Sint), "HistogramSizeForSourceFormat"); + var crs = obj.ClipRectSource; + Assert.AreEqual (0, crs.Origin.X, "ClipRectSource.Origin.X"); + Assert.AreEqual (0, crs.Origin.Y, "ClipRectSource.Origin.Y"); + Assert.AreEqual (0, crs.Origin.Z, "ClipRectSource.Origin.Z"); + Assert.AreEqual (-1, crs.Size.Depth, "ClipRectSource.Size.Depth"); + Assert.AreEqual (-1, crs.Size.Height, "ClipRectSource.Size.Height"); + Assert.AreEqual (-1, crs.Size.Width, "ClipRectSource.Size.Width"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/ModelIO/MDLAssetTest.cs b/tests/monotouch-test/ModelIO/MDLAssetTest.cs new file mode 100644 index 000000000000..2e61f016179c --- /dev/null +++ b/tests/monotouch-test/ModelIO/MDLAssetTest.cs @@ -0,0 +1,65 @@ +// +// MDLAssert Unit Tests +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright 2017 Microsoft Inc. +// + +#if !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +#if !MONOMAC +using UIKit; +#endif +#if !__TVOS__ +using MultipeerConnectivity; +#endif +using ModelIO; +using ObjCRuntime; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +#if !__TVOS__ +using MonoTouch.MultipeerConnectivity; +#endif +using MonoTouch.UIKit; +using MonoTouch.ModelIO; +using MonoTouch.ObjCRuntime; +#endif +using OpenTK; +using NUnit.Framework; + +namespace MonoTouchFixtures.ModelIO +{ + + [TestFixture] + // we want the test to be available if we use the linker + [Preserve (AllMembers = true)] + public class MDLAssetTest + { + [TestFixtureSetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (7, 0); + } + + [Test] + public void BoundingBoxTest () + { + using (var obj = new MDLAsset ()) { + MDLAxisAlignedBoundingBox box = new MDLAxisAlignedBoundingBox ( + new Vector3 (-1, -1, -1), + new Vector3 (0, 0, 0) + ); + Asserts.AreEqual (box, obj.BoundingBox, "BoundingBox"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/ModelIO/MDLCameraTest.cs b/tests/monotouch-test/ModelIO/MDLCameraTest.cs new file mode 100644 index 000000000000..aaee43c75e3c --- /dev/null +++ b/tests/monotouch-test/ModelIO/MDLCameraTest.cs @@ -0,0 +1,91 @@ +// +// MDLCamera Unit Tests +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright 2017 Microsoft Inc. +// + +#if !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +#if !MONOMAC +using UIKit; +#endif +#if !__TVOS__ +using MultipeerConnectivity; +#endif +using ModelIO; +using ObjCRuntime; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +#if !__TVOS__ +using MonoTouch.MultipeerConnectivity; +#endif +using MonoTouch.UIKit; +using MonoTouch.ModelIO; +using MonoTouch.ObjCRuntime; +#endif +using OpenTK; + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + +using Bindings.Test; + +using NUnit.Framework; + +namespace MonoTouchFixtures.ModelIO +{ + + [TestFixture] + // we want the test to be available if we use the linker + [Preserve (AllMembers = true)] + public class MDCameraTest + { + [TestFixtureSetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (7, 0); + } + + [Test] + public void ProjectionMatrix () + { + using (var obj = new MDLCamera ()) { + Assert.AreEqual (0.1f, obj.NearVisibilityDistance, 0.0001f, "NearVisibilityDistance"); + Assert.AreEqual (1000f, obj.FarVisibilityDistance, 0.0001f, "FarVisibilityDistance"); + Assert.AreEqual (54f, obj.FieldOfView, 0.0001f, "FieldOfView"); + var initialProjectionMatrix = new Matrix4 ( + 1.308407f, 0, 0, 0, + 0, 1.962611f, 0, 0, + 0, 0, -1.0002f, -1, + 0, 0, -0.20002f, 0 + ); + Asserts.AreEqual (initialProjectionMatrix, obj.ProjectionMatrix, 0.0001f, "Initial"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) initialProjectionMatrix), obj.ProjectionMatrix4x4, 0.0001f, "Initial 4x4"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) initialProjectionMatrix), CFunctions.GetMatrixFloat4x4 (obj, "projectionMatrix"), 0.0001f, "Initial native"); + + obj.NearVisibilityDistance = 1.0f; + var modifiedProjectionMatrix = new Matrix4 ( + 1.308407f, 0, 0, 0, + 0, 1.962611f, 0, 0, + 0, 0, -1.002002f, -1, + 0, 0, -2.002002f, 0 + ); + Asserts.AreEqual (modifiedProjectionMatrix, obj.ProjectionMatrix, 0.0001f, "Second"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) modifiedProjectionMatrix), obj.ProjectionMatrix4x4, 0.0001f, "Second 4x4"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) modifiedProjectionMatrix), CFunctions.GetMatrixFloat4x4 (obj, "projectionMatrix"), 0.0001f, "Second native"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs b/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs index daf8e85f5069..ec750defc3e6 100644 --- a/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs +++ b/tests/monotouch-test/ModelIO/MDLMaterialProperty.cs @@ -33,6 +33,13 @@ using MonoTouch.ObjCRuntime; #endif using OpenTK; +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; +#if !TEST_BINDINGS_UNAVAILABLE +using Bindings.Test; +#endif using NUnit.Framework; namespace MonoTouchFixtures.ModelIO { @@ -101,6 +108,7 @@ public void Ctors () Vector3 V3; Vector4 V4; Matrix4 M4; + MatrixFloat4x4 M4x4; MDLTextureSampler tsv; NSUrl url; @@ -122,6 +130,7 @@ public void Ctors () V3 = new Vector3 (3, 4, 5); V4 = new Vector4 (6, 7, 8, 9); M4 = new Matrix4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + M4x4 = new MatrixFloat4x4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); tsv = new MDLTextureSampler (); url = new NSUrl ("http://xamarin.com"); @@ -161,7 +170,11 @@ public void Ctors () // Looks like the URLValue can't change after construction obj.UrlValue = url; - Assert.IsNull (obj.UrlValue, "2 UrlValue"); + if (TestRuntime.CheckXcodeVersion (9, 0)) { + Assert.AreSame (url, obj.UrlValue, "2 UrlValue"); + } else { + Assert.IsNull (obj.UrlValue, "2 UrlValue"); + } } @@ -183,6 +196,17 @@ public void Ctors () using (var obj = new MDLMaterialProperty ("name", MDLMaterialSemantic.AmbientOcclusion, M4)) { Asserts.AreEqual (M4, obj.Matrix4x4, "7 Matrix4x4"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (CFunctions.GetMatrixFloat4x4 (obj, "matrix4x4"), obj.MatrixFloat4x4, "7b MatrixFloat4x4"); +#endif + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) M4), obj.MatrixFloat4x4, "7c MatrixFloat4x4"); + } + + using (var obj = new MDLMaterialProperty ("name", MDLMaterialSemantic.AmbientOcclusion, M4x4)) { +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (CFunctions.GetMatrixFloat4x4 (obj, "matrix4x4"), obj.MatrixFloat4x4, "7' MatrixFloat4x4"); +#endif + Asserts.AreEqual (M4x4, obj.MatrixFloat4x4, "7'b MatrixFloat4x4"); } using (var obj = new MDLMaterialProperty ("name", MDLMaterialSemantic.AmbientOcclusion, V4)) { diff --git a/tests/monotouch-test/ModelIO/MDLMesh.cs b/tests/monotouch-test/ModelIO/MDLMesh.cs index c30257f6f903..4b4386675962 100644 --- a/tests/monotouch-test/ModelIO/MDLMesh.cs +++ b/tests/monotouch-test/ModelIO/MDLMesh.cs @@ -135,16 +135,7 @@ public void CreatePlaneTest () Assert.IsNotNull (obj, "obj"); Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (1.5f, 0, 1.5f), MinBounds = new Vector3 (-1.5f, 0, -1.5f) }, obj.BoundingBox, "BoundingBox"); Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); -#if MONOMAC - var vb = 31; -#else - int vb = 1; - if (TestRuntime.CheckXcodeVersion (8, 2)) - vb = 31; - else if (TestRuntime.CheckXcodeVersion (8, 0)) - vb = 1; -#endif - Assert.AreEqual (vb, obj.VertexBuffers.Length, "VertexBuffers Count"); + Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (1), "VertexBuffers Count"); Assert.AreEqual (16, obj.VertexCount, "VertexCount"); Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); @@ -176,19 +167,16 @@ public void CreateCylindroidTest () Assert.IsNotNull (obj, "obj"); #if MONOMAC Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (0.866025448f, 0.5f, 1f), MinBounds = new Vector3 (-0.866025388f, -0.5f, -0.5f) }, obj.BoundingBox, "BoundingBox"); - Assert.AreEqual (31, obj.VertexBuffers.Length, "VertexBuffers Count"); #else if (TestRuntime.CheckXcodeVersion (8, 2)) { Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (0.866025448f, 0.5f, 1f), MinBounds = new Vector3 (-0.866025388f, -0.5f, -0.5f) }, obj.BoundingBox, "BoundingBox"); - Assert.AreEqual (31, obj.VertexBuffers.Length, "VertexBuffers Count"); } else if (TestRuntime.CheckXcodeVersion (8, 0)) { Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (0.866025448f, 1.0f, 1f), MinBounds = new Vector3 (-0.866025388f, -1.0f, -0.5f) }, obj.BoundingBox, "BoundingBox"); - Assert.AreEqual (3, obj.VertexBuffers.Length, "VertexBuffers Count"); } else { Asserts.AreEqual (new MDLAxisAlignedBoundingBox { MaxBounds = new Vector3 (1f, 0.5f, 1f), MinBounds = new Vector3 (-0.866025388f, -0.5f, -0.866025388f) }, obj.BoundingBox, "BoundingBox"); - Assert.AreEqual (1, obj.VertexBuffers.Length, "VertexBuffers Count"); } #endif + Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (1), "VertexBuffers Count"); Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); Assert.AreEqual (18, obj.VertexCount, "VertexCount"); Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); @@ -279,7 +267,7 @@ public void CreateCapsuleTest () Assert.IsNotNull (obj, "obj"); Assert.That (obj.VertexCount, Is.GreaterThanOrEqualTo (122), "VertexCount"); Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); - Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (3), "VertexBuffers Count"); + Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (1), "VertexBuffers Count"); Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); } @@ -296,7 +284,7 @@ public void CreateConeTest () using (var obj = MDLMesh.CreateCone (V3, V2i, MDLGeometryType.Triangles, true, true, null)) { Assert.IsNotNull (obj, "obj"); Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); - Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (3), "VertexBuffers Count"); + Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (1), "VertexBuffers Count"); Assert.AreEqual (36, obj.VertexCount, "VertexCount"); Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); @@ -314,7 +302,7 @@ public void CreatePaneTest () using (var obj = MDLMesh.CreatePlane (V3, V2i, MDLGeometryType.Triangles, null)) { Assert.IsNotNull (obj, "obj"); Assert.AreEqual (1, obj.Submeshes.Count, "Submeshes Count"); - Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (3), "VertexBuffers Count"); + Assert.That (obj.VertexBuffers.Length, Is.GreaterThanOrEqualTo (1), "VertexBuffers Count"); Assert.AreEqual (30, obj.VertexCount, "VertexCount"); Assert.AreEqual (31, obj.VertexDescriptor.Attributes.Count, "VertexDescriptor Attributes Count"); Assert.AreEqual (31, obj.VertexDescriptor.Layouts.Count, "VertexDescriptor Layouts Count"); diff --git a/tests/monotouch-test/ModelIO/MDLStereoscopicCameraTest.cs b/tests/monotouch-test/ModelIO/MDLStereoscopicCameraTest.cs new file mode 100644 index 000000000000..cc4828c95da0 --- /dev/null +++ b/tests/monotouch-test/ModelIO/MDLStereoscopicCameraTest.cs @@ -0,0 +1,101 @@ +// +// MDLStereoscopicCamera Unit Tests +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright 2017 Microsoft Inc. +// + +#if !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +#if !MONOMAC +using UIKit; +#endif +#if !__TVOS__ +using MultipeerConnectivity; +#endif +using ModelIO; +using ObjCRuntime; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +#if !__TVOS__ +using MonoTouch.MultipeerConnectivity; +#endif +using MonoTouch.UIKit; +using MonoTouch.ModelIO; +using MonoTouch.ObjCRuntime; +#endif +using OpenTK; + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + +using Bindings.Test; +using NUnit.Framework; + +namespace MonoTouchFixtures.ModelIO +{ + [TestFixture] + // we want the test to be available if we use the linker + [Preserve (AllMembers = true)] + public class MDLStereoscopicCameraTest + { + [TestFixtureSetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (7, 0); + } + + [Test] + public void Properties () + { + using (var obj = new MDLStereoscopicCamera ()) { + Assert.AreEqual (63f, obj.InterPupillaryDistance, "InterPupillaryDistance"); + Assert.AreEqual (0f, obj.LeftVergence, "LeftVergence"); + Assert.AreEqual (0f, obj.RightVergence, "RightVergence"); + Assert.AreEqual (0f, obj.Overlap, "Overlap"); + + var mat1 = new Matrix4 ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + -0.63f, 0, 0, 1); + Asserts.AreEqual (mat1, obj.LeftViewMatrix, "LeftViewMatrix"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat1), obj.LeftViewMatrix4x4, "LeftViewMatrix4x4"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat1), CFunctions.GetMatrixFloat4x4 (obj, "leftViewMatrix"), "LeftViewMatrix4x4 native"); + + var mat2 = new Matrix4 ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0.63f, 0, 0, 1); + Asserts.AreEqual (mat2, obj.RightViewMatrix, "RightViewMatrix"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat2), obj.RightViewMatrix4x4, "RightViewMatrix4x4"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat2), CFunctions.GetMatrixFloat4x4 (obj, "rightViewMatrix"), "RightViewMatrix4x4 native"); + + var mat3 = new Matrix4 ( + 1.308407f, 0, 0, 0, + 0, 1.962611f, 0, 0, + 0, 0, -1.0002f, -1, + 0, 0, -0.20002f, 0); + Asserts.AreEqual (mat3, obj.LeftProjectionMatrix, 0.0001f, "LeftProjectionMatrix"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat3), obj.LeftProjectionMatrix4x4, 0.0001f, "LeftProjectionMatrix4x4"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat3), CFunctions.GetMatrixFloat4x4 (obj, "leftProjectionMatrix"), 0.0001f, "LeftProjectionMatrix4x4 native"); + + Asserts.AreEqual (mat3, obj.RightProjectionMatrix, 0.0001f, "RightProjectionMatrix"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat3), obj.RightProjectionMatrix4x4, 0.0001f, "RightProjectionMatrix4x4"); + Asserts.AreEqual (MatrixFloat4x4.Transpose ((MatrixFloat4x4) mat3), CFunctions.GetMatrixFloat4x4 (obj, "rightProjectionMatrix"), 0.0001f, "RightProjectionMatrix4x4 native"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/ModelIO/MDLTransform.cs b/tests/monotouch-test/ModelIO/MDLTransform.cs index b169ecabac48..6bb4ee25097c 100644 --- a/tests/monotouch-test/ModelIO/MDLTransform.cs +++ b/tests/monotouch-test/ModelIO/MDLTransform.cs @@ -30,6 +30,15 @@ using MonoTouch.ObjCRuntime; #endif using OpenTK; + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + +#if !TEST_BINDINGS_UNAVAILABLE +using Bindings.Test; +#endif using NUnit.Framework; namespace MonoTouchFixtures.ModelIO { @@ -120,6 +129,33 @@ public void Ctors () obj.Rotation = V3; Asserts.AreEqual (V3, obj.Rotation, "Rotation 2"); } + + var m4 = new Matrix4 ( + 4, 0, 0, 0, + 0, 3, 0, 0, + 0, 0, 2, 0, + 2, 3, 4, 1); + using (var obj = new MDLTransform (m4)) { + Asserts.AreEqual (Vector3.Zero, obj.Rotation, "Rotation 3"); + Asserts.AreEqual (new Vector3 (4, 3, 2), obj.Scale, "Scale 3"); + Asserts.AreEqual (new Vector3 (2, 3, 4), obj.Translation, "Translation 3"); + Asserts.AreEqual (m4, obj.Matrix, 0.0001f, "Matrix 3"); + } + + var m4x4 = new MatrixFloat4x4 ( + 4, 0, 0, 2, + 0, 3, 0, 3, + 0, 0, 2, 4, + 0, 0, 0, 1); + using (var obj = new MDLTransform (m4x4)) { + Asserts.AreEqual (Vector3.Zero, obj.Rotation, "Rotation 4"); + Asserts.AreEqual (new Vector3 (4, 3, 2), obj.Scale, "Scale 4"); + Asserts.AreEqual (new Vector3 (2, 3, 4), obj.Translation, "Translation 4"); + Asserts.AreEqual (m4x4, obj.GetMatrix4x4 (), 0.0001f, "Matrix4x4 4"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (m4x4, CFunctions.GetMatrixFloat4x4 (obj, "matrix"), 0.0001f, "Matrix4x4-native 4"); +#endif + } } [Test] @@ -157,6 +193,28 @@ public void RotationAtTimeTest () Asserts.AreEqual (V3, obj.GetRotation (0), "RotationAtTime"); } } + + [Test] + public void GetRotationMatrixTest () + { + var matrix = Matrix4.Identity; + var V3 = new Vector3 (1, 0, 0); + + using (var obj = new MDLTransform (matrix)) { + obj.SetRotation (V3, 0); + var expected = new MatrixFloat4x4 ( + 1, 0, 0, 0, + 0, (float) Math.Cos (1.0f), (float) -Math.Sin(1.0f), 0, + 0, (float) Math.Sin (1.0f), (float) Math.Cos(1.0f), 0, + 0, 0, 0, 1 + ); + Asserts.AreEqual ((Matrix4) MatrixFloat4x4.Transpose (expected), obj.GetRotationMatrix (0), 0.00001f, "GetRotationMatrix"); + Asserts.AreEqual (expected, obj.GetRotationMatrix4x4 (0), 0.00001f, "GetRotationMatrix4x4"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (expected, CFunctions.MDLTransform_GetRotationMatrix (obj, 0), 0.00001f, "GetRotationMatrix4x4 native"); +#endif + } + } } } diff --git a/tests/monotouch-test/ModelIO/MDLTransformComponentTest.cs b/tests/monotouch-test/ModelIO/MDLTransformComponentTest.cs new file mode 100644 index 000000000000..34c7d41facfe --- /dev/null +++ b/tests/monotouch-test/ModelIO/MDLTransformComponentTest.cs @@ -0,0 +1,212 @@ +// +// MDLTransformComponent Unit Tests +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright 2017 Microsoft inc +// + +#if !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using Foundation; +#if !MONOMAC +using UIKit; +#endif +#if !__TVOS__ +using MultipeerConnectivity; +#endif +using ModelIO; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +#if !__TVOS__ +using MonoTouch.MultipeerConnectivity; +#endif +using MonoTouch.UIKit; +using MonoTouch.ModelIO; +using MonoTouch.ObjCRuntime; +#endif +using OpenTK; + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + +using Bindings.Test; +using NUnit.Framework; + +namespace MonoTouchFixtures.ModelIO +{ + + [TestFixture] + // we want the test to be available if we use the linker + [Preserve (AllMembers = true)] + public class MDLTransformComponentTest + { + [TestFixtureSetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (7, 0); + } + + [Test] + public void MatrixTest () + { + var m4 = new Matrix4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + var m4x4 = (MatrixFloat4x4) m4; + + using (var obj = new MDLTransform ()) { + // identity + Asserts.AreEqual (Matrix4.Identity, obj.Matrix, "Initial identity"); + Asserts.AreEqual (MatrixFloat4x4.Identity, obj.GetMatrix4x4 (), "Initial identity 4x4"); + Asserts.AreEqual (MatrixFloat4x4.Identity, CFunctions.GetMatrixFloat4x4 (obj, "matrix"), "Initial identity native"); + + // translate the transform somewhere + obj.SetTranslation (new Vector3 (2, 2, 2), 0); + + // the matrix should now be a translation matrix like this: + // 1 0 0 0 2 + // 0 1 0 0 2 + // 0 0 1 0 2 + // 0 0 0 1 0 + // but since Matrix4 is transposed when compared to MatrixFloat4x4, we get this: + + Asserts.AreEqual (new Matrix4 ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 2, 2, 2, 1 + ), obj.Matrix, "Translated"); + + // The 4x4 version is correct: + Asserts.AreEqual (new Matrix4 ( + 1, 0, 0, 2, + 0, 1, 0, 2, + 0, 0, 1, 2, + 0, 0, 0, 1 + ), obj.GetMatrix4x4 (), "Translated 4x4"); + + // Let's set the matrix to something (different from the identity matrix) + obj.Matrix = m4; + + // And the matrix resets to the identify matrix. + Asserts.AreEqual (Matrix4.Identity, obj.Matrix, "After set_Matrix"); + + // Translate again + obj.SetTranslation (new Vector3 (3, 3, 3), 0); + + // Set the matrix using a 4x4 matrix + obj.SetMatrix4x4 (m4x4); + + // And we still get the identity matrix back + Asserts.AreEqual (MatrixFloat4x4.Identity, obj.GetMatrix4x4 (), "After set_Matrix 2"); + } + } + + [Test] + public void LocalTransformTest () + { + var m4 = new Matrix4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + var m4x4 = (MatrixFloat4x4) m4; + + using (var obj = new MDLTransform ()) { + var component = (IMDLTransformComponent) obj; + // identity + Asserts.AreEqual (Matrix4.Identity, component.GetLocalTransform (0), "Initial identity"); + Asserts.AreEqual (MatrixFloat4x4.Identity, component.GetLocalTransform4x4 (0), "Initial identity 4x4"); + Asserts.AreEqual (MatrixFloat4x4.Identity, CFunctions.MDLTransformComponent_GetLocalTransform (component, 0), "Initial identity native"); + + // translate the transform somewhere + obj.SetTranslation (new Vector3 (2, 2, 2), 0); + + // the local transform should now be a translation matrix like this: + // 1 0 0 0 2 + // 0 1 0 0 2 + // 0 0 1 0 2 + // 0 0 0 1 0 + // but since Matrix4 is transposed when compared to MatrixFloat4x4, we get this: + + Asserts.AreEqual (new Matrix4 ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 2, 2, 2, 1 + ), component.GetLocalTransform (0), "Translated"); + + // The 4x4 version is correct: + Asserts.AreEqual (new Matrix4 ( + 1, 0, 0, 2, + 0, 1, 0, 2, + 0, 0, 1, 2, + 0, 0, 0, 1 + ), component.GetLocalTransform4x4 (0), "Translated 4x4"); + + // Let's set the local transform at time 1 to something (different from the identity matrix) + component.SetLocalTransform (m4, 1); + + // At time 1 the transform matrix is now the identity matrix + Asserts.AreEqual (Matrix4.Identity, component.GetLocalTransform (1), "After SetLocalTransform at 1"); + + // At time 0.5 we get a middle ground + Asserts.AreEqual (new Matrix4 ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 1, 1, 1, 1 + ), component.GetLocalTransform (0.5), 0.00001f, "AfterSetLocalTransform at 0.5"); + + // And at time 0 we still have the translated matrix. + Asserts.AreEqual (new Matrix4 ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 2, 2, 2, 1 + ), component.GetLocalTransform (0), 0.00001f, "AfterSetLocalTransform at 0"); + + // Let's set the local transform at all times + component.SetLocalTransform (m4); + + // And we get the identity matrix back at all times + Asserts.AreEqual (Matrix4.Identity, component.GetLocalTransform (0), "Second identity at 0"); + Asserts.AreEqual (Matrix4.Identity, component.GetLocalTransform (1), "Second identity at 1"); + + // Translate again + obj.SetTranslation (new Vector3 (3, 3, 3), 0); + + // Set the local transform using a 4x4 matrix + component.SetLocalTransform4x4 (m4x4, 1); + + // And at time 0.5 we still get a middle ground + // The numbers are different now because the translation matrix was different, + // and the matrix is correct because we're checking the 4x4 version. + Asserts.AreEqual (new MatrixFloat4x4 ( + 1, 0, 0, 1.5f, + 0, 1, 0, 1.5f, + 0, 0, 1, 1.5f, + 0, 0, 0, 1 + ), component.GetLocalTransform4x4 (0.5), 0.00001f, "AfterSetLocalTransform4x4 at 0.5"); + } + } + + [Test] + public void CreateGlobalTransformTest () + { + Matrix4 m4; + MatrixFloat4x4 m4x4; + + using (var obj = new MDLObject ()) { + m4 = MDLTransform.CreateGlobalTransform (obj, 0); + Asserts.AreEqual ((Matrix4) MatrixFloat4x4.Transpose (CFunctions.MDLTransform_CreateGlobalTransform (obj, 0)), m4, "CreateGlobalTransform"); + + m4x4 = MDLTransform.CreateGlobalTransform4x4 (obj, 0); + Asserts.AreEqual (CFunctions.MDLTransform_CreateGlobalTransform (obj, 0), m4, "CreateGlobalTransform4x4"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/ModelIO/MDLVoxelArrayTest.cs b/tests/monotouch-test/ModelIO/MDLVoxelArrayTest.cs new file mode 100644 index 000000000000..0212a3a68279 --- /dev/null +++ b/tests/monotouch-test/ModelIO/MDLVoxelArrayTest.cs @@ -0,0 +1,83 @@ +// +// MDLAssert Unit Tests +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright 2017 Microsoft Inc. +// + +#if !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +#if !MONOMAC +using UIKit; +#endif +#if !__TVOS__ +using MultipeerConnectivity; +#endif +using ModelIO; +using ObjCRuntime; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +#if !__TVOS__ +using MonoTouch.MultipeerConnectivity; +#endif +using MonoTouch.UIKit; +using MonoTouch.ModelIO; +using MonoTouch.ObjCRuntime; +#endif +using OpenTK; +using NUnit.Framework; + +namespace MonoTouchFixtures.ModelIO +{ + + [TestFixture] + // we want the test to be available if we use the linker + [Preserve (AllMembers = true)] + public class MDLVoxelArrayTest + { + [TestFixtureSetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (7, 0); + } + + [Test] + public void BoundingBoxTest () + { + MDLAxisAlignedBoundingBox box = new MDLAxisAlignedBoundingBox ( + new Vector3 (4, 5, 6), + new Vector3 (1, 2, 3) + ); + using (var data = new NSData ()) { + using (var obj = new MDLVoxelArray (data, box, 1.0f)) { + Asserts.AreEqual (box, obj.BoundingBox, "BoundingBox"); + + var extents = new MDLVoxelIndexExtent2 ( + new Vector4i (1, 2, 3, 4), + new Vector4i (5, 6, 7, 8)); + var voxels = obj.GetVoxels (extents); + Assert.IsNull (voxels, "GetVoxels"); + + extents = obj.VoxelIndexExtent2; + Asserts.AreEqual (-1, extents.MaximumExtent.X, "MaxX"); + Asserts.AreEqual (-1, extents.MaximumExtent.Y, "MaxY"); + Asserts.AreEqual (-1, extents.MaximumExtent.Z, "MaxZ"); + Asserts.AreEqual (0, extents.MaximumExtent.W, "MaxW"); + Asserts.AreEqual (0, extents.MinimumExtent.X, "MinX"); + Asserts.AreEqual (0, extents.MinimumExtent.Y, "MinY"); + Asserts.AreEqual (0, extents.MinimumExtent.Z, "MinZ"); + Asserts.AreEqual (0, extents.MinimumExtent.W, "MinW"); + } + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/ObjCRuntime/RegistrarTest.cs b/tests/monotouch-test/ObjCRuntime/RegistrarTest.cs index 7dfc0d8ae58c..7023661c1484 100644 --- a/tests/monotouch-test/ObjCRuntime/RegistrarTest.cs +++ b/tests/monotouch-test/ObjCRuntime/RegistrarTest.cs @@ -1427,10 +1427,12 @@ public void TestNativeObjectArray () } } - public class NativeObjectArrayType : MKMapView + public class NativeObjectArrayType : NSObject { public IMKAnnotation[] Annotations; - public override void AddAnnotations(params IMKAnnotation[] annotations) + + [Export ("addAnnotations:")] + public void AddAnnotations (params IMKAnnotation[] annotations) { this.Annotations = annotations; } @@ -2589,4 +2591,15 @@ public void WithUserDelegateTypeAttribute () block.CleanupBlock (); } } + + [Preserve] + class OverloadByStaticity : NSObject + { + // Two Objective-C methods can have the same selector if one is static and the other instance. + [Export ("method")] + public void InstanceMethod () { } + + [Export ("method")] + public static void StaticMethod () { } + } } diff --git a/tests/monotouch-test/PassKit/PKPaymentRequestTest.cs b/tests/monotouch-test/PassKit/PKPaymentRequestTest.cs new file mode 100644 index 000000000000..a535cca88ca0 --- /dev/null +++ b/tests/monotouch-test/PassKit/PKPaymentRequestTest.cs @@ -0,0 +1,77 @@ +#if !__TVOS__ + +using System; +#if XAMCORE_2_0 +using Foundation; +using UIKit; +using PassKit; +#else +using MonoTouch.Foundation; +using MonoTouch.PassKit; +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +namespace MonoTouchFixtures.PassKit { + + [TestFixture] + [Preserve (AllMembers = true)] + public class PKPaymentRequestTest { + + [Test] + public void RequiredBillingContactFields () + { + TestRuntime.AssertXcodeVersion (9,0); + + using (var pr = new PKPaymentRequest ()) { + Assert.That (pr.RequiredBillingContactFields, Is.EqualTo (PKContactFields.None), "None"); + + pr.RequiredBillingContactFields |= PKContactFields.PostalAddress; + Assert.That (pr.RequiredBillingContactFields, Is.EqualTo (PKContactFields.PostalAddress), "PostalAddress"); + + pr.RequiredBillingContactFields |= PKContactFields.EmailAddress; + pr.RequiredBillingContactFields |= PKContactFields.PhoneNumber; + pr.RequiredBillingContactFields |= PKContactFields.Name; + pr.RequiredBillingContactFields |= PKContactFields.PhoneticName; + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (5), "Count-5"); + + pr.RequiredBillingContactFields = PKContactFields.PhoneticName; + Assert.That (pr.RequiredBillingContactFields, Is.EqualTo (PKContactFields.PhoneticName), "PhoneticName"); + } + } + + [Test] + public void WeakRequiredBillingContactFields () + { + TestRuntime.AssertXcodeVersion (9,0); + + using (var pr = new PKPaymentRequest ()) { + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (0), "Count"); + + using (var set = new NSMutableSet ()) { + pr.WeakRequiredBillingContactFields = set; + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (0), "Count-0"); + set.Add (PKContactFields.PostalAddress.GetConstant ()); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (1), "Count-1"); + set.Add (PKContactFields.EmailAddress.GetConstant ()); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (2), "Count-2"); + set.Add (PKContactFields.PhoneNumber.GetConstant ()); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (3), "Count-3"); + set.Add (PKContactFields.Name.GetConstant ()); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (4), "Count-5"); + set.Add (PKContactFields.PhoneticName.GetConstant ()); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (5), "Count-5"); + set.Add (PKContactFields.PhoneticName.GetConstant ()); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (5), "Count-5b"); + set.Remove (PKContactFields.PhoneticName.GetConstant ()); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (4), "Count-4b"); + set.RemoveAll (); + Assert.That (pr.WeakRequiredBillingContactFields.Count, Is.EqualTo (0), "Count-0b"); + } + } + } + } +} + +#endif + diff --git a/tests/monotouch-test/PdfKit/PdfAnnotationTest.cs b/tests/monotouch-test/PdfKit/PdfAnnotationTest.cs new file mode 100644 index 000000000000..23fbb04c0798 --- /dev/null +++ b/tests/monotouch-test/PdfKit/PdfAnnotationTest.cs @@ -0,0 +1,61 @@ +// +// PdfAnnotation Unit Tests +// +// Authors: +// Rolf Bjarne Kvinge +// +// Copyright 2017 Microsoft Inc. +// + +#if (__IOS__ || MONOMAC) && XAMCORE_2_0 + +using System; + +using CoreGraphics; +using Foundation; +using ObjCRuntime; +using PdfKit; + +using NUnit.Framework; + +namespace MonoTouchFixtures.PdfKit +{ + + [TestFixture] + // we want the test to be available if we use the linker + [Preserve (AllMembers = true)] + public class PdfAnnotationTest + { + [TestFixtureSetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void QuadrilateralPoints () + { + using (var obj = new PdfAnnotation ()) { + Assert.IsNotNull (obj.QuadrilateralPoints, "Q1"); + Assert.AreEqual (0, obj.QuadrilateralPoints.Length, "Q1b"); + + var points = new CGPoint [] + { + new CGPoint (0, 1), + new CGPoint (2, 3), + new CGPoint (4, 5), + new CGPoint (6, 7), + }; + + obj.QuadrilateralPoints = points; + Assert.AreEqual (points, obj.QuadrilateralPoints, "Q2"); + + obj.QuadrilateralPoints = null; + Assert.IsNotNull (obj.QuadrilateralPoints, "Q3"); + Assert.AreEqual (0, obj.QuadrilateralPoints.Length, "Q3b"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/ReplayKit/BroadcastHandlerTest.cs b/tests/monotouch-test/ReplayKit/BroadcastHandlerTest.cs new file mode 100644 index 000000000000..78ec99093920 --- /dev/null +++ b/tests/monotouch-test/ReplayKit/BroadcastHandlerTest.cs @@ -0,0 +1,10 @@ +using System; +namespace monotouchtest.ReplayKit +{ + public class BroadcastHandlerTest + { + public BroadcastHandlerTest () + { + } + } +} diff --git a/tests/monotouch-test/Security/TrustTest.cs b/tests/monotouch-test/Security/TrustTest.cs index b75d09deb9d2..a8c0093075e7 100644 --- a/tests/monotouch-test/Security/TrustTest.cs +++ b/tests/monotouch-test/Security/TrustTest.cs @@ -63,6 +63,10 @@ static SecTrustResult Evaluate (SecTrust trust, bool expect_recoverable = false) return result; NSRunLoop.Main.RunUntil (NSDate.Now.AddSeconds (i)); } + // we have done our best (it has not failed, but did not confirm either) + // still it can't recover (we and expected it could) most likely due to external factors (e.g. network) + if (result == SecTrustResult.RecoverableTrustFailure && !expect_recoverable) + Assert.Inconclusive ("Cannot recover from RecoverableTrustFailure after 8 attempts"); return result; } @@ -114,8 +118,12 @@ public void HostName_Leaf_Only () Assert.That (policies.Length, Is.EqualTo (1), "Policies.Length"); Assert.That (policies [0].Handle, Is.EqualTo (policy.Handle), "Handle"); + var trust_result = SecTrustResult.Invalid; + if (TestRuntime.CheckXcodeVersion (9, 0)) + trust_result = SecTrustResult.RecoverableTrustFailure; // Result not invalidated starting with Xcode 9 beta 3. + // since we modified the `trust` instance it's result was invalidated - Assert.That (trust.GetTrustResult (), Is.EqualTo (SecTrustResult.Invalid), "GetTrustResult-2"); + Assert.That (trust.GetTrustResult (), Is.EqualTo (trust_result), "GetTrustResult-2"); } } } @@ -232,6 +240,7 @@ public void Trust_FullChain () SecTrustResult trust_result = SecTrustResult.Unspecified; var ios9 = TestRuntime.CheckXcodeVersion (7, 0); var ios10 = TestRuntime.CheckXcodeVersion (8, 0); + var ios11 = TestRuntime.CheckXcodeVersion (9, 0); if (ios10) trust_result = SecTrustResult.FatalTrustFailure; // iOS9 is not fully happy with the basic constraints: `SecTrustEvaluate [root AnchorTrusted BasicContraints]` @@ -263,8 +272,13 @@ public void Trust_FullChain () trust.SetAnchorCertificates (certs); Assert.That (trust.GetCustomAnchorCertificates ().Length, Is.EqualTo (certs.Count), "GetCustomAnchorCertificates"); - // since we modified the `trust` instance it's result was invalidated - Assert.That (trust.GetTrustResult (), Is.EqualTo (SecTrustResult.Invalid), "GetTrustResult"); + if (ios11) + trust_result = SecTrustResult.Unspecified; + else + trust_result = SecTrustResult.Invalid; + + // since we modified the `trust` instance it's result was invalidated (marked as unspecified on iOS 11) + Assert.That (trust.GetTrustResult (), Is.EqualTo (trust_result), "GetTrustResult-2"); } } } diff --git a/tests/monotouch-test/Simd/MatrixFloat2x2Test.cs b/tests/monotouch-test/Simd/MatrixFloat2x2Test.cs new file mode 100644 index 000000000000..d8eb9310bfed --- /dev/null +++ b/tests/monotouch-test/Simd/MatrixFloat2x2Test.cs @@ -0,0 +1,304 @@ + +using System; +using System.Diagnostics; + +using Foundation; +using ObjCRuntime; + +using OpenTK; +using MatrixFloat2x2 = global::OpenTK.NMatrix2; + +using NUnit.Framework; + +namespace MonoTouchFixtures.Simd +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class MatrixFloat2x2Test + { + [Test] + public void Identity () + { + var identity = new MatrixFloat2x2 { + R0C0 = 1f, + R1C1 = 1f, + }; + Asserts.AreEqual (identity, MatrixFloat2x2.Identity, "identity"); + Asserts.AreEqual (Matrix2.Identity, MatrixFloat2x2.Identity, "opentk identity"); + } + + [Test] + public void ElementConstructor () + { + var expected = GetTestMatrix (); + var actual = new MatrixFloat2x2 (expected.R0C0, expected.R0C1, + expected.R1C0, expected.R1C1); + Asserts.AreEqual (expected, actual, "ctor 1"); + + } + + [Test] + public void Determinant () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat2x2) expected; + Assert.AreEqual (expected.Determinant, actual.Determinant, 0.000001f, "determinant\n" + actual); + } + + [Test] + public void Elements () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat2x2) expected; + + Assert.AreEqual (expected.R0C0, actual.R0C0, "R0C0 getter"); + Assert.AreEqual (expected.R0C1, actual.R0C1, "R0C1 getter"); + Assert.AreEqual (expected.R1C0, actual.R1C0, "R1C0 getter"); + Assert.AreEqual (expected.R1C1, actual.R1C1, "R1C1 getter"); + + var newExpected = GetTestMatrix (); + actual.R0C0 = newExpected.R0C0; + actual.R0C1 = newExpected.R0C1; + actual.R1C0 = newExpected.R1C0; + actual.R1C1 = newExpected.R1C1; + Assert.AreEqual (newExpected.R0C0, actual.R0C0, "R0C0 setter"); + Assert.AreEqual (newExpected.R0C1, actual.R0C1, "R0C1 setter"); + Assert.AreEqual (newExpected.R1C0, actual.R1C0, "R1C0 setter"); + Assert.AreEqual (newExpected.R1C1, actual.R1C1, "R1C1 setter"); + } + + [Test] + public void TransposeInstance () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat2x2) expected; + + expected.Transpose (); + actual.Transpose (); + + Asserts.AreEqual (expected, actual, "transpose"); + } + + [Test] + public void TransposeStatic () + { + var input = GetTestMatrix (); + var inputSimd = (MatrixFloat2x2) input; + + Matrix2 expected; + Matrix2.Transpose (ref input, out expected); + var actual = MatrixFloat2x2.Transpose (inputSimd); + + Asserts.AreEqual (expected, actual, "transpose"); + + input = GetTestMatrix (); + inputSimd = (MatrixFloat2x2) input; + Matrix2.Transpose (ref input, out expected); + MatrixFloat2x2.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void TransposeStatic_ByRef () + { + var input = GetTestMatrix (); + var inputSimd = (MatrixFloat2x2) input; + + Matrix2 expected; + MatrixFloat2x2 actual; + + Matrix2.Transpose (ref input, out expected); + MatrixFloat2x2.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void Multiply () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat2x2) inputL; + var inputSimdR = (MatrixFloat2x2) inputR; + Matrix2 expected; + Matrix2.Multiply (ref inputR, ref inputL, out expected); // OpenTK.Matrix2 got left/right mixed up... + var actual = MatrixFloat2x2.Multiply (inputSimdL, inputSimdR); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Multiply_ByRef () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat2x2) inputL; + var inputSimdR = (MatrixFloat2x2) inputR; + Matrix2 expected; + MatrixFloat2x2 actual; + + Matrix2.Multiply (ref inputR, ref inputL, out expected); // OpenTK.Matrix2 got left/right mixed up... + MatrixFloat2x2.Multiply (ref inputSimdL, ref inputSimdR, out actual); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + + [Test] + public void Multiply_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat2x2) inputL; + var inputSimdR = (MatrixFloat2x2) inputR; + Matrix2 expected; + Matrix2.Multiply (ref inputR, ref inputL, out expected); // OpenTK.Matrix2 got left/right mixed up... + var actual = inputSimdL * inputSimdR; + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Equality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat2x2) inputL; + var inputSimdR = (MatrixFloat2x2) inputR; + + // matrices are different + Assert.AreEqual (inputL.Equals (inputR), inputSimdL == inputSimdR, "inequality"); + Assert.IsFalse (inputL.Equals (inputR), "inequality 2 expected"); + Assert.IsFalse (inputSimdL == inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL.Equals (inputR), inputSimdL == inputSimdR, "equality"); + Assert.IsTrue (inputL.Equals (inputR), "equality 2 expected"); + Assert.IsTrue (inputSimdL == inputSimdR, "equality 2 actual"); + + Assert.IsTrue (MatrixFloat2x2.Identity == (MatrixFloat2x2) Matrix2.Identity, "identity equality"); + } + + [Test] + public void Inequality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat2x2) inputL; + var inputSimdR = (MatrixFloat2x2) inputR; + + // matrices are different + Assert.AreEqual (!inputL.Equals (inputR), inputSimdL != inputSimdR, "inequality"); + Assert.IsTrue (!inputL.Equals (inputR), "inequality 2 expected"); + Assert.IsTrue (inputSimdL != inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (!inputL.Equals (inputR), inputSimdL != inputSimdR, "equality"); + Assert.IsFalse (!inputL.Equals (inputR), "equality 2 expected"); + Assert.IsFalse (inputSimdL != inputSimdR, "equality 2 actual"); + + Assert.IsFalse (MatrixFloat2x2.Identity != (MatrixFloat2x2) Matrix2.Identity, "identity equality"); + } + + [Test] + public void Explicit_Operator_ToMatrix2 () + { + var expected = (MatrixFloat2x2) GetTestMatrix (); + var actual = (Matrix2) expected; + + Asserts.AreEqual (expected, actual, "tomatrix2"); + + actual = (Matrix2) MatrixFloat2x2.Identity; + Asserts.AreEqual (MatrixFloat2x2.Identity, actual, "tomatrix2 identity"); + Asserts.AreEqual (Matrix2.Identity, actual, "tomatrix2 identity2"); + } + + [Test] + public void Explicit_Operator_FromMatrix2 () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat2x2) expected; + + Asserts.AreEqual (expected, actual, "frommatrix2"); + + actual = (MatrixFloat2x2) Matrix2.Identity; + Asserts.AreEqual (MatrixFloat2x2.Identity, actual, "tomatrix2 identity"); + Asserts.AreEqual (Matrix2.Identity, actual, "tomatrix2 identity2"); + } + + [Test] + public void ToStringTest () + { + var actual = new MatrixFloat2x2 (1, 2, 3, 4); + + Assert.AreEqual ("(1, 2)\n(3, 4)", actual.ToString (), "tostring"); + } + + // GetHashCode doesn't have to be identical, so no need to test + + [Test] + public void Equals_Object () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (MatrixFloat2x2) expectedA; + var actualB = (MatrixFloat2x2) expectedB; + + Assert.IsTrue (actualA.Equals ((object) actualA), "self"); + Assert.IsFalse (actualA.Equals ((object) actualB), "other"); + Assert.IsFalse (actualA.Equals (null), "null"); + Assert.IsFalse (actualA.Equals (expectedA), "other type"); + } + + [Test] + public void Equals_Matrix () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (MatrixFloat2x2) expectedA; + var actualB = (MatrixFloat2x2) expectedB; + + Assert.IsTrue (actualA.Equals (actualA), "self"); + Assert.IsFalse (actualA.Equals (actualB), "other"); + } + + // A collection of test matrices. + // + // I initially tried randomly generating test matrices, but it turns out + // there are accumulative computational differences in the different algorithms + // between Matrix2 and MatrixFloat2x2. Since the differences are accumulative, + // I couldn't find a minimal sensible delta values when comparing + // matrices. + // + // So I just serialized a few matrices that were randomly generated, and + // these have been tested to not produce accumulative computational differences. + // + static Matrix2 [] test_matrices = new [] { + new Matrix2 (3, 5, 7, 11), + new Matrix2 (5, 7, 11, 13), + new Matrix2 (7, 11, 13, 17), + new Matrix2 (0.1532144f, 0.5451511f, 0.2004739f, 0.8351463f), + new Matrix2 (0.7717745f, 0.559364f, 0.00918373f, 0.6579159f), + new Matrix2 (0.2023053f, 0.4701468f, 0.6618567f, 0.7685714f), + new Matrix2 (9.799572E+08f, 1.64794E+09f, 1.117296E+09f, 1.239858E+09f), + new Matrix2 (1.102396E+09f, 3.082477E+08f, 1.126484E+09f, 5.022931E+08f), + new Matrix2 (2.263112E+08f, 8.79644E+08f, 1.303282E+09f, 1.654159E+09f), + new Matrix2 (0.4904693f, 0.841727f, 0.2294401f, 0.5736054f), + new Matrix2 (0.1252193f, 0.08986127f, 0.3407605f, 0.9144857f), + new Matrix2 (8.176959E+08f, 1.386156E+09f, 5.956444E+08f, 4.210506E+08f), + new Matrix2 (0.006755914f, 0.07464754f, 0.287938f, 0.3724834f), + }; + + static int counter; + internal static Matrix2 GetTestMatrix () + { + counter++; + if (counter == test_matrices.Length) + counter = 0; + return test_matrices [counter]; + } + } +} diff --git a/tests/monotouch-test/Simd/MatrixFloat3x3Test.cs b/tests/monotouch-test/Simd/MatrixFloat3x3Test.cs new file mode 100644 index 000000000000..ad631ae6b6af --- /dev/null +++ b/tests/monotouch-test/Simd/MatrixFloat3x3Test.cs @@ -0,0 +1,321 @@ + +using System; +using System.Diagnostics; + +using Foundation; +using ObjCRuntime; + +using OpenTK; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; + +using NUnit.Framework; + +namespace MonoTouchFixtures.Simd +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class MatrixFloat3x3Test + { + [Test] + public void Identity () + { + var identity = new MatrixFloat3x3 { + R0C0 = 1f, + R1C1 = 1f, + R2C2 = 1f, + }; + Asserts.AreEqual (identity, MatrixFloat3x3.Identity, "identity"); + Asserts.AreEqual (Matrix3.Identity, MatrixFloat3x3.Identity, "opentk identity"); + } + + [Test] + public void ElementConstructor () + { + var expected = GetTestMatrix (); + var actual = new MatrixFloat3x3 (expected.R0C0, expected.R0C1, expected.R0C2, + expected.R1C0, expected.R1C1, expected.R1C2, + expected.R2C0, expected.R2C1, expected.R2C2); + Asserts.AreEqual (expected, actual, "ctor 1"); + + } + + [Test] + public void Determinant () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat3x3) expected; + Assert.AreEqual (expected.Determinant, actual.Determinant, 0.000001f, "determinant\n" + actual); + } + + [Test] + public void Elements () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat3x3) expected; + + Assert.AreEqual (expected.R0C0, actual.R0C0, "R0C0 getter"); + Assert.AreEqual (expected.R0C1, actual.R0C1, "R0C1 getter"); + Assert.AreEqual (expected.R0C2, actual.R0C2, "R0C2 getter"); + Assert.AreEqual (expected.R1C0, actual.R1C0, "R1C0 getter"); + Assert.AreEqual (expected.R1C1, actual.R1C1, "R1C1 getter"); + Assert.AreEqual (expected.R1C2, actual.R1C2, "R1C2 getter"); + Assert.AreEqual (expected.R2C0, actual.R2C0, "R2C0 getter"); + Assert.AreEqual (expected.R2C1, actual.R2C1, "R2C1 getter"); + Assert.AreEqual (expected.R2C2, actual.R2C2, "R2C2 getter"); + + var newExpected = GetTestMatrix (); + actual.R0C0 = newExpected.R0C0; + actual.R0C1 = newExpected.R0C1; + actual.R0C2 = newExpected.R0C2; + actual.R1C0 = newExpected.R1C0; + actual.R1C1 = newExpected.R1C1; + actual.R1C2 = newExpected.R1C2; + actual.R2C0 = newExpected.R2C0; + actual.R2C1 = newExpected.R2C1; + actual.R2C2 = newExpected.R2C2; + Assert.AreEqual (newExpected.R0C0, actual.R0C0, "R0C0 setter"); + Assert.AreEqual (newExpected.R0C1, actual.R0C1, "R0C1 setter"); + Assert.AreEqual (newExpected.R0C2, actual.R0C2, "R0C2 setter"); + Assert.AreEqual (newExpected.R1C0, actual.R1C0, "R1C0 setter"); + Assert.AreEqual (newExpected.R1C1, actual.R1C1, "R1C1 setter"); + Assert.AreEqual (newExpected.R1C2, actual.R1C2, "R1C2 setter"); + Assert.AreEqual (newExpected.R2C0, actual.R2C0, "R2C0 setter"); + Assert.AreEqual (newExpected.R2C1, actual.R2C1, "R2C1 setter"); + Assert.AreEqual (newExpected.R2C2, actual.R2C2, "R2C2 setter"); + } + + [Test] + public void TransposeInstance () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat3x3) expected; + + expected.Transpose (); + actual.Transpose (); + + Asserts.AreEqual (expected, actual, "transpose"); + } + + [Test] + public void TransposeStatic () + { + var input = GetTestMatrix (); + var inputSimd = (MatrixFloat3x3) input; + + Matrix3 expected; + Matrix3.Transpose (ref input, out expected); + var actual = MatrixFloat3x3.Transpose (inputSimd); + + Asserts.AreEqual (expected, actual, "transpose"); + + input = GetTestMatrix (); + inputSimd = (MatrixFloat3x3) input; + Matrix3.Transpose (ref input, out expected); + MatrixFloat3x3.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void TransposeStatic_ByRef () + { + var input = GetTestMatrix (); + var inputSimd = (MatrixFloat3x3) input; + + Matrix3 expected; + MatrixFloat3x3 actual; + + Matrix3.Transpose (ref input, out expected); + MatrixFloat3x3.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void Multiply () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat3x3) inputL; + var inputSimdR = (MatrixFloat3x3) inputR; + Matrix3 expected; + Matrix3.Multiply (ref inputR, ref inputL, out expected); // OpenTK.Matrix3 got left/right mixed up... + var actual = MatrixFloat3x3.Multiply (inputSimdL, inputSimdR); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Multiply_ByRef () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat3x3) inputL; + var inputSimdR = (MatrixFloat3x3) inputR; + Matrix3 expected; + MatrixFloat3x3 actual; + + Matrix3.Multiply (ref inputR, ref inputL, out expected); // OpenTK.Matrix3 got left/right mixed up... + MatrixFloat3x3.Multiply (ref inputSimdL, ref inputSimdR, out actual); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + + [Test] + public void Multiply_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat3x3) inputL; + var inputSimdR = (MatrixFloat3x3) inputR; + Matrix3 expected; + Matrix3.Multiply (ref inputR, ref inputL, out expected); // OpenTK.Matrix3 got left/right mixed up... + var actual = inputSimdL * inputSimdR; + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Equality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat3x3) inputL; + var inputSimdR = (MatrixFloat3x3) inputR; + + // matrices are different + Assert.AreEqual (inputL.Equals (inputR), inputSimdL == inputSimdR, "inequality"); + Assert.IsFalse (inputL.Equals (inputR), "inequality 2 expected"); + Assert.IsFalse (inputSimdL == inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL.Equals (inputR), inputSimdL == inputSimdR, "equality"); + Assert.IsTrue (inputL.Equals (inputR), "equality 2 expected"); + Assert.IsTrue (inputSimdL == inputSimdR, "equality 2 actual"); + + Assert.IsTrue (MatrixFloat3x3.Identity == (MatrixFloat3x3) Matrix3.Identity, "identity equality"); + } + + [Test] + public void Inequality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat3x3) inputL; + var inputSimdR = (MatrixFloat3x3) inputR; + + // matrices are different + Assert.AreEqual (!inputL.Equals (inputR), inputSimdL != inputSimdR, "inequality"); + Assert.IsTrue (!inputL.Equals (inputR), "inequality 2 expected"); + Assert.IsTrue (inputSimdL != inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (!inputL.Equals (inputR), inputSimdL != inputSimdR, "equality"); + Assert.IsFalse (!inputL.Equals (inputR), "equality 2 expected"); + Assert.IsFalse (inputSimdL != inputSimdR, "equality 2 actual"); + + Assert.IsFalse (MatrixFloat3x3.Identity != (MatrixFloat3x3) Matrix3.Identity, "identity equality"); + } + + [Test] + public void Explicit_Operator_ToMatrix3 () + { + var expected = (MatrixFloat3x3) GetTestMatrix (); + var actual = (Matrix3) expected; + + Asserts.AreEqual (expected, actual, "tomatrix4"); + + actual = (Matrix3) MatrixFloat3x3.Identity; + Asserts.AreEqual (MatrixFloat3x3.Identity, actual, "tomatrix4 identity"); + Asserts.AreEqual (Matrix3.Identity, actual, "tomatrix4 identity2"); + } + + [Test] + public void Explicit_Operator_FromMatrix3 () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat3x3) expected; + + Asserts.AreEqual (expected, actual, "frommatrix4"); + + actual = (MatrixFloat3x3) Matrix3.Identity; + Asserts.AreEqual (MatrixFloat3x3.Identity, actual, "tomatrix4 identity"); + Asserts.AreEqual (Matrix3.Identity, actual, "tomatrix4 identity2"); + } + + [Test] + public void ToStringTest () + { + var actual = new MatrixFloat3x3 (1, 2, 3, 4, 5, 6, 7, 8, 9); + + Assert.AreEqual ("(1, 2, 3)\n(4, 5, 6)\n(7, 8, 9)", actual.ToString (), "tostring"); + } + + // GetHashCode doesn't have to be identical, so no need to test + + [Test] + public void Equals_Object () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (MatrixFloat3x3) expectedA; + var actualB = (MatrixFloat3x3) expectedB; + + Assert.IsTrue (actualA.Equals ((object) actualA), "self"); + Assert.IsFalse (actualA.Equals ((object) actualB), "other"); + Assert.IsFalse (actualA.Equals (null), "null"); + Assert.IsFalse (actualA.Equals (expectedA), "other type"); + } + + [Test] + public void Equals_Matrix () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (MatrixFloat3x3) expectedA; + var actualB = (MatrixFloat3x3) expectedB; + + Assert.IsTrue (actualA.Equals (actualA), "self"); + Assert.IsFalse (actualA.Equals (actualB), "other"); + } + + // A collection of test matrices. + // + // I initially tried randomly generating test matrices, but it turns out + // there are accumulative computational differences in the different algorithms + // between Matrix3 and MatrixFloat3x3. Since the differences are accumulative, + // I couldn't find a minimal sensible delta values when comparing + // matrices. + // + // So I just serialized a few matrices that were randomly generated, and + // these have been tested to not produce accumulative computational differences. + // + static Matrix3 [] test_matrices = new [] { + new Matrix3 (3, 5, 7, 11, 13, 17, 19, 23, 29), + new Matrix3 (5, 7, 11, 13, 17, 19, 23, 29, 31), + new Matrix3 (7, 11, 13, 17, 19, 23, 29, 31, 37), + new Matrix3 (0.1532144f, 0.5451511f, 0.2004739f, 0.8351463f, 0.9884372f, 0.1313103f, 0.3327205f, 0.01164342f, 0.6563147f), + new Matrix3 (0.7717745f, 0.559364f, 0.00918373f, 0.6579159f, 0.123461f, 0.9993145f, 0.5487496f, 0.2823398f, 0.9710717f), + new Matrix3 (0.2023053f, 0.4701468f, 0.6618567f, 0.7685714f, 0.8561344f, 0.009231919f, 0.6150167f, 0.7542298f, 0.550727f), + new Matrix3 (9.799572E+08f, 1.64794E+09f, 1.117296E+09f, 1.239858E+09f, 6.389504E+07f, 1.172175E+09f, 1.399567E+09f, 1.187143E+09f, 3.729208E+07f), + new Matrix3 (1.102396E+09f, 3.082477E+08f, 1.126484E+09f, 5.022931E+08f, 1.966322E+09f, 1.1814E+09f, 8.464673E+08f, 1.940651E+09f, 1.229937E+09f), + new Matrix3 (2.263112E+08f, 8.79644E+08f, 1.303282E+09f, 1.654159E+09f, 3.705524E+08f, 1.984941E+09f, 2.175935E+07f, 4.633518E+08f, 1.801243E+09f), + new Matrix3 (0.4904693f, 0.841727f, 0.2294401f, 0.5736054f, 0.5406881f, 0.2172498f, 0.1261143f, 0.6736677f, 0.4570194f), + new Matrix3 (0.1252193f, 0.08986127f, 0.3407605f, 0.9144857f, 0.340791f, 0.2192288f, 0.5144276f, 0.01813344f, 0.07687104f), + new Matrix3 (8.176959E+08f, 1.386156E+09f, 5.956444E+08f, 4.210506E+08f, 1.212676E+09f, 4.131035E+08f, 1.032453E+09f, 2.074689E+08f, 1.536594E+09f), + new Matrix3 (0.006755914f, 0.07464754f, 0.287938f, 0.3724834f, 0.1496783f, 0.6224982f, 0.7150125f, 0.5554719f, 0.4638171f), + }; + + static int counter; + internal static Matrix3 GetTestMatrix () + { + counter++; + if (counter == test_matrices.Length) + counter = 0; + return test_matrices [counter]; + } + } +} diff --git a/tests/monotouch-test/Simd/MatrixFloat4x3Test.cs b/tests/monotouch-test/Simd/MatrixFloat4x3Test.cs new file mode 100644 index 000000000000..8a55f288fca2 --- /dev/null +++ b/tests/monotouch-test/Simd/MatrixFloat4x3Test.cs @@ -0,0 +1,188 @@ + +using System; +using System.Diagnostics; + +using Foundation; +using ObjCRuntime; + +using OpenTK; + +using NUnit.Framework; + +namespace MonoTouchFixtures.Simd +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class NMatrix4x3Test + { + [Test] + public void ElementConstructor () + { + var expected = GetTestMatrix (); + var actual = new NMatrix4x3 ( + expected.M11, expected.M12, expected.M13, expected.M14, + expected.M21, expected.M22, expected.M23, expected.M24, + expected.M31, expected.M32, expected.M33, expected.M34); + Asserts.AreEqual (expected, actual, "ctor 1"); + + } + + [Test] + public void Elements () + { + var expected = GetTestMatrix (); + var actual = (NMatrix4x3) expected; + + Assert.AreEqual (expected.M11, actual.M11, "m11 getter"); + Assert.AreEqual (expected.M12, actual.M12, "m12 getter"); + Assert.AreEqual (expected.M13, actual.M13, "m13 getter"); + Assert.AreEqual (expected.M14, actual.M14, "m14 getter"); + Assert.AreEqual (expected.M21, actual.M21, "m21 getter"); + Assert.AreEqual (expected.M22, actual.M22, "m22 getter"); + Assert.AreEqual (expected.M23, actual.M23, "m23 getter"); + Assert.AreEqual (expected.M24, actual.M24, "m24 getter"); + Assert.AreEqual (expected.M31, actual.M31, "m31 getter"); + Assert.AreEqual (expected.M32, actual.M32, "m32 getter"); + Assert.AreEqual (expected.M33, actual.M33, "m33 getter"); + Assert.AreEqual (expected.M34, actual.M34, "m34 getter"); + + var newExpected = GetTestMatrix (); + actual.M11 = newExpected.M11; + actual.M12 = newExpected.M12; + actual.M13 = newExpected.M13; + actual.M14 = newExpected.M14; + actual.M21 = newExpected.M21; + actual.M22 = newExpected.M22; + actual.M23 = newExpected.M23; + actual.M24 = newExpected.M24; + actual.M31 = newExpected.M31; + actual.M32 = newExpected.M32; + actual.M33 = newExpected.M33; + actual.M34 = newExpected.M34; + Assert.AreEqual (newExpected.M11, actual.M11, "m11 setter"); + Assert.AreEqual (newExpected.M12, actual.M12, "m12 setter"); + Assert.AreEqual (newExpected.M13, actual.M13, "m13 setter"); + Assert.AreEqual (newExpected.M14, actual.M14, "m14 setter"); + Assert.AreEqual (newExpected.M21, actual.M21, "m21 setter"); + Assert.AreEqual (newExpected.M22, actual.M22, "m22 setter"); + Assert.AreEqual (newExpected.M23, actual.M23, "m23 setter"); + Assert.AreEqual (newExpected.M24, actual.M24, "m24 setter"); + Assert.AreEqual (newExpected.M31, actual.M31, "m31 setter"); + Assert.AreEqual (newExpected.M32, actual.M32, "m32 setter"); + Assert.AreEqual (newExpected.M33, actual.M33, "m33 setter"); + Assert.AreEqual (newExpected.M34, actual.M34, "m34 setter"); + } + + [Test] + public void Equality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (NMatrix4x3) inputL; + var inputSimdR = (NMatrix4x3) inputR; + + // matrices are different + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "inequality"); + Assert.IsFalse (inputL == inputR, "inequality 2 expected"); + Assert.IsFalse (inputSimdL == inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "equality"); + Assert.IsTrue (inputL == inputR, "equality 2 expected"); + Assert.IsTrue (inputSimdL == inputSimdR, "equality 2 actual"); + } + + [Test] + public void Inequality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (NMatrix4x3) inputL; + var inputSimdR = (NMatrix4x3) inputR; + + // matrices are different + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "inequality"); + Assert.IsTrue (inputL != inputR, "inequality 2 expected"); + Assert.IsTrue (inputSimdL != inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "equality"); + Assert.IsFalse (inputL != inputR, "equality 2 expected"); + Assert.IsFalse (inputSimdL != inputSimdR, "equality 2 actual"); + } + + [Test] + public void ToStringTest () + { + var expected = GetTestMatrix (); + var actual = (NMatrix4x3) expected; + + Assert.AreEqual (expected.ToString (), actual.ToString (), "tostring"); + } + + // GetHashCode doesn't have to be identical, so no need to test + + [Test] + public void Equals_Object () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (NMatrix4x3) expectedA; + var actualB = (NMatrix4x3) expectedB; + + Assert.IsTrue (actualA.Equals ((object) actualA), "self"); + Assert.IsFalse (actualA.Equals ((object) actualB), "other"); + Assert.IsFalse (actualA.Equals (null), "null"); + Assert.IsTrue (actualA.Equals (expectedA), "other type"); + } + + [Test] + public void Equals_Matrix () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (NMatrix4x3) expectedA; + var actualB = (NMatrix4x3) expectedB; + + Assert.IsTrue (actualA.Equals (actualA), "self"); + Assert.IsFalse (actualA.Equals (actualB), "other"); + } + + // A collection of test matrices. + // + // I initially tried randomly generating test matrices, but it turns out + // there are accumulative computational differences in the different algorithms + // between Matrix4 and NMatrix4x3. Since the differences are accumulative, + // I couldn't find a minimal sensible delta values when comparing + // matrices. + // + // So I just serialized a few matrices that were randomly generated, and + // these have been tested to not produce accumulative computational differences. + // + static NMatrix4x3 [] test_matrices = new [] { + new NMatrix4x3 (0.1532144f, 0.5451511f, 0.2004739f, 0.8351463f, 0.9884372f, 0.1313103f, 0.3327205f, 0.01164342f, 0.6563147f, 0.7923161f, 0.6764754f, 0.07481737f), + new NMatrix4x3 (0.7717745f, 0.559364f, 0.00918373f, 0.6579159f, 0.123461f, 0.9993145f, 0.5487496f, 0.2823398f, 0.9710717f, 0.8750508f, 0.472472f, 0.2608089f), + new NMatrix4x3 (0.2023053f, 0.4701468f, 0.6618567f, 0.7685714f, 0.8561344f, 0.009231919f, 0.6150167f, 0.7542298f, 0.550727f, 0.3625788f, 0.6639862f, 0.5763468f), + new NMatrix4x3 (9.799572E+08f, 1.64794E+09f, 1.117296E+09f, 1.239858E+09f, 6.389504E+07f, 1.172175E+09f, 1.399567E+09f, 1.187143E+09f, 3.729208E+07f, 5.50313E+08f, 1.847369E+09f, 1.612405E+09f), + new NMatrix4x3 (1.102396E+09f, 3.082477E+08f, 1.126484E+09f, 5.022931E+08f, 1.966322E+09f, 1.1814E+09f, 8.464673E+08f, 1.940651E+09f, 1.229937E+09f, 1.367379E+09f, 1.900015E+09f, 1.516109E+09f), + new NMatrix4x3 (2.263112E+08f, 8.79644E+08f, 1.303282E+09f, 1.654159E+09f, 3.705524E+08f, 1.984941E+09f, 2.175935E+07f, 4.633518E+08f, 1.801243E+09f, 1.616996E+09f, 1.620852E+09f, 7291498f), + new NMatrix4x3 (0.4904693f, 0.841727f, 0.2294401f, 0.5736054f, 0.5406881f, 0.2172498f, 0.1261143f, 0.6736677f, 0.4570194f, 0.9091009f, 0.7669608f, 0.8468134f), + new NMatrix4x3 (0.1252193f, 0.08986127f, 0.3407605f, 0.9144857f, 0.340791f, 0.2192288f, 0.5144276f, 0.01813344f, 0.07687104f, 0.7971596f, 0.6393988f, 0.9002907f), + new NMatrix4x3 (8.176959E+08f, 1.386156E+09f, 5.956444E+08f, 4.210506E+08f, 1.212676E+09f, 4.131035E+08f, 1.032453E+09f, 2.074689E+08f, 1.536594E+09f, 3.266183E+07f, 5.222072E+08f, 7.923175E+08f), + new NMatrix4x3 (0.006755914f, 0.07464754f, 0.287938f, 0.3724834f, 0.1496783f, 0.6224982f, 0.7150125f, 0.5554719f, 0.4638171f, 0.4200902f, 0.4867154f, 0.773377f), + }; + + static int counter; + internal static NMatrix4x3 GetTestMatrix () + { + counter++; + if (counter == test_matrices.Length) + counter = 0; + return test_matrices [counter]; + } + } +} diff --git a/tests/monotouch-test/Simd/MatrixFloat4x4Test.cs b/tests/monotouch-test/Simd/MatrixFloat4x4Test.cs new file mode 100644 index 000000000000..f1e66f554031 --- /dev/null +++ b/tests/monotouch-test/Simd/MatrixFloat4x4Test.cs @@ -0,0 +1,348 @@ + +using System; +using System.Diagnostics; + +using Foundation; +using ObjCRuntime; + +using OpenTK; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; + +using NUnit.Framework; + +namespace MonoTouchFixtures.Simd +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class MatrixFloat4x4Test + { + [Test] + public void Identity () + { + var identity = new MatrixFloat4x4 { + M11 = 1f, + M22 = 1f, + M33 = 1f, + M44 = 1f, + }; + Asserts.AreEqual (identity, MatrixFloat4x4.Identity, "identity"); + Asserts.AreEqual (Matrix4.Identity, MatrixFloat4x4.Identity, "opentk identity"); + } + + [Test] + public void RowConstructor () + { + var expected = GetTestMatrix (); + var actual = new MatrixFloat4x4 (expected.Row0, expected.Row1, expected.Row2, expected.Row3); + Asserts.AreEqual (expected, actual, "ctor 1"); + } + + [Test] + public void ElementConstructor () + { + var expected = GetTestMatrix (); + var actual = new MatrixFloat4x4 (expected.M11, expected.M12, expected.M13, expected.M14, + expected.M21, expected.M22, expected.M23, expected.M24, + expected.M31, expected.M32, expected.M33, expected.M34, + expected.M41, expected.M42, expected.M43, expected.M44); + Asserts.AreEqual (expected, actual, "ctor 1"); + + } + + [Test] + public void Determinant () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat4x4) expected; + Assert.AreEqual (expected.Determinant, actual.Determinant, 0.000001f, "determinant\n" + actual); + + } + + [Test] + public void Elements () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat4x4) expected; + + Assert.AreEqual (expected.M11, actual.M11, "m11 getter"); + Assert.AreEqual (expected.M12, actual.M12, "m12 getter"); + Assert.AreEqual (expected.M13, actual.M13, "m13 getter"); + Assert.AreEqual (expected.M14, actual.M14, "m14 getter"); + Assert.AreEqual (expected.M21, actual.M21, "m21 getter"); + Assert.AreEqual (expected.M22, actual.M22, "m22 getter"); + Assert.AreEqual (expected.M23, actual.M23, "m23 getter"); + Assert.AreEqual (expected.M24, actual.M24, "m24 getter"); + Assert.AreEqual (expected.M31, actual.M31, "m31 getter"); + Assert.AreEqual (expected.M32, actual.M32, "m32 getter"); + Assert.AreEqual (expected.M33, actual.M33, "m33 getter"); + Assert.AreEqual (expected.M34, actual.M34, "m34 getter"); + Assert.AreEqual (expected.M41, actual.M41, "m41 getter"); + Assert.AreEqual (expected.M42, actual.M42, "m42 getter"); + Assert.AreEqual (expected.M43, actual.M43, "m43 getter"); + Assert.AreEqual (expected.M44, actual.M44, "m44 getter"); + + var newExpected = GetTestMatrix (); + actual.M11 = newExpected.M11; + actual.M12 = newExpected.M12; + actual.M13 = newExpected.M13; + actual.M14 = newExpected.M14; + actual.M21 = newExpected.M21; + actual.M22 = newExpected.M22; + actual.M23 = newExpected.M23; + actual.M24 = newExpected.M24; + actual.M31 = newExpected.M31; + actual.M32 = newExpected.M32; + actual.M33 = newExpected.M33; + actual.M34 = newExpected.M34; + actual.M41 = newExpected.M41; + actual.M42 = newExpected.M42; + actual.M43 = newExpected.M43; + actual.M44 = newExpected.M44; + Assert.AreEqual (newExpected.M11, actual.M11, "m11 setter"); + Assert.AreEqual (newExpected.M12, actual.M12, "m12 setter"); + Assert.AreEqual (newExpected.M13, actual.M13, "m13 setter"); + Assert.AreEqual (newExpected.M14, actual.M14, "m14 setter"); + Assert.AreEqual (newExpected.M21, actual.M21, "m21 setter"); + Assert.AreEqual (newExpected.M22, actual.M22, "m22 setter"); + Assert.AreEqual (newExpected.M23, actual.M23, "m23 setter"); + Assert.AreEqual (newExpected.M24, actual.M24, "m24 setter"); + Assert.AreEqual (newExpected.M31, actual.M31, "m31 setter"); + Assert.AreEqual (newExpected.M32, actual.M32, "m32 setter"); + Assert.AreEqual (newExpected.M33, actual.M33, "m33 setter"); + Assert.AreEqual (newExpected.M34, actual.M34, "m34 setter"); + Assert.AreEqual (newExpected.M41, actual.M41, "m41 setter"); + Assert.AreEqual (newExpected.M42, actual.M42, "m42 setter"); + Assert.AreEqual (newExpected.M43, actual.M43, "m43 setter"); + Assert.AreEqual (newExpected.M44, actual.M44, "m44 setter"); + } + + [Test] + public void TransposeInstance () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat4x4) expected; + + expected.Transpose (); + actual.Transpose (); + + Asserts.AreEqual (expected, actual, "transpose"); + } + + [Test] + public void TransposeStatic () + { + var input = GetTestMatrix (); + var inputSimd = (MatrixFloat4x4) input; + + var expected = Matrix4.Transpose (input); + var actual = MatrixFloat4x4.Transpose (inputSimd); + + Asserts.AreEqual (expected, actual, "transpose"); + + input = GetTestMatrix (); + inputSimd = (MatrixFloat4x4) input; + Matrix4.Transpose (ref input, out expected); + MatrixFloat4x4.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void TransposeStatic_ByRef () + { + var input = GetTestMatrix (); + var inputSimd = (MatrixFloat4x4) input; + + Matrix4 expected; + MatrixFloat4x4 actual; + + Matrix4.Transpose (ref input, out expected); + MatrixFloat4x4.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void Multiply () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat4x4) inputL; + var inputSimdR = (MatrixFloat4x4) inputR; + var expected = Matrix4.Mult (inputL, inputR); + var actual = MatrixFloat4x4.Multiply (inputSimdL, inputSimdR); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Multiply_ByRef () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat4x4) inputL; + var inputSimdR = (MatrixFloat4x4) inputR; + Matrix4 expected; + MatrixFloat4x4 actual; + + Matrix4.Mult (ref inputL, ref inputR, out expected); + MatrixFloat4x4.Multiply (ref inputSimdL, ref inputSimdR, out actual); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + + [Test] + public void Multiply_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat4x4) inputL; + var inputSimdR = (MatrixFloat4x4) inputR; + var expected = inputL * inputR; + var actual = inputSimdL * inputSimdR; + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Equality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat4x4) inputL; + var inputSimdR = (MatrixFloat4x4) inputR; + + // matrices are different + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "inequality"); + Assert.IsFalse (inputL == inputR, "inequality 2 expected"); + Assert.IsFalse (inputSimdL == inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "equality"); + Assert.IsTrue (inputL == inputR, "equality 2 expected"); + Assert.IsTrue (inputSimdL == inputSimdR, "equality 2 actual"); + + Assert.IsTrue (MatrixFloat4x4.Identity == (MatrixFloat4x4) Matrix4.Identity, "identity equality"); + } + + [Test] + public void Inequality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (MatrixFloat4x4) inputL; + var inputSimdR = (MatrixFloat4x4) inputR; + + // matrices are different + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "inequality"); + Assert.IsTrue (inputL != inputR, "inequality 2 expected"); + Assert.IsTrue (inputSimdL != inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "equality"); + Assert.IsFalse (inputL != inputR, "equality 2 expected"); + Assert.IsFalse (inputSimdL != inputSimdR, "equality 2 actual"); + + Assert.IsFalse (MatrixFloat4x4.Identity != (MatrixFloat4x4) Matrix4.Identity, "identity equality"); + } + + [Test] + public void Explicit_Operator_ToMatrix4 () + { + var expected = (MatrixFloat4x4) GetTestMatrix (); + var actual = (Matrix4) expected; + + Asserts.AreEqual (expected, actual, "tomatrix4"); + + actual = (Matrix4) MatrixFloat4x4.Identity; + Asserts.AreEqual (MatrixFloat4x4.Identity, actual, "tomatrix4 identity"); + Asserts.AreEqual (Matrix4.Identity, actual, "tomatrix4 identity2"); + } + + [Test] + public void Explicit_Operator_FromMatrix4 () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat4x4) expected; + + Asserts.AreEqual (expected, actual, "frommatrix4"); + + actual = (MatrixFloat4x4) Matrix4.Identity; + Asserts.AreEqual (MatrixFloat4x4.Identity, actual, "tomatrix4 identity"); + Asserts.AreEqual (Matrix4.Identity, actual, "tomatrix4 identity2"); + } + + [Test] + public void ToStringTest () + { + var expected = GetTestMatrix (); + var actual = (MatrixFloat4x4) expected; + + Assert.AreEqual (expected.ToString (), actual.ToString (), "tostring"); + } + + // GetHashCode doesn't have to be identical, so no need to test + + [Test] + public void Equals_Object () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (MatrixFloat4x4) expectedA; + var actualB = (MatrixFloat4x4) expectedB; + + Assert.IsTrue (actualA.Equals ((object) actualA), "self"); + Assert.IsFalse (actualA.Equals ((object) actualB), "other"); + Assert.IsFalse (actualA.Equals (null), "null"); + Assert.IsFalse (actualA.Equals (expectedA), "other type"); + } + + [Test] + public void Equals_Matrix () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (MatrixFloat4x4) expectedA; + var actualB = (MatrixFloat4x4) expectedB; + + Assert.IsTrue (actualA.Equals (actualA), "self"); + Assert.IsFalse (actualA.Equals (actualB), "other"); + } + + // A collection of test matrices. + // + // I initially tried randomly generating test matrices, but it turns out + // there are accumulative computational differences in the different algorithms + // between Matrix4 and MatrixFloat4x4. Since the differences are accumulative, + // I couldn't find a minimal sensible delta values when comparing + // matrices. + // + // So I just serialized a few matrices that were randomly generated, and + // these have been tested to not produce accumulative computational differences. + // + static Matrix4 [] test_matrices = new [] { + new Matrix4 (0.1532144f, 0.5451511f, 0.2004739f, 0.8351463f, 0.9884372f, 0.1313103f, 0.3327205f, 0.01164342f, 0.6563147f, 0.7923161f, 0.6764754f, 0.07481737f, 0.03239552f, 0.7156482f, 0.6136858f, 0.1864168f), + new Matrix4 (0.7717745f, 0.559364f, 0.00918373f, 0.6579159f, 0.123461f, 0.9993145f, 0.5487496f, 0.2823398f, 0.9710717f, 0.8750508f, 0.472472f, 0.2608089f, 0.5771761f, 0.5617125f, 0.176998f, 0.1271691f), + new Matrix4 (0.2023053f, 0.4701468f, 0.6618567f, 0.7685714f, 0.8561344f, 0.009231919f, 0.6150167f, 0.7542298f, 0.550727f, 0.3625788f, 0.6639862f, 0.5763468f, 0.9717328f, 0.003812184f, 0.985266f, 0.7540002f), + new Matrix4 (9.799572E+08f, 1.64794E+09f, 1.117296E+09f, 1.239858E+09f, 6.389504E+07f, 1.172175E+09f, 1.399567E+09f, 1.187143E+09f, 3.729208E+07f, 5.50313E+08f, 1.847369E+09f, 1.612405E+09f, 1.699488E+08f, 4.952176E+08f, 1.07262E+09f, 2.035059E+09f), + new Matrix4 (1.102396E+09f, 3.082477E+08f, 1.126484E+09f, 5.022931E+08f, 1.966322E+09f, 1.1814E+09f, 8.464673E+08f, 1.940651E+09f, 1.229937E+09f, 1.367379E+09f, 1.900015E+09f, 1.516109E+09f, 2.146064E+09f, 1.870971E+09f, 1.046267E+09f, 1.088363E+09f), + new Matrix4 (2.263112E+08f, 8.79644E+08f, 1.303282E+09f, 1.654159E+09f, 3.705524E+08f, 1.984941E+09f, 2.175935E+07f, 4.633518E+08f, 1.801243E+09f, 1.616996E+09f, 1.620852E+09f, 7291498f, 1.012728E+09f, 2.834145E+08f, 3.5328E+08f, 1.35012E+09f), + new Matrix4 (0.4904693f, 0.841727f, 0.2294401f, 0.5736054f, 0.5406881f, 0.2172498f, 0.1261143f, 0.6736677f, 0.4570194f, 0.9091009f, 0.7669608f, 0.8468134f, 0.01802658f, 0.3850208f, 0.3730424f, 0.2440258f), + new Matrix4 (0.1252193f, 0.08986127f, 0.3407605f, 0.9144857f, 0.340791f, 0.2192288f, 0.5144276f, 0.01813344f, 0.07687104f, 0.7971596f, 0.6393988f, 0.9002907f, 0.1011457f, 0.5047605f, 0.7202546f, 0.07729452f), + new Matrix4 (8.176959E+08f, 1.386156E+09f, 5.956444E+08f, 4.210506E+08f, 1.212676E+09f, 4.131035E+08f, 1.032453E+09f, 2.074689E+08f, 1.536594E+09f, 3.266183E+07f, 5.222072E+08f, 7.923175E+08f, 1.762531E+09f, 7.901702E+08f, 8.1975E+08f, 1.630734E+09f), + new Matrix4 (0.006755914f, 0.07464754f, 0.287938f, 0.3724834f, 0.1496783f, 0.6224982f, 0.7150125f, 0.5554719f, 0.4638171f, 0.4200902f, 0.4867154f, 0.773377f, 0.3558737f, 0.4043404f, 0.04670618f, 0.7695189f), + }; + + static int counter; + internal static Matrix4 GetTestMatrix () + { + counter++; + if (counter == test_matrices.Length) + counter = 0; + return test_matrices [counter]; + } + } +} diff --git a/tests/monotouch-test/Simd/NMatrix4dTest.cs b/tests/monotouch-test/Simd/NMatrix4dTest.cs new file mode 100644 index 000000000000..58b5aec51d9a --- /dev/null +++ b/tests/monotouch-test/Simd/NMatrix4dTest.cs @@ -0,0 +1,346 @@ + +using System; +using System.Diagnostics; + +using Foundation; +using ObjCRuntime; + +using OpenTK; + +using NUnit.Framework; + +namespace MonoTouchFixtures.Simd { + [TestFixture] + [Preserve (AllMembers = true)] + public class NMatrix4dTest { + + [Test] + public void Identity () + { + var identity = new NMatrix4d { + M11 = 1d, + M22 = 1d, + M33 = 1d, + M44 = 1d, + }; + Asserts.AreEqual (identity, NMatrix4d.Identity, "identity"); + Asserts.AreEqual (Matrix4d.Identity, NMatrix4d.Identity, "opentk identity"); + } + + [Test] + public void RowConstructor () + { + var expected = GetTestMatrix (); + var actual = new NMatrix4d (expected.Row0, expected.Row1, expected.Row2, expected.Row3); + Asserts.AreEqual (expected, actual, "ctor 1"); + } + + [Test] + public void ElementConstructor () + { + var expected = GetTestMatrix (); + var actual = new NMatrix4d (expected.M11, expected.M12, expected.M13, expected.M14, + expected.M21, expected.M22, expected.M23, expected.M24, + expected.M31, expected.M32, expected.M33, expected.M34, + expected.M41, expected.M42, expected.M43, expected.M44); + Asserts.AreEqual (expected, actual, "ctor 1"); + + } + + [Test] + public void Determinant () + { + var expected = GetTestMatrix (); + var actual = (NMatrix4d) expected; + Assert.AreEqual (expected.Determinant, actual.Determinant, 0.000001d, "determinant\n" + actual); + + } + + [Test] + public void Elements () + { + var expected = GetTestMatrix (); + var actual = (NMatrix4d) expected; + + Assert.AreEqual (expected.M11, actual.M11, "m11 getter"); + Assert.AreEqual (expected.M12, actual.M12, "m12 getter"); + Assert.AreEqual (expected.M13, actual.M13, "m13 getter"); + Assert.AreEqual (expected.M14, actual.M14, "m14 getter"); + Assert.AreEqual (expected.M21, actual.M21, "m21 getter"); + Assert.AreEqual (expected.M22, actual.M22, "m22 getter"); + Assert.AreEqual (expected.M23, actual.M23, "m23 getter"); + Assert.AreEqual (expected.M24, actual.M24, "m24 getter"); + Assert.AreEqual (expected.M31, actual.M31, "m31 getter"); + Assert.AreEqual (expected.M32, actual.M32, "m32 getter"); + Assert.AreEqual (expected.M33, actual.M33, "m33 getter"); + Assert.AreEqual (expected.M34, actual.M34, "m34 getter"); + Assert.AreEqual (expected.M41, actual.M41, "m41 getter"); + Assert.AreEqual (expected.M42, actual.M42, "m42 getter"); + Assert.AreEqual (expected.M43, actual.M43, "m43 getter"); + Assert.AreEqual (expected.M44, actual.M44, "m44 getter"); + + var newExpected = GetTestMatrix (); + actual.M11 = newExpected.M11; + actual.M12 = newExpected.M12; + actual.M13 = newExpected.M13; + actual.M14 = newExpected.M14; + actual.M21 = newExpected.M21; + actual.M22 = newExpected.M22; + actual.M23 = newExpected.M23; + actual.M24 = newExpected.M24; + actual.M31 = newExpected.M31; + actual.M32 = newExpected.M32; + actual.M33 = newExpected.M33; + actual.M34 = newExpected.M34; + actual.M41 = newExpected.M41; + actual.M42 = newExpected.M42; + actual.M43 = newExpected.M43; + actual.M44 = newExpected.M44; + Assert.AreEqual (newExpected.M11, actual.M11, "m11 setter"); + Assert.AreEqual (newExpected.M12, actual.M12, "m12 setter"); + Assert.AreEqual (newExpected.M13, actual.M13, "m13 setter"); + Assert.AreEqual (newExpected.M14, actual.M14, "m14 setter"); + Assert.AreEqual (newExpected.M21, actual.M21, "m21 setter"); + Assert.AreEqual (newExpected.M22, actual.M22, "m22 setter"); + Assert.AreEqual (newExpected.M23, actual.M23, "m23 setter"); + Assert.AreEqual (newExpected.M24, actual.M24, "m24 setter"); + Assert.AreEqual (newExpected.M31, actual.M31, "m31 setter"); + Assert.AreEqual (newExpected.M32, actual.M32, "m32 setter"); + Assert.AreEqual (newExpected.M33, actual.M33, "m33 setter"); + Assert.AreEqual (newExpected.M34, actual.M34, "m34 setter"); + Assert.AreEqual (newExpected.M41, actual.M41, "m41 setter"); + Assert.AreEqual (newExpected.M42, actual.M42, "m42 setter"); + Assert.AreEqual (newExpected.M43, actual.M43, "m43 setter"); + Assert.AreEqual (newExpected.M44, actual.M44, "m44 setter"); + } + + [Test] + public void TransposeInstance () + { + var expected = GetTestMatrix (); + var actual = (NMatrix4d) expected; + + expected.Transpose (); + actual.Transpose (); + + Asserts.AreEqual (expected, actual, "transpose"); + } + + [Test] + public void TransposeStatic () + { + var input = GetTestMatrix (); + var inputSimd = (NMatrix4d) input; + + var expected = Matrix4d.Transpose (input); + var actual = NMatrix4d.Transpose (inputSimd); + + Asserts.AreEqual (expected, actual, "transpose"); + + input = GetTestMatrix (); + inputSimd = (NMatrix4d) input; + Matrix4d.Transpose (ref input, out expected); + NMatrix4d.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void TransposeStatic_ByRef () + { + var input = GetTestMatrix (); + var inputSimd = (NMatrix4d) input; + + Matrix4d expected; + NMatrix4d actual; + + Matrix4d.Transpose (ref input, out expected); + NMatrix4d.Transpose (ref inputSimd, out actual); + Asserts.AreEqual (expected, actual, "transpose out/ref"); + } + + [Test] + public void Multiply () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (NMatrix4d) inputL; + var inputSimdR = (NMatrix4d) inputR; + var expected = Matrix4d.Mult (inputL, inputR); + var actual = NMatrix4d.Multiply (inputSimdL, inputSimdR); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Multiply_ByRef () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (NMatrix4d) inputL; + var inputSimdR = (NMatrix4d) inputR; + Matrix4d expected; + NMatrix4d actual; + + Matrix4d.Mult (ref inputL, ref inputR, out expected); + NMatrix4d.Multiply (ref inputSimdL, ref inputSimdR, out actual); + + Asserts.AreEqual (expected, actual, "multiply"); + } + + + [Test] + public void Multiply_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (NMatrix4d) inputL; + var inputSimdR = (NMatrix4d) inputR; + var expected = inputL * inputR; + var actual = inputSimdL * inputSimdR; + + Asserts.AreEqual (expected, actual, "multiply"); + } + + [Test] + public void Equality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (NMatrix4d) inputL; + var inputSimdR = (NMatrix4d) inputR; + + // matrices are different + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "inequality"); + Assert.IsFalse (inputL == inputR, "inequality 2 expected"); + Assert.IsFalse (inputSimdL == inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "equality"); + Assert.IsTrue (inputL == inputR, "equality 2 expected"); + Assert.IsTrue (inputSimdL == inputSimdR, "equality 2 actual"); + + Assert.IsTrue (NMatrix4d.Identity == (NMatrix4d) Matrix4d.Identity, "identity equality"); + } + + [Test] + public void Inequality_Operator () + { + var inputL = GetTestMatrix (); + var inputR = GetTestMatrix (); + var inputSimdL = (NMatrix4d) inputL; + var inputSimdR = (NMatrix4d) inputR; + + // matrices are different + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "inequality"); + Assert.IsTrue (inputL != inputR, "inequality 2 expected"); + Assert.IsTrue (inputSimdL != inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "equality"); + Assert.IsFalse (inputL != inputR, "equality 2 expected"); + Assert.IsFalse (inputSimdL != inputSimdR, "equality 2 actual"); + + Assert.IsFalse (NMatrix4d.Identity != (NMatrix4d) Matrix4d.Identity, "identity equality"); + } + + [Test] + public void Explicit_Operator_ToMatrix4d () + { + var expected = (NMatrix4d) GetTestMatrix (); + var actual = (Matrix4d) expected; + + Asserts.AreEqual (expected, actual, "tomatrix4"); + + actual = (Matrix4d) NMatrix4d.Identity; + Asserts.AreEqual (NMatrix4d.Identity, actual, "tomatrix4 identity"); + Asserts.AreEqual (Matrix4d.Identity, actual, "tomatrix4 identity2"); + } + + [Test] + public void Explicit_Operator_FromMatrix4d () + { + var expected = GetTestMatrix (); + var actual = (NMatrix4d) expected; + + Asserts.AreEqual (expected, actual, "frommatrix4"); + + actual = (NMatrix4d) Matrix4d.Identity; + Asserts.AreEqual (NMatrix4d.Identity, actual, "tomatrix4 identity"); + Asserts.AreEqual (Matrix4d.Identity, actual, "tomatrix4 identity2"); + } + + [Test] + public void ToStringTest () + { + var expected = GetTestMatrix (); + var actual = (NMatrix4d) expected; + + Assert.AreEqual (expected.ToString (), actual.ToString (), "tostring"); + } + + // GetHashCode doesn't have to be identical, so no need to test + + [Test] + public void Equals_Object () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (NMatrix4d) expectedA; + var actualB = (NMatrix4d) expectedB; + + Assert.IsTrue (actualA.Equals ((object) actualA), "self"); + Assert.IsFalse (actualA.Equals ((object) actualB), "other"); + Assert.IsFalse (actualA.Equals (null), "null"); + Assert.IsFalse (actualA.Equals (expectedA), "other type"); + } + + [Test] + public void Equals_Matrix () + { + var expectedA = GetTestMatrix (); + var expectedB = GetTestMatrix (); + var actualA = (NMatrix4d) expectedA; + var actualB = (NMatrix4d) expectedB; + + Assert.IsTrue (actualA.Equals (actualA), "self"); + Assert.IsFalse (actualA.Equals (actualB), "other"); + } + + // A collection of test matrices. + // + // I initially tried randomly generating test matrices, but it turns out + // there are accumulative computational differences in the different algorithms + // between Matrix4d and NMatrix4d. Since the differences are accumulative, + // I couldn't find a minimal sensible delta values when comparing + // matrices. + // + // So I just serialized a few matrices that were randomly generated, and + // these have been tested to not produce accumulative computational differences. + // + static Matrix4d [] test_matrices = new [] { + new Matrix4d (0.1532144d, 0.5451511d, 0.2004739d, 0.8351463d, 0.9884372d, 0.1313103d, 0.3327205d, 0.01164342d, 0.6563147d, 0.7923161d, 0.6764754d, 0.07481737d, 0.03239552d, 0.7156482d, 0.6136858d, 0.1864168f), + new Matrix4d (0.7717745d, 0.559364d, 0.00918373d, 0.6579159d, 0.123461d, 0.9993145d, 0.5487496d, 0.2823398d, 0.9710717d, 0.8750508d, 0.472472d, 0.2608089d, 0.5771761d, 0.5617125d, 0.176998d, 0.1271691f), + new Matrix4d (0.2023053d, 0.4701468d, 0.6618567d, 0.7685714d, 0.8561344d, 0.009231919d, 0.6150167d, 0.7542298d, 0.550727d, 0.3625788d, 0.6639862d, 0.5763468d, 0.9717328d, 0.003812184d, 0.985266d, 0.7540002f), + new Matrix4d (9.799572E+08d, 1.64794E+09d, 1.117296E+09d, 1.239858E+09d, 6.389504E+07d, 1.172175E+09d, 1.399567E+09d, 1.187143E+09d, 3.729208E+07d, 5.50313E+08d, 1.847369E+09d, 1.612405E+09d, 1.699488E+08d, 4.952176E+08d, 1.07262E+09d, 2.035059E+09f), + new Matrix4d (1.102396E+09d, 3.082477E+08d, 1.126484E+09d, 5.022931E+08d, 1.966322E+09d, 1.1814E+09d, 8.464673E+08d, 1.940651E+09d, 1.229937E+09d, 1.367379E+09d, 1.900015E+09d, 1.516109E+09d, 2.146064E+09d, 1.870971E+09d, 1.046267E+09d, 1.088363E+09f), + new Matrix4d (2.263112E+08d, 8.79644E+08d, 1.303282E+09d, 1.654159E+09d, 3.705524E+08d, 1.984941E+09d, 2.175935E+07d, 4.633518E+08d, 1.801243E+09d, 1.616996E+09d, 1.620852E+09d, 7291498d, 1.012728E+09d, 2.834145E+08d, 3.5328E+08d, 1.35012E+09f), + new Matrix4d (0.4904693d, 0.841727d, 0.2294401d, 0.5736054d, 0.5406881d, 0.2172498d, 0.1261143d, 0.6736677d, 0.4570194d, 0.9091009d, 0.7669608d, 0.8468134d, 0.01802658d, 0.3850208d, 0.3730424d, 0.2440258f), + new Matrix4d (0.1252193d, 0.08986127d, 0.3407605d, 0.9144857d, 0.340791d, 0.2192288d, 0.5144276d, 0.01813344d, 0.07687104d, 0.7971596d, 0.6393988d, 0.9002907d, 0.1011457d, 0.5047605d, 0.7202546d, 0.07729452f), + new Matrix4d (8.176959E+08d, 1.386156E+09d, 5.956444E+08d, 4.210506E+08d, 1.212676E+09d, 4.131035E+08d, 1.032453E+09d, 2.074689E+08d, 1.536594E+09d, 3.266183E+07d, 5.222072E+08d, 7.923175E+08d, 1.762531E+09d, 7.901702E+08d, 8.1975E+08d, 1.630734E+09f), + new Matrix4d (0.006755914d, 0.07464754d, 0.287938d, 0.3724834d, 0.1496783d, 0.6224982d, 0.7150125d, 0.5554719d, 0.4638171d, 0.4200902d, 0.4867154d, 0.773377d, 0.3558737d, 0.4043404d, 0.04670618d, 0.7695189d), + }; + + static int counter; + internal static Matrix4d GetTestMatrix () + { + counter++; + if (counter == test_matrices.Length) + counter = 0; + return test_matrices [counter]; + } + } +} diff --git a/tests/monotouch-test/Simd/NVector3dTest.cs b/tests/monotouch-test/Simd/NVector3dTest.cs new file mode 100644 index 000000000000..3f36a2e85c0b --- /dev/null +++ b/tests/monotouch-test/Simd/NVector3dTest.cs @@ -0,0 +1,143 @@ + +using System; +using System.Diagnostics; + +using Foundation; +using ObjCRuntime; + +using OpenTK; + +using NUnit.Framework; + +namespace MonoTouchFixtures.Simd { + [TestFixture] + [Preserve (AllMembers = true)] + public class NVector3dTest { + + [Test] + public void ElementConstructor () + { + var expected = GetTestVector (); + var actual = new NVector3d (expected.X, expected.Y, expected.Z); + Asserts.AreEqual (expected, actual, "ctor 1"); + } + + [Test] + public void Equality_Operator () + { + var inputL = GetTestVector (); + var inputR = GetTestVector (); + var inputSimdL = (NVector3d) inputL; + var inputSimdR = (NVector3d) inputR; + + // matrices are different + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "inequality"); + Assert.IsFalse (inputL == inputR, "inequality 2 expected"); + Assert.IsFalse (inputSimdL == inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "equality"); + Assert.IsTrue (inputL == inputR, "equality 2 expected"); + Assert.IsTrue (inputSimdL == inputSimdR, "equality 2 actual"); + } + + [Test] + public void Inequality_Operator () + { + var inputL = GetTestVector (); + var inputR = GetTestVector (); + var inputSimdL = (NVector3d) inputL; + var inputSimdR = (NVector3d) inputR; + + // matrices are different + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "inequality"); + Assert.IsTrue (inputL != inputR, "inequality 2 expected"); + Assert.IsTrue (inputSimdL != inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "equality"); + Assert.IsFalse (inputL != inputR, "equality 2 expected"); + Assert.IsFalse (inputSimdL != inputSimdR, "equality 2 actual"); + } + + [Test] + public void Explicit_Operator_ToVector3 () + { + var expected = GetTestVector (); + var actual = (Vector3d) expected; + + Asserts.AreEqual (expected, actual, "ToVector3d"); + } + + [Test] + public void Explicit_Operator_FromVector3 () + { + var expected = new Vector3d (2, 3, 7.7d); + var actual = (NVector3d) expected; + + Asserts.AreEqual (expected, actual, "FromVector3d"); + } + + [Test] + public void ToStringTest () + { + var vector = new NVector3d (1, 2, 3); + + Assert.AreEqual ("(1, 2, 3)", vector.ToString (), "tostring"); + } + + // GetHashCode doesn't have to be identical, so no need to test + + [Test] + public void Equals_Object () + { + var expectedA = GetTestVector (); + var expectedB = GetTestVector (); + var actualA = (NVector3d) expectedA; + var actualB = (NVector3d) expectedB; + + Assert.IsTrue (actualA.Equals ((object) actualA), "self"); + Assert.IsFalse (actualA.Equals ((object) actualB), "other"); + Assert.IsFalse (actualA.Equals (null), "null"); + Assert.IsTrue (actualA.Equals (expectedA), "same type"); + } + + [Test] + public void Equals_Vector () + { + var expectedA = GetTestVector (); + var expectedB = GetTestVector (); + var actualA = (NVector3d) expectedA; + var actualB = (NVector3d) expectedB; + + Assert.IsTrue (actualA.Equals (actualA), "self"); + Assert.IsFalse (actualA.Equals (actualB), "other"); + } + + static NVector3d [] test_vectors = new [] { + new NVector3d (0.1532144d, 0.5451511d, 0.2004739d), + new NVector3d (0.7717745d, 0.559364d, 0.00918373d), + new NVector3d (0.2023053d, 0.4701468d, 0.6618567d), + new NVector3d (0.4904693d, 0.841727d, 0.2294401d), + new NVector3d (0.1252193d, 0.08986127d, 0.3407605d), + new NVector3d (0.006755914d, 0.07464754d, 0.287938d), + new NVector3d (9.799572E+08d, 1.64794E+09d, 1.117296E+09d), + new NVector3d (1.102396E+09d, 3.082477E+08d, 1.126484E+09d), + new NVector3d (2.263112E+08d, 8.79644E+08d, 1.303282E+09d), + new NVector3d (8.176959E+08d, 1.386156E+09d, 5.956444E+08d), + }; + + static int counter; + internal static NVector3d GetTestVector () + { + counter++; + if (counter == test_vectors.Length) + counter = 0; + return test_vectors [counter]; + } + } +} diff --git a/tests/monotouch-test/Simd/VectorFloat3Test.cs b/tests/monotouch-test/Simd/VectorFloat3Test.cs new file mode 100644 index 000000000000..9b1b99cbcb33 --- /dev/null +++ b/tests/monotouch-test/Simd/VectorFloat3Test.cs @@ -0,0 +1,145 @@ + +using System; +using System.Diagnostics; + +using Foundation; +using ObjCRuntime; + +using OpenTK; +using VectorFloat3 = global::OpenTK.NVector3; + +using NUnit.Framework; + +namespace MonoTouchFixtures.Simd +{ + [TestFixture] + [Preserve (AllMembers = true)] + public class VectorFloat3Test + { + [Test] + public void ElementConstructor () + { + var expected = GetTestVector (); + var actual = new VectorFloat3 (expected.X, expected.Y, expected.Z); + Asserts.AreEqual (expected, actual, "ctor 1"); + } + + [Test] + public void Equality_Operator () + { + var inputL = GetTestVector (); + var inputR = GetTestVector (); + var inputSimdL = (VectorFloat3) inputL; + var inputSimdR = (VectorFloat3) inputR; + + // matrices are different + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "inequality"); + Assert.IsFalse (inputL == inputR, "inequality 2 expected"); + Assert.IsFalse (inputSimdL == inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL == inputR, inputSimdL == inputSimdR, "equality"); + Assert.IsTrue (inputL == inputR, "equality 2 expected"); + Assert.IsTrue (inputSimdL == inputSimdR, "equality 2 actual"); + } + + [Test] + public void Inequality_Operator () + { + var inputL = GetTestVector (); + var inputR = GetTestVector (); + var inputSimdL = (VectorFloat3) inputL; + var inputSimdR = (VectorFloat3) inputR; + + // matrices are different + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "inequality"); + Assert.IsTrue (inputL != inputR, "inequality 2 expected"); + Assert.IsTrue (inputSimdL != inputSimdR, "inequality 2 actual"); + + inputL = inputR; + inputSimdL = inputSimdR; + // matrices are identical + Assert.AreEqual (inputL != inputR, inputSimdL != inputSimdR, "equality"); + Assert.IsFalse (inputL != inputR, "equality 2 expected"); + Assert.IsFalse (inputSimdL != inputSimdR, "equality 2 actual"); + } + + [Test] + public void Explicit_Operator_ToVector3 () + { + var expected = GetTestVector (); + var actual = (Vector3) expected; + + Asserts.AreEqual (expected, actual, "ToVector3"); + } + + [Test] + public void Explicit_Operator_FromVector3 () + { + var expected = new Vector3 (2, 3, 7.7f); + var actual = (VectorFloat3) expected; + + Asserts.AreEqual (expected, actual, "FromVector3"); + } + + [Test] + public void ToStringTest () + { + var vector = new VectorFloat3 (1, 2, 3); + + Assert.AreEqual ("(1, 2, 3)", vector.ToString (), "tostring"); + } + + // GetHashCode doesn't have to be identical, so no need to test + + [Test] + public void Equals_Object () + { + var expectedA = GetTestVector (); + var expectedB = GetTestVector (); + var actualA = (VectorFloat3) expectedA; + var actualB = (VectorFloat3) expectedB; + + Assert.IsTrue (actualA.Equals ((object) actualA), "self"); + Assert.IsFalse (actualA.Equals ((object) actualB), "other"); + Assert.IsFalse (actualA.Equals (null), "null"); + Assert.IsTrue (actualA.Equals (expectedA), "same type"); + } + + [Test] + public void Equals_Vector () + { + var expectedA = GetTestVector (); + var expectedB = GetTestVector (); + var actualA = (VectorFloat3) expectedA; + var actualB = (VectorFloat3) expectedB; + + Assert.IsTrue (actualA.Equals (actualA), "self"); + Assert.IsFalse (actualA.Equals (actualB), "other"); + } + + static VectorFloat3 [] test_vectors = new [] { + new VectorFloat3 (0.1532144f, 0.5451511f, 0.2004739f), + new VectorFloat3 (0.7717745f, 0.559364f, 0.00918373f), + new VectorFloat3 (0.2023053f, 0.4701468f, 0.6618567f), + new VectorFloat3 (0.4904693f, 0.841727f, 0.2294401f), + new VectorFloat3 (0.1252193f, 0.08986127f, 0.3407605f), + new VectorFloat3 (0.006755914f, 0.07464754f, 0.287938f), + new VectorFloat3 (9.799572E+08f, 1.64794E+09f, 1.117296E+09f), + new VectorFloat3 (1.102396E+09f, 3.082477E+08f, 1.126484E+09f), + new VectorFloat3 (2.263112E+08f, 8.79644E+08f, 1.303282E+09f), + new VectorFloat3 (8.176959E+08f, 1.386156E+09f, 5.956444E+08f), + }; + + static int counter; + internal static VectorFloat3 GetTestVector () + { + counter++; + if (counter == test_vectors.Length) + counter = 0; + return test_vectors [counter]; + } + } +} diff --git a/tests/monotouch-test/SpriteKit/SKTransformNodeTest.cs b/tests/monotouch-test/SpriteKit/SKTransformNodeTest.cs new file mode 100644 index 000000000000..8b69dc8f8b29 --- /dev/null +++ b/tests/monotouch-test/SpriteKit/SKTransformNodeTest.cs @@ -0,0 +1,100 @@ +#if !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using Foundation; +#if !MONOMAC +using UIKit; +#endif +using SpriteKit; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +using MonoTouch.SpriteKit; +using MonoTouch.UIKit; +using MonoTouch.ObjCRuntime; +#endif +using OpenTK; + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + +using Bindings.Test; +using NUnit.Framework; + +namespace MonoTouchFixtures.SpriteKit { + + [TestFixture] + [Preserve (AllMembers = true)] + public class SKTransformNodeTest { + [SetUp] + public void VersionCheck () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void EulerAngles () + { + VectorFloat3 V3 = new VectorFloat3 (); + + using (var obj = new SKTransformNode ()) { + Asserts.AreEqual (V3, obj.EulerAngles, "1 EulerAngles"); + V3 = new VectorFloat3 (1, 2, 3); + obj.EulerAngles = V3; + // The values bellow match what the same code in Swift returns. + Assert.AreEqual (-2.14159298f, obj.EulerAngles.X, "#x1"); + Assert.AreEqual (1.14159274f, obj.EulerAngles.Y, "#y1"); + Assert.AreEqual (-0.141592711f, obj.EulerAngles.Z, "#z1"); + } + } + + [Test] + public void RotationMatrix () + { + using (var obj = new SKTransformNode ()) { + var zero = new MatrixFloat3x3 (); + obj.RotationMatrix = zero; + // In Swift, a rotated zero matrice also becomes the identity matrice. + Asserts.AreEqual (MatrixFloat3x3.Identity, obj.RotationMatrix, "RotationMatrix"); + // Changing XRotation (or YRotation for that matter), makes the RotationMatrix change too + obj.XRotation = (nfloat) (Math.PI / 2); + var rotatedMatrix = new MatrixFloat3x3 ( + 1, 0, 0, + 0, 0, -1, + 0, 1, 0 + ); + Asserts.AreEqual (rotatedMatrix, obj.RotationMatrix, 0.000001f, "RotationMatrix a"); + Asserts.AreEqual (rotatedMatrix, CFunctions.GetMatrixFloat3x3 (obj, "rotationMatrix"), 0.000001f, "RotationMatrix native a"); + + // Got this matrix after setting both XRotation and YRotation to Pi/2 + rotatedMatrix = new MatrixFloat3x3 ( + 0, 1, 0, + 0, 0, -1, + -1, 0, 0 + ); + obj.RotationMatrix = rotatedMatrix; + Asserts.AreEqual (rotatedMatrix, obj.RotationMatrix, 0.000001f, "RotationMatrix b"); + Assert.AreEqual ((nfloat) (Math.PI / 2), obj.XRotation, 0.000001f, "XRotation b"); + Assert.AreEqual (0, obj.YRotation, 0.000001f, "YRotation b"); // Setting YRotation changes RotationMatrix, but setting RotationMatrix doesn't change YRotation. + } + } + + [Test] + public void QuaternionTest () + { + Quaternion Q; + + using (var obj = new SKTransformNode ()) { + Asserts.AreEqual (Quaternion.Identity, obj.Quaternion, "1 Quaternion"); + Q = new Quaternion (new Vector3 (1, 2, 3), 4); + obj.Quaternion = Q; + Asserts.AreEqual (Q, obj.Quaternion, "2 Quaternion"); + } + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/monotouch-test/SpriteKit/UniformTest.cs b/tests/monotouch-test/SpriteKit/UniformTest.cs index 8918e56a2765..b82ac1d41736 100644 --- a/tests/monotouch-test/SpriteKit/UniformTest.cs +++ b/tests/monotouch-test/SpriteKit/UniformTest.cs @@ -15,7 +15,16 @@ using MonoTouch.ObjCRuntime; #endif using OpenTK; + +using MatrixFloat2x2 = global::OpenTK.NMatrix2; +using MatrixFloat3x3 = global::OpenTK.NMatrix3; +using MatrixFloat4x4 = global::OpenTK.NMatrix4; +using VectorFloat3 = global::OpenTK.NVector3; + using NUnit.Framework; +#if !TEST_BINDINGS_UNAVAILABLE +using Bindings.Test; +#endif namespace MonoTouchFixtures.SpriteKit { @@ -76,6 +85,9 @@ public void Ctors () Matrix2 M2; Matrix3 M3; Matrix4 M4; + MatrixFloat2x2 M2x2; + MatrixFloat3x3 M3x3; + MatrixFloat4x4 M4x4; using (var obj = new SKUniform ("name")) { var M4Zero = new Matrix4 (Vector4.Zero, Vector4.Zero, Vector4.Zero, Vector4.Zero); @@ -97,6 +109,9 @@ public void Ctors () M2 = new Matrix2 (1, 2, 3, 4); M3 = new Matrix3 (1, 2, 3, 4, 5, 6, 7, 8, 9); M4 = new Matrix4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + M2x2 = (MatrixFloat2x2) M2; + M3x3 = (MatrixFloat3x3) M3; + M4x4 = (MatrixFloat4x4) M4; obj.TextureValue = texture; Assert.AreEqual (texture, obj.TextureValue, "2 TextureValue"); @@ -123,6 +138,7 @@ public void Ctors () Asserts.AreEqual (M4, obj.FloatMatrix4Value, "2 FloatMatrix4Value"); } + bool hasSimdConstructors = TestRuntime.CheckXcodeVersion (8, 0); using (var obj = new SKUniform ("name", texture)) { Assert.AreEqual (texture, obj.TextureValue, "3 TextureValue"); } @@ -145,14 +161,109 @@ public void Ctors () using (var obj = new SKUniform ("name", M2)) { Asserts.AreEqual (M2, obj.FloatMatrix2Value, "8 FloatMatrix2Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M2, MatrixFloat2x2.Transpose (CFunctions.GetMatrixFloat2x2 (obj, "matrixFloat2x2Value")), "8b FloatMatrix2Value"); +#endif } using (var obj = new SKUniform ("name", M3)) { Asserts.AreEqual (M3, obj.FloatMatrix3Value, "9 FloatMatrix3Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M3, MatrixFloat3x3.Transpose (CFunctions.GetMatrixFloat3x3 (obj, "matrixFloat3x3Value")), "9b FloatMatrix3Value"); +#endif } using (var obj = new SKUniform ("name", M4)) { Asserts.AreEqual (M4, obj.FloatMatrix4Value, "10 FloatMatrix4Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M4, MatrixFloat4x4.Transpose (CFunctions.GetMatrixFloat4x4 (obj, "matrixFloat4x4Value")), "10b FloatMatrix4Value"); +#endif + } + + using (var obj = new SKUniform ("name", M2x2)) { + Asserts.AreEqual (M2x2, obj.MatrixFloat2x2Value, "11 MatrixFloat2x2Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M2x2, CFunctions.GetMatrixFloat2x2 (obj, "matrixFloat2x2Value"), "11b MatrixFloat2x2Value"); +#endif + var tmp2 = new MatrixFloat2x2 (9, 8, 7, 6); + obj.MatrixFloat2x2Value = tmp2; + Asserts.AreEqual (tmp2, obj.MatrixFloat2x2Value, "11 MatrixFloat2x2Value second"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (tmp2, CFunctions.GetMatrixFloat2x2 (obj, "matrixFloat2x2Value"), "11b MatrixFloat2x2Value second"); +#endif + } + + using (var obj = new SKUniform ("name", M3x3)) { + Asserts.AreEqual (M3x3, obj.MatrixFloat3x3Value, "12 MatrixFloat3x3Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M3x3, CFunctions.GetMatrixFloat3x3 (obj, "matrixFloat3x3Value"), "12b MatrixFloat3x3Value"); +#endif + var tmp3 = new MatrixFloat3x3 (9, 8, 7, 6, 5, 4, 3, 2, 1); + obj.MatrixFloat3x3Value = tmp3; + Asserts.AreEqual (tmp3, obj.MatrixFloat3x3Value, "12 MatrixFloat3x3Value second"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (tmp3, CFunctions.GetMatrixFloat3x3 (obj, "matrixFloat3x3Value"), "12b MatrixFloat3x3Value second"); +#endif + } + + using (var obj = new SKUniform ("name", M4x4)) { + Asserts.AreEqual (M4x4, obj.MatrixFloat4x4Value, "13 MatrixFloat4x4Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M4x4, CFunctions.GetMatrixFloat4x4 (obj, "matrixFloat4x4Value"), "13b FloatMatrix4Value"); +#endif + var tmp4 = new MatrixFloat4x4 (9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6); + obj.MatrixFloat4x4Value = tmp4; + Asserts.AreEqual (tmp4, obj.MatrixFloat4x4Value, "13 MatrixFloat4x4Value second"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (tmp4, CFunctions.GetMatrixFloat4x4 (obj, "matrixFloat4x4Value"), "13b MatrixFloat4x4Value second"); +#endif + } + } + + [Test] + public void Create () + { + var M2x2 = new MatrixFloat2x2 (1, 2, 3, 4); + var M3x3 = new MatrixFloat3x3 (1, 2, 3, 4, 5, 6, 7, 8, 9); + var M4x4 = new MatrixFloat4x4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + + using (var obj = SKUniform.Create ("name", M2x2)) { + Asserts.AreEqual (M2x2, obj.MatrixFloat2x2Value, "11 MatrixFloat2x2Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M2x2, CFunctions.GetMatrixFloat2x2 (obj, "matrixFloat2x2Value"), "11b MatrixFloat2x2Value"); +#endif + var tmp2 = new MatrixFloat2x2 (9, 8, 7, 6); + obj.MatrixFloat2x2Value = tmp2; + Asserts.AreEqual (tmp2, obj.MatrixFloat2x2Value, "11 MatrixFloat2x2Value second"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (tmp2, CFunctions.GetMatrixFloat2x2 (obj, "matrixFloat2x2Value"), "11b MatrixFloat2x2Value second"); +#endif + } + + using (var obj = SKUniform.Create ("name", M3x3)) { + Asserts.AreEqual (M3x3, obj.MatrixFloat3x3Value, "12 MatrixFloat3x3Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M3x3, CFunctions.GetMatrixFloat3x3 (obj, "matrixFloat3x3Value"), "12b MatrixFloat3x3Value"); +#endif + var tmp3 = new MatrixFloat3x3 (9, 8, 7, 6, 5, 4, 3, 2, 1); + obj.MatrixFloat3x3Value = tmp3; + Asserts.AreEqual (tmp3, obj.MatrixFloat3x3Value, "12 MatrixFloat3x3Value second"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (tmp3, CFunctions.GetMatrixFloat3x3 (obj, "matrixFloat3x3Value"), "12b MatrixFloat3x3Value second"); +#endif + } + + using (var obj = SKUniform.Create ("name", M4x4)) { + Asserts.AreEqual (M4x4, obj.MatrixFloat4x4Value, "13 MatrixFloat4x4Value"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (M4x4, CFunctions.GetMatrixFloat4x4 (obj, "matrixFloat4x4Value"), "13b FloatMatrix4Value"); +#endif + var tmp4 = new MatrixFloat4x4 (9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6); + obj.MatrixFloat4x4Value = tmp4; + Asserts.AreEqual (tmp4, obj.MatrixFloat4x4Value, "13 MatrixFloat4x4Value second"); +#if !TEST_BINDINGS_UNAVAILABLE + Asserts.AreEqual (tmp4, CFunctions.GetMatrixFloat4x4 (obj, "matrixFloat4x4Value"), "13b MatrixFloat4x4Value second"); +#endif } } } diff --git a/tests/monotouch-test/System.Net.Http/MessageHandlers.cs b/tests/monotouch-test/System.Net.Http/MessageHandlers.cs index 4984379176de..23bf9b8b934d 100644 --- a/tests/monotouch-test/System.Net.Http/MessageHandlers.cs +++ b/tests/monotouch-test/System.Net.Http/MessageHandlers.cs @@ -22,6 +22,15 @@ namespace MonoTests.System.Net.Http [TestFixture] public class MessageHandlerTest { + void PrintHandlerToTest () + { +#if !__WATCHOS__ + Console.WriteLine (new HttpClientHandler ()); + Console.WriteLine (new CFNetworkHandler ()); +#endif + Console.WriteLine (new NSUrlSessionHandler ()); + } + HttpMessageHandler GetHandler (Type handler_type) { return (HttpMessageHandler) Activator.CreateInstance (handler_type); @@ -35,6 +44,8 @@ HttpMessageHandler GetHandler (Type handler_type) [TestCase (typeof (NSUrlSessionHandler))] public void DnsFailure (Type handlerType) { + PrintHandlerToTest (); + bool done = false; Exception ex = null; @@ -51,6 +62,7 @@ public void DnsFailure (Type handlerType) }, () => done); Assert.IsNotNull (ex, "Exception"); - // The handlers throw different types of exceptions, so we can't assert much more than that something went wrong. + // The handlers throw different types of exceptions, so we can't assert much more than that something went wrong. } + }} diff --git a/tests/monotouch-test/UIKit/DirectionalEdgeInsetsTest.cs b/tests/monotouch-test/UIKit/DirectionalEdgeInsetsTest.cs new file mode 100644 index 000000000000..07ba7e38d9ed --- /dev/null +++ b/tests/monotouch-test/UIKit/DirectionalEdgeInsetsTest.cs @@ -0,0 +1,59 @@ +// +// Unit tests for NSDirectionalEdgeInsets +// +// Authors: +// Vincent Dondain +// +// Copyright 2017 Microsoft. All rights reserved. +// + +#if XAMCORE_2_0 + +using System; +using System.Drawing; +using Foundation; +using UIKit; +using NUnit.Framework; + +namespace MonoTouchFixtures.UIKit { + + [TestFixture] + [Preserve (AllMembers = true)] + public class DirectionalEdgeInsetsTest { + + [SetUp] + public void SetUp () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void FromString_Null () + { + var e = NSDirectionalEdgeInsets.FromString (null); + Assert.That (e, Is.EqualTo (NSDirectionalEdgeInsets.Zero), "roundtrip"); + } + + [Test] + public void ToFromString_Zero () + { + string s = NSDirectionalEdgeInsets.Zero.ToString (); + var e = NSDirectionalEdgeInsets.FromString (s); + Assert.That (e, Is.EqualTo (NSDirectionalEdgeInsets.Zero), "roundtrip"); + } + + [Test] + public void Operators () + { + var i1 = new NSDirectionalEdgeInsets (10, 20, 30, 40); + var i2 = new NSDirectionalEdgeInsets (10, 10, 10, 10); + + Assert.True (i1 == i1, "i1 == i1"); + Assert.True (i2 == i2, "i1 == i1"); + Assert.True (i1 != i2, "i1 != i2"); + Assert.True (i2 != i1, "i2 != i1"); + } + } +} + +#endif // XAMCORE_2_0 \ No newline at end of file diff --git a/tests/monotouch-test/UIKit/NibTest.cs b/tests/monotouch-test/UIKit/NibTest.cs index 69ed5b58061c..7126cf7bf3e3 100644 --- a/tests/monotouch-test/UIKit/NibTest.cs +++ b/tests/monotouch-test/UIKit/NibTest.cs @@ -39,6 +39,7 @@ public void FromName_DoesNotExists () } } +#if false // Disabling for now due to Xcode 9 does not support nibs if deployment target == 6.0 [Test] public void FromName () { @@ -71,6 +72,7 @@ public void FromData () Assert.That (result2.Length, Is.EqualTo (0), "Instantiate"); } } +#endif } } diff --git a/tests/monotouch-test/UIKit/TabBarControllerTest.cs b/tests/monotouch-test/UIKit/TabBarControllerTest.cs index ac2fea9d5382..83bb573ffd0c 100644 --- a/tests/monotouch-test/UIKit/TabBarControllerTest.cs +++ b/tests/monotouch-test/UIKit/TabBarControllerTest.cs @@ -57,6 +57,7 @@ public void Ctor_Defaults () } } +#if false // Disabling for now due to Xcode 9 does not support nibs if deployment target == 6.0 [Test] public void Ctor_Nib () { @@ -66,6 +67,7 @@ public void Ctor_Nib () CheckDefault (c); } } +#endif } } diff --git a/tests/monotouch-test/UIKit/TextFieldTest.cs b/tests/monotouch-test/UIKit/TextFieldTest.cs index d363bd01516d..03e5bc8941f9 100644 --- a/tests/monotouch-test/UIKit/TextFieldTest.cs +++ b/tests/monotouch-test/UIKit/TextFieldTest.cs @@ -7,9 +7,11 @@ #if XAMCORE_2_0 using Foundation; using UIKit; +using CoreGraphics; #else using MonoTouch.Foundation; using MonoTouch.UIKit; +using MonoTouch.CoreGraphics; #endif using NUnit.Framework; @@ -54,7 +56,11 @@ public void InputAccessoryViewTest () public void EmptySelection () { using (var tf = new UITextField ()) { - Assert.IsNull (tf.SelectedTextRange, "SelectedTextRange"); + if (TestRuntime.CheckXcodeVersion (9, 0)) { + Assert.IsNotNull (tf.SelectedTextRange, "SelectedTextRange 1"); + } else { + Assert.IsNull (tf.SelectedTextRange, "SelectedTextRange"); + } if (TestRuntime.CheckSystemAndSDKVersion (6,0)) { Assert.IsNull (tf.TypingAttributes, "default"); // ^ calling TypingAttributes does not crash like UITextView does, it simply returns null @@ -83,7 +89,15 @@ public void GetCaretRectForPositiont_Null () // https://bugzilla.xamarin.com/show_bug.cgi?id=20572 using (UITextField tf = new UITextField ()) { var rect = tf.GetCaretRectForPosition (null); - Assert.True (rect.IsEmpty, "IsEmpty"); + if (TestRuntime.CheckXcodeVersion (9, 0)) { +#if __TVOS__ + Assert.AreEqual (new CGRect (0, -24, 2, 19), rect, "IsEmpty"); +#else + Assert.AreEqual (new CGRect (0, -12, 2, 18.5), rect, "IsEmpty"); +#endif + } else { + Assert.AreEqual (CGRect.Empty, rect, "IsEmpty"); + } } } diff --git a/tests/monotouch-test/UIKit/UIDragDropSessionExtensionsTest.cs b/tests/monotouch-test/UIKit/UIDragDropSessionExtensionsTest.cs new file mode 100644 index 000000000000..226c21c0dbef --- /dev/null +++ b/tests/monotouch-test/UIKit/UIDragDropSessionExtensionsTest.cs @@ -0,0 +1,79 @@ +// +// Unit tests for UIDragDropSessionExtensionsTest +// +// Authors: +// Vincent Dondain +// +// +// Copyright 2017 Microsoft. +// + +#if !__TVOS__ && !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +using ObjCRuntime; +using UIKit; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +namespace MonoTouchFixtures.UIKit { + [TestFixture] + [Preserve (AllMembers = true)] + public class UIDragDropSessionExtensionsTest { + + [Test] + public void LoadObjectsTest () + { + if (!TestRuntime.CheckXcodeVersion (9,0)) + Assert.Ignore ("Ignoring tests: Requires iOS11+"); + + var test = new DropSession (); + test.CanLoadObjects (typeof (UIImage)); + test.LoadObjects (null); + } + } + + class DropSession : NSObject, IUIDropSession { + public IUIDragSession LocalDragSession => throw new NotImplementedException (); + + public UIDropSessionProgressIndicatorStyle ProgressIndicatorStyle { get => throw new NotImplementedException (); set => throw new NotImplementedException (); } + + public UIDragItem [] Items => throw new NotImplementedException (); + + public bool AllowsMoveOperation => throw new NotImplementedException (); + + public bool RestrictedToDraggingApplication => throw new NotImplementedException (); + + public bool CanLoadObjects (Class itemProviderReadingClass) + { + Assert.That (itemProviderReadingClass.Handle, Is.EqualTo (new Class (typeof (UIImage)).Handle), "UIDragDropSessionExtensionsTest did not convert the type properly for 'CanLoadObjects'."); + return true; + } + + public bool HasConformingItems (string [] typeIdentifiers) + { + throw new NotImplementedException (); + } + + public NSProgress LoadObjects (Class itemProviderReadingClass, Action completion) + { + Assert.That (itemProviderReadingClass.Handle, Is.EqualTo (new Class (typeof (UIImage)).Handle), "UIDragDropSessionExtensionsTest did not convert the type properly for 'LoadObjects'."); + return new NSProgress (); + } + + public CGPoint LocationInView (UIView view) + { + throw new NotImplementedException (); + } + } +} + +#endif // !__TVOS__ && !__WATCHOS__ \ No newline at end of file diff --git a/tests/monotouch-test/UIKit/UIPasteConfigurationSupportingTest.cs b/tests/monotouch-test/UIKit/UIPasteConfigurationSupportingTest.cs new file mode 100644 index 000000000000..0e8260b04a45 --- /dev/null +++ b/tests/monotouch-test/UIKit/UIPasteConfigurationSupportingTest.cs @@ -0,0 +1,90 @@ +// +// Unit tests for UIPasteConfigurationSupportingTest +// +// Authors: +// Vincent Dondain +// +// +// Copyright 2017 Microsoft. +// + +#if !__TVOS__ && !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +using SpriteKit; +using ObjCRuntime; +using UIKit; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +using MonoTouch.SpriteKit; +using MonoTouch.ObjCRuntime; +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +namespace MonoTouchFixtures.UIKit { + [TestFixture] + [Preserve (AllMembers = true)] + public class UIPasteConfigurationSupportingTest { + + [SetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void UIViewControllerPasteTest () + { + var viewController = new ViewControllerPoker (); + viewController.PasteConfiguration = new UIPasteConfiguration (typeof (UIImage)); + viewController.Paste (new NSItemProvider [] { new NSItemProvider (new UIImage ()) }); + } + + [Test] + public void UIViewPasteTest () + { + var view = new ViewPoker (); + view.PasteConfiguration = new UIPasteConfiguration (typeof (UIImage)); + view.Paste (new NSItemProvider [] { new NSItemProvider (new UIImage ()) }); + } + + [Test] + public void SKNodeTest () + { + var node = new NodePoker (); + node.PasteConfiguration = new UIPasteConfiguration (typeof (UIImage)); + node.Paste (new NSItemProvider [] { new NSItemProvider (new UIImage ()) }); + } + + class ViewControllerPoker : UIViewController { + + public override void Paste (NSItemProvider [] itemProviders) + { + Assert.IsTrue (itemProviders [0].CanLoadObject (typeof (UIImage))); + } + } + + class ViewPoker : UIView { + + public override void Paste (NSItemProvider [] itemProviders) + { + Assert.IsTrue (itemProviders [0].CanLoadObject (typeof (UIImage))); + } + } + + class NodePoker : SKNode { + + public override void Paste (NSItemProvider [] itemProviders) + { + Assert.IsTrue (itemProviders [0].CanLoadObject (typeof (UIImage))); + } + } + } +} + +#endif // !__TVOS__ && !__WATCHOS__ \ No newline at end of file diff --git a/tests/monotouch-test/UIKit/UISpringLoadedInteractionSupportingTest.cs b/tests/monotouch-test/UIKit/UISpringLoadedInteractionSupportingTest.cs new file mode 100644 index 000000000000..ab5f44f803dc --- /dev/null +++ b/tests/monotouch-test/UIKit/UISpringLoadedInteractionSupportingTest.cs @@ -0,0 +1,104 @@ +// +// Unit tests for UISpringLoadedInteractionSupportingTest +// +// Authors: +// Vincent Dondain +// +// +// Copyright 2017 Microsoft. +// + +#if !__TVOS__ && !__WATCHOS__ + +using System; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +using ObjCRuntime; +using UIKit; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +namespace MonoTouchFixtures.UIKit { + [TestFixture] + [Preserve (AllMembers = true)] + public class UISpringLoadedInteractionSupportingTest { + + [SetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (9, 0); + } + + [Test] + public void UIAlertControllerSpringLoadTest () + { + var alertController = new UIAlertController (); + alertController.SpringLoaded = true; + Assert.IsTrue (alertController.SpringLoaded); + } + + [Test] + public void UIBarButtonItemSpringLoadTest () + { + var barButtonItem = new UIBarButtonItem (); + barButtonItem.SpringLoaded = true; + Assert.IsTrue (barButtonItem.SpringLoaded); + } + + [Test] + public void UIButtonSpringLoadTest () + { + var button = new UIButton (); + button.SpringLoaded = true; + Assert.IsTrue (button.SpringLoaded); + } + + [Test] + public void UICollectionViewSpringLoadTest () + { + var collectionView = new UICollectionView (new CGRect (0, 0, 100, 100), new UICollectionViewLayout ()); + collectionView.SpringLoaded = true; + Assert.IsTrue (collectionView.SpringLoaded); + } + + [Test] + public void UISegmentedControlSpringLoadTest () + { + var segmentedControl = new UISegmentedControl (); + segmentedControl.SpringLoaded = true; + Assert.IsTrue (segmentedControl.SpringLoaded); + } + + [Test] + public void UITabBarItemSpringLoadTest () + { + var tabBarItem = new UITabBarItem (); + tabBarItem.SpringLoaded = true; + Assert.IsTrue (tabBarItem.SpringLoaded); + } + + [Test] + public void UITabBarSpringLoadTest () + { + var tabBar = new UITabBar (); + tabBar.SpringLoaded = true; + Assert.IsTrue (tabBar.SpringLoaded); + } + + [Test] + public void UITableViewSpringLoadTest () + { + var tableView = new UITableView (); + tableView.SpringLoaded = true; + Assert.IsTrue (tableView.SpringLoaded); + } + } +} + +#endif // !__TVOS__ && !__WATCHOS__ \ No newline at end of file diff --git a/tests/monotouch-test/monotouch-test.csproj b/tests/monotouch-test/monotouch-test.csproj index 748b2df7769c..f591dc8718f4 100644 --- a/tests/monotouch-test/monotouch-test.csproj +++ b/tests/monotouch-test/monotouch-test.csproj @@ -1,4 +1,4 @@ - + Debug @@ -163,6 +163,7 @@ + @@ -355,7 +356,6 @@ - @@ -645,6 +645,7 @@ + @@ -657,10 +658,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +753,7 @@ + @@ -727,6 +767,11 @@ + + + + + @@ -739,7 +784,6 @@ - @@ -762,6 +806,7 @@ + @@ -794,4 +839,4 @@ - \ No newline at end of file + diff --git a/tests/mtouch/MTouch.cs b/tests/mtouch/MTouch.cs index 20b2322a522b..91ddb88723b4 100644 --- a/tests/mtouch/MTouch.cs +++ b/tests/mtouch/MTouch.cs @@ -181,6 +181,7 @@ public void FatAppFiles () mtouch.CreateTemporaryApp (); mtouch.CreateTemporaryCacheDirectory (); mtouch.Abi = "armv7,arm64"; + mtouch.TargetVer = "10.3"; // otherwise 32-bit build isn't possible mtouch.DSym = false; // speeds up the test mtouch.MSym = false; // speeds up the test mtouch.AssertExecute (MTouchAction.BuildDev, "build"); @@ -245,6 +246,7 @@ public void CodeSharingLLVM (string name, string abi, string[] assembly_build_ta mtouch.NoStrip = true; // faster test mtouch.NoSymbolStrip = string.Empty; // faster test mtouch.Verbosity = 4; // This is needed to get mtouch to print the output we're verifying + mtouch.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible mtouch.AssertExecute (MTouchAction.BuildDev, "build"); // Check that --llvm is passed to the AOT compiler for every assembly we AOT. var assemblies_checked = 0; @@ -374,6 +376,7 @@ public void RebuildTest_WithExtensions (string name, string abi, bool debug, str extension.CreateTemporaryServiceExtension (extraCode: codeA); extension.CreateTemporaryCacheDirectory (); extension.Abi = abi; + extension.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible extension.Debug = debug; extension.AssemblyBuildTargets.AddRange (assembly_build_targets); extension.DSym = false; // faster test @@ -386,6 +389,7 @@ public void RebuildTest_WithExtensions (string name, string abi, bool debug, str mtouch.CreateTemporaryApp (extraCode: codeA); mtouch.CreateTemporaryCacheDirectory (); mtouch.Abi = abi; + mtouch.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible mtouch.Debug = debug; mtouch.AssemblyBuildTargets.AddRange (assembly_build_targets); mtouch.DSym = false; // faster test @@ -903,6 +907,7 @@ public void MT0075 () using (var mtouch = new MTouchTool ()) { mtouch.CreateTemporaryApp (); mtouch.Abi = "armv7k"; + mtouch.TargetVer = "10.3"; mtouch.AssertExecuteFailure (MTouchAction.BuildDev, "build"); mtouch.AssertError (75, "Invalid architecture 'ARMv7k' for iOS projects. Valid architectures are: ARMv7, ARMv7+Thumb, ARMv7+LLVM, ARMv7+LLVM+Thumb, ARMv7s, ARMv7s+Thumb, ARMv7s+LLVM, ARMv7s+LLVM+Thumb, ARM64, ARM64+LLVM"); } @@ -1002,7 +1007,10 @@ public void MT0091 (Profile profile, string name) mtouch.Linker = MTouchLinker.DontLink; mtouch.Sdk = sdk_version; Assert.AreEqual (1, mtouch.Execute (MTouchAction.BuildSim)); - mtouch.AssertError (91, String.Format ("This version of Xamarin.iOS requires the {0} {1} SDK (shipped with Xcode {2}). Either upgrade Xcode to get the required header files or set the managed linker behaviour to Link Framework SDKs Only (to try to avoid the new APIs).", name, GetSdkVersion (profile), Configuration.XcodeVersion)); + var xcodeVersionString = Configuration.XcodeVersion; + if (xcodeVersionString.EndsWith (".0", StringComparison.Ordinal)) + xcodeVersionString = xcodeVersionString.Substring (0, xcodeVersionString.Length - 2); + mtouch.AssertError (91, String.Format ("This version of Xamarin.iOS requires the {0} {1} SDK (shipped with Xcode {2}). Either upgrade Xcode to get the required header files or set the managed linker behaviour to Link Framework SDKs Only (to try to avoid the new APIs).", name, GetSdkVersion (profile), xcodeVersionString)); } } @@ -1357,6 +1365,7 @@ public void MT0113_abi (string app_abi, string extension_abi, string error_abi) extension.CreateTemporaryServiceExtension (); extension.CreateTemporaryCacheDirectory (); extension.Abi = extension_abi; + extension.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible extension.AssertExecute (MTouchAction.BuildDev, "build extension"); using (var app = new MTouchTool ()) { app.AppExtensions.Add (extension); @@ -1364,6 +1373,7 @@ public void MT0113_abi (string app_abi, string extension_abi, string error_abi) app.CreateTemporaryCacheDirectory (); app.WarnAsError = new int [] { 113 }; app.Abi = app_abi; + app.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible app.AssertExecuteFailure (MTouchAction.BuildDev, "build app"); app.AssertError (113, $"Native code sharing has been disabled for the extension 'testServiceExtension' because the container app does not build for the ABI {error_abi} (while the extension is building for this ABI)."); } @@ -1378,6 +1388,7 @@ public void MT0113_incompatible_abi (string app_abi, string extension_abi, strin extension.CreateTemporaryServiceExtension (); extension.CreateTemporaryCacheDirectory (); extension.Abi = extension_abi; + extension.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible extension.AssertExecute (MTouchAction.BuildDev, "build extension"); using (var app = new MTouchTool ()) { app.AppExtensions.Add (extension); @@ -1385,6 +1396,7 @@ public void MT0113_incompatible_abi (string app_abi, string extension_abi, strin app.CreateTemporaryCacheDirectory (); app.WarnAsError = new int [] { 113 }; app.Abi = app_abi; + app.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible app.AssertExecuteFailure (MTouchAction.BuildDev, "build app"); app.AssertError (113, $"Native code sharing has been disabled for the extension 'testServiceExtension' because the container app is building for the ABI {container_error_abi}, which is not compatible with the extension's ABI ({extension_error_abi})."); } @@ -1446,6 +1458,23 @@ public void CodeSharingExactContentsDifferentPaths () } } + [Test] + [TestCase ("armv7", "ARMv7")] + [TestCase ("armv7s", "ARMv7s")] + [TestCase ("armv7,armv7s", "ARMv7")] + [TestCase ("i386", "i386")] + public void MT0116 (string abi, string messageAbi) + { + using (var mtouch = new MTouchTool ()) { + mtouch.CreateTemporaryApp (); + mtouch.CreateTemporaryCacheDirectory (); + mtouch.TargetVer = "11.0"; + mtouch.Abi = abi; + mtouch.AssertExecuteFailure (abi == "i386" ? MTouchAction.BuildSim : MTouchAction.BuildDev, "build"); + mtouch.AssertError (116, $"Invalid architecture: {messageAbi}. 32-bit architectures are not supported when deployment target is 11 or later."); + } + } + [Test] public void MT0125 () { @@ -1504,8 +1533,8 @@ public class BindingAppB { } "; - var bindingLibA = CreateBindingLibrary (tmpdir, nativeCodeA, null, null, extraCodeA, name: "bindingA"); - var bindingLibB = CreateBindingLibrary (tmpdir, nativeCodeB, null, null, extraCodeB, name: "bindingB", references: new string [] { bindingLibA }); + var bindingLibA = CreateBindingLibrary (tmpdir, nativeCodeA, null, null, extraCodeA, name: "bindingA", arch: "arm64"); + var bindingLibB = CreateBindingLibrary (tmpdir, nativeCodeB, null, null, extraCodeB, name: "bindingB", references: new string [] { bindingLibA }, arch: "arm64"); var exe = CompileTestAppExecutable (tmpdir, @" public class TestApp { static void Main () { @@ -1691,6 +1720,7 @@ public static string GetSimulatorArchitecture (Profile profile) { switch (profile) { case Profile.iOS: + return "x86_64"; case Profile.watchOS: return "i386"; case Profile.tvOS: @@ -1978,11 +2008,12 @@ public void FastDev_Dual () { Profile = Profile.iOS, FastDev = true, + TargetVer = "10.3", // otherwise 32-bit build isn't possible Abi = "armv7,arm64", }) { mtouch.CreateTemporaryApp (); - Assert.AreEqual (0, mtouch.Execute (MTouchAction.BuildDev)); + mtouch.AssertExecute (MTouchAction.BuildDev); var bin = mtouch.NativeExecutablePath; VerifyArchitectures (bin, "arm7s/64", "armv7", "arm64"); foreach (var dylib in Directory.GetFileSystemEntries (mtouch.AppPath, "*.dylib")) { @@ -2037,27 +2068,28 @@ public void FastSim (Profile profile) } [Test] - [TestCase (Target.Dev, "armv7")] - [TestCase (Target.Dev, "armv7s")] - [TestCase (Target.Dev, "armv7,armv7s")] - [TestCase (Target.Dev, "arm64")] - [TestCase (Target.Dev, "arm64+llvm")] - [TestCase (Target.Dev, "armv7,arm64")] - [TestCase (Target.Dev, "armv7s,arm64")] - [TestCase (Target.Dev, "armv7,armv7s,arm64")] - [TestCase (Target.Sim, "i386")] - [TestCase (Target.Sim, "x86_64")] - public void Architectures_Unified (Target target, string abi) + [TestCase (Target.Dev, "armv7", "10.3")] + [TestCase (Target.Dev, "armv7s", "10.3")] + [TestCase (Target.Dev, "armv7,armv7s", "10.3")] + [TestCase (Target.Dev, "arm64", null)] + [TestCase (Target.Dev, "arm64+llvm", null)] + [TestCase (Target.Dev, "armv7,arm64", "10.3")] + [TestCase (Target.Dev, "armv7s,arm64", "10.3")] + [TestCase (Target.Dev, "armv7,armv7s,arm64", "10.3")] + [TestCase (Target.Sim, "i386", "10.3")] + [TestCase (Target.Sim, "x86_64", null)] + public void Architectures_Unified (Target target, string abi, string deployment_target) { using (var mtouch = new MTouchTool ()) { mtouch.Profile = Profile.iOS; mtouch.CreateTemporaryApp (); mtouch.Abi = abi; + mtouch.TargetVer = deployment_target; var bin = Path.Combine (mtouch.AppPath, Path.GetFileNameWithoutExtension (mtouch.RootAssembly)); - Assert.AreEqual (0, mtouch.Execute (target == Target.Dev ? MTouchAction.BuildDev : MTouchAction.BuildSim)); + mtouch.AssertExecute (target == Target.Dev ? MTouchAction.BuildDev : MTouchAction.BuildSim); VerifyArchitectures (bin, abi, abi.Replace ("+llvm", string.Empty).Split (',')); } @@ -2071,6 +2103,7 @@ public void Architectures_Unified_FatSimulator () mtouch.CreateTemporaryApp (); mtouch.Abi = "i386,x86_64"; + mtouch.TargetVer = "10.3"; var bin = Path.Combine (mtouch.AppPath, Path.GetFileNameWithoutExtension (mtouch.RootAssembly)); var bin32 = Path.Combine (mtouch.AppPath, ".monotouch-32", Path.GetFileNameWithoutExtension (mtouch.RootAssembly)); @@ -2091,6 +2124,7 @@ public void Architectures_Unified_Invalid () mtouch.Profile = Profile.iOS; mtouch.CreateTemporaryApp (); + mtouch.TargetVer = "10.3"; mtouch.Abi = "armv6"; Assert.AreEqual (1, mtouch.Execute (MTouchAction.BuildDev)); mtouch.AssertError ("MT", 15, "Invalid ABI: armv6. Supported ABIs are: i386, x86_64, armv7, armv7+llvm, armv7+llvm+thumb2, armv7s, armv7s+llvm, armv7s+llvm+thumb2, armv7k, armv7k+llvm, arm64 and arm64+llvm."); @@ -2143,6 +2177,7 @@ public void MonoFrameworkArchitectures () extension.CreateTemporaryServiceExtension (); extension.CreateTemporaryCacheDirectory (); extension.Abi = "armv7,arm64"; + extension.TargetVer = "10.3"; extension.Linker = MTouchLinker.LinkAll; // faster test extension.NoStrip = true; // faster test extension.AssertExecute (MTouchAction.BuildDev, "build extension"); @@ -2251,6 +2286,7 @@ public void Registrar (Target target, MTouchLinker linker, MTouchRegistrar regis mtouch.Linker = linker; mtouch.Registrar = registrar; mtouch.Abi = abi; + mtouch.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible mtouch.Timeout = TimeSpan.FromMinutes (5); mtouch.AssertExecute (target == Target.Dev ? MTouchAction.BuildDev : MTouchAction.BuildSim, "build"); var fi = new FileInfo (mtouch.NativeExecutablePath); @@ -2292,7 +2328,7 @@ public class BindingApp { public static extern void DummyMethod (); } "; - var bindingLib = CreateBindingLibrary (tmpdir, nativeCode, null, null, extraCode); + var bindingLib = CreateBindingLibrary (tmpdir, nativeCode, null, null, extraCode, arch: "arm64"); var exe = CompileTestAppExecutable (tmpdir, @" public class TestApp { static void Main () { @@ -2407,6 +2443,7 @@ public void LinkerWarnings () mtouch.NoFastSim = true; mtouch.Abi = "i386"; mtouch.GccFlags = StringUtils.Quote (lib); + mtouch.TargetVer = "10.3"; // otherwise 32-bit build isn't possible mtouch.AssertExecute (MTouchAction.BuildSim, "build a"); mtouch.AssertWarning (5203, $"Native linking warning: warning: ignoring file {lib}, file was built for archive which is not the architecture being linked (i386): {lib}"); } @@ -2623,6 +2660,7 @@ static void Main () } "; mtouch.Abi = "armv7,arm64"; + mtouch.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible mtouch.CreateTemporaryApp (code: code); mtouch.CreateTemporaryCacheDirectory (); @@ -2710,6 +2748,7 @@ static void Main () mtouch.RootAssembly = exe; mtouch.References = new [] { DLL }; mtouch.Timeout = TimeSpan.FromMinutes (5); + mtouch.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible foreach (var test in tests) { mtouch.Abi = test.Abi; @@ -2729,6 +2768,7 @@ public void TestDuplicatedFatApp () mtouch.CreateTemporaryApp (); mtouch.CreateTemporaryCacheDirectory (); mtouch.Abi = "armv7,arm64"; + mtouch.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible mtouch.AssertExecute (MTouchAction.BuildDev, "build"); FileAssert.Exists (Path.Combine (mtouch.AppPath, "testApp.exe")); // Don't check for mscorlib.dll, there might be two versions of it (since Xamarin.iOS.dll depends on it), or there might not. @@ -2743,6 +2783,7 @@ public void TestAllLoad () mtouch.CreateTemporaryApp (); mtouch.GccFlags = "-all_load"; mtouch.Abi = "armv7,arm64"; + mtouch.TargetVer = "10.3"; // otherwise 32-bit builds aren't possible mtouch.AssertExecute (MTouchAction.BuildDev, "build"); } } @@ -3435,7 +3476,7 @@ public void DummyTest () {} True -v -v -v -v True - i386, x86_64 + x86_64 None @@ -3447,7 +3488,7 @@ public void DummyTest () {} True iPhone Developer -v -v -v -v - ARMv7, ARM64 + ARM64 Full @@ -3520,9 +3561,9 @@ public static string CompileTestAppCode (string target, string targetDirectory, return assembly; } - static string CreateBindingLibrary (string targetDirectory, string nativeCode, string bindingCode, string linkWith = null, string extraCode = "", string name = "binding", string[] references = null) + static string CreateBindingLibrary (string targetDirectory, string nativeCode, string bindingCode, string linkWith = null, string extraCode = "", string name = "binding", string[] references = null, string arch = "armv7") { - var o = CompileNativeLibrary (targetDirectory, nativeCode, name: name); + var o = CompileNativeLibrary (targetDirectory, nativeCode, name: name, arch: arch); var cs = Path.Combine (targetDirectory, $"{name}Code.cs"); var dll = Path.Combine (targetDirectory, $"{name}Library.dll"); diff --git a/tests/mtouch/MTouchTool.cs b/tests/mtouch/MTouchTool.cs index 765a8771f76a..024cd9fea7b8 100644 --- a/tests/mtouch/MTouchTool.cs +++ b/tests/mtouch/MTouchTool.cs @@ -163,7 +163,12 @@ public int Execute (MTouchAction action) public void AssertExecute (MTouchAction action, string message = null) { - NUnit.Framework.Assert.AreEqual (0, Execute (action), message); + var rv = Execute (action); + if (rv == 0) + return; + var errors = Messages.Where ((v) => v.IsError).ToList (); + Assert.Fail ($"Expected execution to succeed, but exit code was {rv}, and there were {errors.Count} error(s): {message}\n\t" + + string.Join ("\n\t", errors.Select ((v) => v.ToString ()))); } public void AssertExecuteFailure (MTouchAction action, string message = null) diff --git a/tests/mtouch/RegistrarTest.cs b/tests/mtouch/RegistrarTest.cs index b3bbe9520a69..8f7ede292ad7 100644 --- a/tests/mtouch/RegistrarTest.cs +++ b/tests/mtouch/RegistrarTest.cs @@ -731,8 +731,11 @@ public void NoWarnings () mtouch.Verbosity = 9; // Increase verbosity, otherwise linker warnings aren't shown mtouch.AssertExecute (MTouchAction.BuildSim, "build"); mtouch.AssertNoWarnings (); - foreach (var line in mtouch.OutputLines) + foreach (var line in mtouch.OutputLines) { + if (line.Contains ("warning: method 'paymentAuthorizationViewController:didAuthorizePayment:handler:' in protocol 'PKPaymentAuthorizationViewControllerDelegate' not implemented [-Wprotocol]")) + continue; // Xcode 9 beta 1: this method changed from optional to required. Assert.That (line, Does.Not.Match ("warning:"), "no warnings"); + } } } diff --git a/tests/scripted/Makefile b/tests/scripted/Makefile index 3066445c83cc..7e53132b24cd 100644 --- a/tests/scripted/Makefile +++ b/tests/scripted/Makefile @@ -6,11 +6,11 @@ ALL_TESTS=select-native-compiler bug-13945 bug-35786 all-local tests run-tests:: $(ALL_TESTS) select-native-compiler: - $(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch armv7 -mno-thumb -miphoneos-version-min=$(IOS_SDK_VERSION) -isysroot $(XCODE_DEVELOPER_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(IOS_SDK_VERSION).sdk -Wall -g -c select-native-compiler/native.cpp -o select-native-compiler/libNative.a + $(XCODE_DEVELOPER_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch arm64 -miphoneos-version-min=$(IOS_SDK_VERSION) -isysroot $(XCODE_DEVELOPER_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(IOS_SDK_VERSION).sdk -Wall -g -c select-native-compiler/native.cpp -o select-native-compiler/libNative.a mkdir -p select-native-compiler/SelectNativeCompiler.app $(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/btouch-native select-native-compiler/binding.cs --link-with=select-native-compiler/libNative.a,Native -s:select-native-compiler/managed.cs -o:select-native-compiler/binding.dll $(SYSTEM_MCS) select-native-compiler/app.cs -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll -r:select-native-compiler/binding.dll -out:select-native-compiler/app.exe - $(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/mtouch -r:select-native-compiler/binding.dll select-native-compiler/app.exe --abi=armv7 -sdk "$(IOS_SDK_VERSION)" -dev:select-native-compiler/SelectNativeCompiler.app -sdkroot $(XCODE_DEVELOPER_ROOT) -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll + $(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/mtouch -r:select-native-compiler/binding.dll select-native-compiler/app.exe --abi=arm64 -sdk "$(IOS_SDK_VERSION)" -dev:select-native-compiler/SelectNativeCompiler.app -sdkroot $(XCODE_DEVELOPER_ROOT) -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll bug-13945 bug-35786: $(MAKE) -C $@ diff --git a/tests/scripted/bug-13945/Makefile b/tests/scripted/bug-13945/Makefile index 8585d24605bf..7b7d4023a4a3 100644 --- a/tests/scripted/bug-13945/Makefile +++ b/tests/scripted/bug-13945/Makefile @@ -8,26 +8,26 @@ bug-13945: @echo "void foo () {}" > nativeA.m @echo "void bar () {}" > nativeB.m @mkdir -p .libs - @$(MAKE) .libs/ios/nativeA.armv7.o - @$(MAKE) .libs/ios/nativeB.armv7.o + @$(MAKE) .libs/ios/nativeA.arm64.o + @$(MAKE) .libs/ios/nativeB.arm64.o @rm -Rf TheApp.app cache cache-first @mkdir -p TheApp.app @mkdir -p cache - @cp .libs/ios/nativeA.armv7.o libNative.a + @cp .libs/ios/nativeA.arm64.o libNative.a @$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/btouch-native binding.cs --link-with=libNative.a,Native -s:managed.cs -o:binding.dll @$(SYSTEM_MCS) app.cs -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll -r:binding.dll -out:app.exe - @$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/mtouch -r:binding.dll app.exe --abi=armv7 -sdk "$(IOS_SDK_VERSION)" -dev:TheApp.app -sdkroot $(XCODE_DEVELOPER_ROOT) --cache=$(shell pwd)/cache -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll + @$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/mtouch -r:binding.dll app.exe --abi=arm64 -sdk "$(IOS_SDK_VERSION)" -dev:TheApp.app -sdkroot $(XCODE_DEVELOPER_ROOT) --cache=$(shell pwd)/cache -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll @cp -Rp cache cache-first - @cp .libs/ios/nativeB.armv7.o libNative.a + @cp .libs/ios/nativeB.arm64.o libNative.a @$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/btouch-native binding.cs --link-with=libNative.a,Native -s:managed.cs -o:binding.dll # do not rebuild the .exe - @$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/mtouch -r:binding.dll app.exe --abi=armv7 -sdk "$(IOS_SDK_VERSION)" -dev:TheApp.app -sdkroot $(XCODE_DEVELOPER_ROOT) --cache=$(shell pwd)/cache -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll + @$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/bin/mtouch -r:binding.dll app.exe --abi=arm64 -sdk "$(IOS_SDK_VERSION)" -dev:TheApp.app -sdkroot $(XCODE_DEVELOPER_ROOT) --cache=$(shell pwd)/cache -r:$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll - # this will verify that binding.dll wasn't AOT'ed again - if binding.dll.armv7.s differ then the AOT compiler executed. - @diff -u cache-first/armv7/binding.dll.s cache/armv7/binding.dll.s + # this will verify that binding.dll wasn't AOT'ed again - if binding.dll.arm64.s differ then the AOT compiler executed. + @diff -u cache-first/arm64/binding.dll.s cache/arm64/binding.dll.s @echo "$@: Success" include $(TOP)/mk/rules.mk diff --git a/tests/scripted/bug-35786/Makefile b/tests/scripted/bug-35786/Makefile index b3b80c7e7ae0..f00605f32109 100644 --- a/tests/scripted/bug-35786/Makefile +++ b/tests/scripted/bug-35786/Makefile @@ -38,7 +38,7 @@ bug-35786: @# we lower the ulimit here so that we don't have to create that many assemblies to test with @# the ulimit default on Yosemite is ulimit=256, which requires 300 assemblies to break the stripper, and 400 assemblies to break the AOT compiler. @# with 96 here, we only need 20 assemblies to break the stripper, and 35 to break the AOT compiler, so running the test with 100 assemblies should be more than enough. - ulimit -n 96 && $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/mtouch --dev libs/bug-35786.app --abi armv7,arm64 libs/bug-35786.exe --sdkroot $(XCODE_DEVELOPER_ROOT) --sdk $(IOS_SDK_VERSION) -r:$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll + ulimit -n 96 && $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/mtouch --dev libs/bug-35786.app --targetver=10.3 --abi armv7,arm64 libs/bug-35786.exe --sdkroot $(XCODE_DEVELOPER_ROOT) --sdk $(IOS_SDK_VERSION) -r:$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/Xamarin.iOS.dll include $(TOP)/mk/rules.mk diff --git a/tests/templates/WatchContainer/Container.csproj b/tests/templates/WatchContainer/Container.csproj index 912f11337e9b..4dd2a4c4e7e6 100644 --- a/tests/templates/WatchContainer/Container.csproj +++ b/tests/templates/WatchContainer/Container.csproj @@ -20,7 +20,7 @@ bin\iPhoneSimulator\$(Configuration)-watchos prompt 4 - i386 + x86_64 None true iPhone Developer @@ -32,7 +32,7 @@ true prompt 4 - ARMv7 + ARM64 %CONTAINER_PATH%Entitlements.plist true iPhone Developer @@ -44,7 +44,7 @@ true prompt 4 - i386 + x86_64 None iPhone Developer @@ -56,7 +56,7 @@ DEBUG;$(DefineConstants) prompt 4 - ARMv7 + ARM64 Full %CONTAINER_PATH%Entitlements.plist true diff --git a/tests/test-libraries/libtest.h b/tests/test-libraries/libtest.h index 33218d15d94d..5f1918d86b20 100644 --- a/tests/test-libraries/libtest.h +++ b/tests/test-libraries/libtest.h @@ -1,7 +1,12 @@ #import +#include #include "rename.h" +#if !TARGET_OS_WATCH +#import +#endif + #ifdef __cplusplus extern "C" { #endif @@ -9,6 +14,17 @@ extern "C" { int theUltimateAnswer (); void useZLib (); +void x_get_matrix_float2x2 (id self, const char *sel, float* r0c0, float* r0c1, float* r1c0, float* r1c1); +void x_get_matrix_float3x3 (id self, const char *sel, float* r0c0, float* r0c1, float* r0c2, float* r1c0, float* r1c1, float* r1c2, float* r2c0, float* r2c1, float* r2c2); +void x_get_matrix_float4x4 (id self, const char *sel, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); +void x_get_matrix_float4x3 (id self, const char *sel, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3); + +#if !TARGET_OS_WATCH +void x_mdltransformcomponent_get_local_transform (id self, NSTimeInterval time, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); +void x_mdltransform_create_global_transform (MDLObject *object, NSTimeInterval time, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); +void x_mdltransform_get_rotation_matrix (MDLTransform *self, NSTimeInterval time, float* r0c0, float* r0c1, float* r0c2, float* r0c3, float* r1c0, float* r1c1, float* r1c2, float* r1c3, float* r2c0, float* r2c1, float* r2c2, float* r2c3, float* r3c0, float* r3c1, float* r3c2, float* r3c3); +#endif + /* * Various structs used in ObjCRegistrarTest */ diff --git a/tests/test-libraries/libtest.m b/tests/test-libraries/libtest.m index 921afc9cbf53..cc6eab828c30 100644 --- a/tests/test-libraries/libtest.m +++ b/tests/test-libraries/libtest.m @@ -1,6 +1,8 @@ #import +#include #include +#include #include #include "libtest.h" @@ -15,6 +17,233 @@ void useZLib () printf ("ZLib version: %s\n", zlibVersion ()); } +typedef matrix_float2x2 (*func_x_get_matrix_float2x2_msgSend) (id self, SEL sel); +void +x_get_matrix_float2x2 (id self, const char *sel, + float* r0c0, float* r0c1, + float* r1c0, float* r1c1) +{ + matrix_float2x2 rv; +#if __i386__ + IMP msgSend = (IMP) objc_msgSend_stret; +#elif __x86_64__ + IMP msgSend = (IMP) objc_msgSend; +#elif __arm64__ + IMP msgSend = (IMP) objc_msgSend; +#elif __arm__ + IMP msgSend = (IMP) objc_msgSend_stret; +#else +#error unknown architecture +#endif + rv = ((func_x_get_matrix_float2x2_msgSend) msgSend) (self, sel_registerName (sel)); + *r0c0 = rv.columns[0][0]; + *r0c1 = rv.columns[1][0]; + *r1c0 = rv.columns[0][1]; + *r1c1 = rv.columns[1][1]; +} + +typedef matrix_float3x3 (*func_x_get_matrix_float3x3_msgSend) (id self, SEL sel); +void +x_get_matrix_float3x3 (id self, const char *sel, + float* r0c0, float* r0c1, float* r0c2, + float* r1c0, float* r1c1, float* r1c2, + float* r2c0, float* r2c1, float* r2c2) +{ + matrix_float3x3 rv; +#if __i386__ + IMP msgSend = (IMP) objc_msgSend_stret; +#elif __x86_64__ + IMP msgSend = (IMP) objc_msgSend_stret; +#elif __arm64__ + IMP msgSend = (IMP) objc_msgSend; +#elif __arm__ + IMP msgSend = (IMP) objc_msgSend_stret; +#else +#error unknown architecture +#endif + rv = ((func_x_get_matrix_float3x3_msgSend) msgSend) (self, sel_registerName (sel)); + *r0c0 = rv.columns[0][0]; + *r0c1 = rv.columns[1][0]; + *r0c2 = rv.columns[2][0]; + + *r1c0 = rv.columns[0][1]; + *r1c1 = rv.columns[1][1]; + *r1c2 = rv.columns[2][1]; + + *r2c0 = rv.columns[0][2]; + *r2c1 = rv.columns[1][2]; + *r2c2 = rv.columns[2][2]; +} + +typedef matrix_float4x4 (*func_x_get_matrix_float4x4_msgSend) (id self, SEL sel); +void +x_get_matrix_float4x4 (id self, const char *sel, + float* r0c0, float* r0c1, float* r0c2, float* r0c3, + float* r1c0, float* r1c1, float* r1c2, float* r1c3, + float* r2c0, float* r2c1, float* r2c2, float* r2c3, + float* r3c0, float* r3c1, float* r3c2, float* r3c3) +{ + matrix_float4x4 rv; +#if __i386__ + IMP msgSend = (IMP) objc_msgSend_stret; +#elif __x86_64__ + IMP msgSend = (IMP) objc_msgSend_stret; +#elif __arm64__ + IMP msgSend = (IMP) objc_msgSend; +#elif __arm__ + IMP msgSend = (IMP) objc_msgSend_stret; +#else +#error unknown architecture +#endif + rv = ((func_x_get_matrix_float4x4_msgSend) msgSend) (self, sel_registerName (sel)); + *r0c0 = rv.columns[0][0]; + *r0c1 = rv.columns[1][0]; + *r0c2 = rv.columns[2][0]; + *r0c3 = rv.columns[3][0]; + + *r1c0 = rv.columns[0][1]; + *r1c1 = rv.columns[1][1]; + *r1c2 = rv.columns[2][1]; + *r1c3 = rv.columns[3][1]; + + *r2c0 = rv.columns[0][2]; + *r2c1 = rv.columns[1][2]; + *r2c2 = rv.columns[2][2]; + *r2c3 = rv.columns[3][2]; + + *r3c0 = rv.columns[0][3]; + *r3c1 = rv.columns[1][3]; + *r3c2 = rv.columns[2][3]; + *r3c3 = rv.columns[3][3]; +} + +typedef matrix_float4x3 (*func_x_get_matrix_float4x3_msgSend) (id self, SEL sel); +void +x_get_matrix_float4x3 (id self, const char *sel, + float* r0c0, float* r0c1, float* r0c2, float* r0c3, + float* r1c0, float* r1c1, float* r1c2, float* r1c3, + float* r2c0, float* r2c1, float* r2c2, float* r2c3) +{ + matrix_float4x3 rv; +#if __i386__ + IMP msgSend = (IMP) objc_msgSend_stret; +#elif __x86_64__ + IMP msgSend = (IMP) objc_msgSend_stret; +#elif __arm64__ + IMP msgSend = (IMP) objc_msgSend; +#elif __arm__ + IMP msgSend = (IMP) objc_msgSend_stret; +#else +#error unknown architecture +#endif + rv = ((func_x_get_matrix_float4x3_msgSend) msgSend) (self, sel_registerName (sel)); + *r0c0 = rv.columns[0][0]; + *r0c1 = rv.columns[1][0]; + *r0c2 = rv.columns[2][0]; + *r0c3 = rv.columns[3][0]; + + *r1c0 = rv.columns[0][1]; + *r1c1 = rv.columns[1][1]; + *r1c2 = rv.columns[2][1]; + *r1c3 = rv.columns[3][1]; + + *r2c0 = rv.columns[0][2]; + *r2c1 = rv.columns[1][2]; + *r2c2 = rv.columns[2][2]; + *r2c3 = rv.columns[3][2]; +} +#if !TARGET_OS_WATCH +void +x_mdltransformcomponent_get_local_transform (id self, NSTimeInterval time, + float* r0c0, float* r0c1, float* r0c2, float* r0c3, + float* r1c0, float* r1c1, float* r1c2, float* r1c3, + float* r2c0, float* r2c1, float* r2c2, float* r2c3, + float* r3c0, float* r3c1, float* r3c2, float* r3c3) +{ + matrix_float4x4 rv; + rv = [self localTransformAtTime: time]; + *r0c0 = rv.columns[0][0]; + *r0c1 = rv.columns[1][0]; + *r0c2 = rv.columns[2][0]; + *r0c3 = rv.columns[3][0]; + + *r1c0 = rv.columns[0][1]; + *r1c1 = rv.columns[1][1]; + *r1c2 = rv.columns[2][1]; + *r1c3 = rv.columns[3][1]; + + *r2c0 = rv.columns[0][2]; + *r2c1 = rv.columns[1][2]; + *r2c2 = rv.columns[2][2]; + *r2c3 = rv.columns[3][2]; + + *r3c0 = rv.columns[0][3]; + *r3c1 = rv.columns[1][3]; + *r3c2 = rv.columns[2][3]; + *r3c3 = rv.columns[3][3]; +} + +void +x_mdltransform_create_global_transform (MDLObject *object, NSTimeInterval time, + float* r0c0, float* r0c1, float* r0c2, float* r0c3, + float* r1c0, float* r1c1, float* r1c2, float* r1c3, + float* r2c0, float* r2c1, float* r2c2, float* r2c3, + float* r3c0, float* r3c1, float* r3c2, float* r3c3) +{ + matrix_float4x4 rv; + rv = [MDLTransform globalTransformWithObject: object atTime: time]; + *r0c0 = rv.columns[0][0]; + *r0c1 = rv.columns[1][0]; + *r0c2 = rv.columns[2][0]; + *r0c3 = rv.columns[3][0]; + + *r1c0 = rv.columns[0][1]; + *r1c1 = rv.columns[1][1]; + *r1c2 = rv.columns[2][1]; + *r1c3 = rv.columns[3][1]; + + *r2c0 = rv.columns[0][2]; + *r2c1 = rv.columns[1][2]; + *r2c2 = rv.columns[2][2]; + *r2c3 = rv.columns[3][2]; + + *r3c0 = rv.columns[0][3]; + *r3c1 = rv.columns[1][3]; + *r3c2 = rv.columns[2][3]; + *r3c3 = rv.columns[3][3]; +} + +void +x_mdltransform_get_rotation_matrix (MDLTransform *self, NSTimeInterval time, + float* r0c0, float* r0c1, float* r0c2, float* r0c3, + float* r1c0, float* r1c1, float* r1c2, float* r1c3, + float* r2c0, float* r2c1, float* r2c2, float* r2c3, + float* r3c0, float* r3c1, float* r3c2, float* r3c3) +{ + matrix_float4x4 rv; + rv = [self rotationMatrixAtTime: time]; + *r0c0 = rv.columns[0][0]; + *r0c1 = rv.columns[1][0]; + *r0c2 = rv.columns[2][0]; + *r0c3 = rv.columns[3][0]; + + *r1c0 = rv.columns[0][1]; + *r1c1 = rv.columns[1][1]; + *r1c2 = rv.columns[2][1]; + *r1c3 = rv.columns[3][1]; + + *r2c0 = rv.columns[0][2]; + *r2c1 = rv.columns[1][2]; + *r2c2 = rv.columns[2][2]; + *r2c3 = rv.columns[3][2]; + + *r3c0 = rv.columns[0][3]; + *r3c1 = rv.columns[1][3]; + *r3c2 = rv.columns[2][3]; + *r3c3 = rv.columns[3][3]; +} +#endif // !TARGET_OS_WATCH + @interface UltimateMachine : NSObject { } diff --git a/tests/test-libraries/rename.h b/tests/test-libraries/rename.h index 5d51469e4781..621dcc96666a 100644 --- a/tests/test-libraries/rename.h +++ b/tests/test-libraries/rename.h @@ -53,6 +53,13 @@ #define CtorChaining1 object_CtorChaining1 #define ObjCExceptionTest object_ObjCExceptionTest #define ObjCProtocolClassTest object_ObjCProtocolClassTest + #define x_mdltransform_get_rotation_matrix object_x_mdltransform_get_rotation_matrix + #define x_mdltransformcomponent_get_local_transform object_x_mdltransformcomponent_get_local_transform + #define x_mdltransform_create_global_transform object_x_mdltransform_create_global_transform + #define x_get_matrix_float4x4 object_x_get_matrix_float4x4 + #define x_get_matrix_float4x3 object_x_get_matrix_float4x3 + #define x_get_matrix_float3x3 object_x_get_matrix_float3x3 + #define x_get_matrix_float2x2 object_x_get_matrix_float2x2 #elif PREFIX == 2 #define theUltimateAnswer ar_theUltimateAnswer #define useZLib ar_useZLib @@ -107,6 +114,13 @@ #define CtorChaining1 ar_CtorChaining1 #define ObjCExceptionTest ar_ObjCExceptionTest #define ObjCProtocolClassTest ar_ObjCProtocolClassTest + #define x_mdltransform_get_rotation_matrix ar_x_mdltransform_get_rotation_matrix + #define x_mdltransformcomponent_get_local_transform ar_x_mdltransformcomponent_get_local_transform + #define x_mdltransform_create_global_transform ar_x_mdltransform_create_global_transform + #define x_get_matrix_float4x4 ar_x_get_matrix_float4x4 + #define x_get_matrix_float4x3 ar_x_get_matrix_float4x3 + #define x_get_matrix_float3x3 ar_x_get_matrix_float3x3 + #define x_get_matrix_float2x2 ar_x_get_matrix_float2x2 #else // keep original names #endif diff --git a/tests/tests-mac.sln b/tests/tests-mac.sln index 6dad0de6f8c0..5c65a62077ac 100644 --- a/tests/tests-mac.sln +++ b/tests/tests-mac.sln @@ -1,18 +1,42 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dontlink-mac-unified", "dontlink-mac\dontlink-mac-unified.csproj", "{FD385098-B3FD-4331-92BF-CC1F918E3334}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mmptest", "mmptest\mmptest.csproj", "{6E5405EC-1F68-4CD8-AD4B-E4CCFBE47977}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "msbuild-mac", "msbuild-mac\msbuild-mac.csproj", "{F8500DCE-2119-4DF9-8360-0F46DDB6930C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GuiUnit_xammac_mobile", "..\external\guiunit\src\framework\GuiUnit_xammac_mobile.csproj", "{EACFD119-769E-4E6C-89B7-A6CE3757C431}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "apitest-unified", "apitest\apitest-unified.csproj", "{7A0EDA95-30A6-43E1-AD43-368AD95AC48B}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xammac_tests", "xammac_tests\xammac_tests.csproj", "{22BF080C-AFAD-445B-8BB5-42B9E7FDBC68}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GuiUnit_NET_4_5", "..\external\guiunit\src\framework\GuiUnit_NET_4_5.csproj", "{D12F0F7B-8DE3-43EC-BA49-41052D065A9B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dontlink-mac-unified", "dontlink-mac\dontlink-mac-unified.csproj", "{78831857-A261-8EE0-A5F6-33D2628DE5D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "apitest-unified", "apitest\apitest-unified.csproj", "{EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "introspection-mac", "introspection\Mac\introspection-mac.csproj", "{EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "introspection-mac-unified", "introspection\Mac\introspection-mac-unified.csproj", "{4D0F03E2-FD85-D330-562F-C7421BDF3F3C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "introspection-mac-unified-32", "introspection\Mac\introspection-mac-unified-32.csproj", "{E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "apitest", "apitest\apitest.csproj", "{7A0EDA95-30A6-43E1-AD43-368AD95AC48B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "apitest-unified-32", "apitest\apitest-unified-32.csproj", "{4863B19A-06DC-90CB-0A14-5C5F0023A237}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "apitest-unifiedXM45", "apitest\apitest-unifiedXM45.csproj", "{3E867194-BFE6-E5EC-F39F-63AF6A5304FF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "apitest-unifiedXM45-32", "apitest\apitest-unifiedXM45-32.csproj", "{C74FC111-C78B-3723-456C-FBCA7CDA5147}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dontlink-mac", "dontlink-mac\dontlink-mac.csproj", "{FD385098-B3FD-4331-92BF-CC1F918E3334}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dontlink-mac-unified-32", "dontlink-mac\dontlink-mac-unified-32.csproj", "{E70715C3-299F-6FD5-E1C1-21949351D4B8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dontlink-mac-unifiedXM45", "dontlink-mac\dontlink-mac-unifiedXM45.csproj", "{A99E2CFD-3D03-D274-8E2C-036F0B00132F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dontlink-mac-unifiedXM45-32", "dontlink-mac\dontlink-mac-unifiedXM45-32.csproj", "{50CD2B87-A83C-1A43-A4B0-EA349E7082A5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -23,18 +47,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|Any CPU.ActiveCfg = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|Any CPU.Build.0 = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|Any CPU.ActiveCfg = Release|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|Any CPU.Build.0 = Release|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Default|Any CPU.ActiveCfg = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Default|Any CPU.Build.0 = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.AppStore|Any CPU.ActiveCfg = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.AppStore|Any CPU.Build.0 = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|x86.ActiveCfg = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|x86.Build.0 = Debug|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|x86.ActiveCfg = Release|x86 - {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|x86.Build.0 = Release|x86 {6E5405EC-1F68-4CD8-AD4B-E4CCFBE47977}.Debug|Any CPU.ActiveCfg = Debug|x86 {6E5405EC-1F68-4CD8-AD4B-E4CCFBE47977}.Debug|Any CPU.Build.0 = Debug|x86 {6E5405EC-1F68-4CD8-AD4B-E4CCFBE47977}.Release|Any CPU.ActiveCfg = Release|x86 @@ -71,18 +83,6 @@ Global {EACFD119-769E-4E6C-89B7-A6CE3757C431}.Debug|x86.Build.0 = Debug|Any CPU {EACFD119-769E-4E6C-89B7-A6CE3757C431}.Release|x86.ActiveCfg = Release|Any CPU {EACFD119-769E-4E6C-89B7-A6CE3757C431}.Release|x86.Build.0 = Release|Any CPU - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|Any CPU.ActiveCfg = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|Any CPU.Build.0 = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|Any CPU.ActiveCfg = Release|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|Any CPU.Build.0 = Release|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Default|Any CPU.ActiveCfg = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Default|Any CPU.Build.0 = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.AppStore|Any CPU.ActiveCfg = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.AppStore|Any CPU.Build.0 = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|x86.ActiveCfg = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|x86.Build.0 = Debug|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|x86.ActiveCfg = Release|x86 - {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|x86.Build.0 = Release|x86 {22BF080C-AFAD-445B-8BB5-42B9E7FDBC68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {22BF080C-AFAD-445B-8BB5-42B9E7FDBC68}.Debug|Any CPU.Build.0 = Debug|Any CPU {22BF080C-AFAD-445B-8BB5-42B9E7FDBC68}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -95,5 +95,173 @@ Global {22BF080C-AFAD-445B-8BB5-42B9E7FDBC68}.Debug|x86.Build.0 = Debug|Any CPU {22BF080C-AFAD-445B-8BB5-42B9E7FDBC68}.Release|x86.ActiveCfg = Release|Any CPU {22BF080C-AFAD-445B-8BB5-42B9E7FDBC68}.Release|x86.Build.0 = Release|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Release|Any CPU.Build.0 = Release|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Default|Any CPU.ActiveCfg = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Default|Any CPU.Build.0 = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Debug|x86.ActiveCfg = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Debug|x86.Build.0 = Debug|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Release|x86.ActiveCfg = Release|Any CPU + {D12F0F7B-8DE3-43EC-BA49-41052D065A9B}.Release|x86.Build.0 = Release|Any CPU + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Debug|Any CPU.ActiveCfg = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Debug|Any CPU.Build.0 = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Release|Any CPU.ActiveCfg = Release|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Release|Any CPU.Build.0 = Release|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Default|Any CPU.ActiveCfg = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Default|Any CPU.Build.0 = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.AppStore|Any CPU.Build.0 = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Debug|x86.ActiveCfg = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Debug|x86.Build.0 = Debug|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Release|x86.ActiveCfg = Release|x86 + {78831857-A261-8EE0-A5F6-33D2628DE5D0}.Release|x86.Build.0 = Release|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Debug|Any CPU.ActiveCfg = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Debug|Any CPU.Build.0 = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Release|Any CPU.ActiveCfg = Release|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Release|Any CPU.Build.0 = Release|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Default|Any CPU.ActiveCfg = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Default|Any CPU.Build.0 = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.AppStore|Any CPU.Build.0 = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Debug|x86.ActiveCfg = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Debug|x86.Build.0 = Debug|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Release|x86.ActiveCfg = Release|x86 + {EF5231F6-E06A-BC8A-9B5C-181E2AC5EBBC}.Release|x86.Build.0 = Release|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Debug|Any CPU.ActiveCfg = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Debug|Any CPU.Build.0 = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Release|Any CPU.ActiveCfg = Release|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Release|Any CPU.Build.0 = Release|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Default|Any CPU.ActiveCfg = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Default|Any CPU.Build.0 = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.AppStore|Any CPU.Build.0 = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Debug|x86.ActiveCfg = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Debug|x86.Build.0 = Debug|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Release|x86.ActiveCfg = Release|x86 + {EA3E6B50-AE2B-4A63-BBFC-9888B93331CA}.Release|x86.Build.0 = Release|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Debug|Any CPU.ActiveCfg = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Debug|Any CPU.Build.0 = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Release|Any CPU.ActiveCfg = Release|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Release|Any CPU.Build.0 = Release|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Default|Any CPU.ActiveCfg = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Default|Any CPU.Build.0 = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.AppStore|Any CPU.Build.0 = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Debug|x86.ActiveCfg = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Debug|x86.Build.0 = Debug|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Release|x86.ActiveCfg = Release|x86 + {4D0F03E2-FD85-D330-562F-C7421BDF3F3C}.Release|x86.Build.0 = Release|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Debug|Any CPU.ActiveCfg = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Debug|Any CPU.Build.0 = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Release|Any CPU.ActiveCfg = Release|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Release|Any CPU.Build.0 = Release|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Default|Any CPU.ActiveCfg = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Default|Any CPU.Build.0 = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.AppStore|Any CPU.Build.0 = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Debug|x86.ActiveCfg = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Debug|x86.Build.0 = Debug|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Release|x86.ActiveCfg = Release|x86 + {E0E84B58-C333-1BF3-D1EC-42EE3EA0D071}.Release|x86.Build.0 = Release|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|Any CPU.ActiveCfg = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|Any CPU.Build.0 = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|Any CPU.ActiveCfg = Release|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|Any CPU.Build.0 = Release|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Default|Any CPU.ActiveCfg = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Default|Any CPU.Build.0 = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.AppStore|Any CPU.Build.0 = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|x86.ActiveCfg = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Debug|x86.Build.0 = Debug|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|x86.ActiveCfg = Release|x86 + {7A0EDA95-30A6-43E1-AD43-368AD95AC48B}.Release|x86.Build.0 = Release|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Debug|Any CPU.ActiveCfg = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Debug|Any CPU.Build.0 = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Release|Any CPU.ActiveCfg = Release|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Release|Any CPU.Build.0 = Release|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Default|Any CPU.ActiveCfg = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Default|Any CPU.Build.0 = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.AppStore|Any CPU.Build.0 = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Debug|x86.ActiveCfg = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Debug|x86.Build.0 = Debug|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Release|x86.ActiveCfg = Release|x86 + {4863B19A-06DC-90CB-0A14-5C5F0023A237}.Release|x86.Build.0 = Release|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Debug|Any CPU.ActiveCfg = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Debug|Any CPU.Build.0 = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Release|Any CPU.ActiveCfg = Release|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Release|Any CPU.Build.0 = Release|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Default|Any CPU.ActiveCfg = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Default|Any CPU.Build.0 = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.AppStore|Any CPU.Build.0 = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Debug|x86.ActiveCfg = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Debug|x86.Build.0 = Debug|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Release|x86.ActiveCfg = Release|x86 + {3E867194-BFE6-E5EC-F39F-63AF6A5304FF}.Release|x86.Build.0 = Release|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Debug|Any CPU.ActiveCfg = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Debug|Any CPU.Build.0 = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Release|Any CPU.ActiveCfg = Release|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Release|Any CPU.Build.0 = Release|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Default|Any CPU.ActiveCfg = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Default|Any CPU.Build.0 = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.AppStore|Any CPU.Build.0 = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Debug|x86.ActiveCfg = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Debug|x86.Build.0 = Debug|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Release|x86.ActiveCfg = Release|x86 + {C74FC111-C78B-3723-456C-FBCA7CDA5147}.Release|x86.Build.0 = Release|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|Any CPU.ActiveCfg = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|Any CPU.Build.0 = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|Any CPU.ActiveCfg = Release|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|Any CPU.Build.0 = Release|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Default|Any CPU.ActiveCfg = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Default|Any CPU.Build.0 = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.AppStore|Any CPU.Build.0 = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|x86.ActiveCfg = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Debug|x86.Build.0 = Debug|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|x86.ActiveCfg = Release|x86 + {FD385098-B3FD-4331-92BF-CC1F918E3334}.Release|x86.Build.0 = Release|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Debug|Any CPU.ActiveCfg = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Debug|Any CPU.Build.0 = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Release|Any CPU.ActiveCfg = Release|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Release|Any CPU.Build.0 = Release|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Default|Any CPU.ActiveCfg = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Default|Any CPU.Build.0 = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.AppStore|Any CPU.Build.0 = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Debug|x86.ActiveCfg = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Debug|x86.Build.0 = Debug|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Release|x86.ActiveCfg = Release|x86 + {E70715C3-299F-6FD5-E1C1-21949351D4B8}.Release|x86.Build.0 = Release|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Debug|Any CPU.ActiveCfg = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Debug|Any CPU.Build.0 = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Release|Any CPU.ActiveCfg = Release|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Release|Any CPU.Build.0 = Release|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Default|Any CPU.ActiveCfg = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Default|Any CPU.Build.0 = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.AppStore|Any CPU.Build.0 = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Debug|x86.ActiveCfg = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Debug|x86.Build.0 = Debug|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Release|x86.ActiveCfg = Release|x86 + {A99E2CFD-3D03-D274-8E2C-036F0B00132F}.Release|x86.Build.0 = Release|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Debug|Any CPU.ActiveCfg = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Debug|Any CPU.Build.0 = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Release|Any CPU.ActiveCfg = Release|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Release|Any CPU.Build.0 = Release|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Default|Any CPU.ActiveCfg = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Default|Any CPU.Build.0 = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.AppStore|Any CPU.ActiveCfg = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.AppStore|Any CPU.Build.0 = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Debug|x86.ActiveCfg = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Debug|x86.Build.0 = Debug|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Release|x86.ActiveCfg = Release|x86 + {50CD2B87-A83C-1A43-A4B0-EA349E7082A5}.Release|x86.Build.0 = Release|x86 EndGlobalSection EndGlobal diff --git a/tests/xammac_tests/xammac_tests.csproj b/tests/xammac_tests/xammac_tests.csproj index 84785e75c182..ce1a8d036c0e 100644 --- a/tests/xammac_tests/xammac_tests.csproj +++ b/tests/xammac_tests/xammac_tests.csproj @@ -17,7 +17,7 @@ full false bin\x86\Debug - __UNIFIED__;DEBUG;MONOMAC;XAMCORE_2_0 + __UNIFIED__;DEBUG;MONOMAC;XAMCORE_2_0;TEST_BINDINGS_UNAVAILABLE prompt 4 false @@ -38,7 +38,7 @@ true bin\x86\Release - __UNIFIED__;MONOMAC;XAMCORE_2_0 + __UNIFIED__;MONOMAC;XAMCORE_2_0;TEST_BINDINGS_UNAVAILABLE prompt 4 false @@ -584,9 +584,6 @@ EventKit\AlarmTest.cs - - EventKit\CalendarItemTest.cs - EventKit\CalendarTest.cs @@ -1054,6 +1051,24 @@ StringUtils.cs + + Metal\HeapDescriptorTest.cs + + + Metal\MTLArgumentDescriptorTest.cs + + + Metal\MTLPipelineBufferDescriptorTests.cs + + + Metal\MTLPointerTypeTests.cs + + + Metal\MTLTextureReferenceType.cs + + + Metal\MTLDeviceTests.cs + diff --git a/tests/xharness/AppRunner.cs b/tests/xharness/AppRunner.cs index 32c2c9bbcb48..65ff89621b4f 100644 --- a/tests/xharness/AppRunner.cs +++ b/tests/xharness/AppRunner.cs @@ -318,123 +318,94 @@ public bool EnsureCleanSimulatorState { ensure_clean_simulator_state = value; } } - - void GenerateHumanReadableLogs (string finalPath, string logHeader, XmlDocument doc) - { - // load the resource that contains the xslt and apply it to the doc and write the logs - if (File.Exists (finalPath)) { - // if the file does exist, remove it - File.Delete (finalPath); - } - - using (var strm = Assembly.GetExecutingAssembly ().GetManifestResourceStream ("xharness.nunit-summary.xslt")) - using (var xsltReader = XmlReader.Create (strm)) - using (var xmlReader = new XmlNodeReader (doc)) - using (var writer = new StreamWriter (finalPath)) { - writer.Write (logHeader); - var xslt = new XslCompiledTransform (); - xslt.Load (xsltReader); - xslt.Transform (xmlReader, null, writer); - writer.Flush (); - } - } - public bool TestsSucceeded (LogStream listener_log, bool timed_out, bool crashed) { string log; using (var reader = listener_log.GetReader ()) log = reader.ReadToEnd (); - // parsing the result is different if we are in jenkins or nor. + // parsing the result is different if we are in jenkins or not. + // When in Jenkins, Touch.Unit produces an xml file instead of a console log (so that we can get better test reporting). + // However, for our own reporting, we still want the console-based log. This log is embedded inside the xml produced + // by Touch.Unit, so we need to extract it and write it to disk. We also need to re-save the xml output, since Touch.Unit + // wraps the NUnit xml output with additional information, which we need to unwrap so that Jenkins understands it. if (Harness.InJenkins) { // we have to parse the xml result crashed = false; - if (log.Contains ("test-results")) { - // remove any possible extra info - var index = log.IndexOf ("{mode} failed: Test run: {totalTests} Passed: {totalTests - invalid - inconclusive - ignored} Inconclusive: {inconclusive} Failed: {errors + failures} Ignored: {ignored}
"); - main_log.WriteLine ("Test run failed"); + } catch (Exception e) { + main_log.WriteLine ("Could not parse xml result file: {0}", e); + + if (timed_out) { + Harness.LogWrench ($"@MonkeyWrench: AddSummary: {mode} timed out
"); return false; } else { - Harness.LogWrench ($"@MonkeyWrench: AddSummary: {mode} succeeded: Test run: {totalTests} Passed: {totalTests - invalid - inconclusive - ignored} Inconclusive: {inconclusive} Failed: 0 Ignored: {ignored}
"); - main_log.WriteLine ("Test run succeeded"); - return true; + Harness.LogWrench ($"@MonkeyWrench: AddSummary: {mode} crashed
"); + main_log.WriteLine ("Test run crashed"); + crashed = true; + return false; } - } else if (timed_out) { - Harness.LogWrench ($"@MonkeyWrench: AddSummary: {mode} timed out
"); - return false; - } else { - Harness.LogWrench ($"@MonkeyWrench: AddSummary: {mode} crashed
"); - main_log.WriteLine ("Test run crashed"); - crashed = true; - return false; } - } else { - // parsing the human readable results - if (log.Contains ("Tests run")) { - var tests_run = string.Empty; - var log_lines = log.Split ('\n'); - var failed = false; - foreach (var line in log_lines) { - if (line.Contains ("Tests run:")) { - Console.WriteLine (line); - tests_run = line.Replace ("Tests run: ", ""); - break; - } else if (line.Contains ("FAIL")) { - Console.WriteLine (line); - failed = true; - } - } + } - if (failed) { - Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} failed: {1}
", mode, tests_run); - main_log.WriteLine ("Test run failed"); - return false; - } else { - Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} succeeded: {1}
", mode, tests_run); - main_log.WriteLine ("Test run succeeded"); - return true; + // parsing the human readable results + if (log.Contains ("Tests run")) { + var tests_run = string.Empty; + var log_lines = log.Split ('\n'); + var failed = false; + foreach (var line in log_lines) { + if (line.Contains ("Tests run:")) { + Console.WriteLine (line); + tests_run = line.Replace ("Tests run: ", ""); + break; + } else if (line.Contains ("FAIL")) { + Console.WriteLine (line); + failed = true; } - } else if (timed_out) { - Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} timed out
", mode); + } + + if (failed) { + Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} failed: {1}
", mode, tests_run); + main_log.WriteLine ("Test run failed"); return false; } else { - Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} crashed
", mode); - main_log.WriteLine ("Test run crashed"); - crashed = true; - return false; + Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} succeeded: {1}
", mode, tests_run); + main_log.WriteLine ("Test run succeeded"); + return true; } + } else if (timed_out) { + Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} timed out
", mode); + return false; + } else { + Harness.LogWrench ("@MonkeyWrench: AddSummary: {0} crashed
", mode); + main_log.WriteLine ("Test run crashed"); + crashed = true; + return false; } } @@ -476,8 +447,11 @@ public async Task RunAsync () args.Append (" -argument=-app-arg:-enablenetwork"); args.Append (" -setenv=NUNIT_ENABLE_NETWORK=true"); // detect if we are using a jenkins bot. - if (Harness.InJenkins) + var useXmlOutput = Harness.InJenkins; + if (useXmlOutput) { args.Append (" -setenv=NUNIT_ENABLE_XML_OUTPUT=true"); + args.Append (" -setenv=NUNIT_ENABLE_XML_MODE=wrapped"); + } if (!IncludeSystemPermissionTests) args.Append (" -setenv=DISABLE_SYSTEM_PERMISSION_TESTS=1"); @@ -497,12 +471,24 @@ public async Task RunAsync () args.AppendFormat (" -argument=-app-arg:-hostname:{0}", ips.ToString ()); args.AppendFormat (" -setenv=NUNIT_HOSTNAME={0}", ips.ToString ()); } - var transport = mode == "watchos" ? "HTTP" : "TCP"; + string transport; + if (mode == "watchos") { + transport = isSimulator ? "FILE" : "HTTP"; + } else { + transport = "TCP"; + } args.AppendFormat (" -argument=-app-arg:-transport:{0}", transport); args.AppendFormat (" -setenv=NUNIT_TRANSPORT={0}", transport); + listener_log = Logs.CreateStream (LogDirectory, string.Format ("test-{0}-{1:yyyyMMdd_HHmmss}.log", mode, DateTime.Now), "Test log"); + SimpleListener listener; switch (transport) { + case "FILE": + var fn = listener_log.FullPath + ".tmp"; + listener = new SimpleFileListener (fn); + args.Append (" -setenv=NUNIT_LOG_FILE=").Append (StringUtils.Quote (fn)); + break; case "HTTP": listener = new SimpleHttpListener (); break; @@ -512,11 +498,11 @@ public async Task RunAsync () default: throw new NotImplementedException (); } - listener_log = Logs.CreateStream (LogDirectory, string.Format ("test-{0}-{1:yyyyMMdd_HHmmss}.log", mode, DateTime.Now), "Test log"); listener.TestLog = listener_log; listener.Log = main_log; listener.AutoExit = true; listener.Address = System.Net.IPAddress.Any; + listener.XmlOutput = useXmlOutput; listener.Initialize (); args.AppendFormat (" -argument=-app-arg:-hostport:{0}", listener.Port); diff --git a/tests/xharness/DeviceLogCapturer.cs b/tests/xharness/DeviceLogCapturer.cs index d028ecc65f5b..b881a01e67dc 100644 --- a/tests/xharness/DeviceLogCapturer.cs +++ b/tests/xharness/DeviceLogCapturer.cs @@ -59,7 +59,7 @@ public void StopCapture () if (process.HasExited) return; - process.KillTreeAsync (Harness.HarnessLog).Wait (); + process.KillTreeAsync (Harness.HarnessLog, diagnostics: false).Wait (); process.Dispose (); } } diff --git a/tests/xharness/Harness.cs b/tests/xharness/Harness.cs index 3138c1ec6dcb..7ef270839f8a 100644 --- a/tests/xharness/Harness.cs +++ b/tests/xharness/Harness.cs @@ -147,11 +147,23 @@ public string XcodeRoot { } } + Version xcode_version; + public Version XcodeVersion { + get { + if (xcode_version == null) { + var doc = new XmlDocument (); + doc.Load (Path.Combine (XcodeRoot, "Contents", "version.plist")); + xcode_version = Version.Parse (doc.SelectSingleNode ("//key[text() = 'CFBundleShortVersionString']/following-sibling::string").InnerText); + } + return xcode_version; + } + } + object mlaunch_lock = new object (); string DownloadMlaunch () { // NOTE: the filename part in the url must be unique so that the caching logic works properly. - var mlaunch_url = "http://bosstoragemirror.blob.core.windows.net/public-builder/mlaunch/mlaunch-af02fb1c25d31ff3c5b4a3753fdb4b1783294294.zip"; + var mlaunch_url = "https://dl.xamarin.com/uploads/3euiqmcoizk/mlaunch-18deb964b64886af65fb1760b19adeee58dd8bea.zip"; var extraction_dir = Path.Combine (Path.GetTempPath (), Path.GetFileNameWithoutExtension (mlaunch_url)); var mlaunch_path = Path.Combine (extraction_dir, "bin", "mlaunch"); diff --git a/tests/xharness/Jenkins.cs b/tests/xharness/Jenkins.cs index 59aaf34169ea..68b34c30baf0 100644 --- a/tests/xharness/Jenkins.cs +++ b/tests/xharness/Jenkins.cs @@ -469,6 +469,7 @@ async Task PopulateTasksAsync () foreach (var taskGroup in runSimulatorTasks.GroupBy ((RunSimulatorTask task) => task.Platform)) { Tasks.Add (new AggregatedRunSimulatorTask (taskGroup) { Jenkins = this, + TestName = $"Tests for {taskGroup.Key}", }); } @@ -1622,7 +1623,8 @@ function oninitialload () writer.Write ($""); writer.WriteLine ($"
"); @@ -1823,7 +1825,7 @@ abstract class TestTask public Jenkins Jenkins; public Harness Harness { get { return Jenkins.Harness; } } public TestProject TestProject; - public string ProjectFile { get { return TestProject.Path; } } + public string ProjectFile { get { return TestProject?.Path; } } public string ProjectConfiguration; public string ProjectPlatform; public Dictionary Environment = new Dictionary (); @@ -1906,6 +1908,8 @@ public virtual string TestName { return test_name; var rv = Path.GetFileNameWithoutExtension (ProjectFile); + if (rv == null) + return $"unknown test name ({GetType ().Name}"; switch (Platform) { case TestPlatform.Mac: case TestPlatform.Mac_Classic: @@ -2949,7 +2953,7 @@ public Task SelectSimulatorAsync () if (Platform == TestPlatform.watchOS) CompanionDevice = Jenkins.Simulators.FindCompanionDevice (Jenkins.SimulatorLoadLog, Device); - var clean_state = false;//Platform == TestPlatform.tvOS; + var clean_state = false;//Platform == TestPlatform.watchOS; runner = new AppRunner () { Harness = Harness, diff --git a/tests/xharness/Log.cs b/tests/xharness/Log.cs index 191d266f2be1..ecfc99f1873d 100644 --- a/tests/xharness/Log.cs +++ b/tests/xharness/Log.cs @@ -244,6 +244,11 @@ public void StartCapture () public void StopCapture () { + if (!File.Exists (CapturePath)) { + File.WriteAllText (Path, $"Could not capture the file '{CapturePath}' because it doesn't exist."); + return; + } + if (entire_file) { File.Copy (CapturePath, Path, true); return; diff --git a/tests/xharness/MakefileGenerator.cs b/tests/xharness/MakefileGenerator.cs index bad7f0a1b50c..d28f8abdca05 100644 --- a/tests/xharness/MakefileGenerator.cs +++ b/tests/xharness/MakefileGenerator.cs @@ -267,6 +267,7 @@ static string GetMakeName (this Target target, bool escape = true) public static void CreateMakefile (Harness harness, IEnumerable unified_targets, IEnumerable tvos_targets, IEnumerable watchos_targets, IEnumerable today_targets) { + var executeSim32 = !harness.InWrench; // Waiting for iOS 10.3 simulator to be installed on wrench var makefile = Path.Combine (harness.RootDirectory, "Makefile.inc"); using (var writer = new StreamWriter (makefile, false, new UTF8Encoding (false))) { writer.WriteLine (".stamp-configure-projects: Makefile xharness/xharness.exe"); @@ -368,7 +369,11 @@ public static void CreateMakefile (Harness harness, IEnumerable u writer.WriteLine (); writer.WriteTarget ("exec{0}-sim32-{1}", "$(UNIT_SERVER)", make_escaped_suffix, make_escaped_name); - writer.WriteLine ("\t$(Q) $(SYSTEM_MONO) --debug xharness/xharness.exe $(XHARNESS_VERBOSITY) --run \"{0}\" --target {1}-simulator-32 --sdkroot $(XCODE_DEVELOPER_ROOT) --logdirectory \"$(abspath $(CURDIR))/logs/$@\" --configuration $(CONFIG)", target.ProjectPath, target.Platform); + if (executeSim32) { + writer.WriteLine ("\t$(Q) $(SYSTEM_MONO) --debug xharness/xharness.exe $(XHARNESS_VERBOSITY) --run \"{0}\" --target {1}-simulator-32 --sdkroot $(XCODE_DEVELOPER_ROOT) --logdirectory \"$(abspath $(CURDIR))/logs/$@\" --configuration $(CONFIG)", target.ProjectPath, target.Platform); + } else { + writer.WriteLine ("\t$(Q) echo 'Execution of sim32 has been disabled.'"); + } writer.WriteLine (); } else { writer.WriteTarget ("exec{0}-sim{2}-{1}", "$(UNIT_SERVER)", make_escaped_suffix, make_escaped_name, target.MakefileWhereSuffix); diff --git a/tests/xharness/Process_Extensions.cs b/tests/xharness/Process_Extensions.cs index 66b9fcd88d57..9538393e2473 100644 --- a/tests/xharness/Process_Extensions.cs +++ b/tests/xharness/Process_Extensions.cs @@ -157,8 +157,8 @@ public static async Task KillTreeAsync (int pid, Log log, bool diagnostics = tru { var pids = new List (); GetChildrenPS (log, pids, pid); - log.WriteLine ($"Pids to kill: {string.Join (", ", pids.Select ((v) => v.ToString ()).ToArray ())}"); if (diagnostics) { + log.WriteLine ($"Pids to kill: {string.Join (", ", pids.Select ((v) => v.ToString ()).ToArray ())}"); using (var ps = new Process ()) { log.WriteLine ("Writing process list:"); ps.StartInfo.FileName = "ps"; diff --git a/tests/xharness/SimpleFileListener.cs b/tests/xharness/SimpleFileListener.cs new file mode 100644 index 000000000000..602a89fea633 --- /dev/null +++ b/tests/xharness/SimpleFileListener.cs @@ -0,0 +1,85 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace xharness +{ + public class SimpleFileListener : SimpleListener + { + Thread processor_thread; + bool cancel; + public string Path { get; private set; } + + public SimpleFileListener (string path) + { + Path = path; + } + + protected override void Stop () + { + cancel = true; + processor_thread.Join (); + processor_thread = null; + Finished (true); + } + + public override void Initialize () + { + processor_thread = new Thread (Processing); + } + + protected override void Start () + { + processor_thread.Start (); + } + + void Processing () + { + Connected ("N/A"); + using (var fs = new BlockingFileStream (Path) { Listener = this }) { + using (var reader = new StreamReader (fs)) { + string line; + while ((line = reader.ReadLine ()) != null) { + OutputWriter.WriteLine (line); + if (line.StartsWith ("[Runner executing:", StringComparison.Ordinal)) { + Log.WriteLine ("Tests have started executing"); + } else if (!XmlOutput && line.StartsWith ("Tests run: ", StringComparison.Ordinal)) { + Log.WriteLine ("Tests have finished executing"); + Finished (); + return; + } else if (XmlOutput && line == "") { + Log.WriteLine ("Tests have finished executing"); + Finished (); + return; + } + } + } + } + } + + class BlockingFileStream : FileStream + { + public SimpleFileListener Listener; + + long last_position; + + public BlockingFileStream (string path) + : base (path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite) + { + } + + public override int Read (byte [] array, int offset, int count) + { + while (last_position == base.Length && !Listener.cancel) + Thread.Sleep (25); + var rv = base.Read (array, offset, count); + last_position += rv; + return rv; + } + } + } +} + diff --git a/tests/xharness/SimpleHttpListener.cs b/tests/xharness/SimpleHttpListener.cs index 9ed0b6fd459b..29c9f42da90b 100644 --- a/tests/xharness/SimpleHttpListener.cs +++ b/tests/xharness/SimpleHttpListener.cs @@ -58,7 +58,7 @@ protected override void Start () try { server.Stop (); } finally { - stopped.Set (); + Finished (); } } } diff --git a/tests/xharness/SimpleListener.cs b/tests/xharness/SimpleListener.cs index c39d77550a7f..d55b4943d2fa 100644 --- a/tests/xharness/SimpleListener.cs +++ b/tests/xharness/SimpleListener.cs @@ -3,14 +3,16 @@ using System.IO; using System.Text; using System.Threading; +using System.Threading.Tasks; namespace xharness { public abstract class SimpleListener : IDisposable { StreamWriter output_writer; + string xml_data; - protected ManualResetEvent stopped = new ManualResetEvent (false); + TaskCompletionSource stopped = new TaskCompletionSource (); protected ManualResetEvent connected = new ManualResetEvent (false); public IPAddress Address { get; set; } @@ -18,6 +20,7 @@ public abstract class SimpleListener : IDisposable public Log Log { get; set; } public LogStream TestLog { get; set; } public bool AutoExit { get; set; } + public bool XmlOutput { get; set; } public abstract void Initialize (); protected abstract void Start (); @@ -36,17 +39,44 @@ protected void Connected (string remote) if (output_writer == null) { output_writer = TestLog.GetWriter (); - // a few extra bits of data only available from this side - output_writer.WriteLine ($"[Local Date/Time:\t{DateTime.Now}]"); - output_writer.WriteLine ($"[Remote Address:\t{remote}]"); + var local_data = +$@"[Local Date/Time: {DateTime.Now}] +[Remote Address: {remote}]"; + if (XmlOutput) { + xml_data = local_data; + } else { + output_writer.WriteLine (local_data); + } + } + } + + protected void Finished (bool early_termination = false) + { + if (stopped.TrySetResult (early_termination)) { + if (early_termination) { + Log.WriteLine ("Tests were terminated before completion"); + } else { + Log.WriteLine ("Tests have finished executing"); + } + if (xml_data != null) { + output_writer.WriteLine ($""); + output_writer.Flush (); + xml_data = null; + } } } public void StartAsync () { - var t = new Thread (Start) + var t = new Thread (() => { + try { + Start (); + } catch (Exception e) { + Console.WriteLine ($"{GetType ().Name}: an exception occurred in processing thread: {e}"); + } + }) { IsBackground = true, }; @@ -60,14 +90,14 @@ public bool WaitForConnection (TimeSpan ts) public bool WaitForCompletion (TimeSpan ts) { - return stopped.WaitOne (ts); + return stopped.Task.Wait (ts); } public void Cancel () { try { // wait a second just in case more data arrives. - if (!stopped.WaitOne (TimeSpan.FromSeconds (1))) + if (!stopped.Task.Wait (TimeSpan.FromSeconds (1))) Stop (); } catch { // We might have stopped already, so just ignore any exceptions. diff --git a/tests/xharness/SimpleTcpListener.cs b/tests/xharness/SimpleTcpListener.cs index c768d4ddc7e3..4b8802b56fdd 100644 --- a/tests/xharness/SimpleTcpListener.cs +++ b/tests/xharness/SimpleTcpListener.cs @@ -45,7 +45,7 @@ protected override void Start () try { server.Stop (); } finally { - stopped.Set (); + Finished (); } } } diff --git a/tests/xharness/Simulators.cs b/tests/xharness/Simulators.cs index b32b724ec16e..3996cbd1b067 100644 --- a/tests/xharness/Simulators.cs +++ b/tests/xharness/Simulators.cs @@ -113,7 +113,7 @@ public async Task FindAsync (AppRunnerTarget target, Log log) switch (target) { case AppRunnerTarget.Simulator_iOS32: simulator_devicetypes = new string [] { "com.apple.CoreSimulator.SimDeviceType.iPhone-5" }; - simulator_runtime = "com.apple.CoreSimulator.SimRuntime.iOS-" + Xamarin.SdkVersions.iOS.Replace ('.', '-'); + simulator_runtime = "com.apple.CoreSimulator.SimRuntime.iOS-10-3"; break; case AppRunnerTarget.Simulator_iOS64: simulator_devicetypes = new string [] { "com.apple.CoreSimulator.SimDeviceType.iPhone-6" }; @@ -286,7 +286,7 @@ public bool MoveNext () if (devices == null) devices = Enumerable.Simulators.FindAsync (Enumerable.Target, Enumerable.Log).Result; moved = true; - return moved && devices?.Length > 0; + return devices?.Length > 0; } public void Reset () @@ -350,7 +350,7 @@ public static async Task KillEverythingAsync (Log log) { await ProcessHelper.ExecuteCommandAsync ("launchctl", "remove com.apple.CoreSimulator.CoreSimulatorService", log, TimeSpan.FromSeconds (10)); - var to_kill = new string [] { "iPhone Simulator", "iOS Simulator", "Simulator", "Simulator (Watch)", "com.apple.CoreSimulator.CoreSimulatorService" }; + var to_kill = new string [] { "iPhone Simulator", "iOS Simulator", "Simulator", "Simulator (Watch)", "com.apple.CoreSimulator.CoreSimulatorService", "ibtoold" }; await ProcessHelper.ExecuteCommandAsync ("killall", "-9 " + string.Join (" ", to_kill.Select ((v) => StringUtils.Quote (v)).ToArray ()), log, TimeSpan.FromSeconds (10)); @@ -422,7 +422,7 @@ async Task OpenSimulator (Log log) { string simulator_app; - if (IsWatchSimulator) { + if (IsWatchSimulator && Harness.XcodeVersion.Major < 9) { simulator_app = Path.Combine (Harness.XcodeRoot, "Contents", "Developer", "Applications", "Simulator (Watch).app"); } else { simulator_app = Path.Combine (Harness.XcodeRoot, "Contents", "Developer", "Applications", "Simulator.app"); diff --git a/tests/xharness/Target.cs b/tests/xharness/Target.cs index 4fa5215b8bf9..43d67edda111 100644 --- a/tests/xharness/Target.cs +++ b/tests/xharness/Target.cs @@ -107,7 +107,10 @@ protected virtual void ProcessProject () protected void CreateExecutableProject () { ProcessProject (); - if (!Harness.Mac) { + if (Harness.Mac) { + ProjectGuid = "{" + Harness.NewStableGuid ().ToString ().ToUpper () + "}"; + inputProject.SetProjectGuid (ProjectGuid); + } else { inputProject.FixArchitectures (SimulatorArchitectures, DeviceArchitectures); inputProject.FixInfoPListInclude (Suffix); inputProject.SetExtraLinkerDefs ("extra-linker-defs" + Suffix + ".xml"); diff --git a/tests/xharness/xharness.csproj b/tests/xharness/xharness.csproj index 294a69255f9b..7d18da0e98fd 100644 --- a/tests/xharness/xharness.csproj +++ b/tests/xharness/xharness.csproj @@ -82,11 +82,7 @@ StringUtils.cs - - - - nunit-summary.xslt - + diff --git a/tests/xtro-sharpie/EnumCheck.cs b/tests/xtro-sharpie/EnumCheck.cs index 388f514a0ae2..fe0e05e92e63 100644 --- a/tests/xtro-sharpie/EnumCheck.cs +++ b/tests/xtro-sharpie/EnumCheck.cs @@ -22,7 +22,9 @@ public override void VisitManagedType (TypeDefinition type) // e.g. WatchKit.WKErrorCode and WebKit.WKErrorCode :-( if (!enums.TryGetValue (name, out td)) enums.Add (name, type); - else { + else if (td.Namespace.StartsWith ("OpenTK.", StringComparison.Ordinal)) { + // OpenTK duplicate a lots of enums between it's versions + } else { Console.WriteLine ("!duplicate-type-name! {0} enum exists as both {1} and {2}", name, type.FullName, td.FullName); } } @@ -74,6 +76,7 @@ public override void VisitEnumDecl (EnumDecl decl, VisitKind visitKind) case "OptionBits": // UInt32 case "long": case "FourCharCode": + case "OSStatus": break; case "int64_t": case "uint64_t": diff --git a/tests/xtro-sharpie/Helpers.cs b/tests/xtro-sharpie/Helpers.cs index aa5a89eafad8..dad43bd7f97a 100644 --- a/tests/xtro-sharpie/Helpers.cs +++ b/tests/xtro-sharpie/Helpers.cs @@ -13,6 +13,7 @@ public static class Helpers { // the original name can be lost and, if not registered (e.g. enums), might not be available static Dictionary map = new Dictionary () { { "CFURLPathStyle", "CFUrlPathStyle" }, + { "CIDataMatrixCodeECCVersion", "CIDataMatrixCodeEccVersion" }, { "CXPlayDTMFCallActionType", "CXPlayDtmfCallActionType" }, { "EABluetoothAccessoryPickerErrorCode", "EABluetoothAccessoryPickerError" }, { "EKCalendarEventAvailabilityMask", "EKCalendarEventAvailability" }, @@ -39,6 +40,7 @@ public static class Helpers { { "NEVPNIKEv2IntegrityAlgorithm", "NEVpnIke2IntegrityAlgorithm" }, { "NEVPNStatus", "NEVpnStatus" }, { "NSAttributedStringEnumerationOptions", "NSAttributedStringEnumeration" }, + { "NSFileProviderErrorCode", "NSFileProviderError" }, { "NSHTTPCookieAcceptPolicy", "NSHttpCookieAcceptPolicy" }, { "NSISO8601DateFormatOptions", "NSIso8601DateFormatOptions" }, { "NSJSONReadingOptions", "NSJsonReadingOptions" }, @@ -52,11 +54,16 @@ public static class Helpers { { "NSURLRequestCachePolicy", "NSUrlRequestCachePolicy" }, { "NSURLRequestNetworkServiceType", "NSUrlRequestNetworkServiceType" }, { "NSURLSessionAuthChallengeDisposition", "NSUrlSessionAuthChallengeDisposition" }, + { "NSURLSessionMultipathServiceType", "NSUrlSessionMultipathServiceType" }, { "NSURLSessionResponseDisposition", "NSUrlSessionResponseDisposition" }, { "NSURLSessionTaskMetricsResourceFetchType", "NSUrlSessionTaskMetricsResourceFetchType" }, { "NSURLSessionTaskState", "NSUrlSessionTaskState" }, { "NWTCPConnectionState", "NWTcpConnectionState" }, { "NWUDPSessionState", "NWUdpSessionState" }, + { "PDFDisplayDirection", "PdfDisplayDirection" }, + { "PDFInterpolationQuality", "PdfInterpolationQuality" }, + { "PDFThumbnailLayoutMode", "PdfThumbnailLayoutMode" }, + { "PDFWidgetCellState", "PdfWidgetCellState" }, { "RPRecordingErrorCode", "RPRecordingError" }, { "SecTrustResultType", "SecTrustResult" }, { "SKErrorCode", "SKError" }, @@ -69,6 +76,7 @@ public static class Helpers { { "WatchKitErrorCode", "WKErrorCode" }, // WebKit already had that name // not enums { "NSMutableURLRequest", "NSMutableUrlRequest" }, + { "UIImagePickerControllerImageURLExportPreset", "UIImagePickerControllerImageUrlExportPreset" }, }; public static string GetManagedName (string nativeName) @@ -84,7 +92,15 @@ public static string ReplaceFirstInstance (this string source, string find, stri return index < 0 ? source : source.Substring (0, index) + replace + source.Substring (index + find.Length); } - public static string Platform { get; set; } + public enum Platforms + { + macOS, + iOS, + watchOS, + tvOS, + } + + public static Platforms Platform { get; set; } public static bool IsAvailable (this Decl decl) { @@ -93,20 +109,29 @@ public static bool IsAvailable (this Decl decl) // some categories are not decorated (as not available) but they extend types that are if (!result.HasValue) { - var category = (decl.DeclContext as ObjCCategoryDecl); + // first check if we're checking the category itself + var category = decl as ObjCCategoryDecl; if (category != null) result = category.ClassInterface.IsAvailable (Platform); + + if (!result.HasValue) { + // then check if we're a method inside a category + category = (decl.DeclContext as ObjCCategoryDecl); + if (category != null) + result = category.ClassInterface.IsAvailable (Platform); + } } // but right now most frameworks consider tvOS and watchOS like iOS unless // decorated otherwise so we must check again if we do not get a definitve answer - if ((result == null) && ((Platform == "tvos") || (Platform == "watchos"))) - result = decl.IsAvailable ("ios"); + if ((result == null) && ((Platform == Platforms.tvOS) || (Platform == Platforms.watchOS))) + result = decl.IsAvailable (Platforms.iOS); return !result.HasValue ? true : result.Value; } - static bool? IsAvailable (this Decl decl, string platform) + static bool? IsAvailable (this Decl decl, Platforms platform_value) { + var platform = platform_value.ToString ().ToLowerInvariant (); bool? result = null; foreach (var attr in decl.Attrs) { // NS_UNAVAILABLE @@ -165,7 +190,8 @@ public static string GetName (this ObjCMethodDecl self) sb.Append ('+'); sb.Append ((self.DeclContext as NamedDecl).Name); sb.Append ("::"); - sb.Append (self.Selector); + var sel = self.Selector.ToString (); + sb.Append (string.IsNullOrEmpty (sel) ? self.Name : sel); return sb.ToString (); } @@ -189,6 +215,10 @@ public static string GetName (this TypeDefinition self) if (ca.HasConstructorArguments) return (ca.ConstructorArguments [0].Value as string); return self.Name; + } else if (ca.Constructor.DeclaringType.Name == "ProtocolAttribute") { + if (ca.HasConstructorArguments) + return (ca.ConstructorArguments [0].Value as string); + return self.Name; } } } @@ -242,5 +272,47 @@ public static string GetSelector (this ObjCMethodDecl self) { return self.Selector.ToString () ?? (self.IsPropertyAccessor ? self.Name : null); } + + public static bool IsObsolete (this ICustomAttributeProvider provider) + { + if (provider.HasCustomAttributes) { + foreach (var attrib in provider.CustomAttributes) { + var attribType = attrib.Constructor.DeclaringType; + if (attribType.Namespace == "System" && attribType.Name == "ObsoleteAttribute") + return true; + } + } + + // If we're a property accessor, check the property as well. + var prop = FindProperty (provider as MethodReference); + if (prop != null) + return IsObsolete (prop); + + return false; + } + + public static PropertyDefinition FindProperty (this MethodReference method) + { + var def = method?.Resolve (); + if (def == null) + return null; + + if (!def.IsSpecialName) + return null; + + if (!def.DeclaringType.HasProperties) + return null; + + if (!method.Name.StartsWith ("get_", StringComparison.Ordinal) && !method.Name.StartsWith ("set_", StringComparison.Ordinal)) + return null; + + var propName = method.Name.Substring (4); + foreach (var prop in def.DeclaringType.Properties) { + if (prop.Name == propName) + return prop; + } + + return null; + } } } \ No newline at end of file diff --git a/tests/xtro-sharpie/Makefile b/tests/xtro-sharpie/Makefile index 6c1658333af1..496afe19d1a6 100644 --- a/tests/xtro-sharpie/Makefile +++ b/tests/xtro-sharpie/Makefile @@ -6,28 +6,22 @@ include $(TOP)/Make.config MONO ?= mono64 --debug all-local:: run-ios run-osx run-watchos run-tvos classify - -sharpie: sharpie-ios sharpie-osx sharpie-watchos sharpie-tvos classify clean-local:: rm -f ios.results osx.results watchos.results tvos.results *.tmp rm -rf *os*.pch* - -bin/Debug/xtro-sharpie.exe ./bin/Debug/xtro-plugin.dll build: - xbuild - +bin/Debug/xtro-sharpie.exe build: + $(Q_BUILD) msbuild $(XBUILD_VERBOSITY) xtro-sharpie.sln + XIOS ?= $(TOP)/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/64bits/Xamarin.iOS.dll XIOS_GL ?= $(TOP)/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/mono/Xamarin.iOS/OpenTK-1.0.dll XIOS_ARCH = arm64 XIOS_PCH = iphoneos$(IOS_SDK_VERSION)-$(XIOS_ARCH).pch -run-ios: build $(XIOS_PCH) +ios.results run-ios: build $(XIOS_PCH) $(MONO) bin/Debug/xtro-sharpie.exe $(XIOS_PCH) $(XIOS) $(XIOS_GL) | sort > ios.results -sharpie-ios: build $(XIOS_PCH) - sharpie ./bin/Debug/xtro-plugin.dll extro $(XIOS_PCH) $(XIOS) $(XIOS_GL) | sort > ios.results - $(XIOS_PCH): sharpie sdk-db -s iphoneos$(IOS_SDK_VERSION) -a $(XIOS_ARCH) @@ -36,12 +30,9 @@ XWATCHOS ?= $(TOP)/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/ XWATCHOS_ARCH = armv7 XWATCHOS_PCH = watchos$(WATCH_SDK_VERSION)-$(XWATCHOS_ARCH).pch -run-watchos: build $(XWATCHOS_PCH) +watchos.results run-watchos: build $(XWATCHOS_PCH) $(MONO) bin/Debug/xtro-sharpie.exe $(XWATCHOS_PCH) $(XWATCHOS) | sort > watchos.results -sharpie-watchos: build $(XWATCHOS_PCH) - sharpie ./bin/Debug/xtro-plugin.dll extro $(XWATCHOS_PCH) $(XWATCHOS) | sort > watchos.results - $(XWATCHOS_PCH): sharpie sdk-db -s watchos$(WATCH_SDK_VERSION) -a $(XWATCHOS_ARCH) @@ -51,12 +42,9 @@ XTVOS_GL ?= $(TOP)/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/ XTVOS_ARCH = arm64 XTVOS_PCH = appletvos$(TVOS_SDK_VERSION)-$(XTVOS_ARCH).pch -run-tvos: build $(XTVOS_PCH) +tvos.results run-tvos: build $(XTVOS_PCH) $(MONO) bin/Debug/xtro-sharpie.exe $(XTVOS_PCH) $(XTVOS) $(XTVOS_GL) | sort > tvos.results -sharpie-tvos: build $(XTVOS_PCH) - sharpie ./bin/Debug/xtro-plugin.dll extro $(XTVOS_PCH) $(XTVOS) $(XTVOS_GL) | sort > tvos.results - $(XTVOS_PCH): sharpie sdk-db -s appletvos$(TVOS_SDK_VERSION) -a $(XTVOS_ARCH) @@ -65,34 +53,31 @@ XMAC ?= $(TOP)/_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/git/ XMAC_ARCH = x86_64 XMAC_PCH = macosx$(OSX_SDK_VERSION)-$(XMAC_ARCH).pch -run-osx: build $(XMAC_PCH) +osx.results run-osx: build $(XMAC_PCH) $(MONO) bin/Debug/xtro-sharpie.exe $(XMAC_PCH) $(XMAC) | sort > osx.results -sharpie-osx: build $(XMAC_PCH) - sharpie ./bin/Debug/xtro-plugin.dll extro $(XMAC_PCH) $(XMAC) | sort > osx.results - $(XMAC_PCH): - sharpie sdk-db -s macosx$(OSX_SDK_VERSION) -a $(XMAC_ARCH) + sharpie sdk-db -s macosx$(OSX_SDK_VERSION) -a $(XMAC_ARCH) -x InputMethodKit preclassify: ios.results osx.results @comm -12 ios.results osx.results > common.unclassified.tmp -classify-ios: preclassify +classify-ios: preclassify ios.results @sort ios.ignore ios.pending common.ignore common.pending > ios.skip.tmp @comm -23 ios.results common.unclassified.tmp > ios.unclassified.tmp @comm -23 ios.unclassified.tmp ios.skip.tmp > ios.unclassified -classify-tvos: preclassify +classify-tvos: preclassify tvos.results @sort tvos.ignore tvos.pending ios.ignore ios.pending common.ignore common.pending > tvos.skip.tmp @comm -23 tvos.results common.unclassified.tmp > tvos.unclassified.tmp @comm -23 tvos.unclassified.tmp tvos.skip.tmp > tvos.unclassified -classify-watchos: preclassify +classify-watchos: preclassify watchos.results @sort watchos.ignore watchos.pending common.ignore common.pending > watchos.skip.tmp @comm -23 watchos.results common.unclassified.tmp > watchos.unclassified.tmp @comm -23 watchos.unclassified.tmp watchos.skip.tmp > watchos.unclassified -classify-osx: preclassify +classify-osx: preclassify osx.results @sort osx.ignore osx.pending common.ignore common.pending > osx.skip.tmp @comm -23 osx.results common.unclassified.tmp > osx.unclassified.tmp @comm -23 osx.unclassified.tmp osx.skip.tmp > osx.unclassified diff --git a/tests/xtro-sharpie/ObjCProtocolCheck.cs b/tests/xtro-sharpie/ObjCProtocolCheck.cs index 56e957d2971c..18f6f90ef92a 100644 --- a/tests/xtro-sharpie/ObjCProtocolCheck.cs +++ b/tests/xtro-sharpie/ObjCProtocolCheck.cs @@ -93,6 +93,7 @@ public override void VisitObjCProtocolDecl (ObjCProtocolDecl decl, VisitKind vis string s_export = null; bool is_required = false; bool is_property = false; + bool is_static = false; switch (ca.Constructor.DeclaringType.Name) { case "ProtocolMemberAttribute": foreach (var p in ca.Properties) { @@ -112,18 +113,28 @@ public override void VisitObjCProtocolDecl (ObjCProtocolDecl decl, VisitKind vis case "IsProperty": is_property = (bool)p.Argument.Value; break; + case "IsStatic": + is_static = (bool)p.Argument.Value; + break; } } break; } if (is_property) { - if (g_export != null) + if (g_export != null) { + if (is_static) + g_export = "+" + g_export; map.Add (g_export, is_required); - if (s_export != null) + } + if (s_export != null) { + if (is_static) + s_export = "+" + s_export; map.Add (s_export, is_required); - } else { - if (export != null) - map.Add (export, is_required); + } + } else if (export != null) { + if (is_static) + export = "+" + export; + map.Add (export, is_required); } } @@ -143,6 +154,9 @@ public override void VisitObjCProtocolDecl (ObjCProtocolDecl decl, VisitKind vis if (IsInit (selector)) continue; + if (method.IsClassMethod) + selector = "+" + selector; + bool is_abstract; if (map.TryGetValue (selector, out is_abstract)) { bool required = method.ImplementationControl == ObjCImplementationControl.Required; diff --git a/tests/xtro-sharpie/Runner.cs b/tests/xtro-sharpie/Runner.cs index 2f93f4906bc5..c25634fb3a02 100644 --- a/tests/xtro-sharpie/Runner.cs +++ b/tests/xtro-sharpie/Runner.cs @@ -25,18 +25,19 @@ public void Execute (string pchFile, IEnumerable assemblyNames) new ObjCInterfaceCheck (), new ObjCProtocolCheck (), new SelectorCheck (), + new SimdCheck (), // new ListNative (), // for debug }; foreach (var assemblyName in assemblyNames) { var name = Path.GetFileNameWithoutExtension (assemblyName); if (name.EndsWith (".iOS", StringComparison.Ordinal)) - Helpers.Platform = "ios"; + Helpers.Platform = Helpers.Platforms.iOS; else if (name.EndsWith (".Mac", StringComparison.Ordinal)) - Helpers.Platform = "osx"; + Helpers.Platform = Helpers.Platforms.macOS; else if (name.EndsWith (".WatchOS", StringComparison.Ordinal)) - Helpers.Platform = "watchos"; + Helpers.Platform = Helpers.Platforms.watchOS; else if (name.EndsWith (".TVOS", StringComparison.Ordinal)) - Helpers.Platform = "tvos"; + Helpers.Platform = Helpers.Platforms.tvOS; managed_reader.Load (assemblyName); } @@ -60,7 +61,7 @@ class ModuleExclusionList { "IOBluetooth", "IOBluetoothUI", "PubSub", "CryptoTokenKit", "DiscRecording", "DiscRecordingUI", "ImageCaptureCore", "OSAKit", "AudioVideoBridging", "Automator", "ImageCapture", // Maybe? - "ICADevices", "OpenDirectory", "IMServicePlugIn", "PreferencePanes", "ScreenSaver", + "ICADevices", "OpenDirectory", "IMServicePlugIn", "PreferencePanes", "ScreenSaver", "CoreMediaIO", "SecurityInterface", // Nope "InstallerPlugins", "JavaVM", "ExceptionHandling", "JavaFrameEmbedding", @@ -74,7 +75,7 @@ static IEnumerable ExclusionList { get { if (_exclusionList == null) { switch (Helpers.Platform) { - case "osx": + case Helpers.Platforms.macOS: _exclusionList = macOSXExclusionList; break; default: @@ -193,18 +194,19 @@ class ListNative : BaseVisitor { public override void VisitDecl (Decl decl) { - if (decl is FunctionDecl) + if (decl is FunctionDecl) { ; - else if (decl is VarDecl) + } else if (decl is VarDecl) { ; - else if (decl is ObjCProtocolDecl) + } else if (decl is ObjCProtocolDecl) { ; - else if (decl is ObjCInterfaceDecl) + } else if (decl is ObjCInterfaceDecl) { ; - else if (decl is EnumDecl) + } else if (decl is EnumDecl) { ; - else + } else { Console.WriteLine ("{0}\t{1}", decl, decl.GetType ().Name); + } } } } diff --git a/tests/xtro-sharpie/SharpieEntryPoint.cs b/tests/xtro-sharpie/SharpieEntryPoint.cs deleted file mode 100644 index 8216c3ea79ce..000000000000 --- a/tests/xtro-sharpie/SharpieEntryPoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -using Sharpie; -using Sharpie.Tooling; - -namespace Extrospection { - - [Tool ("extro", "Run extrospection tests", 500)] - public class SharpieEntryPoint : CommonTool { - - protected override void Run () - { - // ensure Mono.Cecil.dll will be in the directory where this is built - typeof (Mono.Cecil.AssemblyDefinition).ToString (); - - base.Run (); - - var pch = PositionalArguments.DequeueOrDefault (); - if (pch == null || !File.Exists (pch)) - throw new ExitException ("Precompiled header file (pch) must be specified"); - - var assemblies = new List (); - while (PositionalArguments.Count > 0) { - var dll = PositionalArguments.DequeueOrDefault (); - if (dll == null || !File.Exists (dll)) - throw new ExitException ("Assembly file (dll) must be specified"); - - assemblies.Add (dll); - } - new Runner ().Execute (pch, assemblies); - } - } -} \ No newline at end of file diff --git a/tests/xtro-sharpie/SimdCheck.cs b/tests/xtro-sharpie/SimdCheck.cs new file mode 100644 index 000000000000..be487ca64193 --- /dev/null +++ b/tests/xtro-sharpie/SimdCheck.cs @@ -0,0 +1,385 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using Mono.Cecil; + +using Clang.Ast; + +namespace Extrospection +{ + + class SimdCheck : BaseVisitor + { + bool very_strict = false; + bool strict = false; + + // A dictionary of native type -> managed type mapping. + class NativeSimdInfo + { + public string Managed; + public string InvalidManaged; + } + + static Dictionary type_mapping = new Dictionary () { + { "matrix_double2x2", new NativeSimdInfo { Managed ="MatrixDouble2x2", InvalidManaged = "Matrix2d" }}, + { "matrix_double3x3", new NativeSimdInfo { Managed = "MatrixDouble3x3", InvalidManaged = "Matrix3d" }}, + { "matrix_double4x4", new NativeSimdInfo { Managed = "MatrixDouble4x4", InvalidManaged = "Matrix4d" }}, + { "matrix_float2x2", new NativeSimdInfo { Managed = "MatrixFloat2x2", InvalidManaged = "Matrix2", }}, + { "matrix_float3x3", new NativeSimdInfo { Managed = "MatrixFloat3x3", InvalidManaged = "Matrix3", }}, + { "matrix_float4x3", new NativeSimdInfo { Managed = "MatrixFloat4x3", }}, + { "matrix_float4x4", new NativeSimdInfo { Managed = "MatrixFloat4x4", InvalidManaged = "Matrix4", }}, + { "simd_quatd", new NativeSimdInfo { Managed = "Quaternion4d", }}, + { "simd_quatf", new NativeSimdInfo { Managed = "Quaternion4", }}, + { "vector_double2", new NativeSimdInfo { Managed = "Vector2d", }}, + { "vector_double3", new NativeSimdInfo { Managed = "Vector3d", }}, + { "vector_double4", new NativeSimdInfo { Managed = "Vector4d", }}, + { "vector_float2", new NativeSimdInfo { Managed = "Vector2", }}, + { "vector_float3", new NativeSimdInfo { Managed = "Vector3", }}, + { "vector_float4", new NativeSimdInfo { Managed = "Vector4", }}, + { "vector_int2", new NativeSimdInfo { Managed = "Vector2i", }}, + { "vector_int3", new NativeSimdInfo { Managed = "Vector3i", }}, + { "vector_int4", new NativeSimdInfo { Managed = "Vector4i", }}, + { "vector_uint2", new NativeSimdInfo { Managed = "Vector2i", }}, + { "vector_uint3", new NativeSimdInfo { Managed = "Vector3i", }}, + { "vector_uint4", new NativeSimdInfo { Managed = "Vector4i", }}, + // simd_floatX is typedefed to vector_floatX + { "simd_float2", new NativeSimdInfo { Managed = "Vector2" }}, + { "simd_float3", new NativeSimdInfo { Managed = "Vector3" }}, + { "simd_float4", new NativeSimdInfo { Managed = "Vector4" }}, + { "simd_float4x4", new NativeSimdInfo { Managed = "MatrixFloat4x4", InvalidManaged = "Matrix4" }}, + // The native definition is two 'vector_float2' fields. + // The managed definition matches this (two 'Vector2' fields), and should work fine. + { "GKQuad", new NativeSimdInfo { Managed = "GKQuad" }}, + // The native definition is two 'vector_float3' fields. + // In this case each element uses 16 bytes (4 floats) due to padding. + // The managed definition is two Vector3 fields, and does *not* + // match the native definition (missing the padding). + // It still works because we're marshalling this struct manually ([MarshalDirective]). + { "GKBox", new NativeSimdInfo { Managed = "GKBox", }}, + // The native definition is 'vector_float3 points[3]' - an array of three vector_float3. + // In this case each element uses 16 bytes (4 floats) due to padding. + // The managed definition is just an array of Vector3, but luckily + // it's a private field, so we might be able to improve this later. Right now we're marshalling + // this struct manually ([MarshalDirective]), so managed code should get correct + // results. + { "GKTriangle", new NativeSimdInfo { Managed = "GKTriangle", }}, + // This is a 'vector_int4, represented by a Vector4i in managed code, + // which means it's matching the native definition. + { "MDLVoxelIndex", new NativeSimdInfo { Managed = "MDLVoxelIndex" }}, + // In managed code this is struct of two Vector4, so it's matching the native definition. + { "MDLVoxelIndexExtent", new NativeSimdInfo { Managed = "MDLVoxelIndexExtent" }}, + // In managed code this is a struct of two Vector3, so it's *not* matching + // the native definition. However, since we're manually marshalling this type + // (using [MarshalDirective]), managed code doesn't get incorrect results. + { "MDLAxisAlignedBoundingBox", new NativeSimdInfo { Managed = "MDLAxisAlignedBoundingBox", }}, + // The managed definition is identical to the native definition + { "MPSImageHistogramInfo", new NativeSimdInfo { Managed = "MPSImageHistogramInfo" }}, + }; + + static Dictionary managed_simd_types; // bool: invalid_for_simd + + static SimdCheck () + { + managed_simd_types = new Dictionary (); + foreach (var kvp in type_mapping) { + managed_simd_types [kvp.Value.Managed] = false; + if (!string.IsNullOrEmpty (kvp.Value.InvalidManaged)) + managed_simd_types [kvp.Value.InvalidManaged] = true; + } + } + + class ManagedSimdInfo + { + public MethodDefinition Method; + public bool ContainsInvalidMappingForSimd; + } + Dictionary managed_methods = new Dictionary (); + + public override void VisitManagedMethod (MethodDefinition method) + { + var type = method.DeclaringType; + + if (!type.IsNested && type.IsNotPublic) + return; + + if (type.IsNested && (type.IsNestedPrivate || type.IsNestedAssembly || type.IsNestedFamilyAndAssembly)) + return; + + if (method.IsPrivate || method.IsAssembly || method.IsFamilyAndAssembly) + return; // Don't care about non-visible types + + if (type.Namespace == "Simd" || type.Namespace.StartsWith ("OpenTK", StringComparison.Ordinal)) + return; // We're assuming everything in the Simd and OpenTK namespaces can be ignored (the former because it's correctly written, the latter because it doesn't map to native simd types). + + if (method.HasCustomAttributes && method.CustomAttributes.Where ((v) => v.Constructor.DeclaringType.Name == "ExtensionAttribute").Any ()) + return; // Extension methods can't be mapped. + + var invalid_simd_type = false; + var contains_simd_types = ContainsSimdTypes (method, ref invalid_simd_type); + + var key = method.GetName (); + if (key == null) { + if (method.IsObsolete ()) + return; // Don't care about obsolete API. + + if (contains_simd_types && very_strict) { + // We can't map this method to a native function. + Console.WriteLine ($"!missing-simd-native-signature! {method}"); + } + return; + } + + ManagedSimdInfo existing; + if (managed_methods.TryGetValue (key, out existing)) { + if (very_strict) + Console.WriteLine ($"!duplicate-type-mapping! same key '{key}' for both '{existing.Method}' and '{method}'"); + } else { + managed_methods [key] = new ManagedSimdInfo { + Method = method, ContainsInvalidMappingForSimd = invalid_simd_type + }; + } + } + + bool ContainsSimdTypes (MethodDefinition method, ref bool invalid_for_simd) + { + if (IsSimdType (method.ReturnType, ref invalid_for_simd)) + return true; + + if (method.HasParameters) { + foreach (var param in method.Parameters) + if (IsSimdType (param.ParameterType, ref invalid_for_simd)) + return true; + } + + return false; + } + + bool IsSimdType (TypeReference td, ref bool invalid_for_simd) + { + return managed_simd_types.TryGetValue (td.Name, out invalid_for_simd); + } + + bool ContainsSimdTypes (ObjCMethodDecl decl, ref string simd_type, ref bool requires_marshal_directive) + { + if (IsSimdType (decl.ReturnQualType, ref simd_type, ref requires_marshal_directive)) + return true; + + var is_simd_type = false; + foreach (var param in decl.Parameters) + is_simd_type |= IsSimdType (param.QualType, ref simd_type, ref requires_marshal_directive); + + return is_simd_type; + } + + bool IsExtVector (QualType type, ref string simd_type) + { + var rv = false; + var t = type.CanonicalQualType.Type; + + // Unpoint the type + var pointerType = t as Clang.Ast.PointerType; + if (pointerType != null) + t = pointerType.PointeeQualType.Type; + + if (t.Kind == TypeKind.ExtVector) { + rv = true; + } else { + var r = (t as RecordType)?.Decl; + if (r != null) { + foreach (var f in r.Fields) { + var qt = f.QualType.CanonicalQualType.Type; + if (qt.Kind == TypeKind.ExtVector) { + rv = true; + break; + } + var at = qt as ConstantArrayType; + if (at != null) { + if (at.ElementType.Type.Kind == TypeKind.ExtVector) { + rv = true; + break; + } + } + } + } + } + + var typeName = type.ToString (); + + if (!rv && typeName.Contains ("simd")) + Console.WriteLine ($"!unknown-simd-type! Could not detect that {typeName} is a Simd type, but its name contains 'simd'. Something needs fixing in SimdCheck.cs"); + + if (rv) + simd_type = typeName; + + return rv; + } + + bool IsSimdType (QualType type, ref string simd_type, ref bool requires_marshal_directive) + { + var str = Undecorate (type.ToString ()); + + if (type_mapping.TryGetValue (str, out var info)) { + requires_marshal_directive = true; + simd_type = str; + return true; + } + + if (IsExtVector (type, ref simd_type)) + Console.WriteLine ($"!unknown-simd-type-mapping! The Simd type {simd_type} does not have a mapping to a managed type. Please add one in SimdCheck.cs"); + + return false; + } + + string Undecorate (string native_name) + { + if (native_name.StartsWith ("const ", StringComparison.Ordinal)) + return Undecorate (native_name.Substring ("const ".Length)); + + if (native_name.StartsWith ("struct ", StringComparison.Ordinal)) + return Undecorate (native_name.Substring ("struct ".Length)); + + const string _Nonnull = " _Nonnull"; + if (native_name.EndsWith (_Nonnull, StringComparison.Ordinal)) + return Undecorate (native_name.Substring (0, native_name.Length - _Nonnull.Length)); + + const string _Nullable = " _Nullable"; + if (native_name.EndsWith (_Nullable, StringComparison.Ordinal)) + return Undecorate (native_name.Substring (0, native_name.Length - _Nullable.Length)); + + const string _star = " *"; + if (native_name.EndsWith (_star, StringComparison.Ordinal)) + return Undecorate (native_name.Substring (0, native_name.Length - _star.Length)); + + return native_name; + } + + bool HasMarshalDirective (ICustomAttributeProvider provider) + { + if (provider?.HasCustomAttributes != true) + return false; + + foreach (var ca in provider.CustomAttributes) + if (ca.Constructor.DeclaringType.Name == "MarshalDirective") + return true; + + return false; + } + + void CheckMarshalDirective (MethodDefinition method, string simd_type) + { + if (!method.HasBody) + return; + + if (method.IsObsolete ()) + return; + + // The [MarshalDirective] attribute isn't copied to the generated code, + // so instead apply some heuristics and detect calls to the xamarin_simd__ P/Invoke, + // and if there are any, then assume the method binding has a [MarshalDirective]. + var body = method.Body; + var anyCalls = false; + foreach (var i in body.Instructions) { + switch (i.OpCode.Code) { + case Mono.Cecil.Cil.Code.Call: + case Mono.Cecil.Cil.Code.Calli: + case Mono.Cecil.Cil.Code.Callvirt: + var mr = i.Operand as MethodReference; + if (mr != null) { + if (mr.Name.StartsWith ("xamarin_simd__", StringComparison.Ordinal)) + return; + if (mr.Name.StartsWith ("xamarin_vector_float3__", StringComparison.Ordinal)) + return; + } + anyCalls = true; + break; + default: + break; + } + } + + // If the method doesn't call anywhere, it can't be broken. + // For instance if the method just throws an exception. + if (!anyCalls) + return; + + Console.WriteLine ($"!wrong-simd-missing-marshaldirective! {method}: simd type: {simd_type}"); + } + + public override void VisitObjCMethodDecl (ObjCMethodDecl decl, VisitKind visitKind) + { + if (visitKind != VisitKind.Enter) + return; + + // don't process methods (or types) that are unavailable for the current platform + if (!decl.IsAvailable () || !(decl.DeclContext as Decl).IsAvailable ()) + return; + + var simd_type = string.Empty; + var requires_marshal_directive = false; + var native_simd = ContainsSimdTypes (decl, ref simd_type, ref requires_marshal_directive); + + ManagedSimdInfo info; + managed_methods.TryGetValue (decl.GetName (), out info); + var method = info?.Method; + + if (!native_simd) { + if (method != null) { + // The managed method uses types that were incorrectly used in place of the correct Simd types, + // but the native method doesn't use the native Simd types. This means the binding is correct. + } else { + // Neither the managed nor the native method have anything to do with Simd types. + } + return; + } + + if (method == null) { + // Could not map the native method to a managed method. + // This needs investigation, to see why the native method couldn't be mapped. + + // Check if this is new API, in which case it probably couldn't be mapped because we haven't bound it. + var is_new = false; + var attrs = decl.Attrs.ToList (); + var parentClass = decl.DeclContext as Decl; + if (parentClass != null) + attrs.AddRange (parentClass.Attrs); + + foreach (var attr in attrs) { + var av_attr = attr as AvailabilityAttr; + if (av_attr == null) + continue; + if (av_attr.Platform.Name != "ios") + continue; + if (av_attr.Introduced.Major >= 11) { + is_new = true; + break; + } + } + if (is_new && !very_strict) + return; + if (!strict) + return; + Console.WriteLine ($"!missing-simd-managed-method! {decl}: could not find a managed method for the native method {decl.GetName ()} (selector: {decl.Selector}). Found the simd type '{simd_type}' in the native signature."); + return; + } + + if (!info.ContainsInvalidMappingForSimd) { + // The managed method does not have any types that are incorrect for Simd. + if (requires_marshal_directive) + CheckMarshalDirective (method, simd_type); + return; + } + + if (method.IsObsolete ()) { + // We have a potentially broken managed method, but it's obsolete. That's fine. + return; + } + + if (requires_marshal_directive) + CheckMarshalDirective (method, simd_type); + + // We have a potentially broken managed method. This needs fixing/investigation. + Console.WriteLine ($"!unknown-simd-type-in-signature! {method}: the native signature has a simd type ({simd_type}), while the corresponding managed method is using an incorrect (non-simd) type."); + } + } +} \ No newline at end of file diff --git a/tests/xtro-sharpie/common.ignore b/tests/xtro-sharpie/common.ignore index 1ef081070ad0..9f6b3d9dfe41 100644 --- a/tests/xtro-sharpie/common.ignore +++ b/tests/xtro-sharpie/common.ignore @@ -1,3 +1,8 @@ +# ARKit + +## This method is manually bound. +!wrong-simd-missing-marshaldirective! System.IntPtr ARKit.ARPointCloud::GetRawPoints(): simd type: vector_float3 + # AVFoundation ## We only bind "finished" as we cannot use [Bind] here as it would break compatibility with iOS 6.x @@ -30,6 +35,16 @@ !unknown-native-enum! AVAudioSessionInterruptionFlags bound +# CoreFoundation + +## we already expose the NSURLFileProtection* constants +!missing-field! kCFURLFileProtectionComplete not bound +!missing-field! kCFURLFileProtectionCompleteUnlessOpen not bound +!missing-field! kCFURLFileProtectionCompleteUntilFirstUserAuthentication not bound +!missing-field! kCFURLFileProtectionKey not bound +!missing-field! kCFURLFileProtectionNone not bound + + # CoreGraphics ## deprecated (as the name indicates) and not exposed @@ -68,13 +83,38 @@ ## part of category GKScore_Deprecated !missing-selector! GKScore::playerID not bound - # Intents ## not exposed by our API (better use the OS version) !missing-field! IntentsVersionNumber not bound !missing-field! IntentsVersionString not bound +## new (Xcode9) @required members of an older type cannot be made abstract +!incorrect-protocol-member! INSpeakable::alternativeSpeakableMatches is REQUIRED and should be abstract +!incorrect-protocol-member! INSpeakable::vocabularyIdentifier is REQUIRED and should be abstract + +## new types that has deprecated members (likely to be removed from headers at some point) +!missing-selector! +INCallDestinationTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INCallDestinationTypeResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INCallRecordTypeOptionsResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INCallRecordTypeOptionsResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INAccountTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INAccountTypeResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INBalanceTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INBalanceTypeResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INDateSearchTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INDateSearchTypeResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INLocationSearchTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INLocationSearchTypeResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INNoteContentTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INNoteContentTypeResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INNotebookItemTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INNotebookItemTypeResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INTaskStatusResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INTaskStatusResolutionResult::successWithResolvedValue: not bound +!missing-selector! +INVisualCodeTypeResolutionResult::confirmationRequiredWithValueToConfirm: not bound +!missing-selector! +INVisualCodeTypeResolutionResult::successWithResolvedValue: not bound + # CloudKit @@ -85,6 +125,13 @@ !missing-selector! CKRecord::setObject:forKeyedSubscript: not bound +# PassKit + +## made optional in xcode9 beta 3 since they were replaced with newer API +!incorrect-protocol-member! PKPaymentAuthorizationControllerDelegate::paymentAuthorizationController:didAuthorizePayment:completion: is OPTIONAL and should NOT be abstract +!incorrect-protocol-member! PKPaymentAuthorizationViewControllerDelegate::paymentAuthorizationViewController:didAuthorizePayment:completion: is OPTIONAL and should NOT be abstract + + # Metal ## New @required (abstract) methods in existing types (breaking changes) @@ -168,7 +215,6 @@ !incorrect-protocol-member! MDLMeshBufferZone::allocator is REQUIRED and should be abstract !incorrect-protocol-member! MDLMeshBufferZone::capacity is REQUIRED and should be abstract - # Security ## part of mscorlib.dll -> mcs/class/corlib/CommonCrypto/CommonCrypto.cs to implement RNGCryptoServiceProvider @@ -198,6 +244,16 @@ !missing-selector! +UIView::layerClass not bound +# Vision + +## we do not expose internal framework versions +!missing-field! VNVisionVersionNumber not bound + +## called indirectly (there's a required native layer for them) +!missing-pinvoke! VNImagePointForFaceLandmarkPoint is not bound +!missing-pinvoke! VNNormalizedFaceBoundingBoxPointForLandmarkPoint is not bound + + # non-imported headers ## objc runtime @@ -206,3 +262,19 @@ ## CoreLocation # We have our own managed ctor !missing-pinvoke! CLLocationCoordinate2DMake is not bound + +## PDFKit +# The following enums are bound as PdfFoo, lowercase Pdf prefix +!missing-enum! PDFActionNamedName not bound +!missing-enum! PDFAreaOfInterest not bound +!missing-enum! PDFBorderStyle not bound +!missing-enum! PDFDisplayBox not bound +!missing-enum! PDFDisplayDirection not bound +!missing-enum! PDFDisplayMode not bound +!missing-enum! PDFDocumentPermissions not bound +!missing-enum! PDFInterpolationQuality not bound +!missing-enum! PDFLineStyle not bound +!missing-enum! PDFMarkupType not bound +!missing-enum! PDFTextAnnotationIconType not bound +!missing-enum! PDFWidgetCellState not bound +!missing-enum! PDFWidgetControlType not bound diff --git a/tests/xtro-sharpie/common.pending b/tests/xtro-sharpie/common.pending index ca4145edfd70..ed528daa7ff1 100644 --- a/tests/xtro-sharpie/common.pending +++ b/tests/xtro-sharpie/common.pending @@ -4,6 +4,21 @@ !missing-field! AVAudioSessionInterruptionWasSuspendedKey not bound +# CoreAnimation + +## header file removed in xcode9 +!unknown-type! CAEmitterBehavior bound +!unknown-field! kCAEmitterBehaviorAlignToMotion bound +!unknown-field! kCAEmitterBehaviorAttractor bound +!unknown-field! kCAEmitterBehaviorColorOverLife bound +!unknown-field! kCAEmitterBehaviorDrag bound +!unknown-field! kCAEmitterBehaviorLight bound +!unknown-field! kCAEmitterBehaviorSimpleAttractor bound +!unknown-field! kCAEmitterBehaviorValueOverLife bound +!unknown-field! kCAEmitterBehaviorWave bound + + + # CoreData ## https://bugzilla.xamarin.com/show_bug.cgi?id=34968 @@ -25,6 +40,10 @@ !missing-selector! +NSPersistentStoreCoordinator::setMetadata:forPersistentStoreOfType:URL:options:error: not bound !missing-selector! +NSMappingModel::inferredMappingModelForSourceModel:destinationModel:error: not bound +## https://trello.com/c/dlSRYPFx/92-33878590-missing-nsbinarystoresecuredecodingclasses-and-nsbinarystoreinsecuredecodingcompatibilityoption-constants-in-binaries +!missing-field! NSBinaryStoreSecureDecodingClasses not bound +!missing-field! NSBinaryStoreInsecureDecodingCompatibilityOption not bound + # CoreGraphics @@ -35,6 +54,26 @@ !missing-pinvoke! CGColorConverterGetTypeID is not bound +# CoreImage + +## new @required on existing protocols are breaking changes +!incorrect-protocol-member! CIImageProcessorInput::surface is REQUIRED and should be abstract +!incorrect-protocol-member! CIImageProcessorOutput::surface is REQUIRED and should be abstract + +## requires varargs support +!missing-selector! +CIFilter::filterWithName:keysAndValues: not bound +!missing-selector! CISampler::initWithImage:keysAndValues: not bound +!missing-selector! +CISampler::samplerWithImage:keysAndValues: not bound + +## https://bugzilla.xamarin.com/show_bug.cgi?id=59296 +!missing-field! kCIImageApplyOrientationProperty not bound +!missing-field! kCIImageAuxiliaryDepth not bound +!missing-field! kCIImageAuxiliaryDisparity not bound +!missing-field! kCIImageNearestSampling not bound +!missing-field! kCIInputDepthImageKey not bound +!missing-field! kCIInputDisparityImageKey not bound + + # Foundation ## https://bugzilla.xamarin.com/show_bug.cgi?id=35009 @@ -55,12 +94,34 @@ !missing-selector! NSURLSession::getTasksWithCompletionHandler: not bound +# HomeKit + +## unrecognized selector - rdar 33883958: https://trello.com/c/TIlzWzrL +!missing-selector! HMMutablePresenceEvent::setPresenceEventType: not bound +!missing-selector! HMMutablePresenceEvent::setPresenceUserType: not bound + + +# MetalPerformanceShaders + +## new type not yet bound +!wrong-base-type! MPSImageLanczosScale expected MPSImageScale actual MPSUnaryImageKernel + +## autogenerated, likely due to the addition (xcode9) of `initWithCoder:device:` +!extra-designated-initializer! MPSKernel::initWithCoder: is incorrectly decorated with an [DesignatedInitializer] attribute + + # Photos ## xcode 8 beta 1-6 defines it but it does not exists in the binaries - rdar #28169810 https://trello.com/c/RwXK6YRX !missing-field! PHLivePhotoShouldRenderAtPlaybackTime not bound +# ReplayKit + +## https://trello.com/c/eA440suj/91-33875315-rpbroadcasthandler-updatebroadcasturl-unrecognized-selector +!missing-selector! RPBroadcastHandler::updateBroadcastURL: not bound + + # SpriteKit ## Deprecated in iOS 10 @@ -293,6 +354,7 @@ # Protocols we decided not to expose !missing-protocol! NSFastEnumeration not bound +!missing-protocol-conformance! AVCaptureSynchronizedDataCollection should conform to NSFastEnumeration !missing-protocol-conformance! NSArray should conform to NSFastEnumeration !missing-protocol-conformance! NSDictionary should conform to NSFastEnumeration !missing-protocol-conformance! NSEntityDescription should conform to NSFastEnumeration @@ -636,6 +698,9 @@ !missing-selector! INPerson::initWithHandle:nameComponents:contactIdentifier: not bound !missing-selector! INPerson::initWithHandle:nameComponents:displayName:image:contactIdentifier: not bound +## Apple made this @optional in iOS 11 but this is a breaking change +!incorrect-protocol-member! INSpeakable::identifier is OPTIONAL and should NOT be abstract + # GameplayKit ## Fixed in XAMCORE_4_0 @@ -648,4 +713,52 @@ !incorrect-protocol-member! MDLObjectContainerComponent::objectAtIndexedSubscript: is REQUIRED and should be abstract !incorrect-protocol-member! MDLTransformComponent::keyTimes is REQUIRED and should be abstract !incorrect-protocol-member! MDLTransformComponent::resetsTransform is REQUIRED and should be abstract -!incorrect-protocol-member! MDLTransformComponent::setResetsTransform: is REQUIRED and should be abstract \ No newline at end of file +!incorrect-protocol-member! MDLTransformComponent::setResetsTransform: is REQUIRED and should be abstract + +# CoreML +## we do not have NSFastEnumeration and decided to not bind objectForKeyedSubscript using a local method instead +!missing-protocol-conformance! MLDictionaryFeatureProvider should conform to NSFastEnumeration +!missing-selector! MLDictionaryFeatureProvider::objectForKeyedSubscript: not bound + +## radar://33643011 -> https://trello.com/c/ZN712GOi +## [FAIL] Selector not found for CoreML.MLFeatureDescription : setMultiArrayConstraint: +## [FAIL] Selector not found for CoreML.MLFeatureDescription : setImageConstraint: +## [FAIL] Selector not found for CoreML.MLFeatureDescription : setDictionaryConstraint: +!missing-selector! MLFeatureDescription::setDictionaryConstraint: not bound +!missing-selector! MLFeatureDescription::setImageConstraint: not bound +!missing-selector! MLFeatureDescription::setMultiArrayConstraint: not bound + + +# WekKit + +## 34185961 The header WKSnapshotConfiguration.h is not included inside the umbrella WebKit.h +!unknown-type! WKSnapshotConfiguration bound + + +# recent xtro changes + +## init +!missing-designated-initializer! CXAction::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! MPSBinaryImageKernel::initWithDevice: is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! MPSCNNKernel::initWithDevice: is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! MPSImageLanczosScale::initWithDevice: is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! MPSUnaryImageKernel::initWithDevice: is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! MSMessage::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! PKAddPaymentPassRequest::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! SLComposeSheetConfigurationItem::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIBarButtonItem::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIBarItem::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIBezierPath::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UICollectionViewLayout::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UICubicTimingParameters::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIDragPreviewParameters::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIImageAsset::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIKeyCommand::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UILocalNotification::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIMotionEffect::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIPasteConfiguration::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UISpringTimingParameters::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UITabBarItem::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UITraitCollection::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIUserNotificationAction::init is missing an [DesignatedInitializer] attribute +!missing-designated-initializer! UIUserNotificationCategory::init is missing an [DesignatedInitializer] attribute diff --git a/tests/xtro-sharpie/ios.ignore b/tests/xtro-sharpie/ios.ignore index 1ebb8053dee5..617094fbf1e2 100644 --- a/tests/xtro-sharpie/ios.ignore +++ b/tests/xtro-sharpie/ios.ignore @@ -5,6 +5,10 @@ ## untyped enum, we took the prefix from values in ABPerson.h !unknown-native-enum! ABAddressBookError bound +# ARKit + +## NS_SWIFT_UNAVAILABLE("Use run(_:options:) instead") +!missing-selector! ARSession::runWithConfiguration: not bound # AssetLibrary @@ -64,12 +68,33 @@ !missing-selector! CIKernel::setROISelector: not bound +# CoreTelephony + +## deprecated in iOS 10 (in favor of CallKit) +!missing-field! CTCallStateConnected not bound +!missing-field! CTCallStateDialing not bound +!missing-field! CTCallStateDisconnected not bound +!missing-field! CTCallStateIncoming not bound + + # GameKit ## typedef is used + untyped enum in GKPeerPickerController.h: typedef NSUInteger GKPeerPickerConnectionType !unknown-native-enum! GKPeerPickerConnectionType bound +# Intents + +## added and deprecated in Xcode9 (but not removed from headers) +!missing-selector! +INNotebookItemTypeResolutionResult::disambiguationWithValuesToDisambiguate: not bound + +## The following were deprecated in ios(10.0, 10.0) +!missing-selector! INRideDriver::initWithHandle:displayName:image:rating:phoneNumber: not bound +!missing-selector! INRideDriver::initWithHandle:nameComponents:image:rating:phoneNumber: not bound +!missing-selector! INRideOption::identifier not bound +!missing-selector! INRideOption::setIdentifier: not bound + + # IntentsUI ## not exposed by our API (better use the OS version) @@ -77,12 +102,32 @@ !missing-field! IntentsUIVersionString not bound +# MediaPlayer + +## incorrect macro/parsing - decorated with `MP_API(macos(10.12.2))` +!missing-enum! MPNowPlayingPlaybackState not bound +!missing-selector! MPNowPlayingInfoCenter::playbackState not bound +!missing-selector! MPNowPlayingInfoCenter::setPlaybackState: not bound + + +# PushKit + +## was @required but now @optional (a replacement was added in Xcode9) - still a breaking change to remove the abstract +!incorrect-protocol-member! PKPushRegistryDelegate::pushRegistry:didReceiveIncomingPushWithPayload:forType: is OPTIONAL and should NOT be abstract + + # ReplayKit ## only used on tvOS but exposed in iOS 10 SDK !missing-enum! RPPreviewViewControllerMode not bound +# Social + +## deprecated (was not available on iOS before Xcode9) +!missing-field! SLServiceTypeLinkedIn not bound + + # UIKit ## typedef is used (no value) in UITextInput.h: typedef NSInteger UITextDirection @@ -126,6 +171,49 @@ !missing-selector! NSObject::indexOfAccessibilityElement: not bound !missing-selector! NSObject::setAccessibilityElements: not bound +## UIAccessibility +## We can't expose them as categories of NSObject so we have custom types instead +!missing-selector! NSObject::accessibilityActivationPoint not bound +!missing-selector! NSObject::accessibilityAttributedHint not bound +!missing-selector! NSObject::accessibilityAttributedLabel not bound +!missing-selector! NSObject::accessibilityAttributedValue not bound +!missing-selector! NSObject::accessibilityContainerType not bound +!missing-selector! NSObject::accessibilityCustomActions not bound +!missing-selector! NSObject::accessibilityDragSourceDescriptors not bound +!missing-selector! NSObject::accessibilityDropPointDescriptors not bound +!missing-selector! NSObject::accessibilityElementsHidden not bound +!missing-selector! NSObject::accessibilityFrame not bound +!missing-selector! NSObject::accessibilityHint not bound +!missing-selector! NSObject::accessibilityLabel not bound +!missing-selector! NSObject::accessibilityLanguage not bound +!missing-selector! NSObject::accessibilityNavigationStyle not bound +!missing-selector! NSObject::accessibilityPath not bound +!missing-selector! NSObject::accessibilityScroll: not bound +!missing-selector! NSObject::accessibilityTraits not bound +!missing-selector! NSObject::accessibilityValue not bound +!missing-selector! NSObject::accessibilityViewIsModal not bound +!missing-selector! NSObject::isAccessibilityElement not bound +!missing-selector! NSObject::setAccessibilityActivationPoint: not bound +!missing-selector! NSObject::setAccessibilityAttributedHint: not bound +!missing-selector! NSObject::setAccessibilityAttributedLabel: not bound +!missing-selector! NSObject::setAccessibilityAttributedValue: not bound +!missing-selector! NSObject::setAccessibilityContainerType: not bound +!missing-selector! NSObject::setAccessibilityCustomActions: not bound +!missing-selector! NSObject::setAccessibilityDragSourceDescriptors: not bound +!missing-selector! NSObject::setAccessibilityDropPointDescriptors: not bound +!missing-selector! NSObject::setAccessibilityElementsHidden: not bound +!missing-selector! NSObject::setAccessibilityFrame: not bound +!missing-selector! NSObject::setAccessibilityHint: not bound +!missing-selector! NSObject::setAccessibilityLabel: not bound +!missing-selector! NSObject::setAccessibilityLanguage: not bound +!missing-selector! NSObject::setAccessibilityNavigationStyle: not bound +!missing-selector! NSObject::setAccessibilityPath: not bound +!missing-selector! NSObject::setAccessibilityTraits: not bound +!missing-selector! NSObject::setAccessibilityValue: not bound +!missing-selector! NSObject::setAccessibilityViewIsModal: not bound +!missing-selector! NSObject::setIsAccessibilityElement: not bound +!missing-selector! NSObject::setShouldGroupAccessibilityChildren: not bound +!missing-selector! NSObject::shouldGroupAccessibilityChildren not bound # WatchConnectivity @@ -384,3 +472,7 @@ !unknown-field! CBUUIDPeripheralPrivacyFlagString bound !unknown-field! CBUUIDReconnectionAddressString bound !unknown-field! CBUUIDServiceChangedString bound + +## PDFKit +# The following enums are bound as PdfFoo, lowercase Pdf prefix +!missing-enum! PDFThumbnailLayoutMode not bound diff --git a/tests/xtro-sharpie/ios.pending b/tests/xtro-sharpie/ios.pending index 77b1486341b7..9735cb8e5307 100644 --- a/tests/xtro-sharpie/ios.pending +++ b/tests/xtro-sharpie/ios.pending @@ -150,6 +150,12 @@ !wrong-enum-size! MessageComposeResult managed 4 vs native 8 +# Metal + +## only on macOS (but removing would be a vreaking change) +!unknown-native-enum! MTLSamplerBorderColor bound + + # Speech ## iOS 10 beta 1 - use a non-public type in the signature https://trello.com/c/s6s6YKua !missing-selector! SFSpeechRecognizer::prepareWithRequest: not bound @@ -256,17 +262,13 @@ # Intents API iOS 10 -## Deprecated in Xcode 8 beta NS_DEPRECATED(10_12, 10_12, 10_0, 10_0) / pragma mark - Deprecated -!missing-selector! INRideDriver::initWithHandle:displayName:image:rating:phoneNumber: not bound -!missing-selector! INRideDriver::initWithHandle:nameComponents:image:rating:phoneNumber: not bound -!missing-selector! INRideOption::identifier not bound -!missing-selector! INRideOption::setIdentifier: not bound - ## INPayBillIntentHandling && INSearchForBillsIntentHandling are new protocols added in iOS 10.3. This two protocols ## were added to the existing Protocol INPaymentsDomainHandling so making this two required would be a breaking change !incorrect-protocol-member! INPayBillIntentHandling::handlePayBill:completion: is REQUIRED and should be abstract !incorrect-protocol-member! INSearchForBillsIntentHandling::handleSearchForBills:completion: is REQUIRED and should be abstract +## Apple made this protocol member optional in iOS 11 but it is a breaking change for us. Added to XAMCORE_4_0. +!incorrect-protocol-member! INUIHostedViewControlling::configureWithInteraction:context:completion: is OPTIONAL and should NOT be abstract # UIKit @@ -305,6 +307,8 @@ !incorrect-protocol-member! UIViewControllerTransitionCoordinatorContext::isInterruptible is REQUIRED and should be abstract !incorrect-protocol-member! UIFocusEnvironment::preferredFocusEnvironments is REQUIRED and should be abstract !incorrect-protocol-member! UITextDocumentProxy::documentInputMode is REQUIRED and should be abstract +!incorrect-protocol-member! UITextDocumentProxy::documentIdentifier is REQUIRED and should be abstract +!incorrect-protocol-member! UITextDocumentProxy::selectedText is REQUIRED and should be abstract !incorrect-protocol-member! UILayoutSupport::bottomAnchor is REQUIRED and should be abstract !incorrect-protocol-member! UILayoutSupport::heightAnchor is REQUIRED and should be abstract !incorrect-protocol-member! UILayoutSupport::topAnchor is REQUIRED and should be abstract @@ -318,9 +322,20 @@ ## exception name, not clear if useful !missing-field! UIApplicationInvalidInterfaceOrientationException not bound +## fixed for XAMCORE_4_0 +!incorrect-protocol-member! UIDocumentPickerDelegate::documentPicker:didPickDocumentAtURL: is OPTIONAL and should NOT be abstract + +## https://bugzilla.xamarin.com/show_bug.cgi?id=59422 +!missing-pinvoke! UIContentSizeCategoryCompareToCategory is not bound +!missing-pinvoke! UIContentSizeCategoryIsAccessibilityCategory is not bound # WatchKit ## unfortunate duplicated name !duplicate-type-name! WKErrorCode enum exists as both WatchKit.WKErrorCode and WebKit.WKErrorCode !duplicate-type-name! WKErrorCode enum exists as both WebKit.WKErrorCode and WatchKit.WKErrorCode + +#PDFKit +# PDFAnnotationPopup is not available on iOS also deprecated in macOS 10,12 +!missing-selector! PDFAnnotation::popup not bound +!missing-selector! PDFAnnotation::setPopup: not bound diff --git a/tests/xtro-sharpie/osx.ignore b/tests/xtro-sharpie/osx.ignore index ff1e7a7ebd08..580c8f28ef86 100644 --- a/tests/xtro-sharpie/osx.ignore +++ b/tests/xtro-sharpie/osx.ignore @@ -1,5 +1,11 @@ # A large number of assemblies are black listed in xtro-sharpie/Runner.cs +# CoreBluetooth + +## old and different name for CBUUIDCharacteristicValidRangeString, removed in Xcode9 headers (27160443) +!unknown-field! CBUUIDValidRangeString bound + + # GameController ## other CGMicroGamepad API are not available on OSX (looks like a mistake) @@ -7,6 +13,12 @@ !missing-pinvoke! NSDataFromGCMicroGamepadSnapShotDataV100 is not bound +# SpriteKit + +## This enum is not used in macOS API so it makes not sense to expose it +!missing-enum! SKNodeFocusBehavior not bound + + # fixed in XAMCORE_3_0 ## 8a6099b8027fa8e1ad1e032c731c7f750619303e @@ -428,4 +440,8 @@ # Deprecated in the same version of OS X that CBCentral becomes available. The alternative (Identifier property) is bound and available. !missing-selector! CBCentral::UUID not bound -!missing-selector! CBPeripheral::UUID not bound \ No newline at end of file +!missing-selector! CBPeripheral::UUID not bound + +## PDFKit +# The following enums are bound as PdfFoo, lowercase Pdf prefix +!missing-enum! PDFPrintScalingMode not bound diff --git a/tests/xtro-sharpie/osx.pending b/tests/xtro-sharpie/osx.pending index c57a82a88a40..0409da99d947 100644 --- a/tests/xtro-sharpie/osx.pending +++ b/tests/xtro-sharpie/osx.pending @@ -298,6 +298,9 @@ !unknown-native-enum! INRelativeSetting bound !unknown-type! INRelativeSettingResolutionResult bound +## The signature uses INBooleanResolutionResult which is not available on mac +!missing-protocol-member! INSearchCallHistoryIntentHandling::resolveUnseenForSearchCallHistory:withCompletion: not found + # Used in sandbox for NSOpen/Save panel but never should have been bound. #if !XAMCORE_3_0'ed !unknown-type! NSRemoteOpenPanel bound !unknown-type! NSRemoteSavePanel bound @@ -403,9 +406,11 @@ # MediaPlayer API macOS 10.12.2 +## MPMediaItem only exposed for fields, it's not really available in macOS +!wrong-base-type! MPMediaItem expected MPMediaEntity actual NSObject + # These are not available on macOS even if xtro says so. !missing-type! MPMediaEntity not bound -!missing-type! MPMediaItem not bound !missing-enum! MPErrorCode not bound !missing-enum! MPMediaType not bound @@ -413,46 +418,39 @@ !missing-field! MPErrorDomain not bound !missing-field! MPMediaEntityPropertyPersistentID not bound -!missing-field! MPMediaItemPropertyAlbumArtist not bound -!missing-field! MPMediaItemPropertyAlbumArtistPersistentID not bound -!missing-field! MPMediaItemPropertyAlbumPersistentID not bound -!missing-field! MPMediaItemPropertyAlbumTitle not bound -!missing-field! MPMediaItemPropertyAlbumTrackCount not bound -!missing-field! MPMediaItemPropertyAlbumTrackNumber not bound -!missing-field! MPMediaItemPropertyArtist not bound -!missing-field! MPMediaItemPropertyArtistPersistentID not bound -!missing-field! MPMediaItemPropertyArtwork not bound -!missing-field! MPMediaItemPropertyAssetURL not bound -!missing-field! MPMediaItemPropertyBeatsPerMinute not bound -!missing-field! MPMediaItemPropertyBookmarkTime not bound -!missing-field! MPMediaItemPropertyComments not bound -!missing-field! MPMediaItemPropertyComposer not bound -!missing-field! MPMediaItemPropertyComposerPersistentID not bound -!missing-field! MPMediaItemPropertyDateAdded not bound -!missing-field! MPMediaItemPropertyDiscCount not bound -!missing-field! MPMediaItemPropertyDiscNumber not bound -!missing-field! MPMediaItemPropertyGenre not bound -!missing-field! MPMediaItemPropertyGenrePersistentID not bound -!missing-field! MPMediaItemPropertyHasProtectedAsset not bound -!missing-field! MPMediaItemPropertyIsCloudItem not bound -!missing-field! MPMediaItemPropertyIsCompilation not bound -!missing-field! MPMediaItemPropertyIsExplicit not bound -!missing-field! MPMediaItemPropertyLastPlayedDate not bound -!missing-field! MPMediaItemPropertyLyrics not bound -!missing-field! MPMediaItemPropertyMediaType not bound -!missing-field! MPMediaItemPropertyPersistentID not bound -!missing-field! MPMediaItemPropertyPlayCount not bound -!missing-field! MPMediaItemPropertyPlaybackDuration not bound -!missing-field! MPMediaItemPropertyPodcastPersistentID not bound -!missing-field! MPMediaItemPropertyPodcastTitle not bound -!missing-field! MPMediaItemPropertyRating not bound -!missing-field! MPMediaItemPropertyReleaseDate not bound -!missing-field! MPMediaItemPropertySkipCount not bound -!missing-field! MPMediaItemPropertyTitle not bound -!missing-field! MPMediaItemPropertyUserGrouping not bound - +## type not available on macOS !missing-selector! +MPMediaEntity::canFilterByProperty: not bound !missing-selector! MPMediaEntity::enumerateValuesForProperties:usingBlock: not bound !missing-selector! MPMediaEntity::objectForKeyedSubscript: not bound !missing-selector! MPMediaEntity::valueForProperty: not bound + +## deprecaed in iOS 10, not on macOS !missing-selector! MPMediaItemArtwork::imageCropRect not bound + + +# Metal + +## [Notification] in protocol - https://bugzilla.xamarin.com/show_bug.cgi?id=59342 +!missing-field! MTLDeviceRemovalRequestedNotification not bound +!missing-field! MTLDeviceWasAddedNotification not bound +!missing-field! MTLDeviceWasRemovedNotification not bound + + +# Not available in OS X +!missing-selector! ACAccount::userFullName not bound + +## These are not available on macOS even if xtro says so. +!missing-selector! EKCalendarItem::UUID not bound +!missing-selector! EKEvent::birthdayPersonID not bound +!missing-selector! EKEventStore::calendars not bound +!missing-selector! EKEventStore::removeEvent:span:error: not bound +!missing-selector! EKEventStore::saveEvent:span:error: not bound +!missing-selector! EKSource::calendars not bound + +### This is not bound and it is already deprecated +!missing-selector! EKParticipant::ABPersonInAddressBook: not bound + +#PDFKit +## Deprecated +!missing-selector! PDFAnnotation::initWithDictionary:forPage: not bound + diff --git a/tests/xtro-sharpie/tvos.ignore b/tests/xtro-sharpie/tvos.ignore index fa85dfaad9ae..4bef259169c8 100644 --- a/tests/xtro-sharpie/tvos.ignore +++ b/tests/xtro-sharpie/tvos.ignore @@ -101,6 +101,9 @@ !missing-selector! CKContainer::fetchAllLongLivedOperationIDsWithCompletionHandler: not bound !missing-selector! CKContainer::fetchLongLivedOperationWithID:completionHandler: not bound +## deprecated API +!missing-selector! CKContainer::discoverAllContactUserInfosWithCompletionHandler: not bound + # CoreImage @@ -282,6 +285,30 @@ !missing-selector! +MPMediaItem::persistentIDPropertyForGroupingType: not bound !missing-selector! +MPMediaItem::titlePropertyForGroupingType: not bound +## unused in public API for tvOS +!missing-enum! MPMediaType not bound + + These are not available on macOS even if xtro says so. +!missing-type! MPMediaEntity not bound + +## MPMediaItem only exposed for fields, it's not really available in macOS +!unknown-type! MPMediaItem bound +#!wrong-base-type! MPMediaItem expected MPMediaEntity actual NSObject + +## incorrect macro/parsing - decorated with `MP_API(macos(10.12.2))` +!missing-enum! MPNowPlayingPlaybackState not bound +!missing-selector! MPNowPlayingInfoCenter::playbackState not bound +!missing-selector! MPNowPlayingInfoCenter::setPlaybackState: not bound + +## marked as available in tvOS 11 but the member is not and using a type, MPMusicPlayerQueueDescriptor, that's not available +!missing-protocol! MPSystemMusicPlayerController not bound + + +# ReplayKit + +## Not used on tvOS (no camera) +!missing-enum! RPCameraPosition not bound + # StoreKit @@ -296,6 +323,7 @@ !missing-field! SKCloudServiceSetupOptionsITunesItemIdentifierKey not bound !missing-field! SKCloudServiceSetupOptionsAffiliateTokenKey not bound !missing-field! SKCloudServiceSetupOptionsCampaignTokenKey not bound +!missing-field! SKCloudServiceSetupOptionsMessageIdentifierKey not bound !missing-protocol! SKCloudServiceSetupViewControllerDelegate not bound @@ -354,6 +382,16 @@ !missing-selector! UITableViewHeaderFooterView::setTintColor: not bound !missing-selector! UITableViewHeaderFooterView::tintColor not bound +## lack of availabilty macros on NSItemProvder.PreferredPresentationStyle - intro says they are not available +!missing-selector! NSItemProvider::preferredPresentationStyle not bound +!missing-selector! NSItemProvider::setPreferredPresentationStyle: not bound +## and that also means the (enum/returned) type is unused +!missing-enum! UIPreferredPresentationStyle not bound + +## Added on UIAccessibility +!missing-selector! NSObject::accessibilityHeaderElements not bound +!missing-selector! NSObject::setAccessibilityHeaderElements: not bound + # OpenTK @@ -361,103 +399,6 @@ !missing-pinvoke! CVOpenGLESTextureCacheGetTypeID is not bound !missing-pinvoke! CVOpenGLESTextureGetTypeID is not bound -## duplicates by design -!duplicate-type-name! ActiveAttribType enum exists as both OpenTK.Graphics.ES30.ActiveAttribType and OpenTK.Graphics.ES20.ActiveAttribType -!duplicate-type-name! ActiveUniformType enum exists as both OpenTK.Graphics.ES30.ActiveUniformType and OpenTK.Graphics.ES20.ActiveUniformType -!duplicate-type-name! All enum exists as both OpenTK.Graphics.ES20.All and OpenTK.Graphics.ES11.All -!duplicate-type-name! All enum exists as both OpenTK.Graphics.ES30.All and OpenTK.Graphics.ES11.All -!duplicate-type-name! BeginMode enum exists as both OpenTK.Graphics.ES20.BeginMode and OpenTK.Graphics.ES11.BeginMode -!duplicate-type-name! BeginMode enum exists as both OpenTK.Graphics.ES30.BeginMode and OpenTK.Graphics.ES11.BeginMode -!duplicate-type-name! BlendEquationMode enum exists as both OpenTK.Graphics.ES30.BlendEquationMode and OpenTK.Graphics.ES20.BlendEquationMode -!duplicate-type-name! BlendEquationSeparate enum exists as both OpenTK.Graphics.ES30.BlendEquationSeparate and OpenTK.Graphics.ES20.BlendEquationSeparate -!duplicate-type-name! BlendSubtract enum exists as both OpenTK.Graphics.ES30.BlendSubtract and OpenTK.Graphics.ES20.BlendSubtract -!duplicate-type-name! BlendingFactorDest enum exists as both OpenTK.Graphics.ES20.BlendingFactorDest and OpenTK.Graphics.ES11.BlendingFactorDest -!duplicate-type-name! BlendingFactorDest enum exists as both OpenTK.Graphics.ES30.BlendingFactorDest and OpenTK.Graphics.ES11.BlendingFactorDest -!duplicate-type-name! BlendingFactorSrc enum exists as both OpenTK.Graphics.ES20.BlendingFactorSrc and OpenTK.Graphics.ES11.BlendingFactorSrc -!duplicate-type-name! BlendingFactorSrc enum exists as both OpenTK.Graphics.ES30.BlendingFactorSrc and OpenTK.Graphics.ES11.BlendingFactorSrc -!duplicate-type-name! Boolean enum exists as both OpenTK.Graphics.ES20.Boolean and OpenTK.Graphics.ES11.Boolean -!duplicate-type-name! Boolean enum exists as both OpenTK.Graphics.ES30.Boolean and OpenTK.Graphics.ES11.Boolean -!duplicate-type-name! BufferObjects enum exists as both OpenTK.Graphics.ES20.BufferObjects and OpenTK.Graphics.ES11.BufferObjects -!duplicate-type-name! BufferObjects enum exists as both OpenTK.Graphics.ES30.BufferObjects and OpenTK.Graphics.ES11.BufferObjects -!duplicate-type-name! BufferParameterName enum exists as both OpenTK.Graphics.ES30.BufferParameterName and OpenTK.Graphics.ES20.BufferParameterName -!duplicate-type-name! BufferTarget enum exists as both OpenTK.Graphics.ES30.BufferTarget and OpenTK.Graphics.ES20.BufferTarget -!duplicate-type-name! BufferUsage enum exists as both OpenTK.Graphics.ES30.BufferUsage and OpenTK.Graphics.ES20.BufferUsage -!duplicate-type-name! ClearBufferMask enum exists as both OpenTK.Graphics.ES20.ClearBufferMask and OpenTK.Graphics.ES11.ClearBufferMask -!duplicate-type-name! ClearBufferMask enum exists as both OpenTK.Graphics.ES30.ClearBufferMask and OpenTK.Graphics.ES11.ClearBufferMask -!duplicate-type-name! CullFaceMode enum exists as both OpenTK.Graphics.ES20.CullFaceMode and OpenTK.Graphics.ES11.CullFaceMode -!duplicate-type-name! CullFaceMode enum exists as both OpenTK.Graphics.ES30.CullFaceMode and OpenTK.Graphics.ES11.CullFaceMode -!duplicate-type-name! DataType enum exists as both OpenTK.Graphics.ES20.DataType and OpenTK.Graphics.ES11.DataType -!duplicate-type-name! DataType enum exists as both OpenTK.Graphics.ES30.DataType and OpenTK.Graphics.ES11.DataType -!duplicate-type-name! DepthFunction enum exists as both OpenTK.Graphics.ES30.DepthFunction and OpenTK.Graphics.ES20.DepthFunction -!duplicate-type-name! DrawElementsType enum exists as both OpenTK.Graphics.ES30.DrawElementsType and OpenTK.Graphics.ES20.DrawElementsType -!duplicate-type-name! EnableCap enum exists as both OpenTK.Graphics.ES20.EnableCap and OpenTK.Graphics.ES11.EnableCap -!duplicate-type-name! EnableCap enum exists as both OpenTK.Graphics.ES30.EnableCap and OpenTK.Graphics.ES11.EnableCap -!duplicate-type-name! ErrorCode enum exists as both OpenTK.Graphics.ES20.ErrorCode and OpenTK.Graphics.ES11.ErrorCode -!duplicate-type-name! ErrorCode enum exists as both OpenTK.Graphics.ES30.ErrorCode and OpenTK.Graphics.ES11.ErrorCode -!duplicate-type-name! FramebufferErrorCode enum exists as both OpenTK.Graphics.ES30.FramebufferErrorCode and OpenTK.Graphics.ES20.FramebufferErrorCode -!duplicate-type-name! FramebufferObject enum exists as both OpenTK.Graphics.ES30.FramebufferObject and OpenTK.Graphics.ES20.FramebufferObject -!duplicate-type-name! FramebufferParameterName enum exists as both OpenTK.Graphics.ES30.FramebufferParameterName and OpenTK.Graphics.ES20.FramebufferParameterName -!duplicate-type-name! FramebufferSlot enum exists as both OpenTK.Graphics.ES30.FramebufferSlot and OpenTK.Graphics.ES20.FramebufferSlot -!duplicate-type-name! FramebufferTarget enum exists as both OpenTK.Graphics.ES30.FramebufferTarget and OpenTK.Graphics.ES20.FramebufferTarget -!duplicate-type-name! FrontFaceDirection enum exists as both OpenTK.Graphics.ES20.FrontFaceDirection and OpenTK.Graphics.ES11.FrontFaceDirection -!duplicate-type-name! FrontFaceDirection enum exists as both OpenTK.Graphics.ES30.FrontFaceDirection and OpenTK.Graphics.ES11.FrontFaceDirection -!duplicate-type-name! GetPName enum exists as both OpenTK.Graphics.ES20.GetPName and OpenTK.Graphics.ES11.GetPName -!duplicate-type-name! GetPName enum exists as both OpenTK.Graphics.ES30.GetPName and OpenTK.Graphics.ES11.GetPName -!duplicate-type-name! GetTextureParameter enum exists as both OpenTK.Graphics.ES20.GetTextureParameter and OpenTK.Graphics.ES11.GetTextureParameter -!duplicate-type-name! GetTextureParameter enum exists as both OpenTK.Graphics.ES30.GetTextureParameter and OpenTK.Graphics.ES11.GetTextureParameter -!duplicate-type-name! HintMode enum exists as both OpenTK.Graphics.ES20.HintMode and OpenTK.Graphics.ES11.HintMode -!duplicate-type-name! HintMode enum exists as both OpenTK.Graphics.ES30.HintMode and OpenTK.Graphics.ES11.HintMode -!duplicate-type-name! HintTarget enum exists as both OpenTK.Graphics.ES20.HintTarget and OpenTK.Graphics.ES11.HintTarget -!duplicate-type-name! HintTarget enum exists as both OpenTK.Graphics.ES30.HintTarget and OpenTK.Graphics.ES11.HintTarget -!duplicate-type-name! OpenGlEsCoreVersions enum exists as both OpenTK.Graphics.ES20.OpenGlEsCoreVersions and OpenTK.Graphics.ES11.OpenGlEsCoreVersions -!duplicate-type-name! OpenGlEsCoreVersions enum exists as both OpenTK.Graphics.ES30.OpenGlEsCoreVersions and OpenTK.Graphics.ES11.OpenGlEsCoreVersions -!duplicate-type-name! OpenGlescoreVersions enum exists as both OpenTK.Graphics.ES20.OpenGlescoreVersions and OpenTK.Graphics.ES11.OpenGlescoreVersions -!duplicate-type-name! PixelFormat enum exists as both OpenTK.Graphics.ES20.PixelFormat and OpenTK.Graphics.ES11.PixelFormat -!duplicate-type-name! PixelFormat enum exists as both OpenTK.Graphics.ES30.PixelFormat and OpenTK.Graphics.ES11.PixelFormat -!duplicate-type-name! PixelInternalFormat enum exists as both OpenTK.Graphics.ES20.PixelInternalFormat and OpenTK.Graphics.ES11.PixelInternalFormat -!duplicate-type-name! PixelInternalFormat enum exists as both OpenTK.Graphics.ES30.PixelInternalFormat and OpenTK.Graphics.ES11.PixelInternalFormat -!duplicate-type-name! PixelStoreParameter enum exists as both OpenTK.Graphics.ES20.PixelStoreParameter and OpenTK.Graphics.ES11.PixelStoreParameter -!duplicate-type-name! PixelStoreParameter enum exists as both OpenTK.Graphics.ES30.PixelStoreParameter and OpenTK.Graphics.ES11.PixelStoreParameter -!duplicate-type-name! PixelType enum exists as both OpenTK.Graphics.ES20.PixelType and OpenTK.Graphics.ES11.PixelType -!duplicate-type-name! PixelType enum exists as both OpenTK.Graphics.ES30.PixelType and OpenTK.Graphics.ES11.PixelType -!duplicate-type-name! ProgramParameter enum exists as both OpenTK.Graphics.ES30.ProgramParameter and OpenTK.Graphics.ES20.ProgramParameter -!duplicate-type-name! ReadFormat enum exists as both OpenTK.Graphics.ES30.ReadFormat and OpenTK.Graphics.ES20.ReadFormat -!duplicate-type-name! RenderbufferInternalFormat enum exists as both OpenTK.Graphics.ES30.RenderbufferInternalFormat and OpenTK.Graphics.ES20.RenderbufferInternalFormat -!duplicate-type-name! RenderbufferParameterName enum exists as both OpenTK.Graphics.ES30.RenderbufferParameterName and OpenTK.Graphics.ES20.RenderbufferParameterName -!duplicate-type-name! RenderbufferTarget enum exists as both OpenTK.Graphics.ES30.RenderbufferTarget and OpenTK.Graphics.ES20.RenderbufferTarget -!duplicate-type-name! SeparateBlendFunctions enum exists as both OpenTK.Graphics.ES30.SeparateBlendFunctions and OpenTK.Graphics.ES20.SeparateBlendFunctions -!duplicate-type-name! ShaderBinary enum exists as both OpenTK.Graphics.ES30.ShaderBinary and OpenTK.Graphics.ES20.ShaderBinary -!duplicate-type-name! ShaderBinaryFormat enum exists as both OpenTK.Graphics.ES30.ShaderBinaryFormat and OpenTK.Graphics.ES20.ShaderBinaryFormat -!duplicate-type-name! ShaderParameter enum exists as both OpenTK.Graphics.ES30.ShaderParameter and OpenTK.Graphics.ES20.ShaderParameter -!duplicate-type-name! ShaderPrecision enum exists as both OpenTK.Graphics.ES30.ShaderPrecision and OpenTK.Graphics.ES20.ShaderPrecision -!duplicate-type-name! ShaderPrecisionSpecifiedTypes enum exists as both OpenTK.Graphics.ES30.ShaderPrecisionSpecifiedTypes and OpenTK.Graphics.ES20.ShaderPrecisionSpecifiedTypes -!duplicate-type-name! ShaderSource enum exists as both OpenTK.Graphics.ES30.ShaderSource and OpenTK.Graphics.ES20.ShaderSource -!duplicate-type-name! ShaderType enum exists as both OpenTK.Graphics.ES30.ShaderType and OpenTK.Graphics.ES20.ShaderType -!duplicate-type-name! Shaders enum exists as both OpenTK.Graphics.ES30.Shaders and OpenTK.Graphics.ES20.Shaders -!duplicate-type-name! StencilFunction enum exists as both OpenTK.Graphics.ES30.StencilFunction and OpenTK.Graphics.ES20.StencilFunction -!duplicate-type-name! StencilOp enum exists as both OpenTK.Graphics.ES20.StencilOp and OpenTK.Graphics.ES11.StencilOp -!duplicate-type-name! StencilOp enum exists as both OpenTK.Graphics.ES30.StencilOp and OpenTK.Graphics.ES11.StencilOp -!duplicate-type-name! StringName enum exists as both OpenTK.Graphics.ES20.StringName and OpenTK.Graphics.ES11.StringName -!duplicate-type-name! StringName enum exists as both OpenTK.Graphics.ES30.StringName and OpenTK.Graphics.ES11.StringName -!duplicate-type-name! TextureMagFilter enum exists as both OpenTK.Graphics.ES20.TextureMagFilter and OpenTK.Graphics.ES11.TextureMagFilter -!duplicate-type-name! TextureMagFilter enum exists as both OpenTK.Graphics.ES30.TextureMagFilter and OpenTK.Graphics.ES11.TextureMagFilter -!duplicate-type-name! TextureMinFilter enum exists as both OpenTK.Graphics.ES20.TextureMinFilter and OpenTK.Graphics.ES11.TextureMinFilter -!duplicate-type-name! TextureMinFilter enum exists as both OpenTK.Graphics.ES30.TextureMinFilter and OpenTK.Graphics.ES11.TextureMinFilter -!duplicate-type-name! TextureParameterName enum exists as both OpenTK.Graphics.ES20.TextureParameterName and OpenTK.Graphics.ES11.TextureParameterName -!duplicate-type-name! TextureParameterName enum exists as both OpenTK.Graphics.ES30.TextureParameterName and OpenTK.Graphics.ES11.TextureParameterName -!duplicate-type-name! TextureTarget enum exists as both OpenTK.Graphics.ES30.TextureTarget and OpenTK.Graphics.ES20.TextureTarget -!duplicate-type-name! TextureUnit enum exists as both OpenTK.Graphics.ES20.TextureUnit and OpenTK.Graphics.ES11.TextureUnit -!duplicate-type-name! TextureUnit enum exists as both OpenTK.Graphics.ES30.TextureUnit and OpenTK.Graphics.ES11.TextureUnit -!duplicate-type-name! TextureWrapMode enum exists as both OpenTK.Graphics.ES20.TextureWrapMode and OpenTK.Graphics.ES11.TextureWrapMode -!duplicate-type-name! TextureWrapMode enum exists as both OpenTK.Graphics.ES30.TextureWrapMode and OpenTK.Graphics.ES11.TextureWrapMode -!duplicate-type-name! UniformTypes enum exists as both OpenTK.Graphics.ES30.UniformTypes and OpenTK.Graphics.ES20.UniformTypes -!duplicate-type-name! Unknown enum exists as both OpenTK.Graphics.ES20.Unknown and OpenTK.Graphics.ES11.Unknown -!duplicate-type-name! Unknown enum exists as both OpenTK.Graphics.ES30.Unknown and OpenTK.Graphics.ES11.Unknown -!duplicate-type-name! VertexArrays enum exists as both OpenTK.Graphics.ES30.VertexArrays and OpenTK.Graphics.ES20.VertexArrays -!duplicate-type-name! VertexAttribParameter enum exists as both OpenTK.Graphics.ES30.VertexAttribParameter and OpenTK.Graphics.ES20.VertexAttribParameter -!duplicate-type-name! VertexAttribPointerParameter enum exists as both OpenTK.Graphics.ES30.VertexAttribPointerParameter and OpenTK.Graphics.ES20.VertexAttribPointerParameter -!duplicate-type-name! VertexAttribPointerType enum exists as both OpenTK.Graphics.ES30.VertexAttribPointerType and OpenTK.Graphics.ES20.VertexAttribPointerType - # Non-Apple diff --git a/tests/xtro-sharpie/tvos.pending b/tests/xtro-sharpie/tvos.pending index bf176c3b9afc..33368970b73c 100644 --- a/tests/xtro-sharpie/tvos.pending +++ b/tests/xtro-sharpie/tvos.pending @@ -14,6 +14,10 @@ !missing-selector! AVPlayerItem::setExternalSubtitleOptionLanguages: not bound !missing-selector! AVPlayerItem::setSelectedExternalSubtitleOptionLanguage: not bound +## this was tvos 10.2 in Xcode 8.3 and changed to iOS-only in Xcode9 betas +## it's still exposed by AVContentKeySessionDelegate which is available in tvos 10.2 +!unknown-type! AVPersistableContentKeyRequest bound + # CloudKit @@ -50,6 +54,9 @@ ## new Apple abstract member (breaking change) fixed in XAMCORE_4_0 !incorrect-protocol-member! MTLRenderCommandEncoder::setDepthClipMode: is REQUIRED and should be abstract +## only on macOS (but removing would be a vreaking change) +!unknown-native-enum! MTLSamplerBorderColor bound + # UserNotifications @@ -168,3 +175,11 @@ ## Marked as not in tvOS in Xcode 8.2 beta 1 but it's a breaking change and it's fixed only in XAMCORE_4_0 !unknown-native-enum! UICloudSharingPermissionOptions bound + +## Intent not yet available on tvOS +!missing-protocol-member! UIApplicationDelegate::application:handleIntent:completionHandler: not found + +## CoreNFC has just enums available in Xcode 9 Beta 1 +!missing-enum! NFCReaderError not bound +!missing-enum! NFCTagType not bound +!missing-enum! NFCTypeNameFormat not bound \ No newline at end of file diff --git a/tests/xtro-sharpie/watchos.ignore b/tests/xtro-sharpie/watchos.ignore index 5bf9cd3ee4fe..ddb1b25231be 100644 --- a/tests/xtro-sharpie/watchos.ignore +++ b/tests/xtro-sharpie/watchos.ignore @@ -8,6 +8,18 @@ ## types/members marked as deprecated in watchOS 2.0 (even if the framework was not available before 3.0) AVAudioPlayerDelegate::audioPlayerEndInterruption:withOptions: +## it's not exposed in the API offered by watchOS +!missing-enum! AVAudioSessionRecordPermission not bound + + +# CoreBluetooth + +## present in headers but already deprecated (we're not exposing them) +!missing-enum! CBCentralManagerState not bound +!missing-enum! CBPeripheralManagerState not bound +!missing-selector! CBPeripheral::RSSI not bound +!missing-selector! +CBUUID::UUIDWithCFUUID: not bound + # Foundation @@ -110,6 +122,12 @@ AVAudioPlayerDelegate::audioPlayerEndInterruption:withOptions: !missing-selector! GKVoiceChatService::setRemoteParticipantVolume: not bound !missing-selector! GKVoiceChatService::startVoiceChatWithParticipantID:error: not bound !missing-selector! GKVoiceChatService::stopVoiceChatWithParticipantID: not bound +!missing-enum! GKSessionError not bound + +# HealthKit + +## type was marked as available in 3.0 - but it's now iOS 11 only (even if members are marked with 10.0) +!unknown-type! HKCDADocument bound #PassKit @@ -119,6 +137,20 @@ AVAudioPlayerDelegate::audioPlayerEndInterruption:withOptions: !missing-enum! PKPaymentButtonType not bound +# SpriteKit + +## AVPlayer is not available on watchOS +!missing-selector! +SKVideoNode::videoNodeWithAVPlayer: not bound +!missing-selector! SKVideoNode::initWithAVPlayer: not bound + +## Those API are already deprecated - so we're not adding them +## from a managed point-of-view that's invisible (same .ctor) +!missing-selector! SKVideoNode::initWithVideoFileNamed: not bound +!missing-selector! SKVideoNode::initWithVideoURL: not bound +!missing-selector! +SKVideoNode::videoNodeWithVideoFileNamed: not bound +!missing-selector! +SKVideoNode::videoNodeWithVideoURL: not bound + + # UIKit ## Implemented in managed code @@ -135,6 +167,15 @@ AVAudioPlayerDelegate::audioPlayerEndInterruption:withOptions: !missing-selector! UIImageDeprecated::stretchableImageWithLeftCapWidth:topCapHeight: not bound !missing-selector! UIImageDeprecated::topCapHeight not bound +## lack of availabilty macros on NSItemProvder.PreferredPresentationStyle - intro says they are not available +!missing-selector! NSItemProvider::preferredPresentationStyle not bound +!missing-selector! NSItemProvider::setPreferredPresentationStyle: not bound +## and that also means the (enum/returned) type is unused +!missing-enum! UIPreferredPresentationStyle not bound + +## UITraitCollection is not available on watchOS +!missing-selector! +UIColor::colorNamed:inBundle:compatibleWithTraitCollection: not bound + # WatchConnectivity diff --git a/tests/xtro-sharpie/watchos.pending b/tests/xtro-sharpie/watchos.pending index 73885ae38efd..33a075b960a2 100644 --- a/tests/xtro-sharpie/watchos.pending +++ b/tests/xtro-sharpie/watchos.pending @@ -69,6 +69,12 @@ !missing-protocol-conformance! CMSensorDataList should conform to NSFastEnumeration +# Foundation + +## type was not marked as unavailable before Xcode9 +!unknown-type! NSUbiquitousKeyValueStore bound + + # HealthKit ## deprecated API (removed in same version it was added) @@ -111,6 +117,21 @@ ## Waiting on a radar https://trello.com/c/h8xBlKTt !missing-selector! +INPreferences::requestSiriAuthorization: not bound +## Bound with no availability information, removing them is a breaking change +## but I am not sure if they should be in WatchOS since they are from last year +## and seems that intro did not complain, also there are others INCar* that are +## explicitly available in WatchOS +!unknown-type! INCarAirCirculationModeResolutionResult bound +!unknown-type! INCarAudioSourceResolutionResult bound +!unknown-type! INCarDefrosterResolutionResult bound +!unknown-type! INCarSeatResolutionResult bound +!unknown-type! INRadioTypeResolutionResult bound +!unknown-type! INRelativeReferenceResolutionResult bound +!unknown-type! INRelativeSettingResolutionResult bound + +## Added and removed in watchOS 4 +!missing-selector! +INNotebookItemTypeResolutionResult::disambiguationWithValuesToDisambiguate: not bound + #PassKit ## No availability macro is provided for PKLabeledValue on watchOS / radar: https://trello.com/c/MvaHEZlc diff --git a/tests/xtro-sharpie/xtro-plugin.csproj b/tests/xtro-sharpie/xtro-plugin.csproj deleted file mode 100644 index 013b7e035121..000000000000 --- a/tests/xtro-sharpie/xtro-plugin.csproj +++ /dev/null @@ -1,51 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {6CBA2C3C-2EC7-42A0-8AA7-85FC62252A18} - Library - xtroplugin - xtro-plugin - v4.5 - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false - - - - - \Library\Frameworks\ObjectiveSharpie.framework\Versions\Current\Sharpie.Core.dll - - - ..\..\packages\Mono.Cecil.0.9.6.1\lib\net45\Mono.Cecil.dll - - - - - - - - - {D890A042-93C2-4B4B-ABF8-7ECBCBF059D8} - xtro-sharpie - - - \ No newline at end of file diff --git a/tests/xtro-sharpie/xtro-sharpie.csproj b/tests/xtro-sharpie/xtro-sharpie.csproj index 4d534ee4f761..e5846bbeafa6 100644 --- a/tests/xtro-sharpie/xtro-sharpie.csproj +++ b/tests/xtro-sharpie/xtro-sharpie.csproj @@ -21,6 +21,7 @@ 4 false ../../iphoneos9.2-arm64.pch /Library/Frameworks/Xamarin.iOS.framework/Versions/Current//lib/64bits/Xamarin.iOS.dll + x64 full @@ -30,6 +31,26 @@ 4 true + + Project + watchos4.0-armv7.pch ../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/32bits/Xamarin.WatchOS.dll + . + + + Project + iphoneos11.0-arm64.pch ../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/64bits/Xamarin.iOS.dll ../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/mono/Xamarin.iOS/OpenTK-1.0.dll + . + + + Project + appletvos11.0-arm64.pch ../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/mono/Xamarin.TVOS/Xamarin.TVOS.dll ../../_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/lib/mono/Xamarin.TVOS/OpenTK-1.0.dll + . + + + Project + macosx10.13-x86_64.pch ../../_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/git/lib/x86_64/mobile/Xamarin.Mac.dll + . + @@ -50,6 +71,7 @@ + diff --git a/tests/xtro-sharpie/xtro-sharpie.sln b/tests/xtro-sharpie/xtro-sharpie.sln index 9f73655d58c3..10710c66b7ed 100644 --- a/tests/xtro-sharpie/xtro-sharpie.sln +++ b/tests/xtro-sharpie/xtro-sharpie.sln @@ -3,18 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xtro-sharpie", "xtro-sharpie.csproj", "{D890A042-93C2-4B4B-ABF8-7ECBCBF059D8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xtro-plugin", "xtro-plugin.csproj", "{6CBA2C3C-2EC7-42A0-8AA7-85FC62252A18}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6CBA2C3C-2EC7-42A0-8AA7-85FC62252A18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6CBA2C3C-2EC7-42A0-8AA7-85FC62252A18}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6CBA2C3C-2EC7-42A0-8AA7-85FC62252A18}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6CBA2C3C-2EC7-42A0-8AA7-85FC62252A18}.Release|Any CPU.Build.0 = Release|Any CPU {D890A042-93C2-4B4B-ABF8-7ECBCBF059D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D890A042-93C2-4B4B-ABF8-7ECBCBF059D8}.Debug|Any CPU.Build.0 = Debug|Any CPU {D890A042-93C2-4B4B-ABF8-7ECBCBF059D8}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/tools/common/Assembly.cs b/tools/common/Assembly.cs index bf952546a5fe..7991eba472c8 100644 --- a/tools/common/Assembly.cs +++ b/tools/common/Assembly.cs @@ -376,6 +376,8 @@ public void ComputeLinkerFlags () case "Metal": case "MetalKit": case "MetalPerformanceShaders": + case "CoreNFC": + case "DeviceCheck": // some frameworks do not exists on simulators and will result in linker errors if we include them #if MTOUCH if (!App.IsSimulatorBuild) { diff --git a/tools/common/Frameworks.cs b/tools/common/Frameworks.cs index c69d7ecaa217..a4c2cfc76c64 100644 --- a/tools/common/Frameworks.cs +++ b/tools/common/Frameworks.cs @@ -136,8 +136,12 @@ public static Frameworks MacFrameworks { { "ModelIO", 10, 11 }, { "Intents", 10, 12 }, + { "IOSurface", "IOSurface", 10, 12 }, { "SafariServices", "SafariServices", 10, 12 }, { "MediaPlayer", "MediaPlayer", 10, 12, 1 }, + + { "CoreML", "CoreML", 10, 13 }, + { "Vision", "Vision", 10, 13 }, }; } return mac_frameworks; @@ -241,6 +245,17 @@ public static Frameworks GetiOSFrameworks (Application app) { "UserNotificationsUI", "UserNotificationsUI", 10 }, { "Intents", "Intents", 10 }, { "IntentsUI", "IntentsUI", 10 }, + + { "ARKit", "ARKit", 11 }, + { "CoreNFC", "CoreNFC", 11 }, + { "DeviceCheck", "DeviceCheck", 11 }, + { "IdentityLookup", "IdentityLookup", 11 }, + { "IOSurface", "IOSurface", 11 }, + { "CoreML", "CoreML", 11 }, + { "Vision", "Vision", 11 }, + { "FileProvider", "FileProvider", 11 }, + { "FileProviderUI", "FileProviderUI", 11 }, + { "PdfKit", "PDFKit", 11 }, }; } return ios_frameworks; @@ -281,6 +296,8 @@ public static Frameworks GetwatchOSFrameworks (Application app) { "SpriteKit", "SpriteKit", 3 }, { "UserNotifications", "UserNotifications", 3 }, { "Intents", "Intents", 3,2 }, + + { "CoreML", "CoreML", 4 }, }; } return watch_frameworks; @@ -344,6 +361,11 @@ public static Frameworks TVOSFrameworks { { "UserNotifications", "UserNotifications", 10 }, { "VideoSubscriberAccount", "VideoSubscriberAccount", 10 }, { "VideoToolbox", "VideoToolbox", 10,2 }, + + { "DeviceCheck", "DeviceCheck", 11 }, + { "CoreML", "CoreML", 11 }, + { "IOSurface", "IOSurface", 11 }, + { "Vision", "Vision", 11 }, }; } return tvos_frameworks; diff --git a/tools/common/MachO.cs b/tools/common/MachO.cs index 3ecbd0d7f0e2..3f6e9316a900 100644 --- a/tools/common/MachO.cs +++ b/tools/common/MachO.cs @@ -3,7 +3,11 @@ using System.IO; using System.Net; +#if MLAUNCH +using Xamarin.Launcher; +#else using Xamarin.Bundler; +#endif namespace Xamarin { diff --git a/tools/common/StaticRegistrar.cs b/tools/common/StaticRegistrar.cs index ef828404ee16..c39fd7ffec9c 100644 --- a/tools/common/StaticRegistrar.cs +++ b/tools/common/StaticRegistrar.cs @@ -1756,8 +1756,13 @@ void CheckNamespace (string ns, List exceptions) case "CoreAnimation": header.WriteLine ("#import "); #if MTOUCH - if (App.SdkVersion.Major > 7) - header.WriteLine ("#import "); + switch (App.Platform) { + case Xamarin.Utils.ApplePlatform.iOS: + case Xamarin.Utils.ApplePlatform.TVOS: + if (App.SdkVersion.Major > 7 && App.SdkVersion.Major < 11) + header.WriteLine ("#import "); + break; + } #endif return; case "CoreMidi": @@ -1819,12 +1824,26 @@ void CheckNamespace (string ns, List exceptions) header.WriteLine ("#import "); namespaces.Add ("UIKit"); return; + case "CoreNFC": + case "DeviceCheck": +#if !MONOMAC + if (IsSimulator) + return; // No headers provided for simulator, which makes sense since there is no NFC on it. +#endif + goto default; case "QTKit": #if MONOMAC if (App.SdkVersion >= MacOSTenTwelveVersion) return; // 10.12 removed the header files for QTKit #endif goto default; + case "IOSurface": // There is no IOSurface.h +#if !MONOMAC + if (IsSimulator) + return; // Not available in the simulator (the header is there, but broken). +#endif + h = ""; + break; default: h = string.Format ("<{0}/{0}.h>", ns); break; diff --git a/tools/common/Target.cs b/tools/common/Target.cs index fb56de22e51c..39cc4d00f44a 100644 --- a/tools/common/Target.cs +++ b/tools/common/Target.cs @@ -150,6 +150,8 @@ public void GatherFrameworks () case "Metal": case "MetalKit": case "MetalPerformanceShaders": + case "CoreNFC": + case "DeviceCheck": // some frameworks do not exists on simulators and will result in linker errors if we include them if (App.IsSimulatorBuild) continue; diff --git a/tools/linker/ObjCExtensions.cs b/tools/linker/ObjCExtensions.cs index 05ca8540c5fc..1fb5bd234002 100644 --- a/tools/linker/ObjCExtensions.cs +++ b/tools/linker/ObjCExtensions.cs @@ -57,6 +57,10 @@ internal static void Initialize () ModelIO = profile.GetNamespace ("ModelIO"); Intents = profile.GetNamespace ("Intents"); Photos = profile.GetNamespace ("Photos"); + CoreML = profile.GetNamespace ("CoreML"); + Vision = profile.GetNamespace ("Vision"); + IOSurface = profile.GetNamespace ("IOSurface"); + PdfKit = profile.GetNamespace ("PdfKit"); #if MONOMAC IOBluetooth = profile.GetNamespace ("IOBluetooth"); IOBluetoothUI = profile.GetNamespace ("IOBluetoothUI"); @@ -65,7 +69,6 @@ internal static void Initialize () AppKit = profile.GetNamespace ("AppKit"); CoreWlan = profile.GetNamespace ("CoreWlan"); ImageKit = profile.GetNamespace ("ImageKit"); - PdfKit = profile.GetNamespace ("PdfKit"); QTKit = profile.GetNamespace ("QTKit"); QuartzComposer = profile.GetNamespace ("QuartzComposer"); SceneKit = profile.GetNamespace ("SceneKit"); @@ -73,6 +76,7 @@ internal static void Initialize () WebKit = profile.GetNamespace ("WebKit"); MediaPlayer = profile.GetNamespace ("MediaPlayer"); PrintCore = profile.GetNamespace ("PrintCore"); + ExternalAccessory = profile.GetNamespace ("ExternalAccessory"); #else Registrar = profile.GetNamespace ("Registrar"); UIKit = profile.GetNamespace ("UIKit"); @@ -134,6 +138,14 @@ internal static void Initialize () public static string Photos { get; private set; } + public static string CoreML { get; private set; } + + public static string Vision { get; private set; } + + public static string IOSurface { get; private set; } + + public static string PdfKit { get; private set; } + #if MONOMAC public static string IOBluetooth { get; private set; } public static string IOBluetoothUI { get; private set; } @@ -146,8 +158,6 @@ internal static void Initialize () public static string ImageKit { get; private set; } - public static string PdfKit { get; private set; } - public static string QTKit { get; private set; } public static string QuartzComposer { get; private set; } @@ -159,6 +169,7 @@ internal static void Initialize () public static string WebKit { get; private set; } public static string MediaPlayer { get; private set; } public static string PrintCore { get; private set; } + public static string ExternalAccessory { get; private set; } #else public static string Registrar { get; private set; } diff --git a/tools/mmp/Makefile b/tools/mmp/Makefile index 8f93a71bc1a6..ffe6ac80935d 100644 --- a/tools/mmp/Makefile +++ b/tools/mmp/Makefile @@ -202,10 +202,10 @@ Xamarin.Mac.registrar.full.x86_64.m: $(TOP)/src/build/mac/full-64/Xamarin.Mac. $(Q) touch Xamarin.Mac.registrar.full.x86_64.m Xamarin.Mac.registrar.full.x86_64.h Xamarin.Mac.registrar.%.i386.a: Xamarin.Mac.registrar.%.i386.m - $(Q_CC) xcrun -sdk macosx clang -DDEBUG -g -gdwarf-2 -x objective-c++ -o $@ -c -arch i386 $< -Wall -I$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/include -mmacosx-version-min=$(MIN_OSX_SDK_VERSION) + $(Q_CC) xcrun -sdk macosx clang -DDEBUG -g -gdwarf-2 -x objective-c++ -o $@ -c -arch i386 $< -Wall -Wno-unguarded-availability-new -I$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/include -mmacosx-version-min=$(MIN_OSX_SDK_VERSION) Xamarin.Mac.registrar.%.x86_64.a: Xamarin.Mac.registrar.%.x86_64.m - $(Q_CC) xcrun -sdk macosx clang -DDEBUG -g -gdwarf-2 -x objective-c++ -o $@ -c -arch x86_64 $< -Wall -I$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/include -mmacosx-version-min=$(MIN_OSX_SDK_VERSION) -fobjc-runtime=macosx + $(Q_CC) xcrun -sdk macosx clang -DDEBUG -g -gdwarf-2 -x objective-c++ -o $@ -c -arch x86_64 $< -Wall -Wno-unguarded-availability-new -I$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/include -mmacosx-version-min=$(MIN_OSX_SDK_VERSION) -fobjc-runtime=macosx Xamarin.Mac.registrar.%.a: Xamarin.Mac.registrar.%.i386.a Xamarin.Mac.registrar.%.x86_64.a $(Q_LIPO) $(DEVICE_BIN_PATH)/lipo -create -output $@ $^ diff --git a/tools/mmp/driver.cs b/tools/mmp/driver.cs index fdf5bcfe9bac..98e4f58d75ac 100644 --- a/tools/mmp/driver.cs +++ b/tools/mmp/driver.cs @@ -693,10 +693,11 @@ static void Pack (IList unprocessed) { if (!App.EnableDebug) registrar = RegistrarMode.Static; - else if (IsUnified && App.LinkMode == LinkMode.None && embed_mono && App.IsDefaultMarshalManagedExceptionMode) + else if (IsUnified && App.LinkMode == LinkMode.None && embed_mono && App.IsDefaultMarshalManagedExceptionMode && File.Exists (PartialStaticLibrary)) registrar = RegistrarMode.PartialStatic; else registrar = RegistrarMode.Dynamic; + Log (1, $"Defaulting registrar to '{registrar}'"); } if (no_executable) { @@ -1057,6 +1058,12 @@ public static string MonoMacBinDirectory { } } + static string PartialStaticLibrary { + get { + return Path.Combine (GetXamMacPrefix (), "lib", string.Format ("mmp/Xamarin.Mac.registrar.{0}.a", IsUnifiedMobile ? "mobile" : "full")); + } + } + public static bool IsUptodate (string source, string target) { return Application.IsUptodate (source, target); @@ -1230,6 +1237,10 @@ static int Compile () args.Append ("-fobjc-runtime=macosx "); if (!embed_mono) args.Append ("-DDYNAMIC_MONO_RUNTIME "); + + if (XcodeVersion >= new Version (9, 0)) + args.Append ("-Wno-unguarded-availability-new "); + bool appendedObjc = false; foreach (var assembly in BuildTarget.Assemblies) { if (assembly.LinkWith != null) { @@ -1331,8 +1342,8 @@ static int Compile () } if (registrar == RegistrarMode.PartialStatic) { - args.Append (Path.Combine (GetXamMacPrefix (), "lib", string.Format ("mmp/Xamarin.Mac.registrar.{0}.a ", IsUnifiedMobile ? "mobile" : "full"))); - args.Append ("-framework Quartz "); + args.Append (PartialStaticLibrary); + args.Append (" -framework Quartz "); } args.Append ("-liconv -x objective-c++ "); diff --git a/tools/mmp/linker/MonoMac.Tuner/MonoMacNamespaces.cs b/tools/mmp/linker/MonoMac.Tuner/MonoMacNamespaces.cs index 9a87c908e138..80a88f7f4102 100644 --- a/tools/mmp/linker/MonoMac.Tuner/MonoMacNamespaces.cs +++ b/tools/mmp/linker/MonoMac.Tuner/MonoMacNamespaces.cs @@ -68,7 +68,12 @@ public class MonoMacNamespaces : IStep { { Constants.MediaPlayerLibrary, Namespaces.MediaPlayer }, { Constants.IntentsLibrary, Namespaces.Intents }, { Constants.PhotosLibrary, Namespaces.Photos }, - { Constants.PrintCoreLibrary, Namespaces.PrintCore} }; + { Constants.PrintCoreLibrary, Namespaces.PrintCore }, + { Constants.CoreMLLibrary, Namespaces.CoreML }, + { Constants.VisionLibrary, Namespaces.Vision }, + { Constants.IOSurfaceLibrary, Namespaces.IOSurface }, + { Constants.ExternalAccessoryLibrary, Namespaces.ExternalAccessory }, + }; public void Process (LinkContext context) { diff --git a/tools/mtouch/Application.cs b/tools/mtouch/Application.cs index c7b4b9f4ee34..ec1bcd0d973f 100644 --- a/tools/mtouch/Application.cs +++ b/tools/mtouch/Application.cs @@ -595,7 +595,11 @@ public void SetDefaultAbi () switch (Platform) { case ApplePlatform.iOS: if (abis.Count == 0) { - abis.Add (IsDeviceBuild ? Abi.ARMv7 : Abi.i386); + if (DeploymentTarget == null || DeploymentTarget.Major >= 11) { + abis.Add (IsDeviceBuild ? Abi.ARM64 : Abi.x86_64); + } else { + abis.Add (IsDeviceBuild ? Abi.ARMv7 : Abi.i386); + } } break; case ApplePlatform.WatchOS: @@ -1340,6 +1344,13 @@ void Initialize () RootAssemblies.Add (Path.Combine (Driver.GetPlatformFrameworkDirectory (this), Driver.GetProductAssembly (this) + ".dll")); } + if (Platform == ApplePlatform.iOS) { + if (DeploymentTarget.Major >= 11 && Is32Build) { + var invalidArches = abis.Where ((v) => (v & Abi.Arch32Mask) != 0); + throw ErrorHelper.CreateError (116, $"Invalid architecture: {invalidArches.First ()}. 32-bit architectures are not supported when deployment target is 11 or later."); + } + } + InitializeCommon (); Driver.Watch ("Resolve References", 1); @@ -1996,7 +2007,7 @@ public void BuildMSymDirectory () GenerateMSymManifest (target, target_directory); var msymdir = Path.Combine (target.BuildDirectory, "Msym"); if (!Directory.Exists (msymdir)) { - ErrorHelper.Warning (116, $"The directory {msymdir} containing the mono symbols could not be found."); + ErrorHelper.Warning (118, $"The directory {msymdir} containing the mono symbols could not be found."); continue; } // copy aot data must be done BEFORE we do copy the msym one diff --git a/tools/mtouch/BuildTasks.mtouch.cs b/tools/mtouch/BuildTasks.mtouch.cs index 2b6578d78020..2b95c4d54e29 100644 --- a/tools/mtouch/BuildTasks.mtouch.cs +++ b/tools/mtouch/BuildTasks.mtouch.cs @@ -336,7 +336,7 @@ protected override async Task ExecuteAsync () // /System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore instead of // /System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore // more details in https://bugzilla.xamarin.com/show_bug.cgi?id=31036 - if (Target.WeakFrameworks.Count > 0) + if (CompilerFlags.WeakFrameworks.Count > 0) Target.AdjustDylibs (); Driver.Watch ("Native Link", 1); } diff --git a/tools/mtouch/Makefile b/tools/mtouch/Makefile index 3236aefd3685..5f7565d54b2b 100644 --- a/tools/mtouch/Makefile +++ b/tools/mtouch/Makefile @@ -272,7 +272,11 @@ SIMLAUNCHER_FRAMEWORKS = \ -weak_framework UserNotifications \ -weak_framework UserNotificationsUI \ -weak_framework Intents \ - -weak_framework IntentsUI + -weak_framework IntentsUI \ + \ + -weak_framework ARKit \ + -weak_framework FileProvider \ + -weak_framework FileProviderUI # note: there _was_ no CoreAudioKit.framework or Metal.framework for the simulator (before recent iOS9 betas) # note 2: there's no GameKit, in iOS 9 (beta 3 at least), you're supposed to reference GameCenter instead (looks fixed in beta 4) @@ -360,16 +364,16 @@ bin/Makefile/Mono.Cecil.Mdb.dll: $(MONO_CECIL_MDB_DLL) | bin/Makefile $(Q_LIPO) $(DEVICE_BIN_PATH)/lipo -create -output $@ $^ %.registrar.ios.i386.a: %.registrar.ios.i386.m %.registrar.ios.i386.h - $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR86_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include + $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR86_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -Wno-unguarded-availability-new -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include %.registrar.ios.x86_64.a: %.registrar.ios.x86_64.m %.registrar.ios.x86_64.h - $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR64_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include + $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR64_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -Wno-unguarded-availability-new -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include %.registrar.watchos.a: %.registrar.watchos.m %.registrar.watchos.h - $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORWATCH_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(XAMARIN_WATCHSIMULATOR_SDK)/usr/include + $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORWATCH_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -Wno-unguarded-availability-new -I$(IOS_DESTDIR)$(XAMARIN_WATCHSIMULATOR_SDK)/usr/include %.registrar.tvos.a: %.registrar.tvos.m %.registrar.tvos.h - $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORTV_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(XAMARIN_TVSIMULATOR_SDK)/usr/include + $(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORTV_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -Wno-unguarded-availability-new -I$(IOS_DESTDIR)$(XAMARIN_TVSIMULATOR_SDK)/usr/include TARGETS = \ $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/mtouch \ diff --git a/tools/mtouch/Target.cs b/tools/mtouch/Target.cs index ef2e78b0f20f..003e9e25a1cb 100644 --- a/tools/mtouch/Target.cs +++ b/tools/mtouch/Target.cs @@ -1208,6 +1208,10 @@ public void Compile () // This is because iOS has a forward declaration of NSPortMessage, but no actual declaration. // They still use NSPortMessage in other API though, so it can't just be removed from our bindings. registrar_task.CompilerFlags.AddOtherFlag ("-Wno-receiver-forward-class"); + + if (Driver.XcodeVersion >= new Version (9, 0)) + registrar_task.CompilerFlags.AddOtherFlag ("-Wno-unguarded-availability-new"); + LinkWithTaskOutput (registrar_task); } @@ -1234,8 +1238,11 @@ public void Compile () throw ErrorHelper.CreateError (71, "Unknown platform: {0}. This usually indicates a bug in Xamarin.iOS; please file a bug report at http://bugzilla.xamarin.com with a test case.", App.Platform); } - registration_methods.Add (method); - LinkWithStaticLibrary (Path.Combine (Driver.GetProductSdkDirectory (App), "usr", "lib", library)); + var lib = Path.Combine (Driver.GetProductSdkDirectory (App), "usr", "lib", library); + if (File.Exists (lib)) { + registration_methods.Add (method); + LinkWithStaticLibrary (lib); + } } // The main method.

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%0DKU&N;G>4%-Uik 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