Add method to hold objects to the native life bound
authorJiyun Yang <ji.yang@samsung.com>
Fri, 6 Dec 2024 02:18:12 +0000 (11:18 +0900)
committerJaehyun Cho <jaehyun0cho@gmail.com>
Fri, 7 Feb 2025 11:15:02 +0000 (20:15 +0900)
Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
src/Tizen.NUI/src/public/Common/BaseHandle.cs

index 9ffb8568d1665ddcf030c09f5dad9565054b1c3f..e1c40571999f7a01caffcd601bddf2099becc67c 100755 (executable)
@@ -15,6 +15,7 @@
  *
  */
 using System;
+using System.Collections.Generic;
 using System.ComponentModel;
 using System.Runtime.CompilerServices;
 using Tizen.NUI.Binding;
@@ -33,6 +34,8 @@ namespace Tizen.NUI
     /// <since_tizen> 3 </since_tizen>
     public class BaseHandle : Element, global::System.IDisposable
     {
+        private static Dictionary<IntPtr, HashSet<object>> nativeBindedHolder = new Dictionary<IntPtr, HashSet<object>>();
+
         static internal void Preload()
         {
             // Do nothing. Just call for load static values.
@@ -601,6 +604,9 @@ namespace Tizen.NUI
             if (SwigCPtr.Handle != IntPtr.Zero)
             {
                 var nativeSwigCPtr = swigCPtr.Handle;
+
+                ClearHolder(nativeSwigCPtr);
+
                 swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
                 if (swigCMemOwn)
                 {
@@ -633,6 +639,49 @@ namespace Tizen.NUI
             Interop.BaseHandle.DeleteBaseHandle(swigCPtr.Handle);
         }
 
+        /// <summary>
+        /// Adds the specified object to the set of objects that have been bound to the native object.
+        /// </summary>
+        /// <param name="obj">The object to add.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected void AddToNativeHolder(object obj)
+        {
+            if (IsDisposedOrQueued)
+            {
+                return;
+            }
+
+            if (!nativeBindedHolder.TryGetValue(swigCPtr.Handle, out var holders))
+            {
+                nativeBindedHolder.Add(swigCPtr.Handle, holders = new HashSet<object>());
+            }
+
+            holders.Add(obj);
+        }
+
+        /// <summary>
+        ///  Removes the specified object from the set of objects that have been bound to the native object.
+        /// </summary>
+        /// <param name="obj">The object to remove.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected void RemoveFromNativeHolder(object obj)
+        {
+            if (IsDisposedOrQueued)
+            {
+                return;
+            }
+
+            if (nativeBindedHolder.TryGetValue(swigCPtr.Handle, out var holders))
+            {
+                holders.Remove(obj);
+
+                if (holders.Count == 0)
+                {
+                    nativeBindedHolder.Remove(swigCPtr.Handle);
+                }
+            }
+        }
+
         /// <summary>
         /// Contains event arguments for the FocusChangeRequested event.
         /// </summary>
@@ -707,6 +756,14 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected internal bool IsDisposeQueued => isDisposeQueued;
 
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected internal bool IsDisposedOrQueued => disposed || isDisposeQueued;
+
+        static private void ClearHolder(IntPtr handle)
+        {
+            nativeBindedHolder.Remove(handle);
+        }
+
         [Conditional("NUI_DISPOSE_DEBUG_ON")]
         private void disposeDebuggingCtor()
         {