27
27
28
28
#include <string.h>
29
29
30
- typedef struct _AppParserGenerator
30
+ typedef struct _AppObjectGenerator AppObjectGenerator ;
31
+
32
+ struct _AppObjectGenerator
31
33
{
32
34
CfgBlockGenerator super ;
33
- GString * block ;
34
- const gchar * topic ;
35
+ gboolean ( * parse_arguments )( AppObjectGenerator * self , CfgArgs * args , const gchar * reference ) ;
36
+ void ( * generate_config )( AppObjectGenerator * self , GlobalConfig * cfg , GString * result ) ;
35
37
const gchar * included_apps ;
36
38
const gchar * excluded_apps ;
37
39
gboolean is_parsing_enabled ;
40
+ };
41
+
42
+ static gboolean
43
+ _is_application_included (AppObjectGenerator * self , const gchar * app_name )
44
+ {
45
+ /* include everything if we don't have the option */
46
+ if (!self -> included_apps )
47
+ return TRUE;
48
+ return strstr (self -> included_apps , app_name ) != NULL ;
49
+ }
50
+
51
+ static gboolean
52
+ _is_application_excluded (AppObjectGenerator * self , const gchar * app_name )
53
+ {
54
+ if (!self -> excluded_apps )
55
+ return FALSE;
56
+ return strstr (self -> excluded_apps , app_name ) != NULL ;
57
+ }
58
+
59
+ static gboolean
60
+ _parse_auto_parse_arg (AppObjectGenerator * self , CfgArgs * args , const gchar * reference )
61
+ {
62
+ const gchar * v = cfg_args_get (args , "auto-parse" );
63
+
64
+ if (v )
65
+ self -> is_parsing_enabled = cfg_process_yesno (v );
66
+ else
67
+ self -> is_parsing_enabled = TRUE;
68
+ return TRUE;
69
+ }
70
+
71
+ static gboolean
72
+ _parse_auto_parse_exclude_arg (AppObjectGenerator * self , CfgArgs * args , const gchar * reference )
73
+ {
74
+ const gchar * v = cfg_args_get (args , "auto-parse-exclude" );
75
+ if (!v )
76
+ return TRUE;
77
+ self -> excluded_apps = g_strdup (v );
78
+ return TRUE;
79
+ }
80
+
81
+ static gboolean
82
+ _parse_auto_parse_include_arg (AppObjectGenerator * self , CfgArgs * args , const gchar * reference )
83
+ {
84
+ const gchar * v = cfg_args_get (args , "auto-parse-include" );
85
+ if (!v )
86
+ return TRUE;
87
+ self -> included_apps = g_strdup (v );
88
+ return TRUE;
89
+ }
90
+
91
+
92
+ static gboolean
93
+ app_object_generator_parse_arguments_method (AppObjectGenerator * self , CfgArgs * args , const gchar * reference )
94
+ {
95
+ g_assert (args != NULL );
96
+
97
+ if (!_parse_auto_parse_arg (self , args , reference ))
98
+ return FALSE;
99
+ if (!_parse_auto_parse_exclude_arg (self , args , reference ))
100
+ return FALSE;
101
+ if (!_parse_auto_parse_include_arg (self , args , reference ))
102
+ return FALSE;
103
+ return TRUE;
104
+ }
105
+
106
+ static gboolean
107
+ _generate (CfgBlockGenerator * s , GlobalConfig * cfg , gpointer args , GString * result , const gchar * reference )
108
+ {
109
+ AppObjectGenerator * self = (AppObjectGenerator * ) s ;
110
+ CfgArgs * cfgargs = (CfgArgs * )args ;
111
+
112
+ if (!self -> parse_arguments (self , cfgargs , reference ))
113
+ return FALSE;
114
+
115
+ self -> generate_config (self , cfg , result );
116
+
117
+ return TRUE;
118
+ }
119
+
120
+ void
121
+ app_object_generator_init_instance (AppObjectGenerator * self , gint context , const gchar * name )
122
+ {
123
+ cfg_block_generator_init_instance (& self -> super , context , name );
124
+ self -> super .generate = _generate ;
125
+ self -> parse_arguments = app_object_generator_parse_arguments_method ;
126
+ }
127
+
128
+ /* app-parser() */
129
+
130
+ typedef struct _AppParserGenerator
131
+ {
132
+ AppObjectGenerator super ;
133
+ const gchar * topic ;
134
+ GString * block ;
38
135
gboolean first_app_generated ;
39
136
gboolean allow_overlaps ;
40
137
} AppParserGenerator ;
41
138
139
+ static gboolean
140
+ _parse_topic_arg (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
141
+ {
142
+ self -> topic = cfg_args_get (args , "topic" );
143
+ if (!self -> topic )
144
+ {
145
+ msg_error ("app-parser() requires a topic() argument" ,
146
+ evt_tag_str ("reference" , reference ));
147
+ return FALSE;
148
+ }
149
+ return TRUE;
150
+ }
151
+
152
+ static gboolean
153
+ _parse_allow_overlaps (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
154
+ {
155
+ const gchar * v = cfg_args_get (args , "allow-overlaps" );
156
+ if (v )
157
+ self -> allow_overlaps = cfg_process_yesno (v );
158
+ else
159
+ self -> allow_overlaps = FALSE;
160
+ return TRUE;
161
+ }
162
+
163
+ static gboolean
164
+ app_parser_generator_parse_arguments (AppObjectGenerator * s , CfgArgs * args , const gchar * reference )
165
+ {
166
+ AppParserGenerator * self = (AppParserGenerator * ) s ;
167
+ g_assert (args != NULL );
168
+
169
+ if (!_parse_topic_arg (self , args , reference ))
170
+ return FALSE;
171
+
172
+ if (!_parse_allow_overlaps (self , args , reference ))
173
+ return FALSE;
174
+
175
+ if (!app_object_generator_parse_arguments_method (& self -> super , args , reference ))
176
+ return FALSE;
177
+
178
+ return TRUE;
179
+ }
180
+
42
181
static void
43
182
_generate_filter (AppParserGenerator * self , const gchar * filter_expr )
44
183
{
@@ -73,36 +212,18 @@ _generate_action(AppParserGenerator *self, Application *app)
73
212
}
74
213
}
75
214
76
- static gboolean
77
- _is_application_included (AppParserGenerator * self , Application * app )
78
- {
79
- /* include everything if we don't have the option */
80
- if (!self -> included_apps )
81
- return TRUE;
82
- return strstr (self -> included_apps , app -> super .name ) != NULL ;
83
- }
84
-
85
- static gboolean
86
- _is_application_excluded (AppParserGenerator * self , Application * app )
87
- {
88
- if (!self -> excluded_apps )
89
- return FALSE;
90
- return strstr (self -> excluded_apps , app -> super .name ) != NULL ;
91
- }
92
-
93
215
static void
94
- _generate_application (AppModelObject * object , gpointer user_data )
216
+ _generate_application (Application * app , gpointer user_data )
95
217
{
96
- Application * app = (Application * ) object ;
97
218
AppParserGenerator * self = (AppParserGenerator * ) user_data ;
98
219
99
220
if (strcmp (self -> topic , app -> super .instance ) != 0 )
100
221
return ;
101
222
102
- if (!_is_application_included (self , app ))
223
+ if (!_is_application_included (& self -> super , app -> super . name ))
103
224
return ;
104
225
105
- if (_is_application_excluded (self , app ))
226
+ if (_is_application_excluded (& self -> super , app -> super . name ))
106
227
return ;
107
228
108
229
if (self -> first_app_generated )
@@ -133,21 +254,21 @@ _generate_application(AppModelObject *object, gpointer user_data)
133
254
}
134
255
135
256
static void
136
- _generate_applications (AppParserGenerator * self , AppModelContext * appmodel )
257
+ _generate_applications (AppParserGenerator * self , GlobalConfig * cfg )
137
258
{
138
- appmodel_context_iter_objects ( appmodel , APPLICATION_TYPE_NAME , _generate_application , self );
259
+ appmodel_iter_applications ( cfg , _generate_application , self );
139
260
}
140
261
141
262
static void
142
- _generate_framing (AppParserGenerator * self , AppModelContext * appmodel )
263
+ _generate_framing (AppParserGenerator * self , GlobalConfig * cfg )
143
264
{
144
265
g_string_append (self -> block ,
145
266
"\nchannel {\n" );
146
267
147
268
self -> first_app_generated = FALSE;
148
269
if (!self -> allow_overlaps )
149
270
{
150
- _generate_applications (self , appmodel );
271
+ _generate_applications (self , cfg );
151
272
if (self -> first_app_generated )
152
273
g_string_append (self -> block , " else {\n" );
153
274
else
@@ -159,7 +280,7 @@ _generate_framing(AppParserGenerator *self, AppModelContext *appmodel)
159
280
}
160
281
else
161
282
{
162
- _generate_applications (self , appmodel );
283
+ _generate_applications (self , cfg );
163
284
if (self -> first_app_generated )
164
285
g_string_append (self -> block , " ;\n" );
165
286
}
@@ -172,106 +293,27 @@ _generate_empty_frame(AppParserGenerator *self)
172
293
g_string_append (self -> block , "channel { filter { tags('.app.doesnotexist'); }; };" );
173
294
}
174
295
175
- static gboolean
176
- _parse_auto_parse_arg (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
177
- {
178
- const gchar * v = cfg_args_get (args , "auto-parse" );
179
-
180
- if (v )
181
- self -> is_parsing_enabled = cfg_process_yesno (v );
182
- else
183
- self -> is_parsing_enabled = TRUE;
184
- return TRUE;
185
- }
186
-
187
- static gboolean
188
- _parse_auto_parse_exclude_arg (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
189
- {
190
- const gchar * v = cfg_args_get (args , "auto-parse-exclude" );
191
- if (!v )
192
- return TRUE;
193
- self -> excluded_apps = g_strdup (v );
194
- return TRUE;
195
- }
196
-
197
- static gboolean
198
- _parse_auto_parse_include_arg (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
199
- {
200
- const gchar * v = cfg_args_get (args , "auto-parse-include" );
201
- if (!v )
202
- return TRUE;
203
- self -> included_apps = g_strdup (v );
204
- return TRUE;
205
- }
206
-
207
- static gboolean
208
- _parse_topic_arg (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
209
- {
210
- self -> topic = cfg_args_get (args , "topic" );
211
- if (!self -> topic )
212
- {
213
- msg_error ("app-parser() requires a topic() argument" ,
214
- evt_tag_str ("reference" , reference ));
215
- return FALSE;
216
- }
217
- return TRUE;
218
- }
219
-
220
- static gboolean
221
- _parse_allow_overlaps (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
222
- {
223
- const gchar * v = cfg_args_get (args , "allow-overlaps" );
224
- if (v )
225
- self -> allow_overlaps = cfg_process_yesno (v );
226
- else
227
- self -> allow_overlaps = FALSE;
228
- return TRUE;
229
- }
230
-
231
- static gboolean
232
- _parse_arguments (AppParserGenerator * self , CfgArgs * args , const gchar * reference )
233
- {
234
- g_assert (args != NULL );
235
-
236
- if (!_parse_topic_arg (self , args , reference ))
237
- return FALSE;
238
- if (!_parse_auto_parse_arg (self , args , reference ))
239
- return FALSE;
240
- if (!_parse_auto_parse_exclude_arg (self , args , reference ))
241
- return FALSE;
242
- if (!_parse_auto_parse_include_arg (self , args , reference ))
243
- return FALSE;
244
- if (!_parse_allow_overlaps (self , args , reference ))
245
- return FALSE;
246
- return TRUE;
247
- }
248
-
249
- static gboolean
250
- _generate (CfgBlockGenerator * s , GlobalConfig * cfg , gpointer args , GString * result , const gchar * reference )
296
+ void
297
+ app_parser_generate_config (AppObjectGenerator * s , GlobalConfig * cfg , GString * result )
251
298
{
252
299
AppParserGenerator * self = (AppParserGenerator * ) s ;
253
- AppModelContext * appmodel = appmodel_get_context (cfg );
254
- CfgArgs * cfgargs = (CfgArgs * )args ;
255
-
256
- if (!_parse_arguments (self , cfgargs , reference ))
257
- return FALSE;
258
300
259
301
self -> block = result ;
260
- if (self -> is_parsing_enabled )
261
- _generate_framing (self , appmodel );
302
+ if (self -> super . is_parsing_enabled )
303
+ _generate_framing (self , cfg );
262
304
else
263
305
_generate_empty_frame (self );
264
306
self -> block = NULL ;
265
-
266
- return TRUE;
267
307
}
268
308
309
+
269
310
CfgBlockGenerator *
270
311
app_parser_generator_new (gint context , const gchar * name )
271
312
{
272
313
AppParserGenerator * self = g_new0 (AppParserGenerator , 1 );
273
314
274
- cfg_block_generator_init_instance (& self -> super , context , name );
275
- self -> super .generate = _generate ;
276
- return & self -> super ;
315
+ app_object_generator_init_instance (& self -> super , context , name );
316
+ self -> super .parse_arguments = app_parser_generator_parse_arguments ;
317
+ self -> super .generate_config = app_parser_generate_config ;
318
+ return & self -> super .super ;
277
319
}
0 commit comments