aboutsummaryrefslogtreecommitdiffstats
path: root/ctl-lib/ctl-config.h
blob: 68016e204d03ddd54404dbb7d832a6ec0b270dcc (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/*
 * Copyright (C) 2016 "IoT.bzh"
 * Author Fulup Ar Foll <fulup@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, something express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Reference:
 *   Json load using json_unpack https://jansson.readthedocs.io/en/2.9/apiref.html#parsing-and-validating-values
 */

#ifndef _CTL_CONFIG_INCLUDE_
#define _CTL_CONFIG_INCLUDE_

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif

#include "ctl-plugin.h"
#include <filescan-utils.h>
#include <wrap-json.h>

#ifdef CONTROL_SUPPORT_LUA
  #include "ctl-lua.h"
#endif

#ifndef CONTROL_MAXPATH_LEN
  #define CONTROL_MAXPATH_LEN 255
#endif

#ifndef CONTROL_CONFIG_PRE
  #define CONTROL_CONFIG_PRE "onload"
#endif

#ifndef CTL_PLUGIN_EXT
  #define CTL_PLUGIN_EXT ".ctlso"
  #define CTL_SCRIPT_EXT ".lua"
#endif

#define LUA_ACTION_PREFIX "lua://"
#define API_ACTION_PREFIX "api://"
#define PLUGIN_ACTION_PREFIX "plugin://"

typedef struct ConfigSectionS {
  const char *key;
  const char *uid;
  const char *info;
  int (*loadCB)(AFB_ApiT apihandle, struct ConfigSectionS *section, json_object *sectionJ);
  void *handle;
  CtlActionT *actions;
} CtlSectionT;

typedef struct {
    const char *api;
    const char *uid;
    const char *info;
    const char *version;
    const char *author;
    const char *date;
    json_object *configJ;
    json_object *requireJ;
    CtlSectionT *sections;
    void *external;
} CtlConfigT;

// This should not be global as application may want to define their own sections
typedef enum {
  CTL_SECTION_PLUGIN,
  CTL_SECTION_ONLOAD,
  CTL_SECTION_CONTROL,
  CTL_SECTION_EVENT,
  CTL_SECTION_HAL,

  CTL_SECTION_ENDTAG,
} SectionEnumT;

// ctl-action.c
CtlActionT *ActionConfig(AFB_ApiT apiHandle, json_object *actionsJ,  int exportApi);
void ActionExecUID(AFB_ReqT request, CtlConfigT *ctlConfig, const char *uid, json_object *queryJ);
int ActionExecOne( CtlSourceT *source, CtlActionT* action, json_object *queryJ);
int ActionLoadOne(AFB_ApiT apiHandle, CtlActionT *action, json_object *, int exportApi);
int ActionLabelToIndex(CtlActionT* actions, const char* actionLabel);

/*******************************************************************************
 *                               ctl-config.h                                  *
 ******************************************************************************/

int CtlConfigMagicNew();
json_object* CtlConfigScan(const char *dirList, const char *prefix) ;

/**
 * @brief Return a string representing the path + filename for a given response
 * object from a CtlConfigScan calls. This will only take the first result, this is
 * made to avoid loading several time the same file found at differents places.
 *
 * The returned string has to be freed.
 *
 * @param apiHandle AppFW Api handle
 * @param responseJ Response from a CtlConfigScan function call.
 * @return char* absolute path to a file
 */
char* ConfigSearch(AFB_ApiT apiHandle, json_object *responseJ);
char* CtlConfigSearch(AFB_ApiT apiHandle, const char *dirList, const char *prefix);

/**
 * @brief Best effort to initialise everything before starting
 * Call afb_require_api at the first call or if there was an error because
 * the CtlConfigExec could be called anywhere and not in binding init.
 * So you could call this function at init time.
 *
 * @param apiHandle : an afb_daemon api handle, see AFB_ApiT in afb_definitions.h
 * @param requireJ : json_object array of api name required.
 */
void DispatchRequiredApi(AFB_ApiT apiHandle, json_object * requireJ);


int CtlConfigExec(AFB_ApiT apiHandle, CtlConfigT *ctlConfig) ;
CtlConfigT *CtlLoadMetaData(AFB_ApiT apiHandle,const char* filepath) ;
int CtlLoadSections(AFB_ApiT apiHandle, CtlConfigT *ctlHandle, CtlSectionT *sections);

/*******************************************************************************
 *                               ctl-event.h                                   *
 ******************************************************************************/

int EventConfig(AFB_ApiT apihandle, CtlSectionT *section, json_object *actionsJ);
#ifdef AFB_BINDING_PREV3
void CtrlDispatchApiEvent (AFB_ApiT apiHandle, const char *evtLabel, struct json_object *eventJ);
#else
void CtrlDispatchV2Event(const char *evtLabel, json_object *eventJ);
#endif

/*******************************************************************************
 *                               ctl-control.h                                 *
 ******************************************************************************/
int ControlConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *actionsJ);

/*******************************************************************************
 *                               ctl-onload.h                                  *
 ******************************************************************************/
int OnloadConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *actionsJ);

/*******************************************************************************
 *                               ctl-plugin.h                                  *
 ******************************************************************************/

/**
 * @brief Plugins definition loads. You have to call it at least twice, one for
 * the configuration at binding preinit and the last one at init step to
 * initilize a API interface for binding with version 2. The last call should
 * not include any plugin definition to add.
 *
 * @param apiHandle an afb_daemon api handle, see AFB_ApiT in afb_definitions.h
 * @param section The plugin section to process
 * @param pluginsJ Json_object holding the plugins definitions to load.
 * @return int 0 if success, other on failure
 */
int PluginConfig(AFB_ApiT UNUSED_ARG(apiHandle), CtlSectionT *section, json_object *pluginsJ);

/**
 * @brief Permit to find a C callback stored in a plugin to attach it to an
 * action as well as the plugin.
 *
 * @param apiHandle an afb_daemon api handle, see AFB_ApiT in afb_definitions.h
 * @param action Action structure to use to store the callback if found
 * @param callbackJ the callback definition to search
 * @return int 0 if success, other on failure
 */
int PluginGetCB (AFB_ApiT apiHandle, CtlActionT *action , json_object *callbackJ);

#ifdef __cplusplus
}
#endif

#endif /* _CTL_CONFIG_INCLUDE_ */