diff options
Diffstat (limited to 'sync/src/sync_syncml_server_item.c')
-rw-r--r-- | sync/src/sync_syncml_server_item.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/sync/src/sync_syncml_server_item.c b/sync/src/sync_syncml_server_item.c new file mode 100644 index 0000000..c0f5643 --- /dev/null +++ b/sync/src/sync_syncml_server_item.c @@ -0,0 +1,111 @@ + +#include <opensync/opensync.h> +#include <glib.h> +#include <string.h> +#include "sync_item.h" +#include "sync_group.h" +#include "sync_syncml_server_item.h" + +#define SYNCML_SERVER_PLUGIN "syncml-http-server" +#define SYNCML_SERVER_CONFIG \ + "<config>" \ + "<username>%s</username>" \ + "<password>%s</password>" \ + "<url>%s</url>" \ + "<port>%d</port>" \ + "<usestringtable>1</usestringtable>" \ + "<onlyreplace>0</onlyreplace>" \ + "<recvLimit>0</recvLimit>" \ + "<contact_db>%s</contact_db>" \ + "<calendar_db>%s</calendar_db>" \ + "<note_db>%s</note_db>" \ + "</config>" + +typedef struct { + gchar *user; + gchar *pass; + guint port; + gchar *card_db; + gchar *cal_db; + gchar *note_db; +} SyncSyncMLServerItemData; + +static void +sync_syncml_server_free_data (SyncSyncMLServerItemData *data) +{ + g_free (data->user); + g_free (data->pass); + g_free (data->card_db); + g_free (data->cal_db); + g_free (data->note_db); +} + +static OSyncMember * +sync_syncml_server_item_get_member (SyncItem *item, SyncGroup *group) +{ + OSyncMember *member; + OSyncError *error = NULL; + OSyncConfigurationTypes type = NO_CONFIGURATION; + + member = osync_member_new (sync_group_get_osync_group (group)); + if (!osync_member_instance_plugin (member, SYNCML_SERVER_PLUGIN, + &error)) { + g_warning ("Error instancing syncml server plug-in: %s", + osync_error_print (&error)); + osync_error_free (&error); + return NULL; + } + if (!osync_member_need_config (member, &type, &error)) { + g_warning ("Error reading plug-in config requirements: %s", + osync_error_print (&error)); + osync_error_free (&error); + return NULL; + } + if (type == NO_CONFIGURATION) { + g_warning ( + "syncml server plug-in reports no need for " + "configuration"); + } else { + SyncSyncMLServerItemData *data; + const gchar *url; + gchar *config; + + data = (SyncSyncMLServerItemData *)sync_item_get_data (item); + url = sync_item_get_name (item); + + config = g_strdup_printf (SYNCML_SERVER_CONFIG, data->user, + data->pass, url, data->port, data->card_db, + data->cal_db, data->note_db); + osync_member_set_config ( + member, config, strlen (config)); + g_free (config); + } + + return member; +} + +SyncItem * +sync_syncml_server_item_new (const gchar *name, const gchar *user, + const gchar *pass, guint port, + const gchar *card_db, const gchar *cal_db, + const gchar *note_db) +{ + SyncItem *item; + SyncSyncMLServerItemData *data; + + item = sync_item_new (name, "", sync_syncml_server_item_get_member); + + data = g_new0 (SyncSyncMLServerItemData, 1); + data->user = g_strdup (user); + data->pass = g_strdup (pass); + data->port = port; + data->card_db = g_strdup (card_db); + data->cal_db = g_strdup (cal_db); + data->note_db = g_strdup (note_db); + + sync_item_set_data (item, data); + sync_item_set_data_free_func (item, + (SyncItemDataFreeFunc)sync_syncml_server_free_data); + + return item; +} |