diff --git a/Handle/BNFileMetadata.cs b/Handle/BNFileMetadata.cs index 758fc2d..9d11332 100644 --- a/Handle/BNFileMetadata.cs +++ b/Handle/BNFileMetadata.cs @@ -46,6 +46,26 @@ internal static FileMetadata MustTakeHandle(IntPtr handle) return new FileMetadata(handle, true); } + + internal static FileMetadata? NewFromHandle(IntPtr handle) + { + if (IntPtr.Zero == handle) + { + return null; + } + + return new FileMetadata(NativeMethods.BNNewFileReference(handle), true); + } + + internal static FileMetadata MustNewFromHandle(IntPtr handle) + { + if (IntPtr.Zero == handle) + { + throw new ArgumentNullException(nameof(handle)); + } + + return new FileMetadata(NativeMethods.BNNewFileReference(handle), true); + } internal static FileMetadata? BorrowHandle(IntPtr handle) { @@ -77,6 +97,12 @@ public static FileMetadata FromFile(string filename) return file; } + /// Acquires an independent native reference to this file metadata object. + public FileMetadata Duplicate() + { + return FileMetadata.MustNewFromHandle(this.handle); + } + protected override bool ReleaseHandle() { if (!this.IsInvalid) @@ -87,7 +113,6 @@ protected override bool ReleaseHandle() this.navigationHandler = null; } - NativeMethods.BNCloseFile(this.handle); NativeMethods.BNFreeFileMetadata(this.handle); this.SetHandleAsInvalid(); } diff --git a/Handle/BNLogger.cs b/Handle/BNLogger.cs index bb63e3e..22b60ea 100644 --- a/Handle/BNLogger.cs +++ b/Handle/BNLogger.cs @@ -38,6 +38,26 @@ internal static Logger MustTakeHandle(IntPtr handle) return new Logger(handle, true); } + + internal static Logger? NewFromHandle(IntPtr handle) + { + if (IntPtr.Zero == handle) + { + return null; + } + + return new Logger(NativeMethods.BNNewLoggerReference(handle), true); + } + + internal static Logger MustNewFromHandle(IntPtr handle) + { + if (IntPtr.Zero == handle) + { + throw new ArgumentNullException(nameof(handle)); + } + + return new Logger(NativeMethods.BNNewLoggerReference(handle), true); + } public static Logger? GetLogger(string name , ulong sessionId = 0) { @@ -81,6 +101,12 @@ public static Logger GetOrCreateLogger(string name , ulong sessionId = 0) ); } + /// Acquires an independent native reference to this logger. + public Logger Duplicate() + { + return Logger.MustNewFromHandle(this.handle); + } + public static string[] GetLoggerNames() { IntPtr arrayPointer = NativeMethods.BNLogGetLoggerNames(out ulong arrayLength); @@ -161,4 +187,4 @@ public void LogAlert(string format , params object[] args) this.LogString( LogLevel.AlertLog , text ); } } -} \ No newline at end of file +}