2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 using System.Runtime.InteropServices;
19 using System.Diagnostics.CodeAnalysis;
21 namespace Tizen.Pims.Calendar
24 /// A record represents an actual record in the database
26 /// <since_tizen> 4 </since_tizen>
28 /// A record represents an actual record in the database,
29 /// but you can also consider it a piece of information, such as an alarm, attendee and extended.
30 /// A record can be a complex set of data, containing other data.
31 /// For example, a calendar record contains the alarm property, which is a reference to an alarm record.
32 /// An alarm record could belong to a event record,
33 /// and its alarm id property is set to the identifier of the corresponding event.
34 /// In this case, the alarm is the child record of the event and the event is the parent record.
36 public class CalendarRecord : IDisposable
40 private Int64 _memoryPressure = CalendarViews.Record.AverageSize;
41 internal IntPtr _recordHandle;
43 internal CalendarRecord(IntPtr handle)
45 _recordHandle = handle;
48 int error = Interop.Record.GetUriPointer(handle, out viewUri);
49 if (CalendarError.None != (CalendarError)error)
51 Log.Error(Globals.LogTag, "GetUriPointer Failed with error " + error);
52 throw CalendarErrorFactory.GetException(error);
54 _uri = Marshal.PtrToStringAnsi(viewUri);
55 GC.AddMemoryPressure(_memoryPressure);
58 internal CalendarRecord(IntPtr handle, bool disposedValue)
60 _recordHandle = handle;
61 _disposedValue = disposedValue;
64 int error = Interop.Record.GetUriPointer(handle, out viewUri);
65 if (CalendarError.None != (CalendarError)error)
67 Log.Error(Globals.LogTag, "GetUriPointer Failed with error " + error);
68 throw CalendarErrorFactory.GetException(error);
70 _uri = Marshal.PtrToStringAnsi(viewUri);
72 GC.AddMemoryPressure(_memoryPressure);
75 internal CalendarRecord(IntPtr handle, int id)
77 _recordHandle = handle;
81 int error = Interop.Record.GetUriPointer(handle, out viewUri);
82 if (CalendarError.None != (CalendarError)error)
84 Log.Error(Globals.LogTag, "GetUriPointer Failed with error " + error);
85 throw CalendarErrorFactory.GetException(error);
87 _uri = Marshal.PtrToStringAnsi(viewUri);
88 GC.AddMemoryPressure(_memoryPressure);
94 /// <since_tizen> 4 </since_tizen>
95 /// <feature>http://tizen.org/feature/calendar</feature>
96 /// <param name="viewUri">The view URI</param>
97 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
98 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
99 /// <exception cref="OutOfMemoryException">Thrown when failed due to out of memory</exception>
100 [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")]
101 public CalendarRecord(string viewUri)
104 error = Interop.Record.Create(viewUri, out _recordHandle);
105 if (CalendarError.None != (CalendarError)error)
107 Log.Error(Globals.LogTag, "CalendarRecord Failed with error " + error);
108 throw CalendarErrorFactory.GetException(error);
111 GC.AddMemoryPressure(_memoryPressure);
122 #region IDisposable Support
123 /// To detect redundant calls
124 internal bool _disposedValue = false;
127 /// Disposes of the resources (other than memory) used by the CalendarRecord.
129 /// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>
130 protected virtual void Dispose(bool disposing)
134 Log.Debug(Globals.LogTag, "Dispose :" + disposing);
136 int error = Interop.Record.Destroy(_recordHandle, false);
137 if (CalendarError.None != (CalendarError)error)
139 Log.Error(Globals.LogTag, "Destroy Failed with error " + error);
140 throw CalendarErrorFactory.GetException(error);
142 _disposedValue = true;
143 GC.RemoveMemoryPressure(_memoryPressure);
148 /// Releases all resources used by the CalendarRecord.
149 /// It should be called after having finished using of the object.
151 public void Dispose()
154 GC.SuppressFinalize(this);
158 internal static Interop.Record.DateTime ConvertCalendarTimeToStruct(CalendarTime value)
160 Interop.Record.DateTime time = new Interop.Record.DateTime();
161 time.type = value._type;
163 if ((int)CalendarTime.Type.Utc == value._type)
165 DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
166 time.utime = (value.UtcTime.Ticks - epoch.Ticks) / 10000000;
170 time.year = value.LocalTime.Year;
171 time.month = value.LocalTime.Month;
172 time.mday = value.LocalTime.Day;
173 time.hour = value.LocalTime.Hour;
174 time.minute = value.LocalTime.Minute;
175 time.second = value.LocalTime.Second;
180 internal static CalendarTime ConvertIntPtrToCalendarTime(Interop.Record.DateTime time)
183 if ((int)CalendarTime.Type.Utc == time.type)
185 DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
186 value = new CalendarTime(time.utime * 10000000 + epoch.Ticks);
190 value = new CalendarTime(time.year, time.month, time.mday, time.hour, time.minute, time.second);
192 value._type = time.type;
197 /// Makes a clone of a record.
199 /// <since_tizen> 4 </since_tizen>
203 /// <feature>http://tizen.org/feature/calendar</feature>
204 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
205 /// <exception cref="OutOfMemoryException">Thrown when failed due to out of memory</exception>
206 public CalendarRecord Clone()
208 IntPtr _clonedRecordHandle;
209 int error = Interop.Record.Clone(_recordHandle, out _clonedRecordHandle);
210 if (CalendarError.None != (CalendarError)error)
212 Log.Error(Globals.LogTag, "Clone Failed with error " + error);
213 throw CalendarErrorFactory.GetException(error);
215 return new CalendarRecord(_clonedRecordHandle, (int)_id);
221 /// <since_tizen> 4 </since_tizen>
222 /// <value>The URI of the record</value>
223 [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings")]
233 /// Gets a object from a record.
235 /// <since_tizen> 4 </since_tizen>
236 /// <param name="propertyId">The property ID</param>
238 /// The value of the property corresponding to property id.
240 /// <feature>http://tizen.org/feature/calendar</feature>
241 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
242 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
243 public T Get<T>(uint propertyId)
245 object parsedValue = null;
246 if (typeof(T) == typeof(string))
249 int error = Interop.Record.GetString(_recordHandle, propertyId, out val);
250 if (CalendarError.None != (CalendarError)error)
252 Log.Error(Globals.LogTag, "Get String Failed [" + error + "]" + String.Format("{0:X}", propertyId));
253 throw CalendarErrorFactory.GetException(error);
255 parsedValue = Convert.ChangeType(val, typeof(T));
257 else if (typeof(T) == typeof(int))
260 int error = Interop.Record.GetInteger(_recordHandle, propertyId, out val);
261 if (CalendarError.None != (CalendarError)error)
263 Log.Error(Globals.LogTag, "Get Intger Failed [" + error + "]" + String.Format("{0:X}", propertyId));
264 throw CalendarErrorFactory.GetException(error);
266 parsedValue = Convert.ChangeType(val, typeof(T));
268 else if (typeof(T) == typeof(long))
271 int error = Interop.Record.GetLli(_recordHandle, propertyId, out val);
272 if (CalendarError.None != (CalendarError)error)
274 Log.Error(Globals.LogTag, "Get Long Failed [" + error + "]" + String.Format("{0:X}", propertyId));
275 throw CalendarErrorFactory.GetException(error);
277 parsedValue = Convert.ChangeType(val, typeof(T));
279 else if (typeof(T) == typeof(double))
282 int error = Interop.Record.GetDouble(_recordHandle, propertyId, out val);
283 if (CalendarError.None != (CalendarError)error)
285 Log.Error(Globals.LogTag, "Get Double Failed [" + error + "]" + String.Format("{0:X}", propertyId));
286 throw CalendarErrorFactory.GetException(error);
288 parsedValue = Convert.ChangeType(val, typeof(T));
290 else if (typeof(T) == typeof(CalendarTime))
292 Interop.Record.DateTime time;
293 int error = Interop.Record.GetCalendarTime(_recordHandle, propertyId, out time);
294 if (CalendarError.None != (CalendarError)error)
296 Log.Error(Globals.LogTag, "Get CalendarTime Failed [" + error + "]" + String.Format("{0:X}", propertyId));
297 throw CalendarErrorFactory.GetException(error);
299 CalendarTime val = ConvertIntPtrToCalendarTime(time);
300 parsedValue = Convert.ChangeType(val, typeof(T));
304 Log.Error(Globals.LogTag, "Not supported Data T/ype");
305 throw CalendarErrorFactory.GetException((int)CalendarError.NotSupported);
307 return (T)parsedValue;
311 /// Sets a value of the property to a record.
313 /// <since_tizen> 4 </since_tizen>
314 /// <param name="propertyId">The property ID</param>
315 /// <param name="value">value</param>
316 /// <feature>http://tizen.org/feature/calendar</feature>
317 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
318 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
319 public void Set<T>(uint propertyId, T value)
321 if (typeof(T) == typeof(string))
323 string val = Convert.ToString(value);
324 int error = Interop.Record.SetString(_recordHandle, propertyId, val);
325 if (CalendarError.None != (CalendarError)error)
327 Log.Error(Globals.LogTag, "Set String Failed [" + error + "]" + String.Format("{0:X}", propertyId));
328 throw CalendarErrorFactory.GetException(error);
331 else if (typeof(T) == typeof(int))
333 int val = Convert.ToInt32(value);
334 int error = Interop.Record.SetInteger(_recordHandle, propertyId, val);
335 if (CalendarError.None != (CalendarError)error)
337 Log.Error(Globals.LogTag, "Set Integer Failed [" + error + "]" + String.Format("{0:X}", propertyId));
338 throw CalendarErrorFactory.GetException(error);
341 else if (typeof(T) == typeof(long))
343 long val = Convert.ToInt64(value);
344 int error = Interop.Record.SetLli(_recordHandle, propertyId, val);
345 if (CalendarError.None != (CalendarError)error)
347 Log.Error(Globals.LogTag, "Set Long Failed [" + error + "]" + String.Format("{0:X}", propertyId));
348 throw CalendarErrorFactory.GetException(error);
351 else if (typeof(T) == typeof(double))
353 double val = Convert.ToDouble(value);
354 int error = Interop.Record.SetDouble(_recordHandle, propertyId, val);
355 if (CalendarError.None != (CalendarError)error)
357 Log.Error(Globals.LogTag, "Set Double Failed [" + error + "]" + String.Format("{0:X}", propertyId));
358 throw CalendarErrorFactory.GetException(error);
361 else if (typeof(T) == typeof(CalendarTime))
363 CalendarTime time = (CalendarTime)Convert.ChangeType(value, typeof(CalendarTime));
364 Interop.Record.DateTime val = ConvertCalendarTimeToStruct(time);
365 int error = Interop.Record.SetCalendarTime(_recordHandle, propertyId, val);
366 if (CalendarError.None != (CalendarError)error)
368 Log.Error(Globals.LogTag, "Set CalendarTime Failed [" + error + "]" + String.Format("{0:X}", propertyId));
369 throw CalendarErrorFactory.GetException(error);
374 Log.Error(Globals.LogTag, "Not supported Data T/ype");
375 throw CalendarErrorFactory.GetException((int)CalendarError.NotSupported);
380 /// Adds a child record to the parent record.
382 /// <since_tizen> 4 </since_tizen>
383 /// <param name="propertyId">The property ID</param>
384 /// <param name="childRecord">The child record</param>
385 /// <feature>http://tizen.org/feature/calendar</feature>
386 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
387 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
388 public void AddChildRecord(uint propertyId, CalendarRecord childRecord)
390 int error = Interop.Record.AddChildRecord(_recordHandle, propertyId, childRecord._recordHandle);
391 if (CalendarError.None != (CalendarError)error)
393 Log.Error(Globals.LogTag, "AddChildRecord Failed [" + error + "]" + String.Format("{0:X}", propertyId));
394 throw CalendarErrorFactory.GetException(error);
396 childRecord._disposedValue = true;
400 /// Removes a child record from the parent record.
402 /// <since_tizen> 4 </since_tizen>
403 /// <param name="propertyId">The property ID</param>
404 /// <param name="childRecord">The child record</param>
405 /// <feature>http://tizen.org/feature/calendar</feature>
406 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
407 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
408 public void RemoveChildRecord(uint propertyId, CalendarRecord childRecord)
410 int error = Interop.Record.RemoveChildRecord(_recordHandle, propertyId, childRecord._recordHandle);
411 if (CalendarError.None != (CalendarError)error)
413 Log.Error(Globals.LogTag, "RemoveChildRecord Failed [" + error + "]" + String.Format("{0:X}", propertyId));
414 throw CalendarErrorFactory.GetException(error);
416 childRecord._disposedValue = false;
420 /// Gets a child record from the parent record
422 /// <since_tizen> 4 </since_tizen>
423 /// <param name="propertyId">The property ID</param>
425 /// The number of child records corresponding to property ID
427 /// <feature>http://tizen.org/feature/calendar</feature>
428 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
429 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
430 public int GetChildRecordCount(uint propertyId)
433 int error = Interop.Record.GetChildRecordCount(_recordHandle, propertyId, out count);
434 if (CalendarError.None != (CalendarError)error)
436 Log.Error(Globals.LogTag, "GetChildRecordCount Failed [" + error + "]" + String.Format("{0:X}", propertyId));
437 throw CalendarErrorFactory.GetException(error);
443 /// Gets a child record from the parent record
445 /// <since_tizen> 4 </since_tizen>
446 /// <param name="propertyId">The property ID</param>
447 /// <param name="index">The child record index</param>
451 /// <feature>http://tizen.org/feature/calendar</feature>
452 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
453 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
454 public CalendarRecord GetChildRecord(uint propertyId, int index)
458 int error = Interop.Record.GetChildRecordPointer(_recordHandle, propertyId, index, out handle);
459 if (CalendarError.None != (CalendarError)error)
461 Log.Error(Globals.LogTag, "GetChildRecord Failed [" + error + "]" + String.Format("{0:X}", propertyId));
462 throw CalendarErrorFactory.GetException(error);
464 return new CalendarRecord(handle, true);
468 /// Clones a child record list corresponding to property ID
470 /// <since_tizen> 4 </since_tizen>
471 /// <param name="propertyId">The property ID</param>
475 /// <feature>http://tizen.org/feature/calendar</feature>
476 /// <exception cref="NotSupportedException">Thrown when feature is not supported</exception>
477 /// <exception cref="ArgumentException">Thrown when one of the arguments provided to a method is not valid</exception>
478 public CalendarList CloneChildRecordList(uint propertyId)
481 int error = Interop.Record.CloneChildRecordList(_recordHandle, propertyId, out listHandle);
482 if (CalendarError.None != (CalendarError)error)
484 Log.Error(Globals.LogTag, "CloneChildRecordList Failed with [" + error + "]" + String.Format("{0:X}", propertyId));
485 throw CalendarErrorFactory.GetException(error);
487 CalendarList list = new CalendarList(listHandle);