/* $Id$ */
/* Copyright (c) 2012-2020 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS System libApp */
/* This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 *
 * 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, see <http://www.gnu.org/licenses/>. */



#ifndef LIBAPP_APP_APPMESSAGE_H
# define LIBAPP_APP_APPMESSAGE_H

# include <System/buffer.h>
# include <System/string.h>
# include <System/variable.h>
# include "app.h"
# include "appstatus.h"


/* AppMessage */
/* types */
typedef enum _AppMessageType
{
	AMT_STATUS_GET = 0,
	AMT_STATUS_SET,
	AMT_CALL,
	AMT_ACKNOWLEDGEMENT
} AppMessageType;
# define AMT_CALLBACK	AMT_CALL

typedef uint32_t AppMessageID;

/* calls */
typedef enum _AppMessageCallDirection
{
	AMCD_IN = 1,
	AMCD_OUT,
	AMCD_IN_OUT
} AppMessageCallDirection;

typedef struct _AppMessageCallArgument
{
	AppMessageCallDirection direction;
	Variable * arg;
} AppMessageCallArgument;


/* macros */
# define AMCA(type, direction, variable) \
	(type | (direction) << 8), (variable)


/* functions */
AppMessage * appmessage_new_deserialize(Buffer * buffer);
/* calls */
AppMessage * appmessage_new_call(String const * method,
		AppMessageCallArgument * args, size_t args_cnt);
AppMessage * appmessage_new_callv(String const * method, ...);
AppMessage * appmessage_new_callv_variables(String const * method, ...);
/* status */
AppMessage * appmessage_new_status(AppStatus * status);

void appmessage_delete(AppMessage * appmessage);

/* accessors */
String const * appmessage_get_method(AppMessage * message);
AppMessageType appmessage_get_type(AppMessage * message);

/* useful */
int appmessage_serialize(AppMessage * message, Buffer * buffer);

#endif /* !LIBAPP_APP_APPMESSAGE_H */
