[packages/libopensync-plugin-opie] - up to 0.38 + updates for libopensync 0.39

qboosh qboosh at pld-linux.org
Sat Sep 6 09:29:00 CEST 2025


commit abdee3ba5a747765fb0cd0370d8a8c0104799139
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sat Sep 6 09:31:48 2025 +0200

    - up to 0.38 + updates for libopensync 0.39

 libopensync-plugin-opie-libopensync0.39.patch | 1125 +++++++++++++++++++++++++
 libopensync-plugin-opie.spec                  |   38 +-
 2 files changed, 1146 insertions(+), 17 deletions(-)
---
diff --git a/libopensync-plugin-opie.spec b/libopensync-plugin-opie.spec
index cfe8dfd..690241a 100644
--- a/libopensync-plugin-opie.spec
+++ b/libopensync-plugin-opie.spec
@@ -1,20 +1,25 @@
 Summary:	OpenSync Plugin for Opie
 Summary(pl.UTF-8):	Wtyczka Opie do OpenSync
 Name:		libopensync-plugin-opie
-Version:	0.22
+Version:	0.38
 Release:	1
 License:	GPL v2
 Group:		Libraries
-Source0:	http://www.opensync.org/attachment/wiki/download/%{name}-%{version}.tar.bz2?format=raw
-# Source0-md5:	29b0fea90a4782f68e8017db32e3b6ea
-URL:		http://www.opensync.org/
+# originally http://www.opensync.org/attachment/wiki/download/%{name}-%{version}.tar.bz2?format=raw, dead now
+# taken from http://ftp.iij.ad.jp/pub/linux/momonga/6/Everything/SOURCES/libopensync-plugin-opie-0.38.tar.bz2
+Source0:	%{name}-%{version}.tar.bz2
+# Source0-md5:	5af4a3afd3f497edd682f1c88dfebf48
+Patch0:		%{name}-libopensync0.39.patch
+# domain dead
+#URL:		http://www.opensync.org/
+BuildRequires:	cmake
 BuildRequires:	curl-devel
 BuildRequires:	glib2-devel >= 1:2.10
-BuildRequires:	libopensync-devel >= %{version}
+BuildRequires:	libopensync-devel >= 0.39
 BuildRequires:	libxml2-devel >= 2.0
-BuildRequires:	openssl-devel >= 0.9.7
-BuildRequires:	pkgconfig
+BuildRequires:	rpmbuild(macros) >= 1.605
 Requires:	glib2 >= 1:2.10
+Requires:	libopensync >= 0.39
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
 %description
@@ -31,28 +36,27 @@ urządzeniach Sharp Zaurus, ale nie było to testowane.
 
 %prep
 %setup -q
+%patch -P0 -p1
 
 %build
-%configure
+install -d build
+cd build
+%cmake ..
+
 %{__make}
 
 %install
 rm -rf $RPM_BUILD_ROOT
 
-%{__make} install \
+%{__make} -C build install \
 	DESTDIR=$RPM_BUILD_ROOT
 
-rm -f $RPM_BUILD_ROOT%{_libdir}/opensync/{plugins,formats}/*.la
-
 %clean
 rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(644,root,root,755)
 %doc AUTHORS README
-%attr(755,root,root) %{_libdir}/opensync/plugins/opie_sync.so
-%attr(755,root,root) %{_libdir}/opensync/formats/opie.so
-%{_datadir}/opensync/defaults/opie-sync
-
-# devel
-#%{_includedir}/opensync-1.0/opensync/opie_sync.h
+%attr(755,root,root) %{_libdir}/libopensync1/formats/opie.so
+%attr(755,root,root) %{_libdir}/libopensync1/plugins/opie-sync.so
+%{_datadir}/libopensync1/defaults/opie-sync
diff --git a/libopensync-plugin-opie-libopensync0.39.patch b/libopensync-plugin-opie-libopensync0.39.patch
new file mode 100644
index 0000000..eac4d1f
--- /dev/null
+++ b/libopensync-plugin-opie-libopensync0.39.patch
@@ -0,0 +1,1125 @@
+--- libopensync-plugin-opie-0.38/src/opie_format.h.orig	2008-11-10 16:33:42.000000000 +0100
++++ libopensync-plugin-opie-0.38/src/opie_format.h	2025-09-05 18:27:37.575477789 +0200
+@@ -28,15 +28,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE
+ void xmlfield_key_to_attr(OSyncXMLField *xmlfield, const char *key, xmlNode *node_to, const char *attrname);
+ void xmlfield_uid_to_attr(OSyncXMLField *xmlfield, xmlNode *node_to);
+ void xml_uid_attr_to_xmlfield(const char *uid, const char *nodename, OSyncXMLFormat *out_xmlformat, OSyncError **error);
+-time_t xmlfield_vtime_to_attr_time_t(OSyncXMLField *xmlfield, xmlNode *node_to, const char *attrname);
++time_t xmlfield_vtime_to_attr_time_t(OSyncXMLField *xmlfield, xmlNode *node_to, const char *attrname, OSyncError **error);
+ OSyncXMLField *xml_attrs_to_xmlfield_keys(xmlNode *node, OSyncXMLFormat *out_xmlformat, const char *fieldname, GSList *attrs, GSList *keys, OSyncError **error);
+ void dual_list_append(GSList **list1, void *item1, GSList **list2, void *item2);
+ void dual_list_clear(GSList **list1, GSList **list2);
+ void xmlfield_categories_to_attr(OSyncXMLField *in_xmlfield, xmlNode *node_to, const char *category_attr);
+ void xml_recur_attr_to_xmlfield(xmlNode *item_node, OSyncXMLFormat *out_xmlformat, GDate *startdate, OSyncError **error);
+-void xmlfield_recur_to_attr(OSyncXMLField *in_xmlfield, xmlNode *node_to);
++void xmlfield_recur_to_attr(OSyncXMLField *in_xmlfield, xmlNode *node_to, OSyncError **error);
+ void xml_todo_alarm_attr_to_xmlfield(const char *alarmstr, OSyncXMLFormat *out_xmlformat, time_t *starttime, OSyncError **error);
+-void xmlformat_todo_alarms_to_attr(OSyncXMLFormat *in_xmlformat, xmlNode *node_to, const char *duedate);
++void xmlformat_todo_alarms_to_attr(OSyncXMLFormat *in_xmlformat, xmlNode *node_to, const char *duedate, OSyncError **error);
+ void xmlformat_cal_alarms_to_attr(OSyncXMLFormat *in_xmlformat, xmlNode *node_to, time_t *starttime);
+ 
+ #endif /* _OPIE_FORMAT_H */
+--- libopensync-plugin-opie-0.38/src/opie_format.c.orig	2008-11-10 16:33:42.000000000 +0100
++++ libopensync-plugin-opie-0.38/src/opie_format.c	2025-09-05 22:03:42.415241228 +0200
+@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE
+ #include <opensync/opensync.h>
+ #include <opensync/opensync-time.h>
+ #include <opensync/opensync-format.h>
+-#include <opensync/opensync-merger.h>
++#include <opensync/opensync-capabilities.h>
+ #include <opensync/opensync-xmlformat.h>
+ 
+ enum OpieTodoState {
+@@ -45,7 +45,7 @@ enum OpieTodoState {
+ /** Convert Opie XML contact to OpenSync XML contact 
+  * 
+  **/
+-static osync_bool conv_opie_xml_contact_to_xml_contact(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_opie_xml_contact_to_xml_contact(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %i, %p, %p, %p, %p)", __func__, input, inpsize, output, outpsize, free_input, config, error);
+ 	int j;
+@@ -81,7 +81,7 @@ static osync_bool conv_opie_xml_contact_
+ 				{
+ 					/* File-as. This is what the Evo plugin does, so copy it. */
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "FormattedName", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Emails"))
+ 				{
+@@ -89,7 +89,7 @@ static osync_bool conv_opie_xml_contact_
+ 					for(j=0;emailtokens[j]!=NULL;j++) 
+ 					{
+ 						out_xmlfield = osync_xmlfield_new(out_xmlformat, "EMail", error);
+-						osync_xmlfield_set_key_value(out_xmlfield, "Content", emailtokens[j]);
++						osync_xmlfield_set_key_value(out_xmlfield, "Content", emailtokens[j], error);
+ 					}
+ 					g_strfreev(emailtokens);
+ 				}
+@@ -99,21 +99,21 @@ static osync_bool conv_opie_xml_contact_
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Categories", error);
+ 					for(j=0;categorytokens[j]!=NULL;j++) 
+ 					{
+-						osync_xmlfield_add_key_value(out_xmlfield, "Category", categorytokens[j]);
++						osync_xmlfield_add_key_value(out_xmlfield, "Category", categorytokens[j], error);
+ 					}
+ 					g_strfreev(categorytokens);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "DefaultEmail"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "EMail", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					/* this is the preferred email address */
+ 					osync_xmlfield_set_attr(out_xmlfield, "Preferred", "true");
+ 				}
+ 				else if(!strcasecmp(iprop->name, "HomePhone"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Telephone", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Location", "Home");
+ 					/* Removed the VOICE tags for the moment as they are assumed if not present, 
+ 					   and if they are KDEPIM shows them up as "Other" */
+@@ -122,21 +122,21 @@ static osync_bool conv_opie_xml_contact_
+ 				else if(!strcasecmp(iprop->name, "HomeFax"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Telephone", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Location", "Home");
+ 					osync_xmlfield_set_attr(out_xmlfield, "Type", "Fax");
+ 				}
+ 				else if(!strcasecmp(iprop->name, "HomeMobile"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Telephone", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Location", "Home");
+ 					osync_xmlfield_set_attr(out_xmlfield, "Type", "Cellular");
+ 				}
+ 				else if(!strcasecmp(iprop->name, "BusinessPhone"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Telephone", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Location", "Work");
+ 					/* Removed the VOICE tags for the moment as they are assumed if not present, 
+ 					   and if they are KDEPIM shows them up as "Other" */
+@@ -145,28 +145,28 @@ static osync_bool conv_opie_xml_contact_
+ 				else if(!strcasecmp(iprop->name, "BusinessFax"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Telephone", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Location", "Work");
+ 					osync_xmlfield_set_attr(out_xmlfield, "Type", "Fax");
+ 				}
+ 				else if(!strcasecmp(iprop->name, "BusinessMobile"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Telephone", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Location", "Work");
+ 					osync_xmlfield_set_attr(out_xmlfield, "Type", "Cellular");
+ 				}
+ 				else if(!strcasecmp(iprop->name, "BusinessPager"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Telephone", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Location", "Work");
+ 					osync_xmlfield_set_attr(out_xmlfield, "Type", "Pager"); /* FIXME is this still supported? */
+ 				}
+ 				else if(!strcasecmp(iprop->name, "HomeWebPage"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Url", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "BusinessWebPage"))
+ 				{
+@@ -175,22 +175,22 @@ static osync_bool conv_opie_xml_contact_
+ 				else if(!strcasecmp(iprop->name, "Spouse"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Spouse", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Birthday"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Birthday", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Anniversary"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Anniversary", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Nickname"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Nickname", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Children"))
+ 				{
+@@ -199,7 +199,7 @@ static osync_bool conv_opie_xml_contact_
+ 				else if(!strcasecmp(iprop->name, "Notes"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Note", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "rid"))
+ 				{
+@@ -216,22 +216,22 @@ static osync_bool conv_opie_xml_contact_
+ 				else if(!strcasecmp(iprop->name, "Assistant"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Assistant", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Manager"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Manager", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Profession"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Profession", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "JobTitle"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Role", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else
+ 				{
+@@ -289,16 +289,18 @@ static osync_bool conv_opie_xml_contact_
+ 	xmlFreeDoc(idoc);
+ 
+ 	// FIXME: remove this later by adding in a pre-sorted way?
+-	osync_xmlformat_sort(out_xmlformat);
++	osync_xmlformat_sort(out_xmlformat, error);
+ 	
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(out_xmlformat, &str, &size);
++	osync_xmlformat_assemble(out_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Output XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
++	/* replacement?
+ 	if (!osync_xmlformat_validate(out_xmlformat, error))
+ 		goto error;
++	 */
+ 
+ 	osync_trace(TRACE_EXIT, "%s", __func__);
+ 	return TRUE;
+@@ -312,7 +314,7 @@ error:
+ /** Convert OpenSync XML contact to Opie XML contact 
+  * 
+  **/
+-static osync_bool conv_xml_contact_to_opie_xml_contact(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_xml_contact_to_opie_xml_contact(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	enum PhoneType {
+ 		PT_HOME = 1,
+@@ -333,7 +335,7 @@ static osync_bool conv_xml_contact_to_op
+ 	OSyncXMLFormat *in_xmlformat = (OSyncXMLFormat *)input;
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(in_xmlformat, &str, &size);
++	osync_xmlformat_assemble(in_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Input XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
+@@ -525,7 +527,7 @@ error:
+ /** Convert Opie XML todo to OpenSync XML todo 
+  * 
+  **/
+-static osync_bool conv_opie_xml_todo_to_xml_todo(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_opie_xml_todo_to_xml_todo(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %i, %p, %p, %p, %p)", __func__, input, inpsize, output, outpsize, free_input, config, error);
+ 	struct _xmlAttr *iprop;
+@@ -558,12 +560,12 @@ static osync_bool conv_opie_xml_todo_to_
+ 				if(!strcasecmp(iprop->name, "Summary")) 
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Summary", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Description"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Description", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Priority"))
+ 				{
+@@ -571,13 +573,13 @@ static osync_bool conv_opie_xml_todo_to_
+ 					int priority = atoi(iprop->children->content);
+ 					char *prio = g_strdup_printf("%d", priority);
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Priority", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", prio);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", prio, error);
+ 					g_free(prio);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Progress"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "PercentComplete", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "State"))
+ 				{
+@@ -598,12 +600,12 @@ static osync_bool conv_opie_xml_todo_to_
+ 							status = "NEEDS-ACTION";
+ 					}
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Status", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", status);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", status, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "StartDate"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "DateStarted", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					osync_xmlfield_set_attr(out_xmlfield, "Value", "DATE");
+ 				}
+ 				else if(!strcasecmp(iprop->name, "Categories"))
+@@ -612,7 +614,7 @@ static osync_bool conv_opie_xml_todo_to_
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Categories", error);
+ 					for(j=0;categorytokens[j]!=NULL;j++) 
+ 					{
+-						osync_xmlfield_add_key_value(out_xmlfield, "Category", categorytokens[j]);
++						osync_xmlfield_add_key_value(out_xmlfield, "Category", categorytokens[j], error);
+ 					}
+ 					g_strfreev(categorytokens);
+ 				}
+@@ -626,7 +628,7 @@ static osync_bool conv_opie_xml_todo_to_
+ 				char *completeDate = xmlGetProp(icur, "CompletedDate");
+ 				if(completeDate) { 
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Completed", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", completeDate);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", completeDate, error);
+ 					// RFC2445 says the default value type is DATE-TIME. But Opie only
+ 					// stores DATE as completed date => alter VALUE to DATE
+ 					osync_xmlfield_set_attr(out_xmlfield, "Value", "DATE");
+@@ -652,7 +654,7 @@ static osync_bool conv_opie_xml_todo_to_
+ 					duedatestr = g_strdup_printf("%04d%02d%02d", dateyear, datemonth, dateday);
+ 					duedate = g_date_new_dmy(dateday, datemonth, dateyear);
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Due", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", duedatestr);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", duedatestr, error);
+ 					// RFC2445 says the default value type is DATE-TIME. But Opie only
+ 					// stores DATE as due date => alter VALUE to DATE
+ 					osync_xmlfield_set_attr(out_xmlfield, "Value", "DATE");
+@@ -671,7 +673,7 @@ static osync_bool conv_opie_xml_todo_to_
+ 		char *alarmstr = xmlGetProp(icur, "Alarms");
+ 		if(alarmstr && duedatestr) {
+ 			char *duetimestr = g_strdup_printf("%sT000000", duedatestr);
+-			time_t duetime = osync_time_vtime2unix(duetimestr, 0);
++			time_t duetime = osync_time_vtime2unix(duetimestr, 0, error);
+ 			xml_todo_alarm_attr_to_xmlfield(alarmstr, out_xmlformat, &duetime, error);
+ 			g_free(duetimestr);
+ 		}
+@@ -691,16 +693,18 @@ static osync_bool conv_opie_xml_todo_to_
+ 	xmlFreeDoc(idoc);
+ 
+ 	// FIXME: remove this later by adding in a pre-sorted way?
+-	osync_xmlformat_sort(out_xmlformat);
++	osync_xmlformat_sort(out_xmlformat, error);
+ 	
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(out_xmlformat, &str, &size);
++	osync_xmlformat_assemble(out_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Output XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
++	/* replacement?
+ 	if (!osync_xmlformat_validate(out_xmlformat, error))
+ 		goto error;
++	 */
+ 	
+ 	osync_trace(TRACE_EXIT, "%s", __func__);
+ 	return TRUE;
+@@ -713,7 +717,7 @@ error:
+ /** Convert OpenSync XML todo to Opie XML todo 
+  * 
+  **/
+-static osync_bool conv_xml_todo_to_opie_xml_todo(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_xml_todo_to_opie_xml_todo(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	const char *completedstr = NULL;
+ 	const char *startedstr = NULL;
+@@ -726,7 +730,7 @@ static osync_bool conv_xml_todo_to_opie_
+ 	OSyncXMLFormat *in_xmlformat = (OSyncXMLFormat *)input;
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(in_xmlformat, &str, &size);
++	osync_xmlformat_assemble(in_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Input XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
+@@ -771,7 +775,7 @@ static osync_bool conv_xml_todo_to_opie_
+ 		else if(!strcmp("Completed", fieldname)) {
+ 			completedstr = osync_xmlfield_get_key_value(in_xmlfield, "Content");
+ 			if(completedstr) {
+-				struct tm *completed = osync_time_vtime2tm(completedstr);
++				struct tm *completed = osync_time_vtime2tm(completedstr, error);
+ 				char *completedstr_out = g_strdup_printf("%04d%02d%02d", completed->tm_year + 1900, (completed->tm_mon + 1), completed->tm_mday);
+ 				xmlSetProp(on_todo, "Completed", "1");
+ 				xmlSetProp(on_todo, "CompletedDate", completedstr_out);
+@@ -782,7 +786,7 @@ static osync_bool conv_xml_todo_to_opie_
+ 		else if(!strcmp("DateStarted", fieldname)) {
+ 			startedstr = osync_xmlfield_get_key_value(in_xmlfield, "Content");
+ 			if(startedstr) {
+-				struct tm *started = osync_time_vtime2tm(startedstr);
++				struct tm *started = osync_time_vtime2tm(startedstr, error);
+ 				char *startedstr_out = g_strdup_printf("%04d%02d%02d", (started->tm_year + 1900), (started->tm_mon + 1), started->tm_mday);
+ 				xmlSetProp(on_todo, "StartDate", startedstr_out);
+ 				g_free(startedstr_out);
+@@ -792,7 +796,7 @@ static osync_bool conv_xml_todo_to_opie_
+ 		else if(!strcmp("Due", fieldname)) {
+ 			duestr = osync_xmlfield_get_key_value(in_xmlfield, "Content");
+ 			if(duestr) {
+-				struct tm *due = osync_time_vtime2tm(duestr);
++				struct tm *due = osync_time_vtime2tm(duestr, error);
+ 				char *dueyear  = g_strdup_printf("%04d", (due->tm_year + 1900));
+ 				char *duemonth = g_strdup_printf("%02d", (due->tm_mon + 1));
+ 				char *dueday   = g_strdup_printf("%02d", due->tm_mday);
+@@ -831,14 +835,14 @@ static osync_bool conv_xml_todo_to_opie_
+ 			}
+ 		}
+ 		else if(!strcmp("RecurrenceRule", fieldname)) {
+-			xmlfield_recur_to_attr(in_xmlfield, on_todo);
++			xmlfield_recur_to_attr(in_xmlfield, on_todo, error);
+ 		}
+ 		
+ 		in_xmlfield = osync_xmlfield_get_next(in_xmlfield);
+ 	}
+ 	
+ 	/* Convert alarms */
+-	xmlformat_todo_alarms_to_attr(in_xmlformat, on_todo, duestr);
++	xmlformat_todo_alarms_to_attr(in_xmlformat, on_todo, duestr, error);
+ 	
+ 	if(!completedstr)
+ 		xmlSetProp(on_todo, "Completed", "0");
+@@ -867,7 +871,7 @@ error:
+ /** Convert Opie XML event to OpenSync XML event 
+  * 
+  **/
+-static osync_bool conv_opie_xml_event_to_xml_event(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_opie_xml_event_to_xml_event(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %i, %p, %p, %p, %p)", __func__, input, inpsize, output, outpsize, free_input, config, error);
+ 	struct _xmlAttr *iprop;
+@@ -911,24 +915,24 @@ static osync_bool conv_opie_xml_event_to
+ 				if(!strcasecmp(iprop->name, "description"))
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Summary", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "note")) 
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Description", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "location")) 
+ 				{
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Location", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "created")) 
+ 				{
+ 					time_t createtime = (time_t)atoi(iprop->children->content);
+-					char *createvtime = osync_time_unix2vtime(&createtime);
++					char *createvtime = osync_time_unix2vtime(&createtime, error);
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "DateCreated", error);
+-					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content);
++					osync_xmlfield_set_key_value(out_xmlfield, "Content", iprop->children->content, error);
+ 					g_free(createvtime);
+ 				}
+ 				else if(!strcasecmp(iprop->name, "start")) 
+@@ -939,14 +943,14 @@ static osync_bool conv_opie_xml_event_to
+ 						struct tm *localtm = g_malloc0(sizeof(struct tm));
+ 						localtime_r(&starttime, localtm);
+ 						char *startvdate = g_strdup_printf("%04d%02d%02d", localtm->tm_year + 1900, (localtm->tm_mon + 1), localtm->tm_mday);
+-						osync_xmlfield_set_key_value(out_xmlfield, "Content", startvdate);
++						osync_xmlfield_set_key_value(out_xmlfield, "Content", startvdate, error);
+ 						osync_xmlfield_set_attr(out_xmlfield, "Value", "DATE");
+ 						g_free(startvdate);
+ 						g_free(localtm);
+ 					}
+ 					else {
+-						char *startvtime = osync_time_unix2vtime(&starttime); 
+-						osync_xmlfield_set_key_value(out_xmlfield, "Content", startvtime);
++						char *startvtime = osync_time_unix2vtime(&starttime, error); 
++						osync_xmlfield_set_key_value(out_xmlfield, "Content", startvtime, error);
+ 						g_free(startvtime);
+ 					}
+ 					/* Record the start date for use later */
+@@ -970,14 +974,14 @@ static osync_bool conv_opie_xml_event_to
+ 						endtime += 1;
+ 						localtime_r(&endtime, localtm);
+ 						char *endvdate = g_strdup_printf("%04d%02d%02d", localtm->tm_year + 1900, (localtm->tm_mon + 1), localtm->tm_mday);
+-						osync_xmlfield_set_key_value(out_xmlfield, "Content", endvdate);
++						osync_xmlfield_set_key_value(out_xmlfield, "Content", endvdate, error);
+ 						osync_xmlfield_set_attr(out_xmlfield, "Value", "DATE");
+ 						g_free(endvdate);
+ 						g_free(localtm);
+ 					}
+ 					else {
+-						char *endvtime = osync_time_unix2vtime(&endtime);
+-						osync_xmlfield_set_key_value(out_xmlfield, "Content", endvtime);
++						char *endvtime = osync_time_unix2vtime(&endtime, error);
++						osync_xmlfield_set_key_value(out_xmlfield, "Content", endvtime, error);
+ 						g_free(endvtime);
+ 					}
+ 				}
+@@ -987,7 +991,7 @@ static osync_bool conv_opie_xml_event_to
+ 					out_xmlfield = osync_xmlfield_new(out_xmlformat, "Categories", error);
+ 					for(j=0;categorytokens[j]!=NULL;j++) 
+ 					{
+-						osync_xmlfield_add_key_value(out_xmlfield, "Category", categorytokens[j]);
++						osync_xmlfield_add_key_value(out_xmlfield, "Category", categorytokens[j], error);
+ 					}
+ 					g_strfreev(categorytokens);
+ 				}
+@@ -1010,13 +1014,13 @@ static osync_bool conv_opie_xml_event_to
+ 				xmlFree(alarmsoundstr);
+ 			}
+ 			if(alarmsound == 1)
+-				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "AUDIO");
++				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "AUDIO", error);
+ 			else
+-				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "DISPLAY");
++				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "DISPLAY", error);
+ 			
+ 			int alarmseconds = -(atoi(alarmminsstr) * 60);
+ 			char *alarmdu = osync_time_sec2alarmdu(alarmseconds);
+-			osync_xmlfield_set_key_value(out_xmlfield, "AlarmTrigger", alarmdu);
++			osync_xmlfield_set_key_value(out_xmlfield, "AlarmTrigger", alarmdu, error);
+ 			g_free(alarmdu);
+ 			xmlFree(alarmminsstr);
+ 		}
+@@ -1032,16 +1036,18 @@ static osync_bool conv_opie_xml_event_to
+ 	xmlFreeDoc(idoc);
+ 
+ 	// FIXME: remove this later by adding in a pre-sorted way?
+-	osync_xmlformat_sort(out_xmlformat);
++	osync_xmlformat_sort(out_xmlformat, error);
+ 	
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(out_xmlformat, &str, &size);
++	osync_xmlformat_assemble(out_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Output XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
++	/* replacement?
+ 	if (!osync_xmlformat_validate(out_xmlformat, error))
+ 		goto error;
++	 */
+ 	
+ 	osync_trace(TRACE_EXIT, "%s", __func__);
+ 	return TRUE;
+@@ -1055,7 +1061,7 @@ error:
+ /** Convert OpenSync XML event to Opie XML event 
+  * 
+  **/
+-static osync_bool conv_xml_event_to_opie_xml_event(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_xml_event_to_opie_xml_event(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	time_t start_time = 0;
+ 	time_t end_time = 0;
+@@ -1067,7 +1073,7 @@ static osync_bool conv_xml_event_to_opie
+ 	OSyncXMLFormat *in_xmlformat = (OSyncXMLFormat *)input;
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(in_xmlformat, &str, &size);
++	osync_xmlformat_assemble(in_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Input XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
+@@ -1093,19 +1099,19 @@ static osync_bool conv_xml_event_to_opie
+ 			xmlfield_key_to_attr(in_xmlfield, "Content", on_event, "location");
+ 		}
+ 		else if(!strcmp("DateCreated", fieldname)) {
+-			xmlfield_vtime_to_attr_time_t(in_xmlfield, on_event, "created");
++			xmlfield_vtime_to_attr_time_t(in_xmlfield, on_event, "created", error);
+ 		}
+ 		else if(!strcmp("DateStarted", fieldname)) {
+-			start_time = xmlfield_vtime_to_attr_time_t(in_xmlfield, on_event, "start");
++			start_time = xmlfield_vtime_to_attr_time_t(in_xmlfield, on_event, "start", error);
+ 		}
+ 		else if(!strcmp("DateEnd", fieldname)) {
+-			end_time = xmlfield_vtime_to_attr_time_t(in_xmlfield, on_event, "end");
++			end_time = xmlfield_vtime_to_attr_time_t(in_xmlfield, on_event, "end", error);
+ 		}
+ 		else if(!strcmp("Categories", fieldname)) {
+ 			xmlfield_categories_to_attr(in_xmlfield, on_event, "Categories");
+ 		}
+ 		else if(!strcmp("RecurrenceRule", fieldname)) {
+-			xmlfield_recur_to_attr(in_xmlfield, on_event);
++			xmlfield_recur_to_attr(in_xmlfield, on_event, error);
+ 		}
+ 		
+ 		in_xmlfield = osync_xmlfield_get_next(in_xmlfield);
+@@ -1148,7 +1154,7 @@ error:
+ /** Convert Opie XML note (which is internal to the plugin, see opie_comms.c) to OpenSync XML note
+  * 
+  **/
+-static osync_bool conv_opie_xml_note_to_xml_note(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_opie_xml_note_to_xml_note(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %i, %p, %p, %p, %p)", __func__, input, inpsize, output, outpsize, free_input, config, error);
+ 		
+@@ -1176,14 +1182,14 @@ static osync_bool conv_opie_xml_note_to_
+ 		char *value = xmlGetProp(icur, "name");
+ 		if(value) {
+ 			out_xmlfield = osync_xmlfield_new(out_xmlformat, "Summary", error);
+-			osync_xmlfield_set_key_value(out_xmlfield, "Content", value);
++			osync_xmlfield_set_key_value(out_xmlfield, "Content", value, error);
+ 			xmlFree(value);
+ 		}
+ 		// Body
+ 		value = xmlGetProp(icur, "content");
+ 		if(value) {
+ 			out_xmlfield = osync_xmlfield_new(out_xmlformat, "Body", error);
+-			osync_xmlfield_set_key_value(out_xmlfield, "Content", value);
++			osync_xmlfield_set_key_value(out_xmlfield, "Content", value, error);
+ 			xmlFree(value);
+ 		}
+ 	}
+@@ -1195,16 +1201,18 @@ static osync_bool conv_opie_xml_note_to_
+ 	xmlFreeDoc(idoc);
+ 
+ 	// FIXME: remove this later by adding in a pre-sorted way?
+-	osync_xmlformat_sort(out_xmlformat);
++	osync_xmlformat_sort(out_xmlformat, error);
+ 	
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(out_xmlformat, &str, &size);
++	osync_xmlformat_assemble(out_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Output XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
++	/* replacement?
+ 	if (!osync_xmlformat_validate(out_xmlformat, error))
+ 		goto error;
++	 */
+ 	
+ 	osync_trace(TRACE_EXIT, "%s", __func__);
+ 	return TRUE;
+@@ -1218,7 +1226,7 @@ error:
+ /** Convert OpenSync XML note to Opie XML note (which is internal to the plugin)
+  * 
+  **/
+-static osync_bool conv_xml_note_to_opie_xml_note(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, OSyncError **error)
++static osync_bool conv_xml_note_to_opie_xml_note(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %i, %p, %p, %p, %p)", 
+ 							__func__, input, inpsize, output, 
+@@ -1227,7 +1235,7 @@ static osync_bool conv_xml_note_to_opie_
+ 	OSyncXMLFormat *in_xmlformat = (OSyncXMLFormat *)input;
+ 	unsigned int size;
+ 	char *str;
+-	osync_xmlformat_assemble(in_xmlformat, &str, &size);
++	osync_xmlformat_assemble(in_xmlformat, &str, &size, error);
+ 	osync_trace(TRACE_INTERNAL, "Input XMLFormat is:\n%s", str);
+ 	g_free(str);
+ 
+@@ -1280,28 +1288,28 @@ osync_bool get_format_info(OSyncFormatEn
+ 	osync_objformat_set_destroy_func(format, destroy_format1);
+ 	osync_objformat_set_duplicate_func(format, duplicate_format1);
+ 	osync_objformat_set_print_func(format, print_format1);*/
+-	osync_format_env_register_objformat(env, format);
++	osync_format_env_register_objformat(env, format, error);
+ 	osync_objformat_unref(format);
+ 	
+ 	/* Todo */
+ 	format = osync_objformat_new(OPIE_FORMAT_XML_TODO, "todo", error);
+ 	if (!format)
+ 		return FALSE;
+-	osync_format_env_register_objformat(env, format);
++	osync_format_env_register_objformat(env, format, error);
+ 	osync_objformat_unref(format);
+ 
+ 	/* Event */
+ 	format = osync_objformat_new(OPIE_FORMAT_XML_EVENT, "event", error);
+ 	if (!format)
+ 		return FALSE;
+-	osync_format_env_register_objformat(env, format);
++	osync_format_env_register_objformat(env, format, error);
+ 	osync_objformat_unref(format);
+ 
+ 	/* Note */
+ 	format = osync_objformat_new(OPIE_FORMAT_XML_NOTE, "note", error);
+ 	if (!format)
+ 		return FALSE;
+-	osync_format_env_register_objformat(env, format);
++	osync_format_env_register_objformat(env, format, error);
+ 	osync_objformat_unref(format);
+ 
+ 	return TRUE;
+@@ -1330,14 +1338,14 @@ osync_bool register_converter(OSyncForma
+ 	if (!conv)
+ 		return FALSE;
+ 
+-	osync_format_env_register_converter(env, conv);
++	osync_format_env_register_converter(env, conv, error);
+ 	osync_converter_unref(conv);
+ 
+ 	conv = osync_converter_new(OSYNC_CONVERTER_CONV, format2, format1, conv_format2_to_format1, error);
+ 	if (!conv)
+ 		return FALSE;
+ 
+-	osync_format_env_register_converter(env, conv);
++	osync_format_env_register_converter(env, conv, error);
+ 	osync_converter_unref(conv);
+ 	return TRUE;
+ }
+@@ -1370,19 +1378,19 @@ void xmlfield_key_to_attr(OSyncXMLField
+ 		xmlSetProp(node_to, attrname, value);
+ }
+ 
+-time_t xmlfield_vtime_to_attr_time_t(OSyncXMLField *xmlfield, xmlNode *node_to, const char *attrname) {
++time_t xmlfield_vtime_to_attr_time_t(OSyncXMLField *xmlfield, xmlNode *node_to, const char *attrname, OSyncError **error) {
+ 	const char *vtime = osync_xmlfield_get_key_value(xmlfield, "Content");
+ 	time_t utime = 0;
+ 	if(vtime) {
+ 		const char *vtimetype = osync_xmlfield_get_attr(xmlfield, "Value");
+ 		if(vtimetype && !strcasecmp(vtimetype, "DATE")) {
+ 			/* vtime has date but no time, so we treat it as midnight local time */
+-			struct tm *localtm = osync_time_vtime2tm(vtime);
++			struct tm *localtm = osync_time_vtime2tm(vtime, error);
+ 			utime = mktime(localtm);
+ 			g_free(localtm);
+ 		}
+ 		else
+-			utime = osync_time_vtime2unix(vtime, 0);
++			utime = osync_time_vtime2unix(vtime, 0, error);
+ 				
+ 		char *timestr = g_strdup_printf("%d", (int)utime);
+ 		xmlSetProp(node_to, attrname, timestr);
+@@ -1403,7 +1411,7 @@ OSyncXMLField *xml_attrs_to_xmlfield_key
+ 			char *key = (char *)(keysptr->data);
+ 			if(!out_xmlfield)
+ 				out_xmlfield = osync_xmlfield_new(out_xmlformat, fieldname, error);
+-			osync_xmlfield_set_key_value(out_xmlfield, key, value);
++			osync_xmlfield_set_key_value(out_xmlfield, key, value, error);
+ 			xmlFree(value);
+ 		}
+ 		
+@@ -1453,10 +1461,10 @@ void xml_recur_attr_to_xmlfield(xmlNode
+ 		
+ 		/* Frequency */
+ 		if(!strcmp(recurType, "Daily")) {
+-			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "DAILY");
++			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "DAILY", error);
+ 		}
+ 		else if(!strcmp(recurType, "Weekly")) {
+-			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "WEEKLY");
++			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "WEEKLY", error);
+ 			
+ 			/* Weekdays */
+ 			char *weekdays = xmlGetProp(item_node, "rweekdays");
+@@ -1483,22 +1491,22 @@ void xml_recur_attr_to_xmlfield(xmlNode
+ 					/* Remove the trailing comma */
+ 					g_string_truncate(byday, strlen(byday->str) - 1);
+ 				
+-					osync_xmlfield_set_key_value(out_xmlfield, "ByDay", byday->str);
++					osync_xmlfield_set_key_value(out_xmlfield, "ByDay", byday->str, error);
+ 					g_string_free(byday, TRUE);
+ 				}
+ 				xmlFree(weekdays);
+ 			}
+ 		}
+ 		else if(!strcmp(recurType, "MonthlyDate")) {
+-			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "MONTHLY");
++			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "MONTHLY", error);
+ 			if(startdate) {
+ 				char *bymonthday = g_strdup_printf("%i", (int)g_date_get_day(startdate));
+-				osync_xmlfield_set_key_value(out_xmlfield, "ByMonthDay", bymonthday);
++				osync_xmlfield_set_key_value(out_xmlfield, "ByMonthDay", bymonthday, error);
+ 				g_free(bymonthday);
+ 			}
+ 		}
+ 		else if(!strcmp(recurType, "MonthlyDay")) {
+-			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "MONTHLY");
++			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "MONTHLY", error);
+ 			if(startdate) {
+ 				int weekno;
+ 				char *weeknostr = xmlGetProp(item_node, "rposition");
+@@ -1538,19 +1546,19 @@ void xml_recur_attr_to_xmlfield(xmlNode
+ 						break;
+ 				}
+ 				if(byday) {
+-					osync_xmlfield_set_key_value(out_xmlfield, "ByDay", byday);
++					osync_xmlfield_set_key_value(out_xmlfield, "ByDay", byday, error);
+ 					g_free(byday);
+ 				}
+ 			}
+ 		}
+ 		else if(!strcmp(recurType, "Yearly")) {
+-			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "YEARLY");
++			osync_xmlfield_set_key_value(out_xmlfield, "Frequency", "YEARLY", error);
+ 		}
+ 
+ 		/* Interval */
+ 		char *interval = xmlGetProp(item_node, "rfreq");
+ 		if(interval) {
+-			osync_xmlfield_set_key_value(out_xmlfield, "Interval", interval);
++			osync_xmlfield_set_key_value(out_xmlfield, "Interval", interval, error);
+ 			xmlFree(interval);
+ 		}
+ 		
+@@ -1560,8 +1568,8 @@ void xml_recur_attr_to_xmlfield(xmlNode
+ 			char *recurendstr = xmlGetProp(item_node, "enddt");
+ 			if(recurendstr) {
+ 				time_t recurendtime = (time_t)atoi(recurendstr);
+-				char *recurendvtime = osync_time_unix2vtime(&recurendtime); 
+-				osync_xmlfield_set_key_value(out_xmlfield, "Until", recurendvtime);
++				char *recurendvtime = osync_time_unix2vtime(&recurendtime, error); 
++				osync_xmlfield_set_key_value(out_xmlfield, "Until", recurendvtime, error);
+ 				g_free(recurendvtime);
+ 				xmlFree(recurendstr);
+ 			}
+@@ -1571,7 +1579,7 @@ void xml_recur_attr_to_xmlfield(xmlNode
+ 	}
+ }
+ 
+-void xmlfield_recur_to_attr(OSyncXMLField *in_xmlfield, xmlNode *node_to) {
++void xmlfield_recur_to_attr(OSyncXMLField *in_xmlfield, xmlNode *node_to, OSyncError **error) {
+ 	/* Recurrence for todos and events */
+ 	char *enddt = NULL;
+ 	char *weekdaysrule = NULL;
+@@ -1620,7 +1628,7 @@ void xmlfield_recur_to_attr(OSyncXMLFiel
+ 			rfreq = g_strdup(keyvalue);
+ 		}
+ 		else if (!strcasecmp(keyname, "UNTIL")) {
+-			time_t utime = osync_time_vtime2unix(keyvalue, 0);
++			time_t utime = osync_time_vtime2unix(keyvalue, 0, error);
+ 			enddt = g_strdup_printf("%d", (int)utime);
+ 		}
+ 	}
+@@ -1725,20 +1733,20 @@ void xml_todo_alarm_attr_to_xmlfield(con
+ 			g_strfreev(alarmargs);
+ 			
+ 			if(alarmsound == 1)
+-				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "AUDIO");
++				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "AUDIO", error);
+ 			else
+-				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "DISPLAY");
++				osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "DISPLAY", error);
+ 			
+ 			if(alarmdatestr) {
+-				struct tm *alarmtm = osync_time_vtime2tm(alarmdatestr);
++				struct tm *alarmtm = osync_time_vtime2tm(alarmdatestr, error);
+ 				time_t alarmtime = mktime(alarmtm);
+ 				g_free(alarmtm);
+-				char *alarmdatestr_utc = osync_time_unix2vtime(&alarmtime);
++				char *alarmdatestr_utc = osync_time_unix2vtime(&alarmtime, error);
+ 				
+ 				if(starttime) {
+ 					char *alarmdu = osync_time_sec2alarmdu((int)difftime(alarmtime, *starttime)); 
+ 					if(alarmdu) {
+-						osync_xmlfield_set_key_value(out_xmlfield, "AlarmTrigger", alarmdu);
++						osync_xmlfield_set_key_value(out_xmlfield, "AlarmTrigger", alarmdu, error);
+ 						g_free(alarmdu);
+ 					}
+ 				}
+@@ -1751,7 +1759,7 @@ void xml_todo_alarm_attr_to_xmlfield(con
+ 	}
+ }
+ 
+-void xmlformat_todo_alarms_to_attr(OSyncXMLFormat *in_xmlformat, xmlNode *node_to, const char *duedate) {
++void xmlformat_todo_alarms_to_attr(OSyncXMLFormat *in_xmlformat, xmlNode *node_to, const char *duedate, OSyncError **error) {
+ 	/* Convert OpenSync XML Alarm entries on a todo node to Opie Alarms attribute value */
+ 	
+ 	GString *alarms = g_string_new("");
+@@ -1768,7 +1776,7 @@ void xmlformat_todo_alarms_to_attr(OSync
+ 					
+ 				if(duedate) {
+ 					int alarmdiff = osync_time_alarmdu2sec(trigger);
+-					alarmtm = osync_time_vtime2tm(duedate);
++					alarmtm = osync_time_vtime2tm(duedate, error);
+ 					alarmtime = timegm(alarmtm);
+ 					alarmtime += alarmdiff;
+ 				}
+--- libopensync-plugin-opie-0.38/src/opie_sync.c.orig	2008-11-10 16:33:42.000000000 +0100
++++ libopensync-plugin-opie-0.38/src/opie_sync.c	2025-09-06 09:00:13.868506077 +0200
+@@ -25,7 +25,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE
+ #include <opensync/opensync-data.h>
+ #include <opensync/opensync-format.h>
+ #include <opensync/opensync-plugin.h>
+-#include <opensync/opensync-context.h>
+ #include <opensync/opensync-helper.h>
+ #include <opensync/opensync-version.h>
+ 
+@@ -249,11 +248,10 @@ error:
+ }
+ 
+ 
+-static void connect(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, userdata, info, ctx);
+-	OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-	OpieSinkEnv *env = osync_objtype_sink_get_userdata(sink);
++	OpieSinkEnv *env = (OpieSinkEnv*)userdata;
+ 
+ 	OSyncError *error = NULL;
+ 
+@@ -275,7 +275,7 @@ static void connect(OSyncObjTypeSink *si
+ 	g_mutex_unlock(env->plugin_env->plugin_mutex);
+ 	
+ 	/* pull the required data back */
+-	if(!opie_fetch_sink(env))
++	if(!opie_fetch_sink(env, ctx))
+ 	{
+ 		/* failed */
+ 		char *errmsg;
+@@ -289,23 +287,23 @@ static void connect(void *userdata, OSyn
+ 	}
+ 
+ 	/* Get hashtable */
+-	const char *configdir = osync_plugin_info_get_configdir(info);
+-	char *tablepath = g_strdup_printf("%s/hashtable.db", configdir);
+-	env->hashtable = osync_hashtable_new(tablepath, osync_objtype_sink_get_name(sink), &error);
+-	g_free(tablepath);
+-	if (!env->hashtable)
+-		goto error;
+-	if(!osync_hashtable_load(env->hashtable, &error))
+-		goto error;
++	osync_objtype_sink_enable_hashtable(sink, TRUE);
++
++	/* State database */
++	osync_objtype_sink_enable_state_db(sink, TRUE);
+ 
+ 	if(env->objtype == OPIE_OBJECT_TYPE_NOTE) {
+ 		/* Check if the notestype config option has changed since the last sync */
+-		char *anchorpath = g_strdup_printf("%s/anchor.db", osync_plugin_info_get_configdir(info));
++		OSyncSinkStateDB *state_db = osync_objtype_sink_get_state_db(sink);
+ 		char *notes_type_str = g_strdup_printf("%d", env->plugin_env->notes_type);
+-		if (!osync_anchor_compare(anchorpath, "notestype", notes_type_str))
+-			osync_objtype_sink_set_slowsync(sink, TRUE);
++		osync_bool notes_match;
++		if (!osync_sink_state_equal(state_db, "notestype", notes_type_str, &notes_match, &error)) {
++			g_free(notes_type_str);
++			goto error;
++		}
++		if (!notes_match)
++			osync_context_report_slowsync(ctx);
+ 		g_free(notes_type_str);
+-		g_free(anchorpath);
+ 	}
+ 	
+ 	osync_context_report_success(ctx);
+@@ -318,15 +316,14 @@ error:
+ 	osync_error_unref(&error);
+ }
+ 
+-static void get_changes(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, userdata, info, ctx);
+-	OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-	OpieSinkEnv *env = osync_objtype_sink_get_userdata(sink);
++	OpieSinkEnv *env = (OpieSinkEnv *)userdata;
+ 
+ 	OSyncError *error = NULL;
+ 
+-	if (osync_objtype_sink_get_slowsync(sink)) {
++	if (slow_sync) {
+ 		osync_trace(TRACE_INTERNAL, "Slow sync requested");
+ 
+ 		if (!osync_hashtable_slowsync(env->hashtable, &error)) {
+@@ -444,11 +441,10 @@ static void get_changes(void *userdata,
+ 	osync_trace(TRACE_EXIT, "%s", __func__);
+ }
+ 
+-static void commit_change(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change)
++static void commit_change(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, userdata, info, ctx);
+-	OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-	OpieSinkEnv *env = osync_objtype_sink_get_userdata(sink);
++	OpieSinkEnv *env = (OpieSinkEnv *)userdata;
+ 
+ 	OSyncError *error = NULL;
+ 	const char *ext_uid = osync_change_get_uid(change);
+@@ -549,11 +545,10 @@ error:
+ 	osync_error_unref(&error);
+ }
+ 
+-static void sync_done(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void sync_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, userdata, info, ctx);
+-	OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-	OpieSinkEnv *env = osync_objtype_sink_get_userdata(sink);
++	OpieSinkEnv *env = (OpieSinkEnv *)userdata;
+ 	OSyncError *error = NULL;
+ 	
+ 	if ( !opie_put_sink(env) ) {
+@@ -565,16 +560,16 @@ static void sync_done(void *userdata, OS
+ 	}
+ 	
+ 	if(env->objtype == OPIE_OBJECT_TYPE_NOTE) {
+-		char *anchorpath = g_strdup_printf("%s/anchor.db", osync_plugin_info_get_configdir(info));
++		OSyncSinkStateDB *state_db = osync_objtype_sink_get_state_db(sink);
+ 		char *notes_type_str = g_strdup_printf("%d", env->plugin_env->notes_type);
+- 		osync_anchor_update(anchorpath, "notestype", notes_type_str);
++		if (!osync_sink_state_set(state_db, "notestype", notes_type_str, &error))
++		{
++			g_free(notes_type_str);
++			goto error;
++		}
+ 		g_free(notes_type_str);
+-		g_free(anchorpath);
+ 	}
+ 	
+-	if (!osync_hashtable_save(env->hashtable, &error))
+-		goto error;
+-	
+ 	osync_context_report_success(ctx);
+ 	osync_trace(TRACE_EXIT, "%s", __func__);
+ 	return;
+@@ -585,15 +580,10 @@ error:
+ 	osync_error_unref(&error);
+ }
+ 
+-static void disconnect(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata)
+ {
+-	OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-	OpieSinkEnv *env = osync_objtype_sink_get_userdata(sink);
++	OpieSinkEnv *env = (OpieSinkEnv *)userdata;
+ 	
+-	/* Close the hashtable */
+-	osync_hashtable_unref(env->hashtable);
+-	env->hashtable = NULL;
+-
+ 	//Answer the call
+ 	osync_context_report_success(ctx);
+ }
+@@ -620,17 +610,13 @@ OpieSinkEnv *opie_sync_create_sink_env(O
+ 	sink_env->objformat = osync_format_env_find_objformat(formatenv, objformat);
+ 
+ 	/* Every sink can have different functions ... */
+-	OSyncObjTypeSinkFunctions functions;
+-	memset(&functions, 0, sizeof(functions));
+-	functions.connect = connect;
+-	functions.disconnect = disconnect;
+-	functions.get_changes = get_changes;
+-	functions.commit = commit_change;
+-	functions.sync_done = sync_done;
+-
+-	/* We pass the sink_env object to the sink, so we dont have to look it up
+-		* again once the functions are called */
+-	osync_objtype_sink_set_functions(sink, functions, sink_env);
++	osync_objtype_sink_set_userdata(sink, sink_env);
++	osync_objtype_sink_set_connect_func(sink, connect);
++	osync_objtype_sink_set_disconnect_func(sink, disconnect);
++	osync_objtype_sink_set_get_changes_func(sink, get_changes);
++	osync_objtype_sink_set_commit_func(sink, commit_change);
++	osync_objtype_sink_set_sync_done_func(sink, sync_done);
++
+ 	osync_plugin_info_add_objtype(info, sink);
+ 	
+ 	return sink_env;
+@@ -715,15 +701,15 @@ static void opie_sync_finalize( void* us
+ 	osync_trace(TRACE_EXIT, "%s", __func__);
+ }
+ 
+-static osync_bool opie_sync_discover(void *data, OSyncPluginInfo *info, OSyncError **error)
++static osync_bool opie_sync_discover(OSyncPluginInfo *info, void *data, OSyncError **error)
+ {
+ 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, error);
+ 	
+ 	OpiePluginEnv *env = (OpiePluginEnv *)data;
+ 	
+-	int i, numobjs = osync_plugin_info_num_objtypes(info);
+-	for (i = 0; i < numobjs; i++) {
+-		OSyncObjTypeSink *sink = osync_plugin_info_nth_objtype(info, i);
++	OSyncList *s, *sinks = osync_plugin_info_get_objtype_sinks(info);
++	for (s = sinks; s; s = s->next) {
++		OSyncObjTypeSink *sink = (OSyncObjTypeSink *) s->data;
+ 		g_assert(sink);
+ 
+ 		osync_objtype_sink_set_available(sink, TRUE);
+@@ -767,7 +753,7 @@ osync_bool get_sync_info(OSyncPluginEnv
+ 	osync_plugin_set_finalize(plugin, opie_sync_finalize);
+ 	osync_plugin_set_discover(plugin, opie_sync_discover);
+ 
+-	osync_plugin_env_register_plugin(env, plugin);
++	osync_plugin_env_register_plugin(env, plugin, error);
+ 	osync_plugin_unref(plugin);
+ 	
+ 	return TRUE;
+--- libopensync-plugin-opie-0.38/src/opie_comms.h.orig	2008-11-10 16:33:42.000000000 +0100
++++ libopensync-plugin-opie-0.38/src/opie_comms.h	2025-09-06 09:13:55.907386044 +0200
+@@ -39,8 +39,8 @@ void comms_shutdown();
+ 
+ 
+ /* connect to the device and pull down the data */
+-gboolean opie_fetch_sink(OpieSinkEnv *env);
+-gboolean opie_fetch_file(OpiePluginEnv *env, OPIE_OBJECT_TYPE objtype, const char *remotefile, xmlDoc **doc, OSyncObjTypeSink *sink);
++gboolean opie_fetch_sink(OpieSinkEnv *env, OSyncContext *ctx);
++gboolean opie_fetch_file(OpiePluginEnv *env, OPIE_OBJECT_TYPE objtype, const char *remotefile, xmlDoc **doc, OSyncContext *ctx);
+ 
+ /* connect to the device and push the files back */
+ gboolean opie_put_sink(OpieSinkEnv *env);
+--- libopensync-plugin-opie-0.38/src/opie_comms.c.orig	2008-11-10 16:33:42.000000000 +0100
++++ libopensync-plugin-opie-0.38/src/opie_comms.c	2025-09-06 09:15:32.646861961 +0200
+@@ -250,18 +250,18 @@ char *get_remote_notes_path(OpiePluginEn
+ /*
+  * opie_fetch_sink
+  */
+-gboolean opie_fetch_sink(OpieSinkEnv *env)
++gboolean opie_fetch_sink(OpieSinkEnv *env, OSyncContext *ctx)
+ {
+-	return opie_fetch_file(env->plugin_env, env->objtype, env->remotefile, &env->doc, env->sink);
++	return opie_fetch_file(env->plugin_env, env->objtype, env->remotefile, &env->doc, ctx);
+ }
+ 
+ 
+ /*
+  * opie_fetch_file
+  */
+-gboolean opie_fetch_file(OpiePluginEnv *env, OPIE_OBJECT_TYPE objtype, const char *remotefile, xmlDoc **doc, OSyncObjTypeSink *sink)
++gboolean opie_fetch_file(OpiePluginEnv *env, OPIE_OBJECT_TYPE objtype, const char *remotefile, xmlDoc **doc, OSyncContext *ctx)
+ {
+-	osync_trace(TRACE_ENTRY, "%s(%p, %i, %s, %p, %p)", __func__, env, objtype, remotefile, doc, sink);
++	osync_trace(TRACE_ENTRY, "%s(%p, %i, %s, %p, %p)", __func__, env, objtype, remotefile, doc, ctx);
+ 	
+ 	gboolean rc = TRUE;
+ 	
+@@ -338,8 +338,8 @@ gboolean opie_fetch_file(OpiePluginEnv *
+ 		{
+ 			if(!data) {
+ 				/* File didn't exist on the handheld (ie, clean device) */
+-				if(sink)
+-					osync_objtype_sink_set_slowsync(sink, TRUE);
++				if(ctx)
++					osync_context_report_slowsync(ctx);
+ 				*doc = opie_xml_create_doc(objtype);
+ 				if(*doc == 0)
+ 					rc = FALSE;
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/libopensync-plugin-opie.git/commitdiff/abdee3ba5a747765fb0cd0370d8a8c0104799139



More information about the pld-cvs-commit mailing list