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>
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()
/// 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>
--- /dev/null
+/*
+* 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;
+ }
+ }
+}