CPF/CPF.Mac/Mac/Foundation/NSDate.cs
2023-11-21 23:05:03 +08:00

173 lines
5.2 KiB
C#

using CPF.Mac.ObjCRuntime;
using System;
using System.ComponentModel;
namespace CPF.Mac.Foundation
{
[Register("NSDate", true)]
public class NSDate : NSObject
{
private const long NSDATE_TICKS = 631139040000000000L;
private static readonly IntPtr selTimeIntervalSinceReferenceDateHandle = Selector.GetHandle("timeIntervalSinceReferenceDate");
private static readonly IntPtr selDateHandle = Selector.GetHandle("date");
private static readonly IntPtr selDistantPastHandle = Selector.GetHandle("distantPast");
private static readonly IntPtr selDistantFutureHandle = Selector.GetHandle("distantFuture");
private static readonly IntPtr selDateWithTimeIntervalSinceReferenceDate_Handle = Selector.GetHandle("dateWithTimeIntervalSinceReferenceDate:");
private static readonly IntPtr selDateWithTimeIntervalSince1970_Handle = Selector.GetHandle("dateWithTimeIntervalSince1970:");
private static readonly IntPtr selDateByAddingTimeInterval_Handle = Selector.GetHandle("dateByAddingTimeInterval:");
private static readonly IntPtr selDateWithTimeIntervalSinceNow_Handle = Selector.GetHandle("dateWithTimeIntervalSinceNow:");
private static readonly IntPtr class_ptr = Class.GetHandle("NSDate");
private static object __mt_Now_var_static;
private static object __mt_DistantPast_var_static;
private static object __mt_DistantFuture_var_static;
public override IntPtr ClassHandle => class_ptr;
public virtual double SecondsSinceReferenceDate
{
[Export("timeIntervalSinceReferenceDate")]
get
{
if (IsDirectBinding)
{
return Messaging.Double_objc_msgSend(base.Handle, selTimeIntervalSinceReferenceDateHandle);
}
return Messaging.Double_objc_msgSendSuper(base.SuperHandle, selTimeIntervalSinceReferenceDateHandle);
}
}
public static NSDate Now
{
[Export("date")]
get
{
return (NSDate)(__mt_Now_var_static = (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(class_ptr, selDateHandle)));
}
}
public static NSDate DistantPast
{
[Export("distantPast")]
get
{
return (NSDate)(__mt_DistantPast_var_static = (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(class_ptr, selDistantPastHandle)));
}
}
public static NSDate DistantFuture
{
[Export("distantFuture")]
get
{
return (NSDate)(__mt_DistantFuture_var_static = (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(class_ptr, selDistantFutureHandle)));
}
}
public static implicit operator DateTime(NSDate d)
{
double secondsSinceReferenceDate = d.SecondsSinceReferenceDate;
if (secondsSinceReferenceDate < -63113904000.0)
{
return DateTime.MinValue;
}
if (secondsSinceReferenceDate > 252423993599.0)
{
return DateTime.MaxValue;
}
return new DateTime((long)(secondsSinceReferenceDate * 10000000.0 + 6.3113904E+17), DateTimeKind.Utc);
}
public static implicit operator NSDate(DateTime dt)
{
return FromTimeIntervalSinceReferenceDate((dt.ToUniversalTime().Ticks - 631139040000000000L) / 10000000);
}
public override string ToString()
{
return Description;
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
[Export("init")]
public NSDate()
: base(NSObjectFlag.Empty)
{
if (IsDirectBinding)
{
base.Handle = Messaging.IntPtr_objc_msgSend(base.Handle, Selector.Init);
}
else
{
base.Handle = Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, Selector.Init);
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
[Export("initWithCoder:")]
public NSDate(NSCoder coder)
: base(NSObjectFlag.Empty)
{
if (IsDirectBinding)
{
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, Selector.InitWithCoder, coder.Handle);
}
else
{
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, Selector.InitWithCoder, coder.Handle);
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
public NSDate(NSObjectFlag t)
: base(t)
{
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
public NSDate(IntPtr handle)
: base(handle)
{
}
[Export("dateWithTimeIntervalSinceReferenceDate:")]
public static NSDate FromTimeIntervalSinceReferenceDate(double secs)
{
return (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Double(class_ptr, selDateWithTimeIntervalSinceReferenceDate_Handle, secs));
}
[Export("dateWithTimeIntervalSince1970:")]
public static NSDate FromTimeIntervalSince1970(double secs)
{
return (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Double(class_ptr, selDateWithTimeIntervalSince1970_Handle, secs));
}
[Export("dateByAddingTimeInterval:")]
public virtual NSDate AddSeconds(double seconds)
{
if (IsDirectBinding)
{
return (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Double(base.Handle, selDateByAddingTimeInterval_Handle, seconds));
}
return (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_Double(base.SuperHandle, selDateByAddingTimeInterval_Handle, seconds));
}
[Export("dateWithTimeIntervalSinceNow:")]
public static NSDate FromTimeIntervalSinceNow(double secs)
{
return (NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Double(class_ptr, selDateWithTimeIntervalSinceNow_Handle, secs));
}
}
}