[packages/libopensync-plugin-gpe] - up to 0.36, patched for libopensync 0.39

qboosh qboosh at pld-linux.org
Sun Sep 7 18:52:37 CEST 2025


commit 1db7d1cb34e33892eeb85c72074320dad1d846f8
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sun Sep 7 18:55:27 2025 +0200

    - up to 0.36, patched for libopensync 0.39

 libopensync-plugin-gpe-libopensync0.39.patch | 696 +++++++++++++++++++++++++++
 libopensync-plugin-gpe.spec                  |  37 +-
 2 files changed, 718 insertions(+), 15 deletions(-)
---
diff --git a/libopensync-plugin-gpe.spec b/libopensync-plugin-gpe.spec
index f995f30..a9690fa 100644
--- a/libopensync-plugin-gpe.spec
+++ b/libopensync-plugin-gpe.spec
@@ -1,17 +1,24 @@
 Summary:	GPE Plugin for OpenSync
 Summary(pl.UTF-8):	Wtyczka GPE do OpenSync
 Name:		libopensync-plugin-gpe
-Version:	0.22
+Version:	0.36
 Release:	1
 License:	LGPL v2.1+
 Group:		Libraries
-Source0:	http://www.opensync.org/attachment/wiki/download/%{name}-%{version}.tar.bz2?format=raw
-# Source0-md5:	791c8976b725c4c52e5dd38ddb38c769
-URL:		http://www.opensync.org/
+# dead domain
+#Source0:	http://www.opensync.org/attachment/wiki/download/%{name}-%{version}.tar.bz2?format=raw
+# restored from http://ftp.iij.ad.jp/pub/linux/momonga/5/Everything/SOURCES/libopensync-plugin-gpe-0.36.tar.bz2
+Source0:	%{name}-%{version}.tar.bz2
+# Source0-md5:	a0d6bc631beacaaf324b97daaa27042d
+Patch0:		%{name}-libopensync0.39.patch
+# dead
+#URL:		http://www.opensync.org/
+BuildRequires:	cmake
 BuildRequires:	glib2-devel >= 2.0
-BuildRequires:	libopensync-devel >= %{version}
-BuildRequires:	libxml2-devel >= 2.0
+BuildRequires:	libopensync-devel >= 1:0.39
 BuildRequires:	pkgconfig
+BuildRequires:	rpmbuild(macros) >= 1.605
+Requires:	libopensync >= 1:0.39
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
 %description
@@ -24,26 +31,26 @@ z PDA używającymi GPE <http://gpe.handhelds.org>.
 
 %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/*.la
-# no -devel yet
-rm -f $RPM_BUILD_ROOT%{_includedir}/opensync-1.0/opensync/gpe_sync.h
-
 %clean
 rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(644,root,root,755)
-%doc AUTHORS ChangeLog README
-%attr(755,root,root) %{_libdir}/opensync/plugins/gpe_sync.so
-%{_datadir}/opensync/defaults/gpe-sync
+%doc AUTHORS BUGS ChangeLog HOWTO README
+%attr(755,root,root) %{_libdir}/libopensync1/plugins/gpe-sync.so
+%{_datadir}/libopensync1/defaults/gpe-sync
diff --git a/libopensync-plugin-gpe-libopensync0.39.patch b/libopensync-plugin-gpe-libopensync0.39.patch
new file mode 100644
index 0000000..65d31fb
--- /dev/null
+++ b/libopensync-plugin-gpe-libopensync0.39.patch
@@ -0,0 +1,696 @@
+--- libopensync-plugin-gpe-0.36/CMakeLists.txt.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/CMakeLists.txt	2025-09-07 18:35:11.693546342 +0200
+@@ -8,7 +8,6 @@ SET( OPENSYNC_MIN_VERSION "0.36" )
+ 
+ FIND_PACKAGE( OpenSync REQUIRED )
+ FIND_PACKAGE( GLIB2 REQUIRED )
+-FIND_PACKAGE( LibXml2 REQUIRED )
+ 
+ INCLUDE( OpenSyncInternal )
+ 
+--- libopensync-plugin-gpe-0.36/src/CMakeLists.txt.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/CMakeLists.txt	2025-09-07 18:35:40.976721035 +0200
+@@ -1,5 +1,5 @@
+-LINK_DIRECTORIES( ${OPENSYNC_LIBRARY_DIRS} ${GLIB2_LIBRARY_DIRS} ${LIBXML2_LIBRARY_DIRS} )
+-INCLUDE_DIRECTORIES( ${OPENSYNC_INCLUDE_DIRS} ${GLIB2_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIRS} )
++LINK_DIRECTORIES( ${OPENSYNC_LIBRARY_DIRS} ${GLIB2_LIBRARY_DIRS} )
++INCLUDE_DIRECTORIES( ${OPENSYNC_INCLUDE_DIRS} ${GLIB2_INCLUDE_DIRS} )
+ 
+ 
+ SET( gpe_LIB_SRCS
+@@ -14,7 +14,7 @@ utils.c
+ 
+ OPENSYNC_PLUGIN_ADD( gpe-sync ${gpe_LIB_SRCS} )
+ 
+-TARGET_LINK_LIBRARIES( gpe-sync ${OPENSYNC_LIBRARIES} ${GLIB2_LIBRARIES} ${LIBXML2_LIBRARIES} )
++TARGET_LINK_LIBRARIES( gpe-sync ${OPENSYNC_LIBRARIES} ${GLIB2_LIBRARIES} )
+ 
+ ###### INSTALL ################### 
+ OPENSYNC_PLUGIN_INSTALL( gpe-sync ) 
+--- libopensync-plugin-gpe-0.36/cmake/modules/FindOpenSync.cmake.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/cmake/modules/FindOpenSync.cmake	2025-09-07 14:06:41.170824535 +0200
+@@ -13,7 +13,7 @@
+ #  For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+ #
+ 
+-# Take care about opensync-1.0.pc settings
++# Take care about libopensync.pc settings
+ INCLUDE( FindPkgConfig )
+ 
+ IF ( OpenSync_FIND_REQUIRED )
+@@ -23,15 +23,15 @@ ELSE( OpenSync_FIND_REQUIRED )
+ ENDIF ( OpenSync_FIND_REQUIRED )
+ 
+ IF ( OPENSYNC_MIN_VERSION )
+-	PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} opensync-1.0>=${OPENSYNC_MIN_VERSION} )
++	PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync>=${OPENSYNC_MIN_VERSION} )
+ ELSE ( OPENSYNC_MIN_VERSION )
+-	PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} opensync-1.0 )
++	PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync )
+ ENDIF ( OPENSYNC_MIN_VERSION )
+ 
+ FIND_PROGRAM( PKGCONFIG_EXECUTABLE NAMES pkg-config )
+ 
+ IF ( PKGCONFIG_EXECUTABLE )
+-	EXEC_PROGRAM( ${PKGCONFIG_EXECUTABLE} ARGS opensync-1.0 --variable=datadir OUTPUT_VARIABLE _opensync_data_DIR )
++	EXEC_PROGRAM( ${PKGCONFIG_EXECUTABLE} ARGS libopensync --variable=datadir OUTPUT_VARIABLE _opensync_data_DIR )
+ 	STRING( REGEX REPLACE "[\r\n]" " " _opensync_data_DIR "${_opensync_data_DIR}"  )
+ ENDIF ( PKGCONFIG_EXECUTABLE )
+ 
+@@ -47,7 +47,7 @@ ENDIF ( OPENSYNC_CMAKE_MODULES )
+ # Look for OpenSync include dir and libraries without pkg-config 
+ IF( NOT OPENSYNC_FOUND AND NOT PKG_CONFIG_FOUND )
+ 	# Fallback if pkg-config doesn't exist
+-	FIND_PATH( OPENSYNC_INCLUDE_DIRS opensync/opensync.h PATH_SUFFIXES opensync-1.0
++	FIND_PATH( OPENSYNC_INCLUDE_DIRS opensync/opensync.h PATH_SUFFIXES libopensync1
+ 			PATHS
+ 			/opt/local/include/
+ 			/sw/include/
+--- libopensync-plugin-gpe-0.36/src/gpe_sync.h.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/gpe_sync.h	2025-09-07 18:21:04.541469092 +0200
+@@ -32,20 +32,14 @@
+ #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>
+ 
+-// this is needed for gpe_xml.c:
+-#include <libxml/parser.h>
+-#include <libxml/xpath.h>
+-
+ #include "gpesync_client.h"
+ 
+ typedef struct sink_environment {
+         OSyncObjTypeSink *sink;
+ 	OSyncObjFormat *objformat;
+-        OSyncHashTable *hashtable;
+ 	char *format;
+   	struct gpe_environment *gpe_env;
+ } sink_environment;
+--- libopensync-plugin-gpe-0.36/src/gpe_xml.h.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/gpe_xml.h	2025-09-07 16:30:03.550888109 +0200
+@@ -21,6 +21,6 @@
+ #ifndef GPE_XML_H
+ #define GPE_XML_H
+ 
+-osync_bool gpe_parse_settings(gpe_environment *env, const char *data);
++osync_bool gpe_parse_settings(gpe_environment *env, OSyncPluginConfig *data);
+ 
+ #endif /* GPE_XML_H */
+--- libopensync-plugin-gpe-0.36/src/gpe_sync.c.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/gpe_sync.c	2025-09-07 16:41:20.053889844 +0200
+@@ -36,7 +36,7 @@ static void gpe_disconnect_internal(gpe_
+ 
+ 	osync_trace(TRACE_EXIT, "GPE-SYNC %s", __func__);
+ }
+-static void gpe_disconnect(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void gpe_disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p)", __func__, userdata, info, ctx);
+ 	gpe_environment *env = ((sink_environment *)userdata)->gpe_env;
+@@ -74,7 +74,7 @@ static void gpe_connect_internal(gpe_env
+ 
+ 	osync_trace(TRACE_EXIT, "GPE-SYNC %s", __func__);
+ }
+-static void gpe_connect(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void gpe_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata)
+ {
+ 	char *client_err = NULL;
+ 
+@@ -118,7 +118,7 @@ static void gpe_connect(void *userdata,
+  *
+  * \param ctx		The context of the plugin
+  */
+-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, "GPE-SYNC %s(%p, %p, %p)", __func__, userdata, info, ctx);
+ 	//gpe_environment *env = ((sink_environment *)userdata)->gpe_env;
+@@ -133,7 +133,6 @@ static void sync_done(void *userdata, OS
+ static void free_sink(sink_environment *sinkenv)
+ {
+   if (sinkenv->sink) osync_objtype_sink_unref(sinkenv->sink);
+-  if (sinkenv->hashtable) osync_hashtable_free(sinkenv->hashtable);
+ }
+ 
+ 
+@@ -169,7 +168,7 @@ static void finalize(void *data)
+  */
+ static void *initialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error)
+ {
+-	const char *configdata = NULL;
++	OSyncPluginConfig *configdata = NULL;
+ 
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p)", __func__, plugin, info, error);
+ 
+@@ -184,8 +183,6 @@ static void *initialize(OSyncPlugin *plu
+                 goto error_free_env;
+         }
+ 
+-	osync_trace(TRACE_INTERNAL, "GPE-SYNC configdata: %s", configdata);
+-	
+ 	if (!gpe_parse_settings(env, configdata)) {
+ 		osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION, "Unable to parse plugin configuration for gpe plugin");
+ 		goto error_free_env;
+@@ -197,12 +194,10 @@ static void *initialize(OSyncPlugin *plu
+ 	env->main_sink.sink = osync_objtype_main_sink_new(error);
+ 	if (!env->main_sink.sink) goto error_free_env;
+ 
+-	OSyncObjTypeSinkFunctions functions;
+-	memset(&functions, 0, sizeof(functions));
+-	functions.connect = gpe_connect;
+-	functions.disconnect = gpe_disconnect;
+-	functions.sync_done = sync_done;
+-	osync_objtype_sink_set_functions(env->main_sink.sink, functions, &env->main_sink);
++	osync_objtype_sink_set_userdata(env->main_sink.sink, &env->main_sink);
++	osync_objtype_sink_set_connect_func(env->main_sink.sink, gpe_connect);
++	osync_objtype_sink_set_disconnect_func(env->main_sink.sink, gpe_disconnect);
++	osync_objtype_sink_set_sync_done_func(env->main_sink.sink, sync_done);
+ 
+ 	osync_plugin_info_set_main_sink(info, env->main_sink.sink);
+ 	env->main_sink.gpe_env = env;
+@@ -231,7 +226,7 @@ error:
+ }
+ 
+ /* Here we actually tell opensync which sinks are available. */
+-static osync_bool discover(void *userdata, OSyncPluginInfo *info, OSyncError **error)
++static osync_bool discover(OSyncPluginInfo *info, void *userdata, OSyncError **error)
+ {
+ 	gchar *err_string = NULL;
+ 	gchar *response = NULL;
+@@ -340,7 +335,7 @@ osync_bool get_sync_info(OSyncPluginEnv
+ 	osync_plugin_set_finalize(plugin, finalize);
+ 	osync_plugin_set_discover(plugin, discover);
+ 
+-	osync_plugin_env_register_plugin(env, plugin);
++	osync_plugin_env_register_plugin(env, plugin, error);
+ 	osync_plugin_unref(plugin);
+ 
+ 	//If you like, you can overwrite the default timeouts of your plugin
+--- libopensync-plugin-gpe-0.36/src/calendar.c.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/calendar.c	2025-09-07 16:41:58.880346170 +0200
+@@ -27,12 +27,12 @@
+  * \param change	The change that has to be committed
+  *
+  */
+-void gpe_calendar_commit_change (void *userdata, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change)
++static void gpe_calendar_commit_change (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p, %p)", __func__, userdata, info, ctx, change);
+ 
+-	gpe_environment *env = (gpe_environment *)userdata;
+-	sink_environment *sinkenv = (sink_environment *)osync_objtype_sink_get_userdata(osync_plugin_info_get_sink(info));
++	sink_environment *sinkenv = (sink_environment *)userdata;
++	gpe_environment *env = sinkenv->gpe_env;
+ 	gchar *response = NULL;
+ 	char *result = NULL;
+ 	char *modified = NULL;
+@@ -81,8 +81,7 @@ void gpe_calendar_commit_change (void *u
+ 				osync_change_set_uid (change, g_strdup (buf));
+ 			}
+ 			osync_change_set_hash (change, modified);
+-			osync_hashtable_update_hash (sinkenv->hashtable, osync_change_get_changetype(change),
+-						     osync_change_get_uid(change), modified);
++			osync_hashtable_update_change (osync_objtype_sink_get_hashtable(sink), change);
+ 			osync_context_report_success(ctx);
+ 		}
+ 		else {
+@@ -108,16 +107,18 @@ void gpe_calendar_commit_change (void *u
+  * \param ctx		Context of the plugin
+  *
+  */
+-void gpe_calendar_get_changes(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void gpe_calendar_get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p)", __func__, userdata, info, ctx);
+ 
+-	gpe_environment *env = (gpe_environment *)userdata;
+-	sink_environment *sinkenv = (sink_environment *)osync_objtype_sink_get_userdata(osync_plugin_info_get_sink(info));
++	sink_environment *sinkenv = (sink_environment *)userdata;
++	gpe_environment *env = (gpe_environment *)sinkenv->gpe_env;
++	OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink);
++	OSyncError *error = NULL;
+ 
+-	if (osync_objtype_sink_get_slowsync(sinkenv->sink)) {
++	if (slow_sync) {
+ 		osync_trace(TRACE_INTERNAL, "Slow sync requested");
+-		osync_hashtable_reset(sinkenv->hashtable);
++		osync_hashtable_slowsync(hashtable, &error);
+ 	}
+ 
+ 	gchar *errmsg = NULL;
+@@ -206,24 +207,17 @@ osync_bool gpe_calendar_setup(sink_envir
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, functions, %p, %p, %p)", __func__, sinkenv, env, info, error);
+ 
+-	char *tablepath = g_strdup_printf("%s/hashtable.db", osync_plugin_info_get_configdir(info));
+-	// Note: caller responsible for freeing hashtable on any error
+-	sinkenv->hashtable = osync_hashtable_new(tablepath, "event", error);
+-	g_free(tablepath);
+-	if (!sinkenv->hashtable) goto error;
+-
+ 	// Note: caller responsible for freeing sink  on any error
+ 	sinkenv->sink = osync_objtype_sink_new("event", error);
+ 	if (!sinkenv->sink) goto error;
+ 
++	osync_objtype_sink_enable_hashtable(sinkenv->sink, TRUE);
++
+ 	sinkenv->format = "vevent20";
+-	osync_objtype_sink_add_objformat(sinkenv->sink, sinkenv->format);
+ 
+-	OSyncObjTypeSinkFunctions functions;
+-	memset(&functions, 0, sizeof(functions));
+-	functions.get_changes = gpe_calendar_get_changes;
+-	functions.commit = gpe_calendar_commit_change;
+-	osync_objtype_sink_set_functions(sinkenv->sink, functions, sinkenv);
++	osync_objtype_sink_set_userdata(sinkenv->sink, sinkenv);
++	osync_objtype_sink_set_get_changes_func(sinkenv->sink, gpe_calendar_get_changes);
++	osync_objtype_sink_set_commit_func(sinkenv->sink, gpe_calendar_commit_change);
+ 
+ 	osync_plugin_info_add_objtype(info, sinkenv->sink);
+ 
+--- libopensync-plugin-gpe-0.36/src/contacts.c.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/contacts.c	2025-09-07 16:53:35.329906512 +0200
+@@ -27,12 +27,12 @@
+  * \param change	The change that has to be committed
+  *
+  */
+-void gpe_contacts_commit_change (void *userdata, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change)
++static void gpe_contacts_commit_change (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p, %p)", __func__, userdata, info, ctx, change);
+ 
+-	gpe_environment *env = (gpe_environment *)userdata;
+-	sink_environment *sinkenv = (sink_environment *)osync_objtype_sink_get_userdata(osync_plugin_info_get_sink(info));
++	sink_environment *sinkenv = (sink_environment *)userdata;
++	gpe_environment *env = sinkenv->gpe_env;
+ 	gchar *response = NULL;
+ 	char *result = NULL;
+ 	char *modified = NULL;
+@@ -81,8 +81,7 @@ void gpe_contacts_commit_change (void *u
+ 				osync_change_set_uid (change, g_strdup (buf));
+ 			}
+ 			osync_change_set_hash (change, modified);
+-			osync_hashtable_update_hash (sinkenv->hashtable, osync_change_get_changetype(change),
+-						     osync_change_get_uid(change), modified);
++			osync_hashtable_update_change (osync_objtype_sink_get_hashtable(sink), change);
+ 			osync_context_report_success(ctx);
+ 		}
+ 		else {
+@@ -108,16 +107,18 @@ void gpe_contacts_commit_change (void *u
+  * \param ctx		Context of the plugin
+  *
+  */
+-void gpe_contacts_get_changes(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void gpe_contacts_get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p)", __func__, userdata, info, ctx);
+ 
+-	gpe_environment *env = (gpe_environment *)userdata;
+-	sink_environment *sinkenv = (sink_environment *)osync_objtype_sink_get_userdata(osync_plugin_info_get_sink(info));
++	sink_environment *sinkenv = (sink_environment *)userdata;
++	gpe_environment *env = sinkenv->gpe_env;
++	OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink);
++	OSyncError *error = NULL;
+ 
+-	if (osync_objtype_sink_get_slowsync(sinkenv->sink)) {
++	if (slow_sync) {
+ 		osync_trace(TRACE_INTERNAL, "Slow sync requested");
+-		osync_hashtable_reset(sinkenv->hashtable);
++		osync_hashtable_slowsync(hashtable, &error);
+ 	}
+ 
+ 	gchar *errmsg = NULL;
+@@ -205,24 +206,17 @@ osync_bool gpe_contacts_setup(sink_envir
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, functions, %p, %p, %p)", __func__, sinkenv, env, info, error);
+ 	
+-	char *tablepath = g_strdup_printf("%s/hashtable.db", osync_plugin_info_get_configdir(info));
+-	// Note: caller responsible for freeing hashtable on any error
+-	sinkenv->hashtable = osync_hashtable_new(tablepath, "contact", error);
+-	g_free(tablepath);
+-	if (!sinkenv->hashtable) goto error;
+-
+ 	// Note: caller responsible for freeing sink  on any error
+ 	sinkenv->sink = osync_objtype_sink_new("contact", error);
+ 	if (!sinkenv->sink) goto error;
+ 
++	osync_objtype_sink_enable_hashtable(sinkenv->sink, TRUE);
++
+ 	sinkenv->format = "vcard30";
+-	osync_objtype_sink_add_objformat(sinkenv->sink, sinkenv->format);
+ 
+-	OSyncObjTypeSinkFunctions functions;
+-	memset(&functions, 0, sizeof(functions));
+-	functions.get_changes = gpe_contacts_get_changes;
+-	functions.commit = gpe_contacts_commit_change;
+-	osync_objtype_sink_set_functions(sinkenv->sink, functions, sinkenv);
++	osync_objtype_sink_set_userdata(sinkenv->sink, sinkenv);
++	osync_objtype_sink_set_get_changes_func(sinkenv->sink, gpe_contacts_get_changes);
++	osync_objtype_sink_set_commit_func(sinkenv->sink, gpe_contacts_commit_change);
+ 
+ 	osync_plugin_info_add_objtype(info, sinkenv->sink);
+ 
+--- libopensync-plugin-gpe-0.36/src/todo.c.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/todo.c	2025-09-07 17:00:48.967557295 +0200
+@@ -27,12 +27,12 @@
+  * \param change	The change that has to be committed
+  *
+  */
+-void gpe_todo_commit_change (void *userdata, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change)
++static void gpe_todo_commit_change (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p, %p)", __func__, userdata, info, ctx, change);
+ 
+-	gpe_environment *env = (gpe_environment *)userdata;
+-	sink_environment *sinkenv = (sink_environment *)osync_objtype_sink_get_userdata(osync_plugin_info_get_sink(info));
++	sink_environment *sinkenv = (sink_environment *)userdata;
++	gpe_environment *env = sinkenv->gpe_env;
+ 	gchar *response = NULL;
+ 	char *result = NULL;
+ 	char *modified = NULL;
+@@ -81,8 +81,7 @@ void gpe_todo_commit_change (void *userd
+ 				osync_change_set_uid (change, g_strdup(buf));
+ 			}
+ 			osync_change_set_hash (change, modified);
+-			osync_hashtable_update_hash (sinkenv->hashtable, osync_change_get_changetype(change),
+-						     osync_change_get_uid(change), modified);
++			osync_hashtable_update_change (osync_objtype_sink_get_hashtable(sink), change);
+ 			osync_context_report_success(ctx);
+ 		}
+ 		else {
+@@ -109,16 +108,18 @@ void gpe_todo_commit_change (void *userd
+  * \param ctx		Context of the plugin
+  *
+  */
+-void gpe_todo_get_changes(void *userdata, OSyncPluginInfo *info, OSyncContext *ctx)
++static void gpe_todo_get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata)
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p)", __func__, userdata, info, ctx);
+ 
+-	gpe_environment *env = (gpe_environment *)userdata;
+-	sink_environment *sinkenv = (sink_environment *)osync_objtype_sink_get_userdata(osync_plugin_info_get_sink(info));
++	sink_environment *sinkenv = (sink_environment *)userdata;
++	gpe_environment *env = sinkenv->gpe_env;
++	OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink);
++	OSyncError *error = NULL;
+ 
+-	if (osync_objtype_sink_get_slowsync(sinkenv->sink)) {
++	if (slow_sync) {
+ 		osync_trace(TRACE_INTERNAL, "Slow sync requested");
+-		osync_hashtable_reset(sinkenv->hashtable);
++		osync_hashtable_slowsync(hashtable, &error);
+ 	}
+ 
+ 	gchar *errmsg = NULL;
+@@ -205,24 +206,17 @@ osync_bool gpe_todo_setup(sink_environme
+ {
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, functions, %p, %p, %p)", __func__, sinkenv, env, info, error);
+ 
+-	char *tablepath = g_strdup_printf("%s/hashtable.db", osync_plugin_info_get_configdir(info));
+-	// Note: caller responsible for freeing hashtable on any error
+-	sinkenv->hashtable = osync_hashtable_new(tablepath, "todo", error);
+-	g_free(tablepath);
+-	if (!sinkenv->hashtable) goto error;
+-
+ 	// Note: caller responsible for freeing sink  on any error
+ 	sinkenv->sink = osync_objtype_sink_new("todo", error);
+ 	if (!sinkenv->sink) goto error;
+ 
++	osync_objtype_sink_enable_hashtable(sinkenv->sink, TRUE);
++
+ 	sinkenv->format = "vtodo20";
+-	osync_objtype_sink_add_objformat(sinkenv->sink, sinkenv->format);
+ 
+-	OSyncObjTypeSinkFunctions functions;
+-	memset(&functions, 0, sizeof(functions));
+-	functions.get_changes = gpe_todo_get_changes;
+-	functions.commit = gpe_todo_commit_change;
+-	osync_objtype_sink_set_functions(sinkenv->sink, functions, sinkenv);
++	osync_objtype_sink_set_userdata(sinkenv->sink, sinkenv);
++	osync_objtype_sink_set_get_changes_func(sinkenv->sink, gpe_todo_get_changes);
++	osync_objtype_sink_set_commit_func(sinkenv->sink, gpe_todo_commit_change);
+ 
+ 	osync_plugin_info_add_objtype(info, sinkenv->sink);
+ 
+--- libopensync-plugin-gpe-0.36/src/gpe_xml.c.orig	2025-09-07 18:20:33.868301930 +0200
++++ libopensync-plugin-gpe-0.36/src/gpe_xml.c	2025-09-07 18:20:46.298234591 +0200
+@@ -22,13 +22,8 @@
+ #include "gpe_sync.h"
+ 
+ /*This just opens the config file and returns the settings in the env */
+-osync_bool gpe_parse_settings(gpe_environment *env, const char *data)
++osync_bool gpe_parse_settings(gpe_environment *env, OSyncPluginConfig *data)
+ {
+-	xmlDocPtr doc = NULL;
+-	xmlXPathContextPtr ctx = NULL;
+-	xmlXPathObjectPtr obj = NULL;
+-	///	xmlNodePtr cur;
+-
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p)", __func__, env, data);
+ 
+ 	// Set the defaults
+@@ -41,37 +36,51 @@ osync_bool gpe_parse_settings(gpe_enviro
+ 	env->use_remote = 0;
+ 	env->debuglevel = 0;
+ 	env->calendar = NULL;
+-	
+-	xmlInitParser();
+ 
+-	doc = xmlParseMemory(data, strlen(data)+1);
+-	
+-	if(!doc) {
+-	  osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: Could not parse data!", __func__);
+-	  return FALSE;
++	OSyncList *optslist = osync_plugin_config_get_advancedoptions(data);
++	for (; optslist; optslist = optslist->next) {
++		OSyncPluginAdvancedOption *option = optslist->data;
++		const char *name = osync_plugin_advancedoption_get_name(option);
++		const char *value = osync_plugin_advancedoption_get_value(option);
++		if (!strcmp(name, "local")) {
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <local> seen", __func__);
++			env->use_local = 1;
++		} else if(!strcmp(name, "ssh")) {
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <ssh> seen", __func__);
++			env->use_ssh = 1;
++		} else if(!strcmp(name, "remote")) {
++			env->use_remote = 1;
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <remote> seen", __func__);
++		} else if(!strcmp(name, "handheld_ip")) {
++			g_free(env->device_addr);
++			env->device_addr = g_strdup(value);
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <handheld_ip> = %s", __func__, env->device_addr);
++		} else if(!strcmp(name, "handheld_user")) {
++			g_free(env->username);
++			env->username = g_strdup(value);
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <handheld_user> = %s", __func__, env->username);
++		} else if(!strcmp(name, "command")) {
++			g_free(env->command);
++			env->command = g_strdup(value);
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <command> = %s", __func__, env->command);
++		} else if(!strcmp(name, "handheld_port")) {
++			env->device_port = atoi(value);
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <handheld_port> = %d", __func__, env->device_port);
++		} else if(!strcmp(name, "debug")) {
++			env->debuglevel = atoi(value);
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <debug> = %d", __func__, env->debuglevel);
++		} else if(!strcmp(name, "calendar")) {
++			env->calendar = g_strdup(value);
++			osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <calendar> = %s", __func__, env->calendar);
++		}
+ 	}
+ 
+-	ctx = xmlXPathNewContext(doc);
+-
+ 	/* Work out which type of connection to use */
+-	obj = xmlXPathEval("/config/local", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  env->use_local = 1;
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <local> seen", __func__);
+-	}
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("/config/ssh", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  if (env->use_local) {
++	if (env->use_ssh && env->use_local) {
+ 	    osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: <local> and <ssh> both found in config file", __func__);
+ 	    goto error;
+-	  }
+-	  env->use_ssh = 1;
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <ssh> seen", __func__);
+ 	}
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("/config/remote", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
++	if (env->use_remote) {
+ 	  if (env->use_local) {
+ 	    osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: <local> and <remote> both found in config file", __func__);
+ 	    goto error;
+@@ -80,93 +89,27 @@ osync_bool gpe_parse_settings(gpe_enviro
+ 	    osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: <ssh> and <remote> both found in config file", __func__);
+ 	    goto error;
+ 	  }
+-	  env->use_remote = 1;
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <remote> seen", __func__);
+ 	}
+ 	if (!(env->use_local || env->use_ssh || env->use_remote)) {
+ 	  osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: one of <local>, <remote>, <ssh> must be specified in config file", __func__);
+ 	  goto error;
+ 	}
+ 
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("//handheld_ip/text()", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  if (!(env->use_remote || env->use_ssh)) {
++	if (strcmp(env->device_addr, "127.0.0.1") && !(env->use_remote || env->use_ssh)) {
+ 	    osync_trace(TRACE_ERROR, "GPE-SYNC %s: <handheld_ip> should only be specified in <remote> or <ssh> sections", __func__);
+-	  }
+-	  g_free(env->device_addr);
+-	  xmlChar *str=xmlXPathCastToString(obj);
+-	  env->device_addr = g_strdup(str);
+-	  xmlFree(str);
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <handheld_ip> = %s", __func__, env->device_addr);
+ 	}
+-
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("//handheld_user/text()", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  if (!(env->use_ssh)) {
++	if (strcmp(env->username, "gpeuser") && !(env->use_ssh)) {
+ 	    osync_trace(TRACE_ERROR, "GPE-SYNC %s: <handheld_user> should only be specified in <ssh> section", __func__);
+-	  }
+-	  g_free(env->username);
+-	  xmlChar *str=xmlXPathCastToString(obj);
+-	  env->username = g_strdup(str);
+-	  xmlFree(str);
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <handheld_user> = %s", __func__, env->username);
+ 	}
+-
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("//command/text()", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  if (!(env->use_local || env->use_ssh)) {
++	if (strcmp(env->command, "gpesyncd --remote") && !(env->use_local || env->use_ssh)) {
+ 	    osync_trace(TRACE_ERROR, "GPE-SYNC %s: <command> should only be specified in <local> or <ssh> sections", __func__);
+-	  }
+-	  g_free(env->username);
+-	  xmlChar *str=xmlXPathCastToString(obj);
+-	  env->command = g_strdup(str);
+-	  xmlFree(str);
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <command> = %s", __func__, env->command);
+ 	}
+-
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("//handheld_port/text()", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  if (!(env->use_remote)) {
++	if ((env->device_port != 6446) && !(env->use_remote)) {
+ 	    osync_trace(TRACE_ERROR, "GPE-SYNC %s: <handheld_port> should only be specified in <remote> section", __func__);
+-	  }
+-	  xmlChar *str=xmlXPathCastToString(obj);
+-	  env->device_port = atoi(str);
+-	  xmlFree(str);
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <handheld_port> = %d", __func__, env->device_port);
+-	}
+-
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("//debug/text()", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  xmlChar *str=xmlXPathCastToString(obj);
+-	  env->debuglevel = atoi(str);
+-	  xmlFree(str);
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <debug> = %d", __func__, env->debuglevel);
+-	}
+-
+-	if (obj) xmlXPathFreeObject(obj);
+-	obj = xmlXPathEval("//calendar/text()", ctx);
+-	if (obj && obj->nodesetval && obj->nodesetval->nodeNr) {
+-	  xmlChar *str=xmlXPathCastToString(obj);
+-	  env->calendar = g_strdup(str);
+-	  xmlFree(str);
+-	  osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: <calendar> = %s", __func__, env->calendar);
+-	}
+-
+-	if (obj) xmlXPathFreeObject(obj);
+-	xmlXPathFreeContext(ctx);
+-	xmlFreeDoc(doc);
+-	xmlCleanupParser();
++	}
++
+ 	osync_trace(TRACE_EXIT, "GPE-SYNC %s", __func__);
+ 	return TRUE;
+  error:
+-	if (obj) xmlXPathFreeObject(obj);
+-	if (ctx) xmlXPathFreeContext(ctx);
+-	if (doc) xmlFreeDoc(doc);
+-	xmlCleanupParser();
+ 	return FALSE;
+ }
+--- libopensync-plugin-gpe-0.36/src/utils.c.orig	2008-01-26 18:02:58.000000000 +0100
++++ libopensync-plugin-gpe-0.36/src/utils.c	2025-09-07 18:26:51.629588755 +0200
+@@ -109,13 +109,13 @@ osync_bool report_change (sink_environme
+ 	osync_change_set_hash (change, hash);
+ 	osync_change_set_data (change, data);
+ 	
+-	OSyncChangeType changetype = osync_hashtable_get_changetype(sinkenv->hashtable, osync_change_get_uid(change), hash);
++	OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sinkenv->sink);
++	OSyncChangeType changetype = osync_hashtable_get_changetype(hashtable, change);
+ 	if (changetype != OSYNC_CHANGE_TYPE_UNMODIFIED) {
+ 	  osync_change_set_changetype(change, changetype);
+ 	  osync_context_report_change (ctx, change);
+-	  osync_hashtable_update_hash (sinkenv->hashtable, changetype, osync_change_get_uid(change), hash);
++	  osync_hashtable_update_change (hashtable, change);
+ 	}
+-	osync_hashtable_report(sinkenv->hashtable, osync_change_get_uid(change));
+ 
+ 	osync_change_unref(change);
+ 
+@@ -135,26 +135,24 @@ void report_deleted (sink_environment *s
+ 	osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p)", __func__, sinkenv, ctx);
+ 
+ 	OSyncError *error = NULL;
++	OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sinkenv->sink);
+ 
+ 	//check for deleted entries ... via hashtable
+-	int i;
+-	char **uids = osync_hashtable_get_deleted(sinkenv->hashtable);
+-	for (i=0; uids[i]; i++) {
++	OSyncList *u, *uids = osync_hashtable_get_deleted(hashtable);
++	for (u = uids; u; u = u->next) {
+ 	  OSyncChange *change = osync_change_new(&error);
+ 	  if (!change) {
+-	    g_free(uids[i]);
+ 	    osync_context_report_osyncwarning(ctx, error);
+ 	    osync_error_unref(&error);
+ 	    continue;
+ 	  }
+ 	  
+-	  osync_trace(TRACE_INTERNAL, "%s: deleting uid %s", __func__, uids[i]);
+-	  osync_change_set_uid(change, uids[i]);
++	  osync_trace(TRACE_INTERNAL, "%s: deleting uid %s", __func__, u->data);
++	  osync_change_set_uid(change, u->data);
+ 	  osync_change_set_changetype(change, OSYNC_CHANGE_TYPE_DELETED);
+  	
+ 	  OSyncData *odata = osync_data_new(NULL, 0, sinkenv->objformat, &error);
+ 	  if (!odata) {
+-	    g_free(uids[i]);
+ 	    osync_change_unref(change);
+ 	    osync_context_report_osyncwarning(ctx, error);
+ 	    osync_error_unref(&error);
+@@ -167,12 +165,11 @@ void report_deleted (sink_environment *s
+ 	  
+ 	  osync_context_report_change(ctx, change);
+ 	  
+-	  osync_hashtable_update_hash(sinkenv->hashtable, osync_change_get_changetype(change), osync_change_get_uid(change), NULL);
++	  osync_hashtable_update_change(hashtable, change);
+ 	  
+ 	  osync_change_unref(change);
+-	  g_free(uids[i]);
+ 	}
+-	g_free(uids);
++	osync_list_free(uids);
+ 
+ 	osync_trace(TRACE_EXIT, "GPE-SYNC %s", __func__);
+ }
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/libopensync-plugin-gpe.git/commitdiff/1db7d1cb34e33892eeb85c72074320dad1d846f8



More information about the pld-cvs-commit mailing list