22 #include "opensync_internals.h" 32 #ifndef DOXYGEN_SHOULD_SKIP_THIS 41 return member->memberfunctions;
54 OSyncObjTypeSink *osync_member_find_objtype_sink(
OSyncMember *member,
const char *objtypestr)
57 for (o = member->objtype_sinks; o; o = o->next) {
58 OSyncObjTypeSink *sink = o->data;
59 if (osync_conv_objtype_is_any(sink->objtype->name) || !strcmp(sink->objtype->name, objtypestr))
94 if (!osync_member_require_sink_info(member, error))
97 *list_ptr = member->objtype_sinks;
130 osync_bool ret = FALSE;
131 if (!member->configdir) {
132 osync_error_set(error, OSYNC_ERROR_GENERIC,
"Member has no config directory set");
138 ret = functions.
get_config(member->configdir, data, size);
140 char *filename = g_strdup_printf(
"%s/%s.conf", member->configdir,
osync_plugin_get_name(member->plugin));
175 member->group = group;
178 member->memberfunctions = osync_memberfunctions_new();
191 osync_assert_msg(member,
"You must set a member to free");
202 if (member->pluginname)
203 g_free(member->pluginname);
205 g_free(member->memberfunctions);
225 g_list_free(member->objtype_sinks);
226 g_list_free(member->format_sinks);
229 member->objtype_sinks = NULL;
230 member->format_sinks = NULL;
231 member->plugin = NULL;
245 g_assert(member->group);
246 g_assert(pluginname);
250 osync_debug(
"OSPLG", 0,
"Couldn't find the plugin %s for member", pluginname);
251 osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION,
"Unable to find the plugin \"%s\"", pluginname);
258 member->plugin = plugin;
270 for (o = member->plugin->accepted_objtypes; o; o = o->next) {
271 OSyncObjTypeTemplate *objtemplate = o->data;
272 OSyncObjTypeSink *objsink = osync_objtype_sink_from_template(member->group, objtemplate);
274 osync_error_set(error, OSYNC_ERROR_GENERIC,
"Could not find object type \"%s\"", objtemplate->name);
277 member->objtype_sinks = g_list_append(member->objtype_sinks, objsink);
279 for (f = objtemplate->formats; f; f = f->next) {
280 OSyncObjFormatTemplate *frmtemplate = f->data;
281 OSyncObjFormatSink *format_sink = osync_objformat_sink_from_template(member->group, frmtemplate);
283 osync_error_set(error, OSYNC_ERROR_GENERIC,
"Could not find format \"%s\"", frmtemplate->name);
286 objsink->formatsinks = g_list_append(objsink->formatsinks, format_sink);
287 format_sink->objtype_sink = objsink;
288 member->format_sinks = g_list_append(member->format_sinks, format_sink);
289 if (frmtemplate->extension_name)
290 member->extension = g_strdup(frmtemplate->extension_name);
294 member->pluginname = g_strdup(pluginname);
310 if (!member->pluginname) {
311 osync_error_set(error, OSYNC_ERROR_GENERIC,
"No default plugin set while instancing");
328 return member->plugin;
340 return member->pluginname;
352 if (member->pluginname)
353 g_free(member->pluginname);
354 member->pluginname = g_strdup(pluginname);
383 return member->configdir;
395 if (member->configdir)
396 g_free(member->configdir);
397 member->configdir = g_strdup(configdir);
410 *type = member->plugin->info.config_type;
441 osync_bool ret = TRUE;
443 if (member->configdata) {
444 *data = member->configdata;
445 *size = member->configsize;
450 if (!osync_member_read_config(member, data, size, error)) {
456 char *filename = g_strdup_printf(OPENSYNC_CONFIGDIR
"/%s", member->pluginname);
457 osync_debug(
"OSMEM", 3,
"Reading default2 config file for member %lli from %s", member->id, filename);
487 osync_bool ret = TRUE;
495 osync_error_set(error, OSYNC_ERROR_GENERIC,
"This member has no configuration options");
500 if (member->configdata) {
501 *data = member->configdata;
502 *size = member->configsize;
507 if (!osync_member_read_config(member, data, size, error)) {
515 osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION,
"Member has not been configured");
520 char *filename = g_strdup_printf(OPENSYNC_CONFIGDIR
"/%s", member->pluginname);
521 osync_debug(
"OSMEM", 3,
"Reading default2 config file for member %lli from %s", member->id, filename);
543 member->configdata = g_strdup(data);
544 member->configsize = size;
606 char *filename = NULL;
608 filename = g_strdup_printf (
"%s/syncmember.conf", path);
611 char *basename = g_path_get_basename(path);
612 member->id = atoi(basename);
614 member->configdir = g_strdup(path);
622 while (cur != NULL) {
623 char *str = (
char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
625 if (!xmlStrcmp(cur->name, (
const xmlChar *)
"pluginname"))
626 member->pluginname = g_strdup(str);
627 if (!xmlStrcmp(cur->name, (
const xmlChar *)
"name"))
628 member->name = g_strdup(str);
650 char *filename = NULL;
659 member->configdir = g_strdup_printf(
"%s/%lli", member->group->configdir, member->id);
662 g_assert(member->configdir);
663 if (!g_file_test(member->configdir, G_FILE_TEST_IS_DIR)) {
664 osync_debug(
"OSMEM", 3,
"Creating config directory: %s for member %i", member->configdir, member->id);
665 if (mkdir(member->configdir, 0700)) {
666 osync_error_set(error, OSYNC_ERROR_IO_ERROR,
"Unable to create directory for member %li\n", member->id);
673 filename = g_strdup_printf (
"%s/syncmember.conf", member->configdir);
675 doc = xmlNewDoc((xmlChar*)
"1.0");
676 doc->children = xmlNewDocNode(doc, NULL, (xmlChar*)
"syncmember", NULL);
678 xmlNewTextChild(doc->children, NULL, (xmlChar*)
"pluginname", (xmlChar*)member->pluginname);
680 xmlNewTextChild(doc->children, NULL, (xmlChar*)
"name", (xmlChar*)member->name);
681 xmlSaveFile(filename, doc);
686 osync_bool ret = TRUE;
687 if (member->configdata) {
691 ret = functions.
store_config(member->configdir, member->configdata, member->configsize);
694 if (!
osync_file_write(filename, member->configdata, member->configsize, 0600, error)) {
699 g_free(member->configdata);
700 member->configdata = NULL;
701 member->configsize = 0;
736 void *(*plgfunc) (
void *,
void *,
OSyncError **);
739 return plgfunc(member->plugindata, data, error);
775 return needs_slow_sync;
788 if (member->memberfunctions->rf_sync_alert)
789 member->memberfunctions->rf_sync_alert(member);
812 OSyncObjFormatSink *format_sink = NULL;
814 for (retry = 0; retry < 100; retry++) {
824 selected = g_random_int_range(0, g_list_length(env->
objtypes));
825 objtype = g_list_nth_data(env->
objtypes, selected);
831 if (!g_list_length(objtype->formats)) {
836 selected = g_random_int_range(0, g_list_length(objtype->formats));
837 format = g_list_nth_data(objtype->formats, selected);
839 if (!format->create_func) {
844 format->create_func(change);
848 OSyncObjTypeSink *objtype_sink = osync_member_find_objtype_sink(member, objtype->name);
854 selected = g_random_int_range(0, g_list_length(objtype_sink->formatsinks));
855 format_sink = g_list_nth_data(objtype_sink->formatsinks, selected);
878 return member->enginedata;
890 member->enginedata = data;
902 return member->group;
918 if (member->id ==
id) {
922 osync_debug(
"OSPLG", 0,
"Couldnt find the member with the id %i",
id);
938 OSyncObjTypeSink *sink = osync_member_find_objtype_sink(member, objtype);
940 return sink->enabled;
958 OSyncObjTypeSink *sink = NULL;
961 if (osync_conv_objtype_is_any(objtypestr)) {
963 for (o = member->objtype_sinks; o; o = o->next) {
964 OSyncObjTypeSink *sink = o->data;
965 sink->enabled = enabled;
969 for (o = member->objtype_sinks; o; o = o->next) {
971 if (!strcmp(sink->objtype->name, objtypestr))
980 sink->enabled = enabled;
1013 g_assert(member->plugin);
1016 if (!(member->plugindata = functions.
initialize(member, error))) {
1036 g_assert(member->plugin);
1039 functions.
finalize(member->plugindata);
1056 OSyncContext *context = osync_context_new(member);
1057 context->callback_function =
function;
1058 context->calldata = user_data;
1060 osync_context_report_error(context, OSYNC_ERROR_GENERIC,
"No get_changeinfo function was given");
1083 g_assert(change->
uid);
1086 OSyncContext *context = osync_context_new(member);
1087 context->callback_function =
function;
1088 context->calldata = user_data;
1093 for (i = member->format_sinks; i; i = i->next) {
1094 OSyncObjFormatSink *fmtsink = i->data;
1098 g_assert(fmtsink->functions.read != NULL);
1099 fmtsink->functions.read(context, change);
1105 osync_context_report_error(context, OSYNC_ERROR_CONVERT,
"Unable to send changes");
1119 for (i = member->format_sinks; i; i = i->next) {
1120 OSyncObjFormatSink *fmtsink = i->data;
1123 return fmtsink->functions.read ? TRUE : FALSE;
1142 g_assert(change != NULL);
1143 OSyncContext *context = osync_context_new(member);
1144 context->callback_function =
function;
1145 context->calldata = user_data;
1146 functions.
get_data(context, change);
1163 OSyncContext *context = osync_context_new(member);
1164 context->callback_function =
function;
1165 context->calldata = user_data;
1167 osync_context_report_error(context, OSYNC_ERROR_GENERIC,
"No connect function was given");
1188 OSyncContext *context = osync_context_new(member);
1189 context->callback_function =
function;
1190 context->calldata = user_data;
1192 osync_context_report_error(context, OSYNC_ERROR_GENERIC,
"No disconnect function was given");
1213 OSyncContext *context = osync_context_new(member);
1214 context->callback_function =
function;
1215 context->calldata = user_data;
1220 osync_context_report_success(context);
1241 OSyncContext *context = osync_context_new(member);
1242 context->callback_function =
function;
1243 context->calldata = user_data;
1260 OSyncObjTypeSink *sink = osync_member_find_objtype_sink(member, type->name);
1261 if (sink && !sink->enabled) {
1262 osync_context_report_success(context);
1273 if (!osync_filter_change_allowed(member, change)) {
1274 osync_context_report_success(context);
1283 for (i = member->format_sinks; i; i = i->next) {
1284 OSyncObjFormatSink *fmtsink = i->data;
1288 if (fmtsink->functions.batch_commit) {
1290 fmtsink->commit_changes = g_list_append(fmtsink->commit_changes, change);
1291 fmtsink->commit_contexts = g_list_append(fmtsink->commit_contexts, context);
1296 if (!fmtsink->functions.commit_change) {
1297 osync_context_report_error(context, OSYNC_ERROR_GENERIC,
"No commit_change function was given");
1301 fmtsink->functions.commit_change(context, change);
1308 osync_context_report_error(context, OSYNC_ERROR_CONVERT,
"Unable to send changes");
1326 OSyncContext **contexts = NULL;
1328 OSyncContext *context = osync_context_new(member);
1329 context->callback_function =
function;
1330 context->calldata = user_data;
1332 GList *pendingchanges = NULL;
1333 GList *pendingcontexts = NULL;
1336 for (f = member->format_sinks; f; f = f->next) {
1337 OSyncObjFormatSink *fmtsink = f->data;
1338 osync_debug(
"OSYNC", 2,
"Sending changes to sink %p:%s", fmtsink, fmtsink->format ? fmtsink->format->name :
"None");
1343 pendingchanges = g_list_concat(pendingchanges, fmtsink->commit_changes);
1344 pendingcontexts = g_list_concat(pendingcontexts, fmtsink->commit_contexts);
1346 fmtsink->commit_changes = NULL;
1347 fmtsink->commit_contexts = NULL;
1351 f = member->format_sinks;
1353 OSyncObjFormatSink *fmtsink = f->data;
1354 osync_debug(
"OSYNC", 2,
"Sending committed all to sink %p:%s", fmtsink, fmtsink->format ? fmtsink->format->name :
"None");
1360 changes = g_malloc0(
sizeof(
OSyncChange *) * (g_list_length(pendingchanges) + 1));
1361 contexts = g_malloc0(
sizeof(OSyncContext *) * (g_list_length(pendingcontexts) + 1));;
1362 GList *o = pendingcontexts;
1365 for (c = pendingchanges; c && o; c = c->next) {
1367 OSyncContext *context = o->data;
1369 changes[i] = change;
1370 contexts[i] = context;
1376 g_list_free(pendingchanges);
1377 g_list_free(pendingcontexts);
1386 osync_context_report_success(context);
1393 void osync_member_set_name(
OSyncMember *member,
const char *name)
1397 g_free(member->name);
1398 member->name = g_strdup(name);
1401 const char *osync_member_get_name(
OSyncMember *member)
1403 return member->name;
1419 OSyncContext *context = osync_context_new(member);
1422 OSyncObjFormatSink *format_sink;
1428 if (!format_sink->functions.access) {
1433 if (!format_sink->functions.access(context, change)) {
1455 OSyncContext *context = osync_context_new(member);
1457 OSyncObjFormatSink *format_sink;
1467 if (!format_sink->functions.access) {
1472 if (!format_sink->functions.access(context, change)) {
1494 OSyncContext *context = osync_context_new(member);
1498 if (!objtype_sink) {
1504 OSyncObjFormatSink *format_sink = osync_objtype_find_format_sink(objtype_sink, format->name);
1510 if (format_sink->functions.batch_commit) {
1512 format_sink->commit_changes = g_list_append(format_sink->commit_changes, change);
1513 format_sink->commit_contexts = g_list_append(format_sink->commit_contexts, context);
1517 if (!format_sink->functions.access) {
1522 if (!format_sink->functions.access(context, change)) {
1539 for (osync_member_get_objtype_sinks(member, &obj, NULL); obj; obj = obj->next) {
1540 OSyncObjTypeSink *sink = obj->data;
1543 osync_message_write_string(message, sink->objtype->name);
1544 osync_message_write_int(message, sink->read);
1545 osync_message_write_int(message, sink->write);
1546 osync_message_write_int(message, sink->enabled);
1547 osync_message_write_int(message, slow);
1549 osync_message_write_string(message, NULL);
1561 int read, write, enabled, slow;
1562 osync_message_read_string(message, &objtypestr);
1566 osync_message_read_int(message, &read);
1567 osync_message_read_int(message, &write);
1568 osync_message_read_int(message, &enabled);
1569 osync_message_read_int(message, &slow);
1571 OSyncObjTypeSink *sink = osync_member_find_objtype_sink(member, objtypestr);
1576 sink->write = write;
1577 sink->enabled = enabled;
1606 __sync_member_read_sink_info(member, message);
1625 set_for_any = __sync_member_read_sink_info(member, message);
void osync_member_sync_done(OSyncMember *member, OSyncEngCallback function, void *user_data)
Tells the plugin that the sync was successfull.
void osync_change_set_objformat(OSyncChange *change, OSyncObjFormat *objformat)
Sets the object format of a change.
osync_bool osync_member_instance_plugin(OSyncMember *member, const char *pluginname, OSyncError **error)
Instances a plugin and loads it if necessary.
void osync_member_connect(OSyncMember *member, OSyncEngCallback function, void *user_data)
Connects a member to its device.
void osync_member_free(OSyncMember *member)
Frees a member.
osync_bool osync_member_get_config(OSyncMember *member, char **data, int *size, OSyncError **error)
Gets the configuration data of this member.
void osync_group_remove_member(OSyncGroup *group, OSyncMember *member)
Removes a member from the group.
osync_bool osync_member_get_slow_sync(OSyncMember *member, const char *objtypestr)
Returns if slow-sync has been set for a object type.
void osync_member_set_objtype_enabled(OSyncMember *member, const char *objtypestr, osync_bool enabled)
Enables or disables a object type on a member.
OSyncObjType * osync_objformat_get_objtype(OSyncObjFormat *format)
Returns the object type of a format.
void osync_member_get_change_data(OSyncMember *member, OSyncChange *change, OSyncEngCallback function, void *user_data)
Gets the "real" data of a object.
void osync_member_finalize(OSyncMember *member)
Finalizes a plugin.
void osync_change_set_uid(OSyncChange *change, const char *uid)
Sets the uid of a change.
osync_bool osync_member_has_configuration(OSyncMember *member)
Returns if the member has configuation options.
osync_bool _osync_open_xml_file(xmlDocPtr *doc, xmlNodePtr *cur, const char *path, const char *topentry, OSyncError **error)
Opens a xml document.
osync_bool osync_member_initialize(OSyncMember *member, OSyncError **error)
Initialize a member.
osync_bool osync_member_has_read_function(OSyncMember *member, OSyncObjType *objtype)
Checks if the member has a read method for the given objtype.
osync_bool osync_change_convert(OSyncFormatEnv *env, OSyncChange *change, OSyncObjFormat *targetformat, OSyncError **error)
Convert a change to a specific format.
int osync_group_num_members(OSyncGroup *group)
Counts the members of the group.
void osync_member_read_change(OSyncMember *member, OSyncChange *change, OSyncEngCallback function, void *user_data)
Reads a single object by its uid.
void * osync_member_get_plugindata(OSyncMember *member)
Returns the custom data set to the OSyncPluginInfo.
void *(* initialize)(OSyncMember *, OSyncError **)
Represent a synchronzation plugin.
osync_bool(* store_config)(char *, const char *, int)
void osync_member_committed_all(OSyncMember *member, OSyncEngCallback function, void *user_data)
Tells the plugin that all changes have been committed.
void osync_member_set_slow_sync(OSyncMember *member, const char *objtypestr, osync_bool slow_sync)
Sets the slow-sync for a given object type on a member.
OSyncObjFormatSink * osync_member_make_random_data(OSyncMember *member, OSyncChange *change, const char *objtypename)
Makes random data of a object type that could be writen to the given member.
osync_bool osync_error_is_set(OSyncError **error)
Checks if the error is set.
OSyncMember * osync_member_load(OSyncGroup *group, const char *path, OSyncError **error)
Loads a member from a directory where it has been saved.
void(* disconnect)(OSyncContext *)
void osync_member_set_configdir(OSyncMember *member, const char *configdir)
Sets the directory where a member is supposed to be stored.
osync_bool osync_member_save(OSyncMember *member, OSyncError **error)
Saves a member to it config directory.
Represent a group of members that should be synchronized.
OSyncChange * osync_change_new(void)
Spawns a new change object.
void osync_member_request_synchronization(OSyncMember *member)
Requests synchronization from the sync engine.
osync_bool osync_file_write(const char *filename, const char *data, int size, int mode, OSyncError **oserror)
Writes data to a file.
void(* connect)(OSyncContext *)
void * osync_plugin_get_function(OSyncPlugin *plugin, const char *name, OSyncError **error)
Used to look up a symbol on the plugin.
void * osync_plugin_get_plugin_data(OSyncPlugin *plugin)
Returns the plugin_info data, set by the plugin.
OSyncMember * osync_member_new(OSyncGroup *group)
Creates a new member for a group.
OSyncChange * osync_member_add_random_data(OSyncMember *member, const char *objtype)
Adds random data to a member.
const char * osync_change_get_uid(OSyncChange *change)
Gets the uid of a change.
void osync_error_free(OSyncError **error)
Frees the error so it can be reused.
long long int osync_group_create_member_id(OSyncGroup *group)
Creates a new unique member if in this group.
A member of a group which represent a single device.
void osync_member_set_data(OSyncMember *member, void *data)
Sets the custom data on a member.
OSyncObjFormat * osync_change_get_objformat(OSyncChange *change)
Gets the object format of a change.
void osync_group_add_member(OSyncGroup *group, OSyncMember *member)
Appends a member to the group.
const char * osync_plugin_get_name(OSyncPlugin *plugin)
Returns the name of the loaded plugin.
void osync_group_reset_slow_sync(OSyncGroup *group, const char *objtypestr)
Reset slow-sync for this group.
void osync_member_commit_change(OSyncMember *member, OSyncChange *change, OSyncEngCallback function, void *user_data)
Commits a change to the device.
void * osync_member_get_data(OSyncMember *member)
Returns the custom data of a member.
osync_bool osync_member_delete_data(OSyncMember *member, OSyncChange *change)
Deletes data from a device.
void osync_member_set_config(OSyncMember *member, const char *data, int size)
Sets the config data for a member.
OSyncObjType * osync_conv_find_objtype(OSyncFormatEnv *env, const char *name)
Finds the object type with the given name.
void osync_debug(const char *subpart, int level, const char *message,...)
Used for debugging.
osync_bool osync_member_modify_random_data(OSyncMember *member, OSyncChange *change)
Modifies random data on a member.
osync_bool osync_member_instance_default_plugin(OSyncMember *member, OSyncError **error)
Tries to instance the default plugin of a member (if set)
osync_bool osync_member_get_config_or_default(OSyncMember *member, char **data, int *size, OSyncError **error)
Gets the configuration data of this member.
osync_bool(* get_config)(char *, char **, int *)
osync_bool osync_file_read(const char *filename, char **data, int *size, OSyncError **oserror)
Reads a file.
Represents the functions that a member will call to inform the syncengine.
long long int osync_member_get_id(OSyncMember *member)
Gets the unique id of a member.
OSyncGroup * osync_member_get_group(OSyncMember *member)
Gets the group in which the member is stored.
void osync_change_set_objtype(OSyncChange *change, OSyncObjType *type)
Sets the object type of a change.
OSyncPlugin * osync_member_get_plugin(OSyncMember *member)
Returns the plugin of member.
const char * osync_member_get_pluginname(OSyncMember *member)
Returns the name of the default plugin of the member.
void * osync_member_call_plugin(OSyncMember *member, const char *function, void *data, OSyncError **error)
Makes a custom call to the plugin that the member has instanced.
void osync_member_set_pluginname(OSyncMember *member, const char *pluginname)
Sets the name of the default plugin of a member.
void osync_error_set(OSyncError **error, OSyncErrorType type, const char *format,...)
Sets the error.
const char * osync_error_print(OSyncError **error)
Returns the message of the error.
void osync_trace(OSyncTraceType type, const char *message,...)
Used for tracing the application.
void osync_member_unload_plugin(OSyncMember *member)
Unloads the plugin of a member.
void(* get_changeinfo)(OSyncContext *)
void * osync_member_get_loop(OSyncMember *member)
Gets the loop in which the member is dispatched.
osync_bool osync_group_get_slow_sync(OSyncGroup *group, const char *objtype)
Returns if the group will perform a slow-sync for the object type.
OSyncPlugin * osync_env_find_plugin(OSyncEnv *env, const char *name)
Finds the plugin with the given name.
const char * osync_member_get_configdir(OSyncMember *member)
Returns the configuration directory where this member is stored.
osync_bool osync_member_objtype_enabled(OSyncMember *member, const char *objtype)
Returns if a certain object type is enabled on this member.
The functions that can be called on a plugin.
OSyncObjType * osync_change_get_objtype(OSyncChange *change)
Gets the object type of a change.
Represent a abstract object type (like "contact")
void(* sync_done)(OSyncContext *ctx)
OSyncMember * osync_member_from_id(OSyncGroup *group, int id)
Searches for a member by its id.
OSyncMember * osync_group_nth_member(OSyncGroup *group, int nth)
Returns the nth member of the group.
void osync_group_set_slow_sync(OSyncGroup *group, const char *objtypestr, osync_bool slow_sync)
Sets if the group requires slow-sync for the given object type.
void osync_member_set_loop(OSyncMember *member, void *loop)
Sets the loop in which the member is dispatched.
void osync_member_get_changeinfo(OSyncMember *member, OSyncEngCallback function, void *user_data)
Queries a plugin for the changed objects since the last sync.
OSyncConfigurationTypes
Gives information about wether the plugin has to be configured or not.
OSyncChangeType changetype
void osync_member_disconnect(OSyncMember *member, OSyncEngCallback function, void *user_data)
Disconnects a member from its device.
OSyncFormatEnv * osync_group_get_format_env(OSyncGroup *group)
Returns the format environment of a group.
void(* get_data)(OSyncContext *, OSyncChange *)