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;
void osync_filter_register(OSyncGroup *group, OSyncFilter *filter)
Registers a filter with a group.
void osync_filter_set_config(OSyncFilter *filter, const char *config)
Sets the config for a filter.
OSyncMember * sourcemember
OSyncObjType * osync_change_detect_objtype_full(OSyncFormatEnv *env, OSyncChange *change, OSyncError **error)
Tries to detect the encapsulated object type of the given change.
void osync_filter_free(OSyncFilter *filter)
Frees a filter.
OSyncFilter * osync_filter_add_custom(OSyncGroup *group, OSyncMember *sourcemember, OSyncMember *destmember, const char *sourceobjtype, const char *destobjtype, const char *detectobjtype, const char *function_name)
Register a new custom filter.
Represent a group of members that should be synchronized.
void osync_filter_remove(OSyncGroup *group, OSyncFilter *filter)
Removes a filter from a group.
void osync_error_free(OSyncError **error)
Frees the error so it can be reused.
A member of a group which represent a single device.
Represents a filter to filter changes.
Represents a custom filter that can be used to call hooks.
void osync_debug(const char *subpart, int level, const char *message,...)
Used for debugging.
OSyncFilter * osync_filter_add(OSyncGroup *group, OSyncMember *sourcemember, OSyncMember *destmember, const char *sourceobjtype, const char *destobjtype, const char *detectobjtype, OSyncFilterAction action)
Register a new filter.
void osync_trace(OSyncTraceType type, const char *message,...)
Used for tracing the application.
Represent a abstract object type (like "contact")
const char * osync_filter_get_config(OSyncFilter *filter)
Gets the config of a filter.
OSyncFilterAction
The action that should be invoked.
OSyncMember * osync_member_from_id(OSyncGroup *group, int id)
Searches for a member by its id.
OSyncFilter * osync_filter_new(void)
Creates a new filter.