From 7aa29b1208357263e3f88cfde0db7128e21b850c Mon Sep 17 00:00:00 2001 From: Jeesun Kim Date: Mon, 11 Sep 2017 14:13:23 +0900 Subject: [PATCH] replace delegate with EventHandler Change-Id: Icd38e534653e6acc16dfb075dd9f8f05164fd4e4 --- .../Tizen.Pims.Calendar/CalendarDatabase.cs | 77 ++++++++++++---------- .../Tizen.Pims.Calendar/DBChangedEventArgs.cs | 40 +++++++++++ 2 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/DBChangedEventArgs.cs diff --git a/src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/CalendarDatabase.cs b/src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/CalendarDatabase.cs index 30c95b2..60d9410 100644 --- a/src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/CalendarDatabase.cs +++ b/src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/CalendarDatabase.cs @@ -22,16 +22,6 @@ using System.Diagnostics.CodeAnalysis; namespace Tizen.Pims.Calendar { /// - /// Delegate for detecting the calendar database changes. - /// - /// The record uri - /// - /// The delegate must be registered using AddDBChangedDelegate. - /// It's invoked when the designated view changes. - /// - public delegate void CalendarDBChanged(string uri); - - /// /// CalendarDatabase provides methods to manage calendar information from/to the database. /// /// @@ -40,8 +30,8 @@ namespace Tizen.Pims.Calendar public class CalendarDatabase { private Object thisLock = new Object(); - private Dictionary _callbackMap = new Dictionary(); - private Dictionary _delegateMap = new Dictionary(); + private Dictionary> _eventHandlerMap = new Dictionary>(); + private Dictionary _callbackMap = new Dictionary(); 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. /// /// The view URI of the record to subscribe for change notifications - /// The callback function to register + /// The EventHandler to register /// http://tizen.org/privilege/calendar.read [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")] - public void AddDBChangedDelegate(string viewUri, CalendarDBChanged callback) + public void AddDBChangedDelegate(string viewUri, EventHandler 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 handler = null; + if (!_eventHandlerMap.TryGetValue(viewUri, out handler)) + _eventHandlerMap.Add(viewUri, null); + + _eventHandlerMap[viewUri] = handler + DBChanged; } /// /// Deregisters a callback function. /// /// The view URI of the record to subscribe for change notifications - /// The callback function to register + /// The EventHandler to deregister /// http://tizen.org/privilege/calendar.read [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")] - public void RemoveDBChangedDelegate(string viewUri, CalendarDBChanged callback) + public void RemoveDBChangedDelegate(string viewUri, EventHandler DBChanged) { Log.Debug(Globals.LogTag, "RemoveDBChangedDelegate"); - int error = Interop.Database.RemoveChangedCallback(viewUri, _delegateMap[viewUri], IntPtr.Zero); - if (CalendarError.None != (CalendarError)error) + EventHandler 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); + } } /// 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 index 0000000..7fc8a9c --- /dev/null +++ b/src/Tizen.Pims.Calendar/Tizen.Pims.Calendar/DBChangedEventArgs.cs @@ -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 +{ + /// + /// Event arguments passed when calendar database is changed + /// + public class DBChangedEventArgs : EventArgs + { + internal DBChangedEventArgs(string viewUri) + { + ViewUri = viewUri; + } + + /// + /// The calendar view URI changed. + /// + public string ViewUri + { + get; + internal set; + } + } +} -- 2.7.4