/*
 *
 *  neard - Near Field Communication manager
 *
 *  Copyright (C) 2011  Intel Corporation. All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <errno.h>
#include <string.h>

#include <gdbus.h>

#include "near.h"

DBusMessage *__near_error_failed(DBusMessage *msg, int errnum)
{
	const char *str = strerror(errnum);

	switch (errnum) {
	case ESRCH:
		return __near_error_not_registered(msg);
	case ENXIO:
		return __near_error_not_found(msg);
	case ENOMEM:
		return __near_error_out_of_memory(msg);
	case EACCES:
		return __near_error_permission_denied(msg);
	case EEXIST:
		return __near_error_already_exists(msg);
	case EINVAL:
		return __near_error_invalid_arguments(msg);
	case EIO:
		return __near_error_io_error(msg);
	case ENOSYS:
		return __near_error_not_implemented(msg);
	case ENOLINK:
		return __near_error_no_carrier(msg);
	case ENOTUNIQ:
		return __near_error_not_unique(msg);
	case EOPNOTSUPP:
		return __near_error_not_supported(msg);
	case ECONNABORTED:
		return __near_error_operation_aborted(msg);
	case EISCONN:
		return __near_error_already_connected(msg);
	case ENOTCONN:
		return __near_error_not_connected(msg);
	case ETIMEDOUT:
		return __near_error_operation_timeout(msg);
	case EALREADY:
		return __near_error_in_progress(msg);
	case ENOKEY:
		return __near_error_passphrase_required(msg);
	case ENOSPC:
		return __near_error_no_space_left(msg);
	}

	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
					".Failed", "%s", str);
}

DBusMessage *__near_error_invalid_arguments(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".InvalidArguments", "Invalid arguments");
}

DBusMessage *__near_error_out_of_memory(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
					".OutOfMemory", "Out of memory");
}

DBusMessage *__near_error_permission_denied(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".PermissionDenied", "Permission denied");
}

DBusMessage *__near_error_passphrase_required(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".PassphraseRequired", "Passphrase required");
}

DBusMessage *__near_error_not_registered(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
					".NotRegistered", "Not registered");
}

DBusMessage *__near_error_not_unique(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
					".NotUnique", "Not unique");
}

DBusMessage *__near_error_not_supported(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
					".NotSupported", "Not supported");
}

DBusMessage *__near_error_not_implemented(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
					".NotImplemented", "Not implemented");
}

DBusMessage *__near_error_not_found(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
						".NotFound", "Not found");
}

DBusMessage *__near_error_not_polling(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
						".Failed", "Not polling");
}

DBusMessage *__near_error_no_carrier(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
						".NoCarrier", "No carrier");
}

DBusMessage *__near_error_in_progress(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
						".InProgress", "In progress");
}

DBusMessage *__near_error_already_exists(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".AlreadyExists", "Already exists");
}

DBusMessage *__near_error_already_enabled(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".AlreadyEnabled", "Already enabled");
}

DBusMessage *__near_error_already_disabled(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".AlreadyDisabled", "Already disabled");
}

DBusMessage *__near_error_already_connected(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".AlreadyConnected", "Already connected");
}

DBusMessage *__near_error_not_connected(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
					".NotConnected", "Not connected");
}
DBusMessage *__near_error_operation_aborted(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".OperationAborted", "Operation aborted");
}

DBusMessage *__near_error_operation_timeout(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".OperationTimeout", "Operation timeout");
}

DBusMessage *__near_error_invalid_service(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".InvalidService", "Invalid service");
}

DBusMessage *__near_error_invalid_property(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".InvalidProperty", "Invalid property");
}

DBusMessage *__near_error_io_error(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".IOError", "I/O Error");
}

DBusMessage *__near_error_no_space_left(DBusMessage *msg)
{
	return g_dbus_create_error(msg, NFC_ERROR_INTERFACE
				".NoSpaceLeft", "No space left");
}
