Browse Source

Improvement: throwing exception when a native object pointer is nullptr

Marcin Ziąbek 1 year ago
parent
commit
5ef2d05615

+ 2 - 6
Source/QuestPDF/Skia/SkBitmap.cs

@@ -6,15 +6,11 @@ namespace QuestPDF.Skia;
 internal sealed class SkBitmap : IDisposable
 internal sealed class SkBitmap : IDisposable
 {
 {
     public IntPtr Instance { get; private set; }
     public IntPtr Instance { get; private set; }
-    
-    public SkBitmap(IntPtr instance)
-    {
-        Instance = instance;
-    }
-    
+
     public SkBitmap(int width, int height)
     public SkBitmap(int width, int height)
     {
     {
         Instance = API.bitmap_create(width, height);
         Instance = API.bitmap_create(width, height);
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     public SkData EncodeAsJpeg(int quality)
     public SkData EncodeAsJpeg(int quality)

+ 2 - 0
Source/QuestPDF/Skia/SkCanvas.cs

@@ -12,6 +12,8 @@ internal sealed class SkCanvas : IDisposable
     public SkCanvas(IntPtr instance, bool disposeNativeObject = true)
     public SkCanvas(IntPtr instance, bool disposeNativeObject = true)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
+        
         DisposeNativeObject = disposeNativeObject;
         DisposeNativeObject = disposeNativeObject;
     }
     }
     
     

+ 1 - 0
Source/QuestPDF/Skia/SkData.cs

@@ -11,6 +11,7 @@ internal sealed class SkData : IDisposable
     public SkData(IntPtr instance)
     public SkData(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     public static SkData FromFile(string filePath)
     public static SkData FromFile(string filePath)

+ 1 - 0
Source/QuestPDF/Skia/SkDocument.cs

@@ -10,6 +10,7 @@ internal sealed class SkDocument : IDisposable
     internal SkDocument(IntPtr instance)
     internal SkDocument(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
 
 
     public SkCanvas BeginPage(float width, float height)
     public SkCanvas BeginPage(float width, float height)

+ 1 - 0
Source/QuestPDF/Skia/SkImage.cs

@@ -14,6 +14,7 @@ internal sealed class SkImage : IDisposable
     public SkImage(IntPtr instance)
     public SkImage(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
         
         
         // load image details
         // load image details
         var details = API.image_get_details(Instance);
         var details = API.image_get_details(Instance);

+ 2 - 2
Source/QuestPDF/Skia/SkNativeDependencyCompatibilityChecker.cs

@@ -4,7 +4,7 @@ using QuestPDF.Drawing.Exceptions;
 
 
 namespace QuestPDF.Skia;
 namespace QuestPDF.Skia;
 
 
-public static class SkNativeDependencyCompatibilityChecker
+internal static class SkNativeDependencyCompatibilityChecker
 {
 {
     private static bool IsCompatibilityChecked = false;
     private static bool IsCompatibilityChecked = false;
         
         
@@ -32,7 +32,7 @@ public static class SkNativeDependencyCompatibilityChecker
             var message = 
             var message = 
                 $"{exceptionBaseMessage}{paragraph}" +
                 $"{exceptionBaseMessage}{paragraph}" +
                 "Your runtime is currently not supported by QuestPDF. " +
                 "Your runtime is currently not supported by QuestPDF. " +
-                "Currently supported runtimes are: win-x64, linux-x64, osx-x64, osx-arm64.";
+                $"Currently supported runtimes are: {string.Join(", ", SkNativeDependencyProvider.SupportedPlatforms)}.";
             
             
             if (RuntimeInformation.ProcessArchitecture == Architecture.X64)
             if (RuntimeInformation.ProcessArchitecture == Architecture.X64)
                 message += $"{paragraph}Please consider setting the 'Platform target' property to 'x64' in your project settings.";
                 message += $"{paragraph}Please consider setting the 'Platform target' property to 'x64' in your project settings.";

+ 31 - 11
Source/QuestPDF/Skia/SkNativeDependencyProvider.cs

@@ -1,12 +1,21 @@
 using System;
 using System;
 using System.IO;
 using System.IO;
+using System.Linq;
 using System.Runtime.InteropServices;
 using System.Runtime.InteropServices;
-using QuestPDF.Drawing.Exceptions;
 
 
 namespace QuestPDF.Skia;
 namespace QuestPDF.Skia;
 
 
 internal static class SkNativeDependencyProvider
 internal static class SkNativeDependencyProvider
 {
 {
+    public static readonly string[] SupportedPlatforms =
+    {
+        "win-x64",
+        "linux-x64",
+        "linux-arm64",
+        "osx-x64",
+        "osx-arm64"
+    };
+    
     public static void EnsureNativeFileAvailability()
     public static void EnsureNativeFileAvailability()
     {
     {
         var nativeFilesPath = GetNativeFileSourcePath();
         var nativeFilesPath = GetNativeFileSourcePath();
@@ -68,25 +77,36 @@ internal static class SkNativeDependencyProvider
         
         
     static string GetRuntimePlatform()
     static string GetRuntimePlatform()
     {
     {
-        if (RuntimeInformation.ProcessArchitecture == Architecture.X64)
+        var identifier = $"{GetSystemIdentifier()}-{GetProcessArchitecture()}";
+        
+        if (SupportedPlatforms.Contains(identifier))
+            return identifier;
+
+        throw new Exception("Your runtime is currently not supported by QuestPDF.");
+
+        static string GetSystemIdentifier()
         {
         {
             if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
             if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
-                return "win-x64";
+                return "win";
                 
                 
             if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
             if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
-                return "linux-x64";
+                return "linux";
                 
                 
             if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
             if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
-                return "osx-x64";
-        }
+                return "osx";
             
             
-        if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
-        {
-            if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
-                return "osx-arm64";
+            throw new Exception("Your runtime is currently not supported by QuestPDF.");
         }
         }
 
 
-        throw new InitializationException("Your runtime is currently not supported by QuestPDF.");
+        static string GetProcessArchitecture()
+        {
+            return RuntimeInformation.ProcessArchitecture switch
+            {
+                Architecture.X64 => "x64",
+                Architecture.Arm64 => "arm64",
+                _ => throw new Exception("Your runtime is currently not supported by QuestPDF.")
+            };
+        }
     }
     }
 
 
     static void CopyFileIfNewer(string sourcePath, string targetPath)
     static void CopyFileIfNewer(string sourcePath, string targetPath)

+ 1 - 0
Source/QuestPDF/Skia/SkPicture.cs

@@ -10,6 +10,7 @@ internal sealed class SkPicture : IDisposable
     public SkPicture(IntPtr instance)
     public SkPicture(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     public static SkPicture Deserialize(SkData data)
     public static SkPicture Deserialize(SkData data)

+ 1 - 0
Source/QuestPDF/Skia/SkPictureRecorder.cs

@@ -10,6 +10,7 @@ internal sealed class SkPictureRecorder : IDisposable
     public SkPictureRecorder()
     public SkPictureRecorder()
     {
     {
         Instance = API.picture_recorder_create();
         Instance = API.picture_recorder_create();
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
 
 
     public SkCanvas BeginRecording(float width, float height)
     public SkCanvas BeginRecording(float width, float height)

+ 1 - 0
Source/QuestPDF/Skia/SkSvgImage.cs

@@ -13,6 +13,7 @@ internal sealed class SkSvgImage : IDisposable
         using var data = SkData.FromBinary(System.Text.Encoding.UTF8.GetBytes(svgString));
         using var data = SkData.FromBinary(System.Text.Encoding.UTF8.GetBytes(svgString));
 
 
         Instance = API.svg_create(data.Instance);
         Instance = API.svg_create(data.Instance);
+        SkiaAPI.EnsureNotNull(Instance);
         
         
         if (Instance == IntPtr.Zero)
         if (Instance == IntPtr.Zero)
             throw new Exception("Cannot decode the provided SVG image.");
             throw new Exception("Cannot decode the provided SVG image.");

+ 1 - 0
Source/QuestPDF/Skia/SkText.cs

@@ -11,6 +11,7 @@ internal class SkText : IDisposable
     public SkText(string? text)
     public SkText(string? text)
     {
     {
         Instance = MarshalFromManagedToNative(text);
         Instance = MarshalFromManagedToNative(text);
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
 
 
     ~SkText()
     ~SkText()

+ 1 - 0
Source/QuestPDF/Skia/SkWriteStream.cs

@@ -10,6 +10,7 @@ internal sealed class SkWriteStream : IDisposable
     public SkWriteStream()
     public SkWriteStream()
     {
     {
         Instance = API.write_stream_create();
         Instance = API.write_stream_create();
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     public SkData DetachData()
     public SkData DetachData()

+ 9 - 0
Source/QuestPDF/Skia/SkiaAPI.cs

@@ -1,6 +1,15 @@
+using System;
+using QuestPDF.Drawing.Exceptions;
+
 namespace QuestPDF.Skia;
 namespace QuestPDF.Skia;
 
 
 internal static class SkiaAPI
 internal static class SkiaAPI
 {
 {
     public const string LibraryName = "QuestPdfSkia";
     public const string LibraryName = "QuestPdfSkia";
+    
+    public static void EnsureNotNull(IntPtr instance)
+    {
+        if (instance == IntPtr.Zero)
+            throw new InitializationException($"QuestPDF cannot instantiate native object.");
+    }
 }
 }

+ 1 - 0
Source/QuestPDF/Skia/Text/SkFontCollection.cs

@@ -10,6 +10,7 @@ internal sealed class SkFontCollection : IDisposable
     public SkFontCollection(IntPtr instance)
     public SkFontCollection(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
 
 
     [StructLayout(LayoutKind.Sequential)]
     [StructLayout(LayoutKind.Sequential)]

+ 1 - 0
Source/QuestPDF/Skia/Text/SkFontManager.cs

@@ -13,6 +13,7 @@ internal sealed class SkFontManager
     private SkFontManager(IntPtr instance)
     private SkFontManager(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     public SkTypeface CreateTypeface(SkData data)
     public SkTypeface CreateTypeface(SkData data)

+ 1 - 0
Source/QuestPDF/Skia/Text/SkParagraph.cs

@@ -10,6 +10,7 @@ internal sealed class SkParagraph : IDisposable
     public SkParagraph(IntPtr instance)
     public SkParagraph(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
 
 
     public void PlanLayout(float availableWidth)
     public void PlanLayout(float availableWidth)

+ 1 - 0
Source/QuestPDF/Skia/Text/SkParagraphBuilder.cs

@@ -88,6 +88,7 @@ internal sealed class SkParagraphBuilder : IDisposable
     public SkParagraphBuilder(IntPtr instance)
     public SkParagraphBuilder(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     public static SkParagraphBuilder Create(ParagraphStyleConfiguration paragraphStyleConfiguration, SkFontCollection fontCollection)
     public static SkParagraphBuilder Create(ParagraphStyleConfiguration paragraphStyleConfiguration, SkFontCollection fontCollection)

+ 1 - 5
Source/QuestPDF/Skia/Text/SkTextStyle.cs

@@ -71,14 +71,10 @@ internal sealed class SkTextStyle : IDisposable
 {
 {
     public IntPtr Instance { get; private set; }
     public IntPtr Instance { get; private set; }
     
     
-    public SkTextStyle(IntPtr instance)
-    {
-        Instance = instance;
-    }
-    
     public SkTextStyle(TextStyleConfiguration textStyleConfiguration)
     public SkTextStyle(TextStyleConfiguration textStyleConfiguration)
     {
     {
         Instance = API.text_style_create(textStyleConfiguration);
         Instance = API.text_style_create(textStyleConfiguration);
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     ~SkTextStyle()
     ~SkTextStyle()

+ 1 - 0
Source/QuestPDF/Skia/Text/SkTypeface.cs

@@ -10,6 +10,7 @@ public sealed class SkTypeface : IDisposable
     public SkTypeface(IntPtr instance)
     public SkTypeface(IntPtr instance)
     {
     {
         Instance = instance;
         Instance = instance;
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     ~SkTypeface()
     ~SkTypeface()

+ 1 - 0
Source/QuestPDF/Skia/Text/SkTypefaceProvider.cs

@@ -10,6 +10,7 @@ internal sealed class SkTypefaceProvider : IDisposable
     public SkTypefaceProvider()
     public SkTypefaceProvider()
     {
     {
         Instance = API.typeface_font_provider_create();
         Instance = API.typeface_font_provider_create();
+        SkiaAPI.EnsureNotNull(Instance);
     }
     }
     
     
     public void AddTypefaceFromData(SkData data, string? alias = null)
     public void AddTypefaceFromData(SkData data, string? alias = null)