[packages/libopensync-plugin-irmc] - up to 0.36, patched for libopensync 0.39 and openobex 1.6+

qboosh qboosh at pld-linux.org
Wed Sep 10 21:49:56 CEST 2025


commit b287d0fbb247d3e2df4cf57af6283bfbaef724ca
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Wed Sep 10 21:52:47 2025 +0200

    - up to 0.36, patched for libopensync 0.39 and openobex 1.6+

 libopensync-plugin-irmc-libopensync0.39.patch | 673 ++++++++++++++++++++++++++
 libopensync-plugin-irmc-openobex.patch        | 105 ++++
 libopensync-plugin-irmc.spec                  |  38 +-
 3 files changed, 800 insertions(+), 16 deletions(-)
---
diff --git a/libopensync-plugin-irmc.spec b/libopensync-plugin-irmc.spec
index ae6a447..574a9bf 100644
--- a/libopensync-plugin-irmc.spec
+++ b/libopensync-plugin-irmc.spec
@@ -1,22 +1,28 @@
 Summary:	OpenSync IRMC plugin
 Summary(pl.UTF-8):	Wtyczka IRMC do OpenSync
 Name:		libopensync-plugin-irmc
-Version:	0.22
-Release:	7
+Version:	0.36
+Release:	1
 License:	GPL v2
 Group:		Libraries
 # originally http://www.opensync.org/attachment/wiki/download/%{name}-%{version}.tar.bz2
+# restored from http://ftp.iij.ad.jp/pub/linux/momonga/5/Everything/SOURCES/libopensync-plugin-irmc-0.36.tar.bz2
 Source0:	%{name}-%{version}.tar.bz2
-# Source0-md5:	ecec872b2bccd824b1c5cbb2ec1d5399
+# Source0-md5:	21f9789fa41c2f06c547a17bc13c6081
+Patch0:		%{name}-libopensync0.39.patch
+Patch1:		%{name}-openobex.patch
 # dead domain
 #URL:		http://www.opensync.org/
 BuildRequires:	bluez-libs-devel
+BuildRequires:	cmake
 BuildRequires:	glib2-devel >= 2.0
-BuildRequires:	libopensync02-devel >= %{version}
+BuildRequires:	libopensync-devel >= 1:0.39
 BuildRequires:	libxml2-devel >= 2.0
-BuildRequires:	openobex-devel >= 1.0.0
+BuildRequires:	linux-irda-devel
+BuildRequires:	openobex-devel >= 1.6
 BuildRequires:	pkgconfig
-Requires:	libopensync02 >= %{version}
+BuildRequires:	rpmbuild(macros) >= 1.605
+Requires:	libopensync >= 1:0.39
 Obsoletes:	multisync-irmc < 0.90
 Obsoletes:	multisync-irmc-bluetooth < 0.90
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
@@ -41,27 +47,27 @@ Ten pakiet zawiera wtyczkę IRMC dla szkieletu OpenSync.
 
 %prep
 %setup -q
+%patch -P0 -p1
+%patch -P1 -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
-
 %clean
 rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(644,root,root,755)
-%doc AUTHORS ChangeLog NEWS README
-%attr(755,root,root) %{_libdir}/opensync/plugins/irmc_sync.so
-%{_datadir}/opensync/defaults/irmc-sync
-
-# devel
-#%{_includedir}/opensync-1.0/opensync/irmc_sync.h
+%doc AUTHORS README
+%attr(755,root,root) %{_libdir}/libopensync1/plugins/irmc-sync.so
+%{_datadir}/libopensync1/defaults/irmc-sync
diff --git a/libopensync-plugin-irmc-libopensync0.39.patch b/libopensync-plugin-irmc-libopensync0.39.patch
new file mode 100644
index 0000000..1845a5c
--- /dev/null
+++ b/libopensync-plugin-irmc-libopensync0.39.patch
@@ -0,0 +1,673 @@
+--- libopensync-plugin-irmc-0.36/cmake/modules/FindOpenSync.cmake.orig	2008-01-26 18:03:01.000000000 +0100
++++ libopensync-plugin-irmc-0.36/cmake/modules/FindOpenSync.cmake	2025-09-07 19:22:30.491500587 +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-irmc-0.36/CMakeLists.txt.orig	2008-01-26 18:03:01.000000000 +0100
++++ libopensync-plugin-irmc-0.36/CMakeLists.txt	2025-09-10 21:45:11.670913789 +0200
+@@ -10,7 +10,6 @@ SET( OPENSYNC_MIN_VERSION "0.36" )
+ 
+ FIND_PACKAGE( OpenSync REQUIRED )
+ FIND_PACKAGE( GLIB2 REQUIRED )
+-FIND_PACKAGE( LibXml2 REQUIRED )
+ FIND_PACKAGE( OpenObex REQUIRED )
+ FIND_PACKAGE( BlueZ )
+ 
+--- libopensync-plugin-irmc-0.36/src/CMakeLists.txt.orig	2008-01-26 18:03:01.000000000 +0100
++++ libopensync-plugin-irmc-0.36/src/CMakeLists.txt	2025-09-10 21:45:31.920804086 +0200
+@@ -1,7 +1,7 @@
+-LINK_DIRECTORIES( ${OPENOBEX_LIBRARY_DIRS} ${BLUEZ_LIBRARY_DIRS} ${OPENSYNC_LIBRARY_DIRS} ${GLIB2_LIBRARY_DIRS} ${LIBXML2_LIBRARY_DIRS} ) 
++LINK_DIRECTORIES( ${OPENOBEX_LIBRARY_DIRS} ${BLUEZ_LIBRARY_DIRS} ${OPENSYNC_LIBRARY_DIRS} ${GLIB2_LIBRARY_DIRS} ) 
+ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/bfb ${CMAKE_CURRENT_SOURCE_DIR} 
+ 		${OPENSYNC_INCLUDE_DIRS} ${OPENOBEX_INCLUDE_DIRS} ${BLUEZ_INCLUDE_DIRS} 
+-		${GLIB2_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIRS} )
++		${GLIB2_INCLUDE_DIRS} )
+ 
+ # irmc-sync source	
+ SET( irmc_sync_LIB_SRCS
+@@ -16,7 +16,7 @@ irmc_obex.c
+ 
+ OPENSYNC_PLUGIN_ADD( irmc-sync ${irmc_sync_LIB_SRCS} ) 
+ 
+-TARGET_LINK_LIBRARIES( irmc-sync ${OPENSYNC_LIBRARIES} ${OPENOBEX_LIBRARIES} ${BLUEZ_LIBRARIES} ${GLIB2_LIBRARIES} ${LIBXML2_LIBRARIES} )
++TARGET_LINK_LIBRARIES( irmc-sync ${OPENSYNC_LIBRARIES} ${OPENOBEX_LIBRARIES} ${BLUEZ_LIBRARIES} ${GLIB2_LIBRARIES} )
+ 
+ # Install plugin
+ OPENSYNC_PLUGIN_INSTALL( irmc-sync )
+--- libopensync-plugin-irmc-0.36/src/irmc_sync.h.orig	2025-09-08 18:56:14.658635305 +0200
++++ libopensync-plugin-irmc-0.36/src/irmc_sync.h	2025-09-09 21:56:35.938609091 +0200
+@@ -58,7 +58,7 @@ typedef struct  {
+ } irmc_config;
+ 
+ typedef struct irmc_environment {
+-  char *anchor_path;             // The path of the irmc anchor
++  OSyncSinkStateDB *state_db;
+   irmc_config config;            // The configuration
+   GList *databases;		 // List of irmc_datase
+   osync_bool isConnected;
+@@ -67,6 +67,7 @@ typedef struct irmc_environment {
+ typedef struct irmc_database {
+   OSyncObjFormat *objformat;     // The configured objformat for this database
+   OSyncObjTypeSink *sink;
++  irmc_environment *env;
+   unsigned int changecounter;   
+   char *dbid;
+   char *obex_db;
+--- libopensync-plugin-irmc-0.36/src/irmc_sync.c.orig	2025-09-08 21:10:47.878232254 +0200
++++ libopensync-plugin-irmc-0.36/src/irmc_sync.c	2025-09-10 21:41:37.938738342 +0200
+@@ -24,7 +24,6 @@
+ #include <opensync/opensync.h>
+ #include <opensync/opensync-format.h>
+ #include <opensync/opensync-plugin.h>
+-#include <opensync/opensync-context.h>
+ #include <opensync/opensync-data.h>
+ #include <opensync/opensync-helper.h>
+ #include <opensync/opensync-group.h>
+@@ -32,9 +31,6 @@
+ 
+ #include <assert.h>
+ 
+-#include <libxml/xmlmemory.h>
+-#include <libxml/parser.h>
+-
+ #include "irmc_sync.h"
+ 
+ #define SYNC_OBJECT_TYPE_CALENDAR 0
+@@ -147,84 +143,51 @@ void irmc_disconnect(irmc_config *config
+ /**
+  * Parses the configuration of this plugin from a string in xml format.
+  */
+-osync_bool parse_settings(irmc_config *config, const char *data, unsigned int size, OSyncError **error)
++osync_bool parse_settings(irmc_config *config, OSyncPluginConfig *data, OSyncError **error)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, config, data, error);
+   osync_trace(TRACE_SENSITIVE, "Content of data:\n%s", data);
+ 
+-  xmlDoc *doc = NULL;
+-  xmlNode *cur = NULL;
+-
+   // set defaults
+   config->donttellsync = FALSE;
+   config->serial_number = NULL;
+ 
+-
+-  doc = xmlParseMemory(data, size);
+-
+-  if (!doc) {
+-    osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to parse settings");
+-    goto error;
+-  }
+-
+-  cur = (xmlNode *) xmlDocGetRootElement(doc);
+-
+-  if (!cur) {
+-    osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get root element of the settings");
+-    goto error_free_doc;
+-  }
+-
+-  if (xmlStrcmp(cur->name, (const xmlChar*) "config")) {
+-    osync_error_set(error, OSYNC_ERROR_GENERIC, "Config valid is not valid");
+-    goto error_free_doc;
+-  }
+-
+-  cur = cur->xmlChildrenNode;
+-
+-  while (cur != NULL) {
+-    char *str = (char *) xmlNodeGetContent(cur);
+-    if (str) {
+-      if (!xmlStrcmp(cur->name, (const xmlChar *)"connectmedium")) {
+-        if (!strcmp(str, "bluetooth"))
+-          config->connectmedium = MEDIUM_BLUETOOTH;
+-        else if (!strcmp(str, "ir"))
+-          config->connectmedium = MEDIUM_IR;
+-        else if (!strcmp(str, "cable"))
+-          config->connectmedium = MEDIUM_CABLE;
++  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, "connectmedium")) {
++      if (!strcmp(value, "bluetooth"))
++        config->connectmedium = MEDIUM_BLUETOOTH;
++      else if (!strcmp(value, "ir"))
++        config->connectmedium = MEDIUM_IR;
++      else if (!strcmp(value, "cable"))
++        config->connectmedium = MEDIUM_CABLE;
+ #ifdef HAVE_BLUETOOTH
+-      } else if (!xmlStrcmp(cur->name, (const xmlChar *)"btunit")) {
+-        baswap(&(config->bdaddr), strtoba(str));
+-      } else if (!xmlStrcmp(cur->name, (const xmlChar *)"btchannel")) {
+-        config->btchannel = atoi(str);
++    } else if (!strcmp(name, "btunit")) {
++      baswap(&(config->bdaddr), strtoba(value));
++    } else if (!strcmp(name, "btchannel")) {
++      config->btchannel = atoi(value);
+ #endif
+-      } else if (!xmlStrcmp(cur->name, (const xmlChar *)"irname")) {
+-        strncpy(config->irunit.name, str, 31);
+-      } else if (!xmlStrcmp(cur->name, (const xmlChar *)"irserial")) {
+-        strncpy(config->irunit.serial, str, 127);
+-      } else if (!xmlStrcmp(cur->name, (const xmlChar *)"cabledev")) {
+-        strncpy(config->cabledev, str, 19);
+-      } else if (!xmlStrcmp(cur->name, (const xmlChar *)"cabletype")) {
+-        config->cabletype = atoi(str);
+-      } else if (!xmlStrcmp(cur->name, (const xmlChar *)"donttellsync")) {
+-        if (!strcmp(str, "true"))
+-          config->donttellsync = TRUE;
+-        else
+-          config->donttellsync = FALSE;
+-      }
+-      xmlFree(str);
++    } else if (!strcmp(name, "irname")) {
++      strncpy(config->irunit.name, value, 31);
++    } else if (!strcmp(name, "irserial")) {
++      strncpy(config->irunit.serial, value, 127);
++    } else if (!strcmp(name, "cabledev")) {
++      strncpy(config->cabledev, value, 19);
++    } else if (!strcmp(name, "cabletype")) {
++      config->cabletype = atoi(value);
++    } else if (!strcmp(name, "donttellsync")) {
++      if (!strcmp(value, "true"))
++        config->donttellsync = TRUE;
++      else
++        config->donttellsync = FALSE;
+     }
+-    cur = cur->next;
+   }
+ 
+-  xmlFreeDoc(doc);
+   osync_trace(TRACE_EXIT, "%s", __func__);
+   return TRUE;
+-
+-error_free_doc:
+-    xmlFreeDoc(doc);
+-error:
+-  osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error));
+-  return FALSE;
+ }
+ 
+ /**
+@@ -235,8 +198,9 @@ void load_sync_anchors( irmc_environment
+   osync_trace(TRACE_ENTRY, "%s(%p)", __func__, env);
+ 
+   irmc_config *config = &(env->config);
++  OSyncError *error = NULL;
+ 
+-  char *anchor = osync_anchor_retrieve(env->anchor_path, "general");
++  char *anchor = osync_sink_state_get(env->state_db, "general", &error);
+   if (!anchor) {
+     config->serial_number = NULL;
+   } else {
+@@ -258,21 +222,21 @@ void save_sync_anchors( const irmc_envir
+   osync_trace(TRACE_ENTRY, "%s(%p)", __func__, env);
+ 
+   const irmc_config *config = &(env->config);
+-   
+-  osync_anchor_update( env->anchor_path, "general", config->serial_number );
++  OSyncError *error = NULL;
++
++  osync_sink_state_set(env->state_db, "general", config->serial_number, &error);
+   osync_trace(TRACE_EXIT, "%s", __func__);
+ }
+ 
+ /**
+  * Creates the calendar specific changeinfo for slow- and fastsync
+  */
+-void create_calendar_changeinfo(int sync_type, OSyncObjTypeSink *sink, OSyncContext *ctx, char *data, char *luid, int type)
++void create_calendar_changeinfo(int sync_type, irmc_database *database, OSyncContext *ctx, char *data, char *luid, int type)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%i, %p, %p, %s, %i)", __func__, sync_type, ctx, data, luid, type);
+   osync_trace(TRACE_SENSITIVE, "Content of data:\n%s", data);
+ 
+   OSyncError *error = NULL;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
+   
+   if (sync_type == SLOW_SYNC) {
+     char *event_start = data, *todo_start;
+@@ -373,13 +337,11 @@ void create_calendar_changeinfo(int sync
+ /**
+  * Creates the addressbook specific changeinfo for slow- and fastsync
+  */
+-void create_addressbook_changeinfo(int sync_type, OSyncObjTypeSink *sink, OSyncContext *ctx, char *data, char *luid, int type)
++void create_addressbook_changeinfo(int sync_type, irmc_database *database, OSyncContext *ctx, char *data, char *luid, int type)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%i, %p, %p, %s, %i)", __func__, sync_type, ctx, data, luid, type);			
+   osync_trace(TRACE_SENSITIVE, "Content of data:\n%s", data);
+ 
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
+-
+   OSyncError *error = NULL;
+   int vcard_size = 0;
+ 
+@@ -453,13 +415,11 @@ void create_addressbook_changeinfo(int s
+ /**
+  * Creates the notebook specific changeinfo for slow- and fastsync
+  */
+-void create_notebook_changeinfo(int sync_type, OSyncObjTypeSink *sink, OSyncContext *ctx, char *data, char *luid, int type)
++void create_notebook_changeinfo(int sync_type, irmc_database *database, OSyncContext *ctx, char *data, char *luid, int type)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%i, %p, %p, %s, %i)", __func__, sync_type, ctx, data, luid, type);			
+   osync_trace(TRACE_SENSITIVE, "Content of data:\n%s", data);
+ 
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
+-  
+   OSyncError *error = NULL;
+ 
+   if (sync_type == SLOW_SYNC) {
+@@ -543,12 +503,10 @@ void create_notebook_changeinfo(int sync
+  *   - create_addressbook_changeinfo()
+  *   - create_notebook_changeinfo()
+  */
+-gboolean get_generic_changeinfo(irmc_environment *env, OSyncPluginInfo *oinfo, OSyncContext *ctx, data_type_information *info, OSyncError **error)
++gboolean get_generic_changeinfo(irmc_environment *env, irmc_database *database, OSyncContext *ctx, data_type_information *info, osync_bool slow_sync, OSyncError **error)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p, %p)", __func__, env, info, ctx, info, error);
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(oinfo);
+-
+   char *buffer;
+   char *buffer_pos;
+   int buffer_length;
+@@ -567,7 +525,7 @@ gboolean get_generic_changeinfo(irmc_env
+   memset(buffer, 0, DATABUFSIZE);
+ 
+   // check whether we have to do a slowsync
+-  if (osync_objtype_sink_get_slowsync(sink) == TRUE) {
++  if (slow_sync) {
+     osync_trace(TRACE_INTERNAL, "slowsync %s\n", info->name );
+     buffer_length = DATABUFSIZE;
+     if (config->donttellsync) {
+@@ -634,11 +592,11 @@ gboolean get_generic_changeinfo(irmc_env
+ 
+     // handle object specific part
+     if ( strcmp( info->identifier, "event" ) == 0 )
+-      create_calendar_changeinfo( SLOW_SYNC, sink, ctx, buffer, 0, 0 );
++      create_calendar_changeinfo( SLOW_SYNC, database, ctx, buffer, 0, 0 );
+     else if ( strcmp( info->identifier, "contact" ) == 0 )
+-      create_addressbook_changeinfo( SLOW_SYNC, sink, ctx, buffer, 0, 0 );
++      create_addressbook_changeinfo( SLOW_SYNC, database, ctx, buffer, 0, 0 );
+     else if ( strcmp( info->identifier, "note" ) == 0 )
+-     create_notebook_changeinfo( SLOW_SYNC, sink, ctx, buffer, 0, 0 );
++     create_notebook_changeinfo( SLOW_SYNC, database, ctx, buffer, 0, 0 );
+ 
+   } else {
+     osync_trace(TRACE_INTERNAL, "fastsync %s\n", info->name );
+@@ -721,11 +679,11 @@ gboolean get_generic_changeinfo(irmc_env
+ 
+         // handle object specific part
+         if ( strcmp( info->identifier, "event" ) == 0 )
+-          create_calendar_changeinfo(FAST_SYNC, sink, ctx, data, luid, type);
++          create_calendar_changeinfo(FAST_SYNC, database, ctx, data, luid, type);
+         else if ( strcmp( info->identifier, "contact" ) == 0 )
+-          create_addressbook_changeinfo(FAST_SYNC, sink, ctx, data, luid, type);
++          create_addressbook_changeinfo(FAST_SYNC, database, ctx, data, luid, type);
+         else if ( strcmp( info->identifier, "note" ) == 0 )
+-          create_notebook_changeinfo(FAST_SYNC, sink, ctx, data, luid, type);
++          create_notebook_changeinfo(FAST_SYNC, database, ctx, data, luid, type);
+       }
+ 
+       buffer_pos = strstr(buffer_pos, "\r\n");
+@@ -852,18 +810,18 @@ gboolean detect_slowsync(int changecount
+ }
+ 
+ /* Establish connection to the device */
+-static void irmcConnect(void *data, OSyncPluginInfo *info, OSyncContext *ctx)
++static void irmcConnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p)", __func__, ctx);			
+ 
+-  irmc_environment *env = (irmc_environment *)data;
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+   irmc_config *config = &(env->config);
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  OSyncError *error = NULL;
+ 
+   const char *objtype = osync_objtype_sink_get_name(sink);
+ 
+-  char *anchor = osync_anchor_retrieve(env->anchor_path, objtype);
++  char *anchor = osync_sink_state_get(env->state_db, objtype, &error);
+   if (!anchor) {
+     database->changecounter = 0;
+     database->dbid = NULL;
+@@ -876,7 +834,6 @@ static void irmcConnect(void *data, OSyn
+   }
+   g_free( anchor );
+ 
+-  OSyncError *error = NULL;
+   if (! env->isConnected) {
+ 
+ 	  config->obexhandle = irmc_obex_client(config);
+@@ -905,7 +862,7 @@ static void irmcConnect(void *data, OSyn
+ 
+   if (slowsync == TRUE) {
+ 	  osync_trace(TRACE_INTERNAL, "Have to do a slowsync for objtype %s", objtype);
+-	  osync_objtype_sink_set_slowsync(sink, TRUE);
++	  osync_context_report_slowsync(ctx);
+   } else {
+     osync_trace(TRACE_INTERNAL, "No slowsync required");
+   }   
+@@ -916,11 +873,12 @@ static void irmcConnect(void *data, OSyn
+ /**
+  * This method is called to disconnect from the device.
+  */
+-static void irmcDisconnect(void *data, OSyncPluginInfo *info, OSyncContext *ctx)
++static void irmcDisconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx);
+ 
+-  irmc_environment *env = (irmc_environment *)data;
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   // TODO: handle disconnect of several sink engines..
+   // disconnect from the device
+@@ -936,20 +894,19 @@ static void irmcDisconnect(void *data, O
+ /**
+  * This method is called when the sync was successfull.
+  */
+-static void irmcSyncDone(void *data, OSyncPluginInfo *info, OSyncContext *ctx)
++static void irmcSyncDone(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx);			
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-
+-  irmc_environment *env = (irmc_environment *)data;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   const char *objtype = osync_objtype_sink_get_name(sink);
++  OSyncError *error = NULL;
+ 
+   if (database->changecounter >= 0 && strcmp(database->dbid, "FFFFFF")) {
+     char *anchor = g_strdup_printf("%d:%s", database->changecounter, database->dbid);
+-    osync_anchor_update( env->anchor_path, objtype, anchor );
++    osync_sink_state_set( env->state_db, objtype, anchor, &error);
+     g_free(anchor);
+   } else {
+     osync_trace(TRACE_INTERNAL, "ERROR: Invalid values for event anchor detected.");
+@@ -964,14 +921,13 @@ static void irmcSyncDone(void *data, OSy
+  *
+  * This method calls get_generic_changeinfo() for objtype event
+  */
+-static void irmcCalendarGetChangeinfo(void *data, OSyncPluginInfo *info, OSyncContext *ctx)
++static void irmcCalendarGetChangeinfo(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%p, %p, %p)", __func__, data, info, ctx);
+   OSyncError *error = 0;
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-  irmc_environment *env = (irmc_environment *)data;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   data_type_information datainfo;
+ 
+@@ -983,7 +939,7 @@ static void irmcCalendarGetChangeinfo(vo
+   datainfo.change_counter = &(database->changecounter);
+ 
+ 
+-  if (!get_generic_changeinfo(env, info, ctx, &datainfo, &error))
++  if (!get_generic_changeinfo(env, database, ctx, &datainfo, slow_sync, &error))
+     goto error;
+ 
+   osync_context_report_success(ctx);
+@@ -1000,14 +956,13 @@ error:
+  *
+  * This method calls get_generic_changeinfo() for objtype contact 
+  */
+-static void irmcContactGetChangeinfo(void *data, OSyncPluginInfo *info, OSyncContext *ctx)
++static void irmcContactGetChangeinfo(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p,%p,%p)", __func__, data, info, ctx);
+   OSyncError *error = 0;
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-  irmc_environment *env = (irmc_environment *)data;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   data_type_information datainfo;
+ 
+@@ -1018,7 +973,7 @@ static void irmcContactGetChangeinfo(voi
+   strcpy(datainfo.path_extension, "vcf");
+   datainfo.change_counter = &(database->changecounter);
+ 
+-  if (!get_generic_changeinfo(env, info, ctx, &datainfo, &error))
++  if (!get_generic_changeinfo(env, database, ctx, &datainfo, slow_sync, &error))
+     goto error;
+ 
+   osync_context_report_success(ctx);
+@@ -1035,14 +990,13 @@ error:
+  *
+  * This method calls get_generic_changeinfo() for objtype note 
+  */
+-static void irmcNoteGetChangeinfo(void *data, OSyncPluginInfo *info, OSyncContext *ctx)
++static void irmcNoteGetChangeinfo(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%p, %p, %p)", __func__, data, info, ctx);
+   OSyncError *error = 0;
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-  irmc_environment *env = (irmc_environment *)data;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   data_type_information datainfo;
+ 
+@@ -1053,7 +1007,7 @@ static void irmcNoteGetChangeinfo(void *
+   strcpy(datainfo.path_extension, "vnt");
+   datainfo.change_counter = &(database->changecounter);
+ 
+-  if (!get_generic_changeinfo(env, info, ctx, &datainfo, &error))
++  if (!get_generic_changeinfo(env, database, ctx, &datainfo, slow_sync, &error))
+     goto error;
+ 
+   osync_context_report_success(ctx);
+@@ -1203,14 +1157,13 @@ osync_bool irmcGenericCommitChange(irmc_
+ /**
+  * Commits the calendar specific changeinfo to the device.
+  */
+-static void irmcCalendarCommitChange(void *data, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change)
++static void irmcCalendarCommitChange(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, data, info, ctx, change);
+   data_type_information datainfo;
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-  irmc_environment *env = (irmc_environment *)data;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   memset(&datainfo, 0, sizeof(datainfo));
+   strcpy(datainfo.name, "calendar");
+@@ -1226,14 +1179,13 @@ static void irmcCalendarCommitChange(voi
+ /**
+  * Commits the addressbook specific changeinfo to the device.
+  */
+-static void irmcContactCommitChange(void *data, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change)
++static void irmcContactCommitChange(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, ctx, change);			
+   data_type_information datainfo;
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-  irmc_environment *env = (irmc_environment *)data;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   memset(&datainfo, 0, sizeof(datainfo));
+   strcpy(datainfo.name, "addressbook");
+@@ -1249,14 +1201,13 @@ static void irmcContactCommitChange(void
+ /**
+  * Commits the notebook specific changeinfo to the device.
+  */
+-static void irmcNoteCommitChange(void *data, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change)
++static void irmcNoteCommitChange(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, data, info, ctx, change);			
+   data_type_information datainfo;
+ 
+-  OSyncObjTypeSink *sink = osync_plugin_info_get_sink(info);
+-  irmc_environment *env = (irmc_environment *)data;
+-  irmc_database *database = osync_objtype_sink_get_userdata(sink);
++  irmc_database *database = (irmc_database *)data;
++  irmc_environment *env = database->env;
+ 
+   memset(&datainfo, 0, sizeof(datainfo));
+   strcpy(datainfo.name, "notebook");
+@@ -1278,8 +1229,6 @@ static void irmcFinalize(void *data)
+ 
+   irmc_environment *env = (irmc_environment *)data;
+ 
+-  g_free(env->anchor_path);
+-
+   while (env->databases) {
+     irmc_database *db = env->databases->data;
+     g_free(db);
+@@ -1294,7 +1243,7 @@ static void irmcFinalize(void *data)
+ /**
+  * Discover the capabilities of the IrMC mobile.
+  */
+-static osync_bool irmcDiscover(void *data, OSyncPluginInfo *info, OSyncError **error)
++static osync_bool irmcDiscover(OSyncPluginInfo *info, void *data, OSyncError **error)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, error);
+ 
+@@ -1319,7 +1268,7 @@ static osync_bool irmcDiscover(void *dat
+   return TRUE;
+ }
+ 
+-static irmc_database *create_database(OSyncPluginInfo *info, const char *objtype, const char *format, char *obex_db, OSyncSinkGetChangesFn getchanges, OSyncSinkCommitFn commit, OSyncError **error)
++static irmc_database *create_database(OSyncPluginInfo *info, irmc_environment *env, const char *objtype, const char *format, char *obex_db, OSyncSinkGetChangesFn getchanges, OSyncSinkCommitFn commit, OSyncError **error)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %s, %s, %p)", __func__, info, objtype, format, error);	
+ 
+@@ -1333,15 +1282,13 @@ static irmc_database *create_database(OS
+   if (!database->sink)
+     goto error_free_db;
+ 
+-  OSyncObjTypeSinkFunctions functions;
+-  memset(&functions, 0, sizeof(functions));
+-  functions.connect = irmcConnect;
+-  functions.disconnect = irmcDisconnect;
+-  functions.sync_done = irmcSyncDone;
+-  functions.get_changes = getchanges;
+-  functions.commit = commit;
+-
+-  osync_objtype_sink_set_functions(database->sink, functions, database);
++  database->env = env;
++  osync_objtype_sink_set_userdata(database->sink, database);
++  osync_objtype_sink_set_connect_func(database->sink, irmcConnect);
++  osync_objtype_sink_set_disconnect_func(database->sink, irmcDisconnect);
++  osync_objtype_sink_set_sync_done_func(database->sink, irmcSyncDone);
++  osync_objtype_sink_set_get_changes_func(database->sink, getchanges);
++  osync_objtype_sink_set_commit_func(database->sink, commit);
+ 
+   database->objformat = osync_format_env_find_objformat(formatenv, format);
+   if (!database->objformat) {
+@@ -1349,7 +1296,6 @@ static irmc_database *create_database(OS
+                                            "Is the vformat plugin correctly installed?", format, objtype);
+     goto error_free_db;
+   }
+-  osync_objtype_sink_add_objformat(database->sink, format);
+ 
+   osync_plugin_info_add_objtype(info, database->sink);
+ 
+@@ -1370,7 +1316,7 @@ static irmc_database *create_database(OS
+ static void *irmcInitialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, plugin, info, error);			
+-  const char *configdata = NULL;
++  OSyncPluginConfig *configdata = NULL;
+ 
+   // create new environment, where all connection information are stored in
+   irmc_environment *env = osync_try_malloc0(sizeof(irmc_environment), error);
+@@ -1387,18 +1333,27 @@ static void *irmcInitialize(OSyncPlugin
+   }
+ 
+   // parse the config data
+-  if (!parse_settings( &(env->config), configdata, strlen(configdata), error)) {
++  if (!parse_settings( &(env->config), configdata, error)) {
+     osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION, "Unable to parse config data: %s", osync_error_print(error));
+     goto error_free_env;
+   }
+ 
+-  // set default irmc anchor path
+-  env->anchor_path = g_strdup_printf("%s/anchor.db", osync_plugin_info_get_configdir(info));
+-
+-  irmc_database *contactdb = create_database(info, "contact", "vcard21", "pb", irmcContactGetChangeinfo, irmcContactCommitChange, error); 
+-  irmc_database *eventdb = create_database(info, "event", "vevent10", "cal", irmcCalendarGetChangeinfo, irmcCalendarCommitChange, error);
+-  irmc_database *tododb = create_database(info, "todo", "vtodo10", "cal", irmcCalendarGetChangeinfo, irmcCalendarCommitChange, error);
+-  irmc_database *notedb = create_database(info, "note", "vnote11", "nt", irmcNoteGetChangeinfo, irmcNoteCommitChange, error);
++  OSyncObjTypeSink *mainsink = osync_objtype_main_sink_new(error);
++  if (!mainsink)
++    goto error_free_env;
++  if (!osync_objtype_sink_open_state_db(mainsink, info, error))
++    goto error_free_env;
++  osync_objtype_sink_enable_state_db(mainsink, TRUE);
++  if (!osync_objtype_sink_open_state_db(mainsink, info, error))
++    goto error_free_env;
++  env->state_db = osync_objtype_sink_get_state_db(mainsink);
++  osync_plugin_info_set_main_sink(info, mainsink);
++  osync_objtype_sink_unref(mainsink);
++  
++  irmc_database *contactdb = create_database(info, env, "contact", "vcard21", "pb", irmcContactGetChangeinfo, irmcContactCommitChange, error); 
++  irmc_database *eventdb = create_database(info, env, "event", "vevent10", "cal", irmcCalendarGetChangeinfo, irmcCalendarCommitChange, error);
++  irmc_database *tododb = create_database(info, env, "todo", "vtodo10", "cal", irmcCalendarGetChangeinfo, irmcCalendarCommitChange, error);
++  irmc_database *notedb = create_database(info, env, "note", "vnote11", "nt", irmcNoteGetChangeinfo, irmcNoteCommitChange, error);
+ 
+   if (!contactdb || !eventdb || !tododb || !notedb)
+     goto error_free_env;
+@@ -1435,7 +1390,7 @@ osync_bool get_sync_info(OSyncPluginEnv
+   osync_plugin_set_finalize(plugin, irmcFinalize);
+   osync_plugin_set_discover(plugin, irmcDiscover);
+ 
+-  osync_plugin_env_register_plugin(env, plugin);
++  osync_plugin_env_register_plugin(env, plugin, error);
+   osync_plugin_unref(plugin);
+ 
+   return TRUE;
diff --git a/libopensync-plugin-irmc-openobex.patch b/libopensync-plugin-irmc-openobex.patch
new file mode 100644
index 0000000..15d97c6
--- /dev/null
+++ b/libopensync-plugin-irmc-openobex.patch
@@ -0,0 +1,105 @@
+--- libopensync-plugin-irmc-0.36/src/irmc_sync.h.orig	2008-01-26 18:03:01.000000000 +0100
++++ libopensync-plugin-irmc-0.36/src/irmc_sync.h	2025-09-08 18:56:14.658635305 +0200
+@@ -34,7 +34,7 @@ typedef enum {
+ typedef struct  {
+   char *serial_number;
+ 
+-  obex_t obexhandle;             // Handle to the obex connection
++  obex_t *obexhandle;             // Handle to the obex connection
+ 
+   // connection options
+   connect_medium connectmedium;  // The connection type
+@@ -75,6 +75,6 @@ typedef struct irmc_database {
+ obex_t* irmc_obex_client(irmc_config *config);
+ char* sync_connect_get_serial(irmc_config *config);
+ gboolean detect_slowsync(int changecounter, char *object, char **dbid, char **serial_number,
+-                         gboolean *slowsync, obex_t obexhandle, OSyncError **error);
++                         gboolean *slowsync, obex_t *obexhandle, OSyncError **error);
+ 
+ #endif
+--- libopensync-plugin-irmc-0.36/src/irmc_sync.c.orig	2008-01-26 18:03:01.000000000 +0100
++++ libopensync-plugin-irmc-0.36/src/irmc_sync.c	2025-09-08 18:54:53.025744215 +0200
+@@ -769,7 +769,7 @@ error:
+  *   - the changelog contains a '*' in the last line
+  */
+ gboolean detect_slowsync(int changecounter, char *object, char **dbid, char **serial_number,
+-                         gboolean *slowsync, obex_t obexhandle, OSyncError **error)
++                         gboolean *slowsync, obex_t *obexhandle, OSyncError **error)
+ {
+   osync_trace(TRACE_ENTRY, "%s(%d, %s, %s, %s, %p, %p)", __func__, changecounter, object, *dbid, *serial_number, obexhandle, error);
+ 
+--- libopensync-plugin-irmc-0.36/src/irmc_obex.c.orig	2008-01-26 18:03:01.000000000 +0100
++++ libopensync-plugin-irmc-0.36/src/irmc_obex.c	2025-09-10 21:43:44.024721942 +0200
+@@ -50,6 +50,28 @@
+ 
+ #include <openobex/obex.h>
+ 
++static int priv_OBEX_CharToUnicode(uint8_t *uc, const uint8_t *c, int size)
++{
++	int len, n;
++
++	if (uc == NULL || c == NULL)
++		return -1;
++
++	len = n = strlen((char *) c);
++	if (n*2+2 > size)
++		return -1;
++
++	uc[n*2+1] = 0;
++	uc[n*2] = 0;
++
++	while (n--) {
++		uc[n*2+1] = c[n];
++		uc[n*2] = 0;
++	}
++
++	return (len * 2) + 2;
++}
++
+ gpointer (*plugin_function)();
+ #define CALL_PLUGIN(mod, name, args) (g_module_symbol(mod,name,(gpointer*)&plugin_function)?(*plugin_function)args:NULL)
+ GModule *bluetoothplugin = NULL;
+@@ -450,7 +472,7 @@ obex_t* irmc_obex_client(irmc_config *co
+ 
+ #ifdef HAVE_IRDA
+   obex_ctrans_t irdatrans = { obex_irda_connect, obex_irda_disconnect,
+-			      obex_cable_listen, obex_cable_write,
++			      obex_cable_listen, NULL, obex_cable_write,
+ 			      obex_cable_handleinput, 0 };
+ #endif
+   obexdata_t *userdata;
+@@ -513,14 +535,14 @@ obex_t* irmc_obex_client(irmc_config *co
+     break;
+   case MEDIUM_IR:
+ #ifdef HAVE_IRDA
+-    if (!(handle = OBEX_Init(OBEX_TRANS_CUST, obex_event, 0)))
++    if (!(handle = OBEX_Init(OBEX_TRANS_CUSTOM, obex_event, 0)))
+       return(0);
+     OBEX_RegisterCTransport(handle, &irdatrans);
+ #endif
+     break;
+   case MEDIUM_CABLE:
+ #ifdef HAVE_COBEX    
+-    if (!(handle = OBEX_Init(OBEX_TRANS_CUST, obex_event, 0)))
++    if (!(handle = OBEX_Init(OBEX_TRANS_CUSTOM, obex_event, 0)))
+       return(0);
+     OBEX_RegisterCTransport(handle, &cabletrans);
+ #endif    
+@@ -687,7 +709,7 @@ gboolean irmc_obex_put(obex_t* handle, c
+     hd.bq4 = body_size; 
+     OBEX_ObjectAddHeader(handle, object, OBEX_HDR_LENGTH, hd, 4, 0); 
+     /* Add unicode name header*/ 
+-    namesize = OBEX_CharToUnicode((uint8_t *) unicodename, (const uint8_t *) name, 1024);
++    namesize = priv_OBEX_CharToUnicode((uint8_t *) unicodename, (const uint8_t *) name, 1024);
+     hd.bs = (const uint8_t *) unicodename; 
+     OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, 
+ 			 namesize, 0); 
+@@ -752,7 +774,7 @@ gboolean irmc_obex_get(obex_t *handle, c
+   userdata = (obexdata_t*) OBEX_GetUserData(handle);  
+   if((object = OBEX_ObjectNew(handle, OBEX_CMD_GET))) {
+     /* Add unicode name header*/ 
+-    namesize = OBEX_CharToUnicode((uint8_t *) unicodename, (const uint8_t *) name, 1024);
++    namesize = priv_OBEX_CharToUnicode((uint8_t *) unicodename, (const uint8_t *) name, 1024);
+     hd.bs = (const uint8_t *) unicodename; 
+     OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, 
+ 			 namesize, 0); 
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/libopensync-plugin-irmc.git/commitdiff/b287d0fbb247d3e2df4cf57af6283bfbaef724ca




More information about the pld-cvs-commit mailing list