/*
 *
 *  Connection Manager
 *
 *  Copyright (C) 2007-2012  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
 *
 */

#ifndef __CONNMAN_LOG_H
#define __CONNMAN_LOG_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * SECTION:log
 * @title: Logging premitives
 * @short_description: Functions for logging error and debug information
 */

void connman_info(const char *format, ...)
				__attribute__((format(printf, 1, 2)));
void connman_warn(const char *format, ...)
				__attribute__((format(printf, 1, 2)));
void connman_error(const char *format, ...)
				__attribute__((format(printf, 1, 2)));
void connman_debug(const char *format, ...)
				__attribute__((format(printf, 1, 2)));

struct connman_debug_desc {
	const char *name;
	const char *file;
#define CONNMAN_DEBUG_FLAG_DEFAULT (0)
#define CONNMAN_DEBUG_FLAG_PRINT   (1 << 0)
#define CONNMAN_DEBUG_FLAG_ALIAS   (1 << 1)
	unsigned int flags;
} __attribute__((aligned(8)));

#define CONNMAN_DEBUG_DEFINE(name) \
	static struct connman_debug_desc __debug_alias_ ## name \
	__attribute__((used, section("__debug"), aligned(8))) = { \
		#name, __FILE__, CONNMAN_DEBUG_FLAG_ALIAS \
	};

/**
 * DBG:
 * @fmt: format string
 * @arg...: list of arguments
 *
 * Simple macro around connman_debug() which also include the function
 * name it is called in.
 */
#define DBG(fmt, arg...) do { \
	static struct connman_debug_desc __connman_debug_desc \
	__attribute__((used, section("__debug"), aligned(8))) = { \
		.file = __FILE__, .flags = CONNMAN_DEBUG_FLAG_DEFAULT, \
	}; \
	if (__connman_debug_desc.flags & CONNMAN_DEBUG_FLAG_PRINT) \
		connman_debug("%s:%s() " fmt, \
					__FILE__, __FUNCTION__ , ## arg); \
} while (0)

#if !defined(CONNMAN_DEBUG)
#define CONNMAN_DEBUG DEBUG && !NDEBUG
#endif

#if CONNMAN_DEBUG
extern unsigned int trace_depth;
extern char trace_tabbuf[];

extern void connman_create_indent(unsigned int depth, char *buffer);

#define connman_trace(dir, fmt, arg...)					\
	do {								\
		connman_create_indent(trace_depth, trace_tabbuf);	\
		connman_debug("%s" dir " (%d) %s: " fmt,		\
			      trace_tabbuf,				\
			      trace_depth,				\
			      __FUNCTION__,				\
			      ## arg);					\
	} while (0)

#define connman_trace_in(fmt, arg...)					\
	do {								\
		connman_trace("-->", fmt, ## arg);			\
		trace_depth++;						\
	} while (0)

#define connman_trace_out(fmt, arg...)					\
	do {								\
		--trace_depth;						\
		connman_trace("<--", fmt, ## arg);			\
	} while (0)
#else
#define connman_trace_in(fmt, arg...)
#define connman_trace_out(fmt, arg...)
#endif

extern void connman_assert_handler(const char *name, const char *predicate, const char *message, const char *file, unsigned int line, void *value, int terminate);

#if !defined(CONNMAN_ASSERT)
#define CONNMAN_ASSERT(name, predicate, message, file, line, value) connman_assert_handler(name, predicate, message, file, line, value, 0)
#endif

#if !defined(CONNMAN_ASSERT_MODULE)
#define CONNMAN_ASSERT_MODULE NULL
#endif

#if CONNMAN_DEBUG
#define connman_assert(predicate)					\
	do {								\
		if (!(predicate)) {					\
			connman_assert_handler(CONNMAN_ASSERT_MODULE,	\
					       #predicate,		\
					       NULL,			\
					       __FILE__,		\
					       __LINE__,		\
					       0,			\
					       1);			\
		}							\
	} while (0)
#else
#define connman_assert(predicate)
#endif

#if CONNMAN_DEBUG
#define connman_check_message(predicate, message)			\
	do {								\
		if (!(predicate)) {					\
			CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE,		\
				       #predicate,			\
				       message,				\
				       __FILE__,			\
				       __LINE__,			\
				       0);				\
		}							\
	} while (0)
#else
#define connman_check_message(predicate, message)
#endif

#if CONNMAN_DEBUG
#define connman_check(predicate)					\
	connman_check_message(predicate, NULL)
#else
#define connman_check(predicate)
#endif

#if CONNMAN_DEBUG
#define connman_check_ok_message(error, message)			\
	do {								\
		if ((error) != 0) {					\
			CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE,		\
				       #error " == 0",			\
				       message,				\
				       __FILE__,			\
				       __LINE__,			\
				       (void *)error);			\
		}							\
	} while (0)
#else
#define connman_check_ok_message(error, message)
#endif

#if CONNMAN_DEBUG
#define connman_check_ok(error)						\
	connman_check_ok_message(error, NULL) 
#else
#define connman_check_ok(error)
#endif

#if CONNMAN_DEBUG
#define connman_verify_message(predicate, message)			\
	connman_check_message(predicate, message)
#else
#define connman_verify_message(predicate, message)			\
	do {								\
		if (!predicate) { }					\
	} while (0)
#endif

#define connman_verify(predicate)					\
	connman_verify_message(predicate, NULL)

#if CONNMAN_DEBUG
#define connman_verify_execute_message(predicate, action, message)	\
	do {								\
		if (!(predicate)) {					\
			CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE,		\
				       #predicate,			\
				       message,				\
				       __FILE__,			\
				       __LINE__,			\
				       0);				\
			{						\
				action;					\
			}						\
		}							\
	} while (0)
#else
#define connman_verify_execute_message(predicate, action, message)	\
	do {								\
		if (!(predicate)) {					\
			{						\
				action;					\
			}						\
		}							\
	} while (0)
#endif

#define connman_verify_execute(predicate, action)			\
    connman_verify_execute_message(predicate, action, NULL)

#if CONNMAN_DEBUG
#define connman_verify_ok_message(error, message)			\
	connman_check_ok_message(error, message)
#else
#define connman_verify_ok_message(error, message)			\
	connman_verify_message(error == 0, message)
#endif

#define connman_verify_ok(error)					\
	connman_verify_ok_message(error, NULL)

#define connman_require_quiet(predicate, label)				\
	do {								\
		if (!(predicate))	{				\
			goto label;					\
		}							\
	} while (0)

#if CONNMAN_DEBUG
#define connman_require_message(predicate, label, message)		\
	do {								\
		if (!(predicate)) {					\
			CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE,		\
				       #predicate,			\
				       message,				\
				       __FILE__,			\
				       __LINE__,			\
				       0);				\
			goto label;					\
		}							\
	} while (0)
#else
#define connman_require_message(predicate, label, message)		\
	connman_require(predicate, label)
#endif

#define connman_require(predicate, label)				\
	connman_require_message(predicate, label, NULL)

#define connman_require_execute_quiet(predicate, label, action)		\
	do {								\
		if (!(predicate)) {					\
			{						\
				action;					\
			}						\
			goto label;					\
		}							\
	} while (0)

#if CONNMAN_DEBUG
#define connman_require_execute_message(predicate, label, action, message)  \
	do {								\
		if (!(predicate)) {					\
			CONNMAN_ASSERT(					\
				       CONNMAN_ASSERT_MODULE,		\
				       #predicate,			\
				       message,				\
				       __FILE__,			\
				       __LINE__,			\
				       0);				\
			{						\
				action;					\
			}						\
			goto label;					\
		}							\
	} while (0)
#else
#define connman_require_execute_message(predicate, label, action, message)  \
	connman_require_execute_message_quiet(predicate, label, action, message)
#endif

#define connman_require_execute(predicate, label, action)		\
	connman_require_execute_message(predicate, label, action, NULL)

#define connman_require_ok_quiet(error, label)				\
	connnman_require_quiet(error == 0, label)

#if CONNMAN_DEBUG
#define connman_require_ok_message(error, label, message)		\
	do {								\
		if ((error) != 0) {					\
			CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE,		\
				       #error " == 0 ",			\
				       message,				\
				       __FILE__,			\
				       __LINE__,			\
				       error);				\
			goto label;					\
		}							\
	} while (0)
#else
#define connman_require_ok_message(error, label, message)		\
	  connman_require_ok_quiet(error, label)
#endif

#define connman_require_ok(error, label)				\
	connman_require_ok_message(error, label, NULL)

#define connman_require_ok_execute_quiet(error, label, action)		\
	do {								\
		if ((error) != 0) {					\
			{						\
				action;					\
			}						\
			goto label;					\
		}							\
	} while (0)
#if CONNMAN_DEBUG
#define connman_require_ok_execute_message(error, label, action, message) \
	do {								\
		if ((error) != 0) {					\
			CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE,		\
				       #error " == 0 ",			\
				       message,				\
				       __FILE__,			\
				       __LINE__,			\
				       error);				\
			{						\
				action;					\
			}						\
			goto label;					\
		}							\
	} while (0)
#else
#define connman_require_ok_execute_message(error, label, action, message) \
		connman_require_ok_execute_quiet(error, label, action)
#endif

#define connman_require_ok_execute(error, label, action)	\
		connman_require_ok_execute_message(error, label, action, NULL)

#ifdef __cplusplus
}
#endif

#endif /* __CONNMAN_LOG_H */
