summaryrefslogtreecommitdiffstats
path: root/sync/src/sync_syncml_server_item.c
diff options
context:
space:
mode:
Diffstat (limited to 'sync/src/sync_syncml_server_item.c')
-rw-r--r--sync/src/sync_syncml_server_item.c111
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;
+}