/*
* 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;
using System.Diagnostics.CodeAnalysis;
namespace Tizen.Pims.Contacts
{
///
/// A query is used to retrieve the data, which satisfies a given criteria.
///
///
/// A query is used to retrieve a person, group, speed dial, and log data, which satisfies a given criteria, such as an integer property being greater than a given value or a string property containing a given substring.
/// A query needs a filter which can set the conditions for the search.
///
/// 4
public class ContactsQuery : IDisposable
{
internal IntPtr _queryHandle;
///
/// Creates a query.
///
/// The view URI of a query.
/// http://tizen.org/feature/contact
/// Thrown when the feature is not supported.
/// Thrown when one of the arguments provided to a method is not valid.
/// Thrown when failed due to out of memory.
/// 4
[SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings")]
public ContactsQuery(string viewUri)
{
int error = Interop.Query.ContactsQueryCreate(viewUri, out _queryHandle);
if ((int)ContactsError.None != error)
{
Log.Error(Globals.LogTag, "ContactsQuery Failed with error " + error);
throw ContactsErrorFactory.CheckAndCreateException(error);
}
}
internal ContactsQuery(IntPtr handle)
{
_queryHandle = handle;
}
///
/// The destructor.
///
/// 4
~ContactsQuery()
{
Dispose(false);
}
#region IDisposable Support
private bool disposedValue = false;
///
/// Releases all the resources used by the ContactsQuery.
///
/// Disposing by the user.
/// 4
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//Called by User
//Release your own managed resources here.
//You should release all of your own disposable objects here
}
if (!disposedValue)
{
int error = Interop.Query.ContactsQueryDestroy(_queryHandle);
if ((int)ContactsError.None != error)
{
Log.Error(Globals.LogTag, "ContactsQueryDestroy Failed with error " + error);
}
disposedValue = true;
}
}
///
/// Releases all the resources used by the ContactsQuery.
/// It should be called after it has finished using the object.
///
/// 4
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
///
/// Adds the property IDs for projection.
///
/// The property ID array.
/// http://tizen.org/feature/contact
/// Thrown when the feature is not supported.
/// Thrown when one of the arguments provided to a method is not valid.
/// 4
public void SetProjection(uint[] propertyIdArray)
{
if (propertyIdArray == null)
{
throw new ArgumentException("Invalid Parameters Provided");
}
int error = Interop.Query.ContactsQuerySetProjection(_queryHandle, propertyIdArray, propertyIdArray.Length);
if ((int)ContactsError.None != error)
{
Log.Error(Globals.LogTag, "SetProjection Failed with error " + error);
throw ContactsErrorFactory.CheckAndCreateException(error);
}
}
///
/// Sets the "distinct" option for projection.
///
/// If true it is set, otherwise if false it is unset.
/// http://tizen.org/feature/contact
/// Thrown when the feature is not supported.
/// 4
public void SetDistinct(bool set)
{
int error = Interop.Query.ContactsQuerySetDistinct(_queryHandle, set);
if ((int)ContactsError.None != error)
{
Log.Error(Globals.LogTag, "SetDistinct Failed with error " + error);
throw ContactsErrorFactory.CheckAndCreateException(error);
}
}
///
/// Sets the filter for a query.
///
/// The filter.
/// http://tizen.org/feature/contact
/// Thrown when the feature is not supported.
/// Thrown when one of the arguments provided to a method is not valid.
/// 4
public void SetFilter(ContactsFilter filter)
{
int error = Interop.Query.ContactsQuerySetFilter(_queryHandle, filter._filterHandle);
if ((int)ContactsError.None != error)
{
Log.Error(Globals.LogTag, "SetFilter Failed with error " + error);
throw ContactsErrorFactory.CheckAndCreateException(error);
}
}
///
/// Sets the sort mode for a query.
///
/// The property ID to sort.
/// If true it sorts in ascending order, otherwise if false it sorts in descending order.
/// http://tizen.org/feature/contact
/// Thrown when the feature is not supported.
/// Thrown when one of the arguments provided to a method is not valid.
/// 4
public void SetSort(uint propertyId, bool isAscending)
{
int error = Interop.Query.ContactsQuerySetSort(_queryHandle, propertyId, isAscending);
if ((int)ContactsError.None != error)
{
Log.Error(Globals.LogTag, "SetSort Failed with error " + error);
throw ContactsErrorFactory.CheckAndCreateException(error);
}
}
}
}