22 #include "opensync_internals.h"
32 #ifndef DOXYGEN_SHOULD_SKIP_THIS
33 OSyncFilter *_osync_filter_add_ids(
OSyncGroup *group,
long long int sourcememberid,
long long int destmemberid,
const char *sourceobjtype,
const char *destobjtype,
const char *detectobjtype,
OSyncFilterAction action,
const char *function_name)
36 filter->group = group;
37 filter->sourcememberid = sourcememberid;
38 filter->destmemberid = destmemberid;
39 filter->sourceobjtype = g_strdup(sourceobjtype);
40 filter->destobjtype = g_strdup(destobjtype);
41 filter->detectobjtype = g_strdup(detectobjtype);
42 filter->action = action;
45 osync_filter_update_hook(filter, group, function_name);
56 g_assert(function_name);
58 OSyncFilterFunction hook = NULL;
60 for (f = group->conv_env->filter_functions; f; f = f->next) {
62 if (!strcmp(custom->name, function_name))
66 osync_trace(TRACE_ERROR,
"Unable to add custom filter, hook not found!");
70 filter->function_name = g_strdup(function_name);
78 for (f = member->group->filters; f; f = f->next) {
80 if (!filter->destmemberid || filter->destmemberid == member->id)
81 ret = g_list_append(ret, filter);
90 osync_debug(
"OSFLT", 3,
"Starting to invoke filter for change %s", change->
uid);
93 if (filter->destmemberid && filter->destmemberid != destmember->id)
95 if (filter->sourceobjtype && strcmp(filter->sourceobjtype, change->
sourceobjtype))
99 if (filter->detectobjtype) {
106 if (strcmp(filter->detectobjtype, objtype->name))
110 osync_debug(
"OSFLT", 3,
"Change %s passed the filter!", change->
uid);
113 return filter->action;
116 return filter->hook(change, filter->config);
122 GList *filters = _osync_filter_find(destmember);
125 osync_debug(
"OSFLT", 3,
"Checking if change %s is allowed for member %lli. Filters to invoke: %i", change->
uid, destmember->id, g_list_length(filters));
126 for (f = filters; f; f = f->next) {
134 g_list_free(filters);
139 const char *osync_filter_get_sourceobjtype(
OSyncFilter *filter)
141 return filter->sourceobjtype;
144 const char *osync_filter_get_destobjtype(
OSyncFilter *filter)
146 return filter->destobjtype;
149 const char *osync_filter_get_detectobjtype(
OSyncFilter *filter)
151 return filter->detectobjtype;
156 return filter->action;
189 group->filters = g_list_append(group->filters, filter);
214 if (filter->sourceobjtype)
215 g_free(filter->sourceobjtype);
216 if (filter->destobjtype)
217 g_free(filter->destobjtype);
218 if (filter->detectobjtype)
219 g_free(filter->detectobjtype);
238 osync_trace(
TRACE_ENTRY,
"%s(%p, %p:%lli, %p:%lli, %s, %s, %s, %i)", __func__, group, \
239 sourcemember, sourcemember ? sourcemember->id : 0, \
240 destmember, destmember ? destmember->id : 0, \
241 sourceobjtype, destobjtype, detectobjtype, action);
243 long long int sourcememberid = 0;
244 long long int destmemberid = 0;
246 sourcememberid = sourcemember->id;
248 destmemberid = destmember->id;
250 OSyncFilter *filter = _osync_filter_add_ids(group, sourcememberid, destmemberid, sourceobjtype, destobjtype, detectobjtype, action, NULL);
264 group->filters = g_list_remove(group->filters, filter);
282 osync_trace(
TRACE_ENTRY,
"%s(%p, %p:%lli, %p:%lli, %s, %s, %s, %s)", __func__, group, \
283 sourcemember, sourcemember ? sourcemember->id : 0, \
284 destmember, destmember ? destmember->id : 0, \
285 sourceobjtype, destobjtype, detectobjtype, function_name);
286 long long int sourcememberid = 0;
287 long long int destmemberid = 0;
289 sourcememberid = sourcemember->id;
291 destmemberid = destmember->id;
293 OSyncFilter *filter = _osync_filter_add_ids(group, sourcememberid, destmemberid, sourceobjtype, destobjtype, detectobjtype,
OSYNC_FILTER_IGNORE, function_name);
310 g_free(filter->config);
311 filter->config = g_strdup(config);
325 return filter->config;