aboutsummaryrefslogtreecommitdiffstats
path: root/include/afb/afb-binding-v2.h
blob: e162aaa82ebda186c066100d3db2a436db258458 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Copyright (C) 2016, 2017 "IoT.bzh"
 * Author: José Bollo <jose.bollo@iot.bzh>
 *
 * 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.
 */

#pragma once

#include <stdint.h>

#include "afb-auth.h"
#include "afb-event-itf.h"
#include "afb-req-common.h"
#include "afb-service-common.h"
#include "afb-daemon-common.h"

#include "afb-req-v2.h"
#include "afb-session-v2.h"

struct json_object;

/*
 * Description of one verb of the API provided by the binding
 * This enumeration is valid for bindings of type version 2
 */
struct afb_verb_v2
{
	const char *verb;                       /* name of the verb */
	void (*callback)(struct afb_req req);   /* callback function implementing the verb */
	const struct afb_auth *auth;		/* required authorisation */
	uint32_t session;                       /* authorisation and session requirements of the verb */
};

/*
 * Description of the bindings of type version 2
 */
struct afb_binding_v2
{
	const char *api;			/* api name for the binding */
	const char *specification;		/* textual specification of the binding */
	const struct afb_verb_v2 *verbs;	/* array of descriptions of verbs terminated by a NULL name */
	int (*preinit)();                       /* callback at load of the binding */
	int (*init)();                          /* callback for starting the service */
	void (*onevent)(const char *event, struct json_object *object); /* callback for handling events */
	unsigned noconcurrency: 1;		/* avoids concurrent requests to verbs */
};

struct afb_binding_data_v2
{
	int verbosity;			/* level of verbosity */
	struct afb_daemon daemon;	/* access to daemon APIs */
	struct afb_service service;	/* access to service APIs */
};

/*
 * A binding V2 MUST have two exported symbols of name:
 *
 *            -  afbBindingV2
 *            -  afbBindingV2data
 *
 */
#if !defined(AFB_BINDING_MAIN_NAME_V2)
extern const struct afb_binding_v2 afbBindingV2;
#endif

#if !defined(AFB_BINDING_DATA_NAME_V2)
#define AFB_BINDING_DATA_NAME_V2 afbBindingV2data
#endif

#if AFB_BINDING_VERSION != 2
extern
#endif
struct afb_binding_data_v2 AFB_BINDING_DATA_NAME_V2  __attribute__ ((weak));

#define afb_get_verbosity_v2()	(AFB_BINDING_DATA_NAME_V2.verbosity)
#define afb_get_daemon_v2()	(AFB_BINDING_DATA_NAME_V2.daemon)
#define afb_get_service_v2()	(AFB_BINDING_DATA_NAME_V2.service)

/*
 * Macros for logging messages
 */
#if !defined(AFB_BINDING_PRAGMA_NO_VERBOSE_MACRO)
# if !defined(AFB_BINDING_PRAGMA_NO_VERBOSE_DETAILS)
#  define _AFB_LOGGING_V2_(vlevel,llevel,...) \
	do{ \
		if(AFB_BINDING_DATA_NAME_V2.verbosity>=vlevel) \
			afb_daemon_verbose_v2(llevel,__FILE__,__LINE__,__func__,__VA_ARGS__); \
	}while(0)
#  define _AFB_REQ_LOGGING_V2_(vlevel,llevel,req,...) \
	do{ \
		if(AFB_BINDING_DATA_NAME_V2.verbosity>=vlevel) \
			afb_req_verbose(req,llevel,__FILE__,__LINE__,__func__,__VA_ARGS__); \
	}while(0)
# else
#  define _AFB_LOGGING_V2_(vlevel,llevel,...) \
	do{ \
		if(afbBindingV2data.verbosity>=vlevel) \
			afb_daemon_verbose_v2(llevel,NULL,0,NULL,__VA_ARGS__); \
	}while(0)
#  define _AFB_REQ_LOGGING_V2_(vlevel,llevel,req,...) \
	do{ \
		if(AFB_BINDING_DATA_NAME_V2.verbosity>=vlevel) \
			afb_req_verbose(req,llevel,NULL,0,NULL,__VA_ARGS__); \
	}while(0)
# endif
# include "afb-verbosity.h"
# define AFB_ERROR_V2(...)       _AFB_LOGGING_V2_(AFB_VERBOSITY_LEVEL_ERROR,_AFB_SYSLOG_LEVEL_ERROR_,__VA_ARGS__)
# define AFB_WARNING_V2(...)     _AFB_LOGGING_V2_(AFB_VERBOSITY_LEVEL_WARNING,_AFB_SYSLOG_LEVEL_WARNING_,__VA_ARGS__)
# define AFB_NOTICE_V2(...)      _AFB_LOGGING_V2_(AFB_VERBOSITY_LEVEL_NOTICE,_AFB_SYSLOG_LEVEL_NOTICE_,__VA_ARGS__)
# define AFB_INFO_V2(...)        _AFB_LOGGING_V2_(AFB_VERBOSITY_LEVEL_INFO,_AFB_SYSLOG_LEVEL_INFO_,__VA_ARGS__)
# define AFB_DEBUG_V2(...)       _AFB_LOGGING_V2_(AFB_VERBOSITY_LEVEL_DEBUG,_AFB_SYSLOG_LEVEL_DEBUG_,__VA_ARGS__)
# define AFB_REQ_ERROR_V2(...)   _AFB_REQ_LOGGING_V2_(AFB_VERBOSITY_LEVEL_ERROR,_AFB_SYSLOG_LEVEL_ERROR_,__VA_ARGS__)
# define AFB_REQ_WARNING_V2(...) _AFB_REQ_LOGGING_V2_(AFB_VERBOSITY_LEVEL_WARNING,_AFB_SYSLOG_LEVEL_WARNING_,__VA_ARGS__)
# define AFB_REQ_NOTICE_V2(...)  _AFB_REQ_LOGGING_V2_(AFB_VERBOSITY_LEVEL_NOTICE,_AFB_SYSLOG_LEVEL_NOTICE_,__VA_ARGS__)
# define AFB_REQ_INFO_V2(...)    _AFB_REQ_LOGGING_V2_(AFB_VERBOSITY_LEVEL_INFO,_AFB_SYSLOG_LEVEL_INFO_,__VA_ARGS__)
# define AFB_REQ_DEBUG_V2(...)   _AFB_REQ_LOGGING_V2_(AFB_VERBOSITY_LEVEL_DEBUG,_AFB_SYSLOG_LEVEL_DEBUG_,__VA_ARGS__)
#endif

#include "afb-daemon-v2.h"
#include "afb-service-v2.h"