protected override bool Skip (Type type) { switch (type.FullName) { // OS X 10.8 + case "MonoMac.AppKit.NSSharingService": case "AppKit.NSSharingService": case "MonoMac.Foundation.NSUserNotification": case "Foundation.NSUserNotification": return !Mac.CheckSystemVersion (10, 8); } switch (type.Namespace) { // OSX 10.8+ case "MonoMac.Accounts": case "Accounts": case "MonoMac.GameKit": case "GameKit": case "MonoMac.Social": case "Social": return !Mac.CheckSystemVersion (10, 8); case "SceneKit": case "MonoMac.SceneKit": return !Mac.CheckSystemVersion (10, 8) || IntPtr.Size != 8; default: return false; } }
public override void SupportsSecureCoding() { if (!Mac.CheckSystemVersion(10, 8)) { return; } base.SupportsSecureCoding(); }
protected override void Dispose(NSObject obj, Type type) { switch (type.FullName) { // FIXME: those crash the application when Dispose is called case "MonoMac.JavaScriptCore.JSManagedValue": case "JavaScriptCore.JSManagedValue": // JSManagedValue crashes in Yosemite (b7), but not Mavericks. if (!Mac.CheckSystemVersion(10, 10)) { goto default; } goto case "MonoMac.ImageKit.IKScannerDeviceView"; // fallthrough case "MonoMac.ImageKit.IKScannerDeviceView": // 19835 case "ImageKit.IKScannerDeviceView": case "MonoMac.AppKit.NSFontPanel": // *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x11491cc00 of class NSButton was deallocated while key value observers were still registered with it. case "AppKit.NSFontPanel": case "MonoMac.AVFoundation.AVAudioRecorder": // same on iOS case "AVFoundation.AVAudioRecorder": case "MonoMac.Foundation.NSUrlConnection": case "Foundation.NSUrlConnection": // 10.8: case "MonoMac.Accounts.ACAccount": // maybe the default .ctor is not allowed ? case "Accounts.ACAccount": case "MonoMac.Accounts.ACAccountCredential": case "Accounts.ACAccountCredential": case "MonoMac.Accounts.ACAccountStore": case "Accounts.ACAccountStore": case "MonoMac.Accounts.ACAccountType": case "Accounts.ACAccountType": case "MonoMac.CoreData.NSPersistentStoreCoordinator": case "CoreData.NSPersistentStoreCoordinator": do_not_dispose.Add(obj); break; // 10.11 case "MonoMac.CoreImage.CIImageAccumulator": case "CoreImage.CIImageAccumulator": case "WebKit.WKNavigation": // crashes on El Capitan (b2) but not before if (!Mac.CheckSystemVersion(10, 11)) { goto default; } do_not_dispose.Add(obj); break; default: base.Dispose(obj, type); break; } }
protected override int Size(Type t, bool simd = false) { switch (t.FullName) { case "GameKit.GKGameCenterViewControllerState": case "AppKit.NSOpenGLContextParameter": // NSOpenGLContextParameter and GKGameCenterViewControllerState are anonymous enums in 10.9, but an NSInteger in 10.10. if (IntPtr.Size == 8 && !Mac.CheckSystemVersion(10, 10)) { return(4); } break; } return(base.Size(t, simd)); }
protected override bool Skip(string nativeName) { switch (nativeName) { case "CIMaskedVariableBlur": // Appears removed in 10.11 but not documented if (Mac.CheckSystemVersion(10, 11)) { return(true); } return(false); case "CICMYKHalftone": // Renamed as CICmykHalftone return(true); default: return(base.Skip(nativeName)); } }
protected override bool CheckResponse(bool value, Type actualType, MethodBase method, ref string name) { var declaredType = method.DeclaringType; switch (name) { // NSDraggingDestination protocol case "concludeDragOperation:": // e.g. NSTokenField case "draggingEnded:": // e.g. NSMatrix case "draggingExited:": // e.g. NSTokenField case "draggingUpdated:": // e.g. NSTokenField case "performDragOperation:": // e.g. NSTokenField case "prepareForDragOperation:": // e.g. NSTokenField case "wantsPeriodicDraggingUpdates": // e.g. NSBrowser - optional, [DefaultValue(true)] if it does not exists return(true); // NSDraggingSource case "draggedImage:beganAt:": // e.g. NSTextView case "draggedImage:endedAt:deposited:": // e.g. NSTableView case "draggedImage:movedTo:": // e.g. NSCollectionView case "ignoreModifierKeysWhileDragging": // e.g. NSTextView case "namesOfPromisedFilesDroppedAtDestination:": // e.g. NSTextView return(true); // NSAnimatablePropertyContainer case "animationForKey:": // e.g. NSViewAnimation case "animator": case "animations": case "setAnimations:": return(true); // NSTypeSetter - Layout Phase Interface (needs to be overridden, not really part of the provided types) case "willSetLineFragmentRect:forGlyphRange:usedRect:baselineOffset:": case "shouldBreakLineByWordBeforeCharacterAtIndex:": case "shouldBreakLineByHyphenatingBeforeCharacterAtIndex:": case "hyphenationFactorForGlyphAtIndex:": case "hyphenCharacterForGlyphAtIndex:": case "boundingBoxForControlGlyphAtIndex:forTextContainer:proposedLineFragment:glyphPosition:characterIndex:": return(true); // in NSView documentation but defined in NSClipView - no answers to call case "scrollClipView:toPoint:": return(true); // IKFilterBrowserPanel ??? not clear why case "finish:": return(true); // IKFilterUIView case "viewForUIConfiguration:excludedKeys:": // [Target] on CIFilter return(true); // NSDictionaryEnumerator case "fileModificationDate": case "fileType": case "filePosixPermissions": case "fileOwnerAccountName": case "fileGroupOwnerAccountName": case "fileSystemNumber": case "fileSystemFileNumber": case "fileExtensionHidden": case "fileHFSCreatorCode": case "fileHFSTypeCode": case "fileIsImmutable": case "fileIsAppendOnly": case "fileCreationDate": case "fileOwnerAccountID": case "fileGroupOwnerAccountID": return(true); // all [Target] on NSDictionary // SBObject case "get": return(true); // NSCoder - documented as available in 10.8 case "allowedClasses": case "requiresSecureCoding": return(true); // NSFileManager case "ubiquityIdentityToken": // documented in 10.8 return(true); // NS[Mutable]UrlRequest case "allowsCellularAccess": // documented in 10.8 case "setAllowsCellularAccess:": // documented in 10.8 return(true); // NSString case "capitalizedStringWithLocale:": // documented in 10.8 case "lowercaseStringWithLocale:": // documented in 10.8 case "uppercaseStringWithLocale:": // documented in 10.8 return(true); // AVVideoComposition case "isValidForAsset:timeRange:validationDelegate:": // documented in 10.8 return(true); // AVPlayer case "setRate:time:atHostTime:": // 10.8+ case "prerollAtRate:completionHandler:": // 10.8+ case "cancelPendingPrerolls": // 10.8+ case "masterClock": // 10.8+ case "setMasterClock:": // 10.8+ // NSDateComponents case "isLeapMonth": // 10.8+ case "setLeapMonth:": // 10.8+ // NSFileCoordinator case "itemAtURL:willMoveToURL:": // 10.8+ return(true); // documented (but does not respond) // MonoMac.CoreImage.CIDetector (10.8+) case "featuresInImage:options:": // MonoMac.CoreImage.CIFaceFeature (10.8+) case "hasTrackingID": case "trackingID": case "hasTrackingFrameCount": case "trackingFrameCount": // MonoMac.CoreImage.CIImage : only in 10.8+ case "properties": // only documented in header files case "autoAdjustmentFilters": case "autoAdjustmentFiltersWithOptions:": // MonoMac.AVFoundation.AVAssetExportSession (10.8+) case "asset": // MonoMac.AVFoundation.AVAssetReaderOutput case "alwaysCopiesSampleData": case "setAlwaysCopiesSampleData:": // MonoMac.AVFoundation.AVAssetTrack case "isPlayable": // MonoMac.AVFoundation.AVAudioPlayer (10.8+) case "enableRate": case "setEnableRate:": case "rate": case "setRate:": // MonoMac.AVFoundation.AVMutableCompositionTrack case "insertTimeRanges:ofTracks:atTime:error:": // MonoMac.AVFoundation.AVPlayerItem case "addOutput:": case "removeOutput:": case "canPlayFastReverse": case "canPlayFastForward": case "canPlaySlowForward": case "canPlayReverse": case "canPlaySlowReverse": case "canStepForward": case "canStepBackward": case "outputs": case "timebase": // MonoMac.CoreAnimation.CAAnimation : only on OSX, added for SceneKit case "usesSceneTimeBase": case "setUsesSceneTimeBase:": if (!Mac.CheckSystemVersion(10, 8)) { return(true); } break; case "initWithString:": if (declaredType.Name == "NSTextStorage") { return(true); } break; } switch (declaredType.Name) { case "NSUrlSession": case "Foundation.NSUrlSession": switch (name) { case "delegateQueue": case "sessionDescription": case "setSessionDescription:": case "delegate": if (!Mac.CheckSystemVersion(10, 11)) { return(true); } break; } break; case "NSUrlSessionTask": case "Foundation.NSUrlSessionTask": switch (name) { case "countOfBytesExpectedToReceive": case "countOfBytesExpectedToSend": case "countOfBytesReceived": case "countOfBytesSent": case "currentRequest": case "error": case "originalRequest": case "response": case "state": case "taskDescription": case "setTaskDescription:": case "taskIdentifier": case "priority": case "setPriority:": if (!Mac.CheckSystemVersion(10, 11)) { return(true); } break; } break; case "Foundation.NSUrlSessionStreamTask": case "NSUrlSessionStreamTask": switch (name) { case "captureStreams": case "closeRead": case "closeWrite": case "readDataOfMinLength:maxLength:timeout:completionHandler:": case "startSecureConnection": case "stopSecureConnection": case "writeData:timeout:completionHandler:": if (!Mac.CheckSystemVersion(10, 11)) { return(true); } break; } break; } // Console.WriteLine ("{0} {1}", declaredType, name); return(base.CheckResponse(value, actualType, method, ref name)); }
protected override bool Skip(Type type) { switch (type.FullName) { case "MonoMac.CIFilter.CIMaskedVariableBlur": // Appears to be missing from 10.11, not documented case "CIFilter.CIMaskedVariableBlur": if (Mac.CheckSystemVersion(10, 11)) { return(true); } break; case "MonoMac.Foundation.NSUrlSession": case "Foundation.NSUrlSession": case "MonoMac.Foundation.NSUrlSessionTask": case "Foundation.NSUrlSessionTask": case "MonoMac.Foundation.NSUrlSessionDataTask": case "Foundation.NSUrlSessionDataTask": case "MonoMac.Foundation.NSUrlSessionUploadTask": case "Foundation.NSUrlSessionUploadTask": case "MonoMac.Foundation.NSUrlSessionDownloadTask": case "Foundation.NSUrlSessionDownloadTask": case "MonoMac.Foundation.NSUrlSessionConfiguration": case "Foundation.NSUrlSessionConfiguration": // These classes are available in 32-bit Yosemite, or 32+64bit Mavericks. if (IntPtr.Size == 4 && !Mac.CheckSystemVersion(10, 10)) { return(true); } break; case "MonoMac.AppKit.NSSharingService": case "AppKit.NSSharingService": case "MonoMac.AppKit.NSSharingServicePicker": case "AppKit.NSSharingServicePicker": case "MonoMac.Foundation.NSByteCountFormatter": case "Foundation.NSByteCountFormatter": case "MonoMac.Foundation.NSUserNotification": case "Foundation.NSUserNotification": case "MonoMac.Foundation.NSUserNotificationCenter": case "Foundation.NSUserNotificationCenter": case "MonoMac.AVFoundation.AVPlayerItemOutput": case "AVFoundation.AVPlayerItemOutput": case "MonoMac.AVFoundation.AVPlayerItemVideoOutput": case "AVFoundation.AVPlayerItemVideoOutput": case "MonoMac.Foundation.NSUuid": case "Foundation.NSUuid": if (!Mac.CheckSystemVersion(10, 8)) { return(true); } break; } switch (type.Namespace) { // OSX 10.8+ case "MonoMac.Accounts": case "Accounts": case "MonoMac.GameKit": case "GameKit": case "MonoMac.Social": case "Social": case "MonoMac.StoreKit": case "StoreKit": if (!Mac.CheckSystemVersion(10, 8)) { return(true); } break; case "SceneKit": case "MonoMac.SceneKit": if (!Mac.CheckSystemVersion(10, 8) || IntPtr.Size != 8) { return(true); } break; // not installed by default case "MonoMac.Growl": case "Growl": return(true); } return(base.Skip(type)); }
protected override bool Skip(Type type, string selectorName) { switch (selectorName) { case "accessibilityNotifiesWhenDestroyed": // The header declares this on an NSObject category but // it doesn't even respondsToSelector on NSView/NSCell... return(true); #if !XAMCORE_4_0 case "xamarinselector:removed:": return(true); #endif #if !XAMCORE_3_0 case "initWithPasteboardPropertyList:ofType:": // This is a broken binding, but it's an abstract protocol // method, so there's no way to remove it without breaking // compat. return(true); #endif case "waitUntilExit": // category, NSTask won't respond -> @interface NSTask (NSTaskConveniences) if (type.Name == "NSTask") { return(true); } break; case "readInBackgroundAndNotifyForModes:": case "readInBackgroundAndNotify": case "readToEndOfFileInBackgroundAndNotifyForModes:": case "readToEndOfFileInBackgroundAndNotify": case "acceptConnectionInBackgroundAndNotifyForModes:": case "acceptConnectionInBackgroundAndNotify": case "waitForDataInBackgroundAndNotifyForModes:": case "waitForDataInBackgroundAndNotify": // category, NSFileHandle won't respond -> @interface NSFileHandle (NSFileHandleAsynchronousAccess) if (type.Name == "NSFileHandle") { return(true); } break; // initWithPlayerIDs: works (valid handle) and is documented - but does not respond when queried case "initWithPlayerIDs:": if (type.Name == "GKLeaderboard") { return(true); } break; // some types had NSCopying added after they were first introduced case "copyWithZone:": if (type.Name == "CBPeripheral" && !Mac.CheckSystemVersion(10, 9)) { return(true); } break; case "readingOptionsForType:pasteboard:": case "writingOptionsForType:pasteboard:": return(true); // Optional selectors on NSPasteboardReading/NSPasteboardWriting } switch (type.Namespace) { // Notifications seems to follow a pattern were selectors are routed to an internal concrete type case "MonoMac.Foundation": case "Foundation": switch (type.Name) { // looks like it's routed to (private) NSConcreteUserNotificationCenter case "NSUserNotificationCenter": switch (selectorName) { case "delegate": case "setDelegate:": case "scheduledNotifications": case "setScheduledNotifications:": case "deliveredNotifications": return(true); } break; // looks like it's routed to (private) NSConcreteUserNotification case "NSUserNotification": switch (selectorName) { case "title": case "setTitle:": case "subtitle": case "setSubtitle:": case "informativeText": case "setInformativeText:": case "actionButtonTitle": case "setActionButtonTitle:": case "userInfo": case "setUserInfo:": case "deliveryDate": case "setDeliveryDate:": case "deliveryTimeZone": case "setDeliveryTimeZone:": case "deliveryRepeatInterval": case "setDeliveryRepeatInterval:": case "actualDeliveryDate": case "isPresented": case "isRemote": case "soundName": case "setSoundName:": case "hasActionButton": case "setHasActionButton:": case "activationType": case "otherButtonTitle": case "setOtherButtonTitle:": return(true); } break; case "NSFileHandle": //Fails on Lion case "NSUrlAuthenticationChallenge": case "NSUrlCredential": case "NSUrlProtectionSpace": case "NSAppleEventDescriptor": if (selectorName == "encodeWithCoder:" && !Mac.CheckSystemVersion(10, 8)) { return(true); } break; case "NSValue": switch (selectorName) { case "SCNMatrix4Value": case "SCNVector3Value": case "SCNVector4Value": case "valueWithSCNMatrix4:": if (IntPtr.Size != 8) { return(true); } break; } break; case "NSUrlSession": switch (selectorName) { case "delegateQueue": case "sessionDescription": case "setSessionDescription:": case "delegate": if (Mac.CheckSystemVersion(10, 11)) { return(true); } break; } break; case "NSUrlSessionStreamTask": switch (selectorName) { case "captureStreams": case "closeRead": case "closeWrite": case "readDataOfMinLength:maxLength:timeout:completionHandler:": case "startSecureConnection": case "stopSecureConnection": case "writeData:timeout:completionHandler:": if (Mac.CheckSystemVersion(10, 11)) { return(true); } break; } break; case "NSUrlSessionTask": switch (selectorName) { case "countOfBytesExpectedToReceive": case "countOfBytesExpectedToSend": case "countOfBytesReceived": case "countOfBytesSent": case "currentRequest": case "error": case "originalRequest": case "response": case "state": case "taskDescription": case "setTaskDescription:": case "taskIdentifier": if (Mac.CheckSystemVersion(10, 11)) { return(true); } break; } break; case "NSUrlSessionConfiguration": if (Mac.IsAtLeast(10, 11)) { return(true); } break; } break; case "MonoMac.AppKit": case "AppKit": switch (type.Name) { #if !XAMCORE_3_0 // These should be not be marked [Abstract] but can't fix w/o breaking change... case "NSScrollView": case "NSTextView": switch (selectorName) { case "contentViewAtIndex:effectiveCharacterRange:": case "didReplaceCharacters": case "drawCharactersInRange:forContentView:": case "rectsForCharacterRange:": case "replaceCharactersInRange:withString:": case "scrollRangeToVisible:": case "shouldReplaceCharactersInRanges:withStrings:": case "stringAtIndex:effectiveRange:endsWithSearchBoundary:": case "stringLength": case "allowsMultipleSelection": case "isEditable": case "firstSelectedRange": case "isSelectable": case "selectedRanges": case "setSelectedRanges:": case "string": case "visibleCharacterRanges": return(true); } break; #endif case "NSMenuDelegate": switch (selectorName) { #if !XAMCORE_3_0 case "menu:willHighlightItem:": return(true); // bound #endif } break; case "NSResponder": switch (selectorName) { case "smartMagnifyWithEvent:": case "quickLookWithEvent:": if (!Mac.CheckSystemVersion(10, 8)) { return(true); } break; } break; case "NSViewController": switch (selectorName) { case "identifier": // case "setIdentifier:": // In Yosemite (but not before) NSViewController implements the NSUserInterfaceItemIdentification // protocol (which brings a r/w Identifier property). We don't have any way of expressing that // a type started implementing a protocol in a particular version, so just ignore these selectors. if (!Mac.CheckSystemVersion(10, 10)) { return(true); } break; } break; } break; // GameKit seems to follow a pattern were selectors are routed to an internal concrete type case "MonoMac.GameKit": case "GameKit": switch (type.Name) { case "GKTurnBasedExchange": switch (selectorName) { case "completionDate": case "data": case "exchangeID": case "sendDate": case "timeoutDate": return(true); } break; case "GKTurnBasedExchangeReply": switch (selectorName) { case "data": case "replyDate": return(true); } break; // looks like it's routed to (private) GKDialogController_Concrete case "GKDialogController": switch (selectorName) { case "parentWindow": case "setParentWindow:": return(true); } break; // looks like it's routed to (private) GKVoiceChat_Concrete case "GKVoiceChat": switch (selectorName) { case "start": case "stop": case "setMute:forPlayer:": case "name": case "isActive": case "setActive:": case "volume": case "setVolume:": case "playerStateUpdateHandler": case "setPlayerStateUpdateHandler:": case "playerIDs": return(true); } break; // looks like it's routed to (private) GKLeaderboard_Concrete case "GKLeaderboard": switch (selectorName) { case "loadScoresWithCompletionHandler:": case "timeScope": case "setTimeScope:": case "playerScope": case "setPlayerScope:": case "maxRange": case "category": case "setCategory:": case "title": case "range": case "setRange:": case "scores": case "localPlayerScore": case "groupIdentifier": case "setGroupIdentifier:": return(true); } break; // looks like it's routed to (private) GKLeaderboard_Concrete case "GKLocalPlayer": switch (selectorName) { case "authenticateWithCompletionHandler:": case "loadDefaultLeaderboardCategoryIDWithCompletionHandler:": case "setDefaultLeaderboardCategoryID:completionHandler:": case "authenticateHandler": case "setAuthenticateHandler:": case "loadFriendsWithCompletionHandler:": case "isAuthenticated": return(true); } break; // looks like it's routed to (private) GKMatch_Concrete case "GKMatch": switch (selectorName) { case "sendData:toPlayers:withDataMode:error:": case "sendDataToAllPlayers:withDataMode:error:": case "disconnect": case "voiceChatWithName:": case "playerIDs": case "delegate": case "setDelegate:": case "expectedPlayerCount": return(true); } break; // looks like it's routed to (private) GKMatchmater_Concrete case "GKMatchmaker": switch (selectorName) { case "inviteHandler": case "setInviteHandler:": case "findMatchForRequest:withCompletionHandler:": case "findPlayersForHostedMatchRequest:withCompletionHandler:": case "addPlayersToMatch:matchRequest:completionHandler:": case "cancel": case "queryPlayerGroupActivity:withCompletionHandler:": case "queryActivityWithCompletionHandler:": return(true); } break; } break; // Gone in Mavericks case "MonoMac.StoreKit": case "StoreKit": switch (type.Name) { case "SKPayment": case "SKMutablePayment": switch (selectorName) { case "paymentWithProductIdentifier:": if (Mac.CheckSystemVersion(10, 9)) { return(true); } break; } break; } break; case "MonoMac.PdfKit": // Bug 20232 case "PdfKit": switch (type.Name) { case "PdfBorder": // Fails on Lion case "PdfAnnotation": if (selectorName == "encodeWithCoder:" && !Mac.CheckSystemVersion(10, 8)) { return(true); } break; case "PdfView": switch (selectorName) { #if !XAMCORE_3_0 case "menu:willHighlightItem:": return(true); #endif } break; } break; case "MonoMac.SceneKit": case "SceneKit": switch (type.Name) { case "SCNGeometryElement": // Ignore on 10.8 where SCNGeometryPrimitiveType is int (32), but // on 10.9+ is NSInteger/nint (32/64). SceneKit is next to useless // on 10.8 anyway. -abock if (selectorName == "primitiveType" && Mac.CheckSystemVersion(10, 8)) { return(true); } // fall through goto case "SCNCamera"; case "SCNCamera": case "SCNGeometry": case "SCNGeometrySource": case "SCNLight": case "SCNMaterial": case "SCNMaterialProperty": case "SCNNode": case "SCNProgram": case "SCNScene": case "SCNMorpher": case "SCNSkinner": case "SCNConstraint": case "SCNLevelOfDetail": // The NSSecureCoding protocol was added to these types in Yosemite, // and we can't (yet?) describe "type added protocol P in version X.Y" // with our AvailabilityAttribute, so do this check manually. if (selectorName == "encodeWithCoder:" && !Mac.CheckSystemVersion(10, 10)) { return(true); } break; } switch (type.Name) { case "SCNGeometry": // SCNGeometry added the SCNShadable protocol in 10.9, which brings in the 'program' selector. switch (selectorName) { case "program": case "setProgram:": if (!Mac.CheckSystemVersion(10, 9)) { return(true); } break; } break; } break; } return(base.Skip(type, selectorName)); }
protected override bool Skip(Type type, MethodBase method, string selector) { switch (type.Namespace) { case "MonoMac.GameKit": case "GameKit": case "MonoMac.StoreKit": case "StoreKit": if (!Mac.CheckSystemVersion(10, 8)) { return(true); } break; case "MonoMac.SceneKit": case "SceneKit": // SceneKit is half-baked at best, and they broke compatibility significantly // from Mountain Lion to Mavericks, so just ignore all problems there. if (!Mac.CheckSystemVersion(10, 9)) { return(true); } break; } // Bug 20232 - This is a hack. if (selector == "geometryElementWithData:primitiveType:primitiveCount:bytesPerIndex:") { return(true); } switch (type.Name) { case "AVPlayerItemOutput": case "AVPlayerItemVideoOutput": case "NSSharingService": case "NSSharingServicePicker": case "NSUserNotification": case "NSUserNotificationCenter": case "NSUuid": return(!Mac.CheckSystemVersion(10, 8)); case "CALayer": case "CAEmitterLayer": case "CAGradientLayer": case "CAOpenGLLayer": case "CAReplicatorLayer": case "CAScrollLayer": case "CAShapeLayer": case "CATextLayer": case "CATiledLayer": case "CATransformLayer": case "QTCaptureLayer": case "QTMovieLayer": case "QCCompositionLayer": case "AVCaptureVideoPreviewLayer": case "AVPlayerLayer": case "SCNLayer": switch (selector) { // CAGradientLayer 'instance MonoMac.CoreAnimation.CAConstraint[] get_Constraints()' selector: constraints == @?@: case "constraints": // CAGradientLayer 'instance Void set_Constraints(MonoMac.CoreAnimation.CAConstraint[])' selector: setConstraints: == v@:@? case "setConstraints:": return(true); } break; case "SCNSkinner": return(!Mac.CheckSystemVersion(10, 9)); case "NSGradient": switch (selector) { case "initWithColorsAndLocations:": // variable length parameters ... case "initWithColors:atLocations:colorSpace:": // void * -> nfloat [] (internal) return(true); } break; case "AVAudioIONode": case "AVAudioUnit": switch (selector) { case "audioUnit": // ^{ComponentInstanceRecord=[1l], tested to work in an apitest return(true); } break; } return(base.Skip(type, method, selector)); }
// only handle exception here (to return true) otherwise call base to deal with it // `caller` is provided to make it easier to detect "special" cases protected override bool Check(char encodedType, Type type) { switch (encodedType) { case 'i': switch (type.FullName) { case "System.nuint": case "System.UInt32": // sign-ness mis-binding, not critical // Signature failure in MonoMac.AppKit.NSViewController presentViewController:asPopoverRelativeToRect:ofView:preferredEdge:behavior: Parameter 'preferredEdge' (#4) is encoded as 'i' and bound as 'System.UInt32' return(true); case "GameKit.GKGameCenterViewControllerState": case "AppKit.NSOpenGLContextParameter": // NSOpenGLContextParameter and GKGameCenterViewControllerState are anonymous enums in 10.9, but an NSInteger in 10.10. if (IntPtr.Size == 8 && !Mac.CheckSystemVersion(10, 10)) { return(true); } break; } break; // unsigned 32 bits case 'I': switch (type.FullName) { case "System.Int32": // sign-ness mis-binding, several of them (not critical) // NSActionCell 'instance Int32 get_MnemonicLocation()' selector: mnemonicLocation == I8@0:4 // NSPathCell 'instance Int32 get_MnemonicLocation()' selector: mnemonicLocation == I8@0:4 // SCNText 'instance Void InsertMaterial(MonoMac.SceneKit.SCNMaterial, Int32)' selector: insertMaterial:atIndex: == v16@0:4@8I12 return(true); } break; // unsigned 32 bits case 'L': switch (type.FullName) { // sign-ness mis-binding (not critical) e.g. // CAMediaTimingFunction 'instance Void GetControlPointAtIndex(Int32, IntPtr)' selector: getControlPointAtIndex:values: == v16@0:4L8[2f]12 case "System.Int32": return(true); } break; // unsigned 64 bits case 'Q': switch (type.FullName) { // sign-ness mis-binding (not critical) e.g. // NSEvent 'instance Int64 get_UniqueID()' selector: uniqueID == Q8@0:4 case "System.Int64": return(true); } break; } return(base.Check(encodedType, type)); }
protected override bool Skip (PropertyInfo p) { switch (p.DeclaringType.Name) { case "NSUrlSessionDownloadDelegate": switch (p.Name) { case "TaskResumeDataKey": // This field was introduced as 64-bit only in Mavericks, and 32+64bits in Yosemite. We can't // express that with our AvailabilityAttribute, we set it as available (for all architectures, since // we can't distinguish them) starting with Mavericks. if (Mac.Is32BitMavericks) return true; break; } break; } switch (p.Name) { // NSTableView case "RowViewKey": return true; // NSBitmapImageRep case "CompressionMethod": case "CompressionFactor": case "DitherTransparency": return true; // CIImage 10.8+ case "AutoAdjustFeaturesKey": // kCIImageAutoAdjustFeatures - documented in 10.8 case "AutoAdjustRedEyeKey": case "AutoAdjustEnhanceKey": case "CIImagePropertiesKey": return true; // CIImage case "CIImageColorSpaceKey": return true; // returns null but documented prior to 10.8 // CLLocation 10.8+ case "ErrorUserInfoAlternateRegionKey": // kCLErrorUserInfoAlternateRegionKey also returns null on iOS return true; // NSUrl 10.8+ case "PathKey": return !Mac.CheckSystemVersion (10, 8); // AVMediaCharacteristic 10.8+ case "IsMainProgramContent": case "IsAuxiliaryContent": case "ContainsOnlyForcedSubtitles": case "TranscribesSpokenDialogForAccessibility": case "DescribesMusicAndSoundForAccessibility": case "DescribesVideoForAccessibility": return !Mac.CheckSystemVersion (10, 8); // AVVideo 10.8+ case "ProfileLevelH264Main32": return !Mac.CheckSystemVersion (10, 8); // AVMetadata 10.8+ case "QuickTimeUserDataKeyTaggedCharacteristic": return !Mac.CheckSystemVersion (10, 8); // CIDetector case "TypeFace": // CIDetectorTypeFace - documented as available in 10.7 case "Accuracy": // CIDetectorAccuracy 10.7 case "AccuracyLow": // CIDetectorAccuracyLow 10.7 case "AccuracyHigh": // CIDetectorAccuracyHigh 10.7 return true; // CIDetector case "ImageOrientation": // documented in 10.8 case "Tracking": case "MinFeatureSize": return true; // CGImageProperties - all new (10.7) values are missing (from pre-6 iOS too iirc) case "ExifCameraOwnerName": // kCGImagePropertyExifCameraOwnerName case "ExifBodySerialNumber": // kCGImagePropertyExifBodySerialNumber case "ExifLensSpecification": // kCGImagePropertyExifLensSpecification case "ExifLensMake": // kCGImagePropertyExifLensMake case "ExifLensModel": // kCGImagePropertyExifLensModel case "ExifLensSerialNumber": // kCGImagePropertyExifLensSerialNumber return true; // ACErrorDomain is _listed_ in the 10.8 Accounts Changes but like iOS it's not documented anywhere else (and does not seems to exists) case "ErrorDomain": // ACAccountStoreDidChangeNotification - documented in 10.8 case "ChangeNotification": // ACAccountType - documented in 10.8 case "Twitter": // ACAccountTypeIdentifierTwitter case "SinaWeibo": case "Facebook": case "AppId": // ACFacebookAppIdKey case "Permissions": // ACFacebookPermissionsKey case "Audience": // *** NOT documented in 10.8 - but part of our API enhancement case "Everyone": // ^ MonoMac.Accounts.ACFacebookAudienceValue.Everyone case "Friends": // ^ MonoMac.Accounts.ACFacebookAudienceValue.Friends case "OnlyMe": // ^ MonoMac.Accounts.ACFacebookAudienceValue.OnlyMe return true; // MonoMac.CoreServices.CFHTTPMessage - document in 10.9 but returns null case "_AuthenticationSchemeOAuth1": return true; default: return base.Skip (p); } }
protected override bool Skip(Type type, string protocolName) { switch (protocolName) { case "NSSecureCoding": switch (type.Name) { case "NSCachedImageRep": // Not declared in header file case "NSCIImageRep": case "NSCustomImageRep": case "NSEPSImageRep": case "NSBitmapImageRep": case "NSImageRep": case "NSPdfImageRep": case "AVAssetTrackSegment": // Not declared in header file case "AVComposition": // Not declared in header file case "AVMutableComposition": // Not declared in header file case "AVCompositionTrackSegment": // Not declared in header file case "MKMapSnapshotOptions": // Not declared in header file case "NSTextTab": // Not declared in header file return(true); default: // CIFilter started implementing NSSecureCoding in 10.11 if (!Mac.CheckSystemVersion(10, 11) && (type == typeof(CIFilter) || type.IsSubclassOf(typeof(CIFilter)))) { return(true); } break; } break; case "NSCopying": switch (type.Name) { case "DomNodeFilter": // Not declared in header file case "MKDirectionsRequest": // Not declared in header file case "EKObject": // Not declared in header file case "EKCalendarItem": // Not declared in header file case "EKSource": // Not declared in header file case "EKCalendar": // Not declared in header file case "EKEvent": // Not declared in header file case "EKReminder": // Not declared in header file case "ACAccount": // Not declared in header file return(true); } break; case "NSMutableCopying": switch (type.Name) { case "EKObject": // Not declared in header file case "EKCalendarItem": // Not declared in header file case "EKSource": // Not declared in header file case "EKStructuredLocation": // Not declared in header file case "EKAlarm": // Not declared in header file case "EKCalendar": // Not declared in header file case "EKEvent": // Not declared in header file case "EKParticipant": // Not declared in header file case "EKRecurrenceRule": // Not declared in header file case "EKReminder": // Not declared in header file return(true); } break; case "NSCoding": switch (type.Name) { case "EKObject": // Not declared in header file case "EKCalendarItem": // Not declared in header file case "EKSource": // Not declared in header file case "EKStructuredLocation": // Not declared in header file case "EKAlarm": // Not declared in header file case "EKCalendar": // Not declared in header file case "EKEvent": // Not declared in header file case "EKParticipant": // Not declared in header file case "EKRecurrenceRule": // Not declared in header file case "EKReminder": // Not declared in header file case "AVAssetTrackSegment": // Not declared in header file case "AVComposition": // Not declared in header file case "AVMutableComposition": // Not declared in header file case "AVCompositionTrackSegment": // Not declared in header file case "MKMapSnapshotOptions": // Not declared in header file return(true); } break; case "NSWindowRestoration": switch (type.Name) { case "NSDocumentController": // There's a category that implements the NSWindowRestoration protocol for NSDocumentController, // but that apparently doesn't make conformsToProtocol: return true. // '@interface NSDocumentController (NSWindowRestoration) <NSWindowRestoration>' return(true); } break; case "NSUserInterfaceItemIdentification": // NSViewController started implementing NSUserInterfaceItemIdentification in 10.10 if (!Mac.CheckSystemVersion(10, 10) && (type == typeof(NSViewController) || type.IsSubclassOf(typeof(NSViewController)))) { return(true); } break; case "NSMenuDelegate": switch (type.Name) { case "PdfView": if (!Mac.CheckSystemVersion(10, 10)) { return(true); } break; } break; case "NSTextFinderClient": // Not listed in header, nor conformsToProtocol, but works in sample. But it just repondsToSelectors if (type.Name == "NSTextView") { return(true); } break; #if !XAMCORE_4_0 case "NSDraggingInfo": return(true); // We have to keep the type to maintain backwards compatibility. #endif } switch (type.Name) { #if !XAMCORE_3_0 case "NSRemoteSavePanel": case "NSRemoteOpenPanel": return(true); // These two classes don't show up in any documentation. #endif } switch (type.Namespace) { case "MonoMac.SceneKit": case "SceneKit": return(IntPtr.Size == 4); // 64bits should be fine } return(base.Skip(type, protocolName)); }
protected override bool Skip(Type type) { switch (type.FullName) { // These should be DisableDefaultCtor but can't due to backward compat case "MonoMac.EventKit.EKParticipant": case "EventKit.EKParticipant": case "XamCore.CoreImage.CISampler": case "CoreImage.CISampler": return(true); // OSX 10.8+ case "MonoMac.AppKit.NSSharingService": case "AppKit.NSSharingService": case "MonoMac.AppKit.NSSharingServicePicker": case "AppKit.NSSharingServicePicker": case "MonoMac.Foundation.NSUserNotification": case "Foundation.NSUserNotification": case "MonoMac.Foundation.NSUserNotificationCenter": case "Foundation.NSUserNotificationCenter": case "MonoMac.AVFoundation.AVPlayerItemVideoOutput": case "AVFoundation.AVPlayerItemVideoOutput": case "MonoMac.Foundation.NSUuid": case "Foundation.NSUuid": if (!Mac.CheckSystemVersion(10, 8)) { return(true); } break; // Native exception coming from [NSWindow init] which calls // [NSWindow initWithContentRect:styleMask:backing:defer] case "MonoMac.AppKit.NSWindow": case "AppKit.NSWindow": return(true); #if !XAMCORE_2_0 case "MonoMac.AppKit.NSToolbar": // mono[10518:626783] *** -[__NSDictionaryM removeObjectForKey:]: key cannot be nil case "MonoMac.SceneKit.SCNRenderer": // -[SCNRenderer init]: unrecognized selector sent to instance 0x7c6446c0 case "MonoMac.SceneKit.SCNLookAtConstraint": return(true); #endif case "MonoMac.Foundation.NSUrlSession": case "Foundation.NSUrlSession": case "MonoMac.Foundation.NSUrlSessionTask": case "Foundation.NSUrlSessionTask": case "MonoMac.Foundation.NSUrlSessionDataTask": case "Foundation.NSUrlSessionDataTask": case "MonoMac.Foundation.NSUrlSessionUploadTask": case "Foundation.NSUrlSessionUploadTask": case "MonoMac.Foundation.NSUrlSessionDownloadTask": case "Foundation.NSUrlSessionDownloadTask": case "MonoMac.Foundation.NSUrlSessionConfiguration": case "Foundation.NSUrlSessionConfiguration": // These types were introduced as 64-bit only in Mavericks, and 32+64bits in Yosemite. We can't // express that with our AvailabilityAttribute, we set it as available (for all architectures, since // we can't distinguish them) starting with Mavericks. if (Mac.Is32BitMavericks) { return(true); } break; case "GLKit.GLKSkyboxEffect": // Crashes inside libGL.dylib, most likely because something hasn't been initialized yet, because // I can reproduce in an Xcode project if I put [[GLKSkyboxEffect alloc] init]; in main, but it doesn't // crash in applicationDidFinishLaunching. // // frame #0: 0x00007fff8d570db1 libGL.dylib`glGetError + 13 // frame #1: 0x0000000100025542 GLKit`-[GLKEffect initWithPropertyArray:] + 1142 // frame #2: 0x0000000100022c2d GLKit`-[GLKSkyboxEffect init] + 493 // if (IntPtr.Size == 8) { return(true); } break; #if !XAMCORE_3_0 case "SpriteKit.SKView": // Causes a crash later. Filed as radar://18440271. // Apple said they won't fix this ('init' isn't a designated initializer) if (IntPtr.Size == 8) { return(true); } break; #endif case "MonoMac.AppKit.NSSpeechRecognizer": case "AppKit.NSSpeechRecognizer": // Makes OSX put up "a download is required for speech recognition" dialog. return(true); case "MonoMac.Foundation.NSUserActivity": case "Foundation.NSUserActivity": // Crashes by default: // Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Caller did not provide an activityType, and this process does not have a NSUserActivityTypes in its Info.plist. // but since it looks like the constructor is usable with the proper Info.plist, we can't remove it. return(true); } switch (type.Namespace) { // OSX 10.8+ case "MonoMac.Accounts": case "Accounts": case "MonoMac.GameKit": case "GameKit": case "MonoMac.Social": case "Social": case "MonoMac.StoreKit": case "StoreKit": if (!Mac.CheckSystemVersion(10, 8)) { return(true); } break; case "SceneKit": case "MonoMac.SceneKit": if (!Mac.CheckSystemVersion(10, 8) || IntPtr.Size != 8) { return(true); } break; } return(base.Skip(type)); }