[NUI] Add defensive code for ViewSignal Disconnect()
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / ViewSignal.cs
1 /*
2  * Copyright(c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 using global::System.Threading;
19 using Tizen.NUI.BaseComponents;
20
21 namespace Tizen.NUI
22 {
23     internal class ViewSignal : Disposable
24     {
25
26         internal ViewSignal(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn)
27         {
28         }
29
30
31         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
32         {
33             Interop.ActorSignal.delete_ActorSignal(swigCPtr);
34         }
35
36         public bool Empty()
37         {
38             bool ret = Interop.ActorSignal.ActorSignal_Empty(swigCPtr);
39             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
40             return ret;
41         }
42
43         public uint GetConnectionCount()
44         {
45             uint ret = Interop.ActorSignal.ActorSignal_GetConnectionCount(swigCPtr);
46             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
47             return ret;
48         }
49
50         public void Connect(System.Delegate func)
51         {
52             System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate<System.Delegate>(func);
53             {
54                 Interop.ActorSignal.ActorSignal_Connect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
55                 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
56             }
57         }
58
59         public void Disconnect(System.Delegate func)
60         {
61             try
62             {
63                 System.IntPtr ip = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate<System.Delegate>(func);
64                 {
65                     Interop.ActorSignal.ActorSignal_Disconnect(swigCPtr, new System.Runtime.InteropServices.HandleRef(this, ip));
66                     if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
67                 }
68             }
69             catch (global::System.Exception ex)
70             {
71                 Tizen.Log.Fatal("NUI", $"[ERROR] excpetion! {ex}: {ex.Message}");
72                 Tizen.Log.Fatal("NUI", $"[ERROR] current threadID : {Thread.CurrentThread.ManagedThreadId}");
73                 Tizen.Log.Fatal("NUI", $"[ERROR] back trace!");
74                 global::System.Diagnostics.StackTrace st = new global::System.Diagnostics.StackTrace(true);
75                 for (int i = 0; i < st.FrameCount; i++)
76                 {
77                     global::System.Diagnostics.StackFrame sf = st.GetFrame(i);
78                     Tizen.Log.Fatal("NUI", " Method " + sf.GetMethod());
79                 }
80             }
81         }
82
83         public void Emit(View arg)
84         {
85             Interop.ActorSignal.ActorSignal_Emit(swigCPtr, View.getCPtr(arg));
86             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
87         }
88
89         public ViewSignal() : this(Interop.ActorSignal.new_ActorSignal(), true)
90         {
91             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
92         }
93     }
94 }