[ThumbnailExtractor] Change PInvoke function for ExtractAsync (#4560)
authorHaesu Gwon <haesu.gwon@samsung.com>
Wed, 14 Sep 2022 07:55:15 +0000 (16:55 +0900)
committerGitHub <noreply@github.com>
Wed, 14 Sep 2022 07:55:15 +0000 (16:55 +0900)
* [ThumbnailExtractor] Change PInvoke function for ExtractAsync

src/Tizen.Multimedia.Util/Interop/Interop.ThumbnailExtractor.cs
src/Tizen.Multimedia.Util/ThumbnailExtractor/ThumbnailExtractor.cs

index 49b298c..be89b9c 100644 (file)
 
 using System;
 using System.Runtime.InteropServices;
-using Tizen;
 using Tizen.Multimedia.Util;
 
 internal static partial class Interop
 {
     internal static class ThumbnailExtractor
     {
-        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-        public delegate void ThumbnailExtractCallback(ThumbnailExtractorError error, string requestId,
-            int thumbWidth, int thumbHeight, IntPtr thumbData, int thumbSize, IntPtr userData);
-
-        [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_create")]
-        internal static extern ThumbnailExtractorError Create(out ThumbnailExtractorHandle handle);
-
-        [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_extract")]
-        internal static extern ThumbnailExtractorError Extract(ThumbnailExtractorHandle handle,
-            ThumbnailExtractCallback callback, IntPtr userData, out IntPtr requestId);
-
-        [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_set_path")]
-        internal static extern ThumbnailExtractorError SetPath(ThumbnailExtractorHandle handle, string path);
-
-        [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_set_size")]
-        internal static extern ThumbnailExtractorError SetSize(ThumbnailExtractorHandle handle, int width, int height);
-
-
-        [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_cancel")]
-        internal static extern ThumbnailExtractorError Cancel(ThumbnailExtractorHandle handle, string requestId);
-
-        [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_destroy")]
-        internal static extern ThumbnailExtractorError Destroy(IntPtr handle);
-
         [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_extract_to_buffer")]
         internal static extern ThumbnailExtractorError ExtractToBuffer(string path, uint width, uint height, out IntPtr thumbData,
             out int dataSize, out uint thumbWidth, out uint thumbHeight);
@@ -54,26 +29,4 @@ internal static partial class Interop
         [DllImport(Libraries.ThumbnailExtractor, EntryPoint = "thumbnail_util_extract_to_file")]
         internal static extern ThumbnailExtractorError ExtractToFile(string path, uint width, uint height, string thumbPath);
     }
-
-    internal class ThumbnailExtractorHandle : CriticalHandle
-    {
-        protected ThumbnailExtractorHandle() : base(IntPtr.Zero)
-        {
-        }
-
-        public override bool IsInvalid => handle == IntPtr.Zero;
-
-        protected override bool ReleaseHandle()
-        {
-            var result = ThumbnailExtractor.Destroy(handle);
-
-            if (result == ThumbnailExtractorError.None)
-            {
-                return true;
-            }
-
-            Log.Error(GetType().Name, $"Failed to destroy handle : {result}");
-            return false;
-        }
-    }
 }
index 6ca098f..2cf3bea 100644 (file)
 
 using System;
 using System.IO;
-using System.Runtime.InteropServices;
 using System.Threading;
 using System.Threading.Tasks;
-using Handle = Interop.ThumbnailExtractorHandle;
 using Native = Interop.ThumbnailExtractor;
 
 namespace Tizen.Multimedia.Util
@@ -30,13 +28,6 @@ namespace Tizen.Multimedia.Util
     /// <since_tizen> 4 </since_tizen>
     public static class ThumbnailExtractor
     {
-        private static Handle CreateHandle()
-        {
-            Native.Create(out var handle).ThrowIfError("Failed to extract.");
-
-            return handle;
-        }
-
         /// <summary>
         /// Extracts the thumbnail for the given media with the specified path.
         /// </summary>
@@ -130,7 +121,7 @@ namespace Tizen.Multimedia.Util
                 throw new ArgumentNullException(nameof(path));
             }
 
-            if (File.Exists(path) == false)
+            if (!File.Exists(path))
             {
                 throw new FileNotFoundException("File does not exists.", path);
             }
@@ -155,89 +146,50 @@ namespace Tizen.Multimedia.Util
                 ExtractAsyncCore(path, size, cancellationToken);
         }
 
-
         private static async Task<ThumbnailExtractionResult> ExtractAsyncCore(string path, Size? size,
             CancellationToken cancellationToken)
         {
-            using (var handle = CreateHandle())
-            {
-                Native.SetPath(handle, path).ThrowIfError("Failed to extract; failed to set the path.");
-
-                if (size.HasValue)
-                {
-                    Native.SetSize(handle, size.Value.Width, size.Value.Height).
-                        ThrowIfError("Failed to extract; failed to set the size");
-                }
+            var tcs = new TaskCompletionSource<ThumbnailExtractionResult>();
 
-                var tcs = new TaskCompletionSource<ThumbnailExtractionResult>();
+            Task thumbTask = null;
 
-                IntPtr id = IntPtr.Zero;
-
-                try
+            if (cancellationToken.CanBeCanceled)
+            {
+                cancellationToken.Register(() =>
                 {
-                    var cb = GetCallback(tcs);
-                    using (var cbKeeper = ObjectKeeper.Get(cb))
+                    if (tcs.Task.IsCompleted)
                     {
-                        Native.Extract(handle, cb, IntPtr.Zero, out id)
-                            .ThrowIfError("Failed to extract.");
-
-                        using (RegisterCancellationToken(tcs, cancellationToken, handle, Marshal.PtrToStringAnsi(id)))
-                        {
-                            return await tcs.Task;
-                        }
+                        return;
                     }
-                }
-                finally
-                {
-                    LibcSupport.Free(id);
-                }
+
+                    tcs.TrySetCanceled();
+                });
             }
-        }
 
-        private static Native.ThumbnailExtractCallback GetCallback(TaskCompletionSource<ThumbnailExtractionResult> tcs)
-        {
-            return (error, requestId, thumbWidth, thumbHeight, thumbData, dataSize, _) =>
+            thumbTask = Task.Factory.StartNew( () =>
             {
-                if (error == ThumbnailExtractorError.None)
+                try
                 {
-                    try
-                    {
-                        tcs.TrySetResult(new ThumbnailExtractionResult(thumbData, thumbWidth, thumbHeight, dataSize));
-                    }
-                    catch (Exception e)
+                    var result = Extract(path, size.HasValue ? size.Value : new Size(320, 240));
+                    if (result != null)
                     {
-                        tcs.TrySetException(new InvalidOperationException("[" + error + "] Failed to create ThumbnailExtractionResult instance.", e));
+                        tcs.TrySetResult(result);
                     }
-                    finally
+                    else
                     {
-                        LibcSupport.Free(thumbData);
+                        tcs.TrySetException(new InvalidOperationException("Failed to extract thumbnail"));
                     }
                 }
-                else
-                {
-                    tcs.TrySetException(error.ToException("Failed to extract."));
-                }
-            };
-        }
-
-        private static IDisposable RegisterCancellationToken(TaskCompletionSource<ThumbnailExtractionResult> tcs,
-            CancellationToken cancellationToken, Handle handle, string id)
-        {
-            if (cancellationToken.CanBeCanceled == false)
-            {
-                return null;
-            }
-
-            return cancellationToken.Register(() =>
-            {
-                if (tcs.Task.IsCompleted)
+                catch (Exception e)
                 {
-                    return;
+                    Log.Error("Tizen.Multimedia.Util", e.ToString());
+                    tcs.TrySetException(e);
                 }
+            }, cancellationToken,
+                TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning,
+                TaskScheduler.Default);
 
-                Native.Cancel(handle, id).ThrowIfError("Failed to cancel.");
-                tcs.TrySetCanceled();
-            });
+            return await tcs.Task;
         }
 
         /// <summary>