summaryrefslogtreecommitdiffstats
path: root/ahl-binding/ahl-api.cpp
blob: c5ade37933a1e07841aa7528e5d9035af0b5b408 (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
/*
 * Copyright (C) 2018 "IoT.bzh"
 * Author Loïc Collignon <loic.collignon@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.
 */

#include "ahl-binding.hpp"

/**
 * @brief Callback invoked on new api creation.
 * @param[in] handle Handle to the new api.
 * @return Status code, zero if success.
 */
int ahl_api_create(void*, afb_api_t handle)
{
	return ahl_binding_t::instance().preinit(handle);
}

/**
 * @brief Entry point for API.
 * @param[in] handle Handle to start with for API creation.
 * @return Status code, zero if success.
 */
int afbBindingEntry(afb_api_t handle)
{
	using namespace std::placeholders;
	assert(handle != nullptr);

	afb_api_new_api(
		handle,
		HL_API_NAME,
		HL_API_INFO,
		1,
		ahl_api_create,
		nullptr
	);

	return 0;
}

/**
 * @brief Callback invoked when API enter the init phase.
 * @return Status code, zero if success.
 */
int ahl_api_init(afb_api_t)
{
	return ahl_binding_t::instance().init();
}

/**
 * @brief Callback invoked when an event is received.
 * @param[in] e Event's name.
 * @param[in] o Event's args.
 */
void ahl_api_on_event(afb_api_t, const char* e, struct json_object* o)
{
	ahl_binding_t::instance().event(e, o);
}

/**
 * @brief Callback invoked when a 'roles' section is found in config file.
 * @param[in] o Config section to handle.
 * @return Status code, zero if success.
 */
int ahl_api_config_roles(afb_api_t, CtlSectionT*, json_object* o)
{
	return ahl_binding_t::instance().parse_roles_config(o);
}

/**
 * @brief Callback invoked when clients call the verb 'get_roles'.
 * @param[in] req Request to handle.
 */
void ahl_api_get_roles(afb_req_t req)
{
	ahl_binding_t::instance().get_roles(req);
}

/**
 * @brief Callback invoked when clients call the verb 'subscribe'.
 * @param[in] req Request to handle.
 */
void ahl_api_subscribe(afb_req_t req)
{
	ahl_binding_t::instance().subscribe(req);
}

/**
 * @brief Callback invoked when clients call the verb 'unsubscribe'.
 * @param[in] req Request to handle.
 */
void ahl_api_unsubscribe(afb_req_t req)
{
	ahl_binding_t::instance().unsubscribe(req);
}

/**
 * @brief Callback invoked when clients call a 'role' verb.
 * @param[in] req Request to handle.
 *
 * Handle dynamic verbs based on role name ('multimedia', 'navigation', ...)
 */
void ahl_api_role(afb_req_t req)
{
	role_t* role = (role_t*)req->vcbdata;
	assert(role != nullptr);

	role->invoke(req);
}