replace delegate with EventHandler 60/148860/4
authorJeesun Kim <iamjs.kim@samsung.com>
Mon, 11 Sep 2017 05:13:23 +0000 (14:13 +0900)
committerjeesun kim <iamjs.kim@samsung.com>
Mon, 11 Sep 2017 05:15:09 +0000 (05:15 +0000)
Change-Id: Icd38e534653e6acc16dfb075dd9f8f05164fd4e4

src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/CalendarDatabase.cs
src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/DBChangedEventArgs.cs [new file with mode: 0644]

index 30c95b2..60d9410 100644 (file)
@@ -22,16 +22,6 @@ using System.Diagnostics.CodeAnalysis;
 namespace Tizen.Pims.Calendar
 {
     /// <summary>
-    /// Delegate for detecting the calendar database changes.
-    /// </summary>
-    /// <param name="uri">The record uri</param>
-    /// <remarks>
-    /// The delegate must be registered using AddDBChangedDelegate.
-    /// It's invoked when the designated view changes.
-    /// </remarks>
-    public delegate void CalendarDBChanged(string uri);
-
-    /// <summary>
     /// CalendarDatabase provides methods to manage calendar information from/to the database.
     /// </summary>
     /// <remarks>
@@ -40,8 +30,8 @@ namespace Tizen.Pims.Calendar
     public class CalendarDatabase
     {
         private Object thisLock = new Object();
-        private Dictionary<string, CalendarDBChanged> _callbackMap = new Dictionary<string, CalendarDBChanged>();
-        private Dictionary<string, Interop.Database.DBChangedCallback> _delegateMap = new Dictionary<string, Interop.Database.DBChangedCallback>();
+        private Dictionary<string, EventHandler<DBChangedEventArgs>> _eventHandlerMap = new Dictionary<string, EventHandler<DBChangedEventArgs>>();
+        private Dictionary<string, Interop.Database.DBChangedCallback> _callbackMap = new Dictionary<string, Interop.Database.DBChangedCallback>();
         private Interop.Database.DBChangedCallback _dbChangedDelegate;
 
         internal CalendarDatabase()
@@ -492,46 +482,63 @@ namespace Tizen.Pims.Calendar
         /// Registers a callback function to be invoked when a record changes.
         /// </summary>
         /// <param name="viewUri">The view URI of the record to subscribe for change notifications</param>
-        /// <param name="callback">The callback function to register</param>
+        /// <param name="DBChanged">The EventHandler to register</param>
         /// <privilege>http://tizen.org/privilege/calendar.read</privilege>
         [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")]
-        public void AddDBChangedDelegate(string viewUri, CalendarDBChanged callback)
+        public void AddDBChangedDelegate(string viewUri, EventHandler<DBChangedEventArgs> DBChanged)
         {
             Log.Debug(Globals.LogTag, "AddDBChangedDelegate");
 
-            _dbChangedDelegate = (string uri, IntPtr userData) =>
-            {
-                _callbackMap[uri](uri);
-            };
-            int error = Interop.Database.AddChangedCallback(viewUri, _dbChangedDelegate, IntPtr.Zero);
-            if (CalendarError.None != (CalendarError)error)
-            {
-                Log.Error(Globals.LogTag, "AddDBChangedDelegate Failed with error " + error);
-                throw CalendarErrorFactory.GetException(error);
-            }
-            _callbackMap[viewUri] += callback;
-            _delegateMap[viewUri] = _dbChangedDelegate;
+                       if (!_callbackMap.ContainsKey(viewUri))
+                       {
+                               _callbackMap[viewUri] = (string uri, IntPtr userData) =>
+                               {
+                                       DBChangedEventArgs args = new DBChangedEventArgs(uri);
+                                       _eventHandlerMap[uri]?.Invoke(this, args);
+                               };
+
+                               int error = Interop.Database.AddChangedCallback(viewUri, _dbChangedDelegate, IntPtr.Zero);
+                               if (CalendarError.None != (CalendarError)error)
+                               {
+                                       Log.Error(Globals.LogTag, "AddDBChangedDelegate Failed with error " + error);
+                                       throw CalendarErrorFactory.GetException(error);
+                               }
+                       }
+
+                       EventHandler<DBChangedEventArgs> handler = null;
+                       if (!_eventHandlerMap.TryGetValue(viewUri, out handler))
+                               _eventHandlerMap.Add(viewUri, null);
+
+                       _eventHandlerMap[viewUri] = handler + DBChanged;
         }
 
         /// <summary>
         /// Deregisters a callback function.
         /// </summary>
         /// <param name="viewUri">The view URI of the record to subscribe for change notifications</param>
-        /// <param name="callback">The callback function to register</param>
+        /// <param name="DBChanged">The EventHandler to deregister</param>
         /// <privilege>http://tizen.org/privilege/calendar.read</privilege>
         [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")]
-        public void RemoveDBChangedDelegate(string viewUri, CalendarDBChanged callback)
+        public void RemoveDBChangedDelegate(string viewUri, EventHandler<DBChangedEventArgs> DBChanged)
         {
             Log.Debug(Globals.LogTag, "RemoveDBChangedDelegate");
 
-            int error = Interop.Database.RemoveChangedCallback(viewUri, _delegateMap[viewUri], IntPtr.Zero);
-            if (CalendarError.None != (CalendarError)error)
+            EventHandler<DBChangedEventArgs> handler = null;
+            if (!_eventHandlerMap.TryGetValue(viewUri, out handler))
+                _eventHandlerMap.Add(viewUri, null);
+            else
+                _eventHandlerMap[viewUri] = handler - DBChanged;
+
+            if (_eventHandlerMap[viewUri] == null)
             {
-                Log.Error(Globals.LogTag, "RemoveDBChangedDelegate Failed with error " + error);
-                throw CalendarErrorFactory.GetException(error);
-            }
-            _callbackMap[viewUri] -= callback;
-            _delegateMap.Remove(viewUri);
+                               int error = Interop.Database.RemoveChangedCallback(viewUri, _callbackMap[viewUri], IntPtr.Zero);
+                               if (CalendarError.None != (CalendarError)error)
+                               {
+                                       Log.Error(Globals.LogTag, "RemoveDBChangedDelegate Failed with error " + error);
+                                       throw CalendarErrorFactory.GetException(error);
+                               }
+                               _callbackMap.Remove(viewUri);
+                       }
         }
 
         /// <summary>
diff --git a/src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/DBChangedEventArgs.cs b/src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/DBChangedEventArgs.cs
new file mode 100644 (file)
index 0000000..7fc8a9c
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the License);
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an AS IS BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+
+namespace Tizen.Pims.Calendar
+{
+    /// <summary>
+    /// Event arguments passed when calendar database is changed
+    /// </summary>
+    public class DBChangedEventArgs : EventArgs
+    {
+        internal DBChangedEventArgs(string viewUri)
+        {
+            ViewUri = viewUri;
+        }
+
+        /// <summary>
+        /// The calendar view URI changed.
+        /// </summary>
+        public string ViewUri
+        {
+            get;
+            internal set;
+        }
+    }
+}