You can subscribe to this list here.
2005 |
Jan
|
Feb
|
Mar
(56) |
Apr
(109) |
May
(15) |
Jun
(3) |
Jul
(37) |
Aug
(96) |
Sep
(40) |
Oct
(4) |
Nov
(54) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(47) |
Feb
(30) |
Mar
(102) |
Apr
(120) |
May
(68) |
Jun
(54) |
Jul
(53) |
Aug
(122) |
Sep
(190) |
Oct
(71) |
Nov
(85) |
Dec
(108) |
2007 |
Jan
(72) |
Feb
(190) |
Mar
(53) |
Apr
(101) |
May
(145) |
Jun
(148) |
Jul
(167) |
Aug
(143) |
Sep
(23) |
Oct
(198) |
Nov
(223) |
Dec
(195) |
2008 |
Jan
(100) |
Feb
(129) |
Mar
(79) |
Apr
(77) |
May
(34) |
Jun
(95) |
Jul
(112) |
Aug
(160) |
Sep
(82) |
Oct
(124) |
Nov
(199) |
Dec
(355) |
2009 |
Jan
(436) |
Feb
(89) |
Mar
(298) |
Apr
(189) |
May
(33) |
Jun
(88) |
Jul
(105) |
Aug
(44) |
Sep
(181) |
Oct
(87) |
Nov
(75) |
Dec
(1) |
2010 |
Jan
(63) |
Feb
(21) |
Mar
(3) |
Apr
(1) |
May
(1) |
Jun
(3) |
Jul
(26) |
Aug
(37) |
Sep
(26) |
Oct
(15) |
Nov
(13) |
Dec
|
From: <svn...@op...> - 2009-09-30 11:12:00
|
Author: bellmich Date: Wed Sep 30 13:11:44 2009 New Revision: 1291 URL: http://libsyncml.opensync.org/changeset/1291 Log: added code to set the new option MAX_MSG_CHANGES This code only stores the option and does nothing else. Modified: trunk/libsyncml/data_sync_api/data_sync_client.c trunk/libsyncml/data_sync_api/data_sync_server.c trunk/libsyncml/data_sync_api/sml_data_sync.c trunk/libsyncml/data_sync_api/sml_data_sync_defines.h trunk/libsyncml/data_sync_api/sml_data_sync_private.h trunk/libsyncml/sml_manager.c trunk/libsyncml/sml_manager.h trunk/libsyncml/sml_manager_internals.h trunk/libsyncml/sml_session.c trunk/libsyncml/sml_session.h trunk/libsyncml/sml_session_internals.h Modified: trunk/libsyncml/data_sync_api/data_sync_client.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_client.c Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/data_sync_api/data_sync_client.c Wed Sep 30 13:11:44 2009 (r1291) @@ -353,6 +353,7 @@ smlManagerSetEventCallback(self->priv->manager, sml_data_sync_event_callback, self); smlManagerSetLocalMaxMsgSize(self->priv->manager, self->priv->max_msg_size); smlManagerSetLocalMaxObjSize(self->priv->manager, self->priv->max_obj_size); + smlManagerSetLocalMaxMsgChanges(self->priv->manager, self->priv->max_msg_changes); /* set server specific callbacks */ self->priv->alert_callback = sml_data_sync_data_store_session_client_alert_callback; Modified: trunk/libsyncml/data_sync_api/data_sync_server.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_server.c Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/data_sync_api/data_sync_server.c Wed Sep 30 13:11:44 2009 (r1291) @@ -232,6 +232,7 @@ smlManagerSetEventCallback(self->priv->manager, sml_data_sync_event_callback, self); smlManagerSetLocalMaxMsgSize(self->priv->manager, self->priv->max_msg_size); smlManagerSetLocalMaxObjSize(self->priv->manager, self->priv->max_obj_size); + smlManagerSetLocalMaxMsgChanges(self->priv->manager, self->priv->max_msg_changes); /* set server specific callbacks */ self->priv->alert_callback = sml_data_sync_data_store_session_server_alert_callback; Modified: trunk/libsyncml/data_sync_api/sml_data_sync.c ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync.c Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/data_sync_api/sml_data_sync.c Wed Sep 30 13:11:44 2009 (r1291) @@ -250,6 +250,7 @@ self->priv->use_timestamp_anchor = TRUE; self->priv->max_obj_size = SML_DEFAULT_MAX_OBJ_SIZE; self->priv->max_msg_size = SML_DEFAULT_MAX_MSG_SIZE; + self->priv->max_msg_changes = SML_DEFAULT_MAX_MSG_CHANGES; self->priv->sessions = g_hash_table_new_full(g_direct_hash, g_direct_equal, sml_data_sync_free_session, @@ -493,6 +494,8 @@ self->priv->max_obj_size = atoi(value); } else if (!strcmp(SML_DATA_SYNC_CONFIG_MAX_MSG_SIZE, name)) { self->priv->max_msg_size = atoi(value); + } else if (!strcmp(SML_DATA_SYNC_CONFIG_MAX_MSG_CHANGES, name)) { + self->priv->max_msg_changes = atoi(value); } else if (!strcmp(SML_DATA_SYNC_CONFIG_FAKE_DEVICE, name)) { self->priv->fake_device = g_strdup(value); } else if (!strcmp(SML_DATA_SYNC_CONFIG_FAKE_MANUFACTURER, name)) { Modified: trunk/libsyncml/data_sync_api/sml_data_sync_defines.h ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync_defines.h Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/data_sync_api/sml_data_sync_defines.h Wed Sep 30 13:11:44 2009 (r1291) @@ -56,6 +56,7 @@ #define SML_DEFAULT_MAX_MSG_SIZE 65535 #define SML_DEFAULT_MAX_OBJ_SIZE 1024000 +#define SML_DEFAULT_MAX_MSG_CHANGES 0 /* disabled limit */ /* Data Synchronization config API defines */ @@ -85,6 +86,7 @@ #define SML_DATA_SYNC_CONFIG_ONLY_REPLACE "ONLY_REPLACE" #define SML_DATA_SYNC_CONFIG_MAX_MSG_SIZE "MAX_MSG_SIZE" #define SML_DATA_SYNC_CONFIG_MAX_OBJ_SIZE "MAX_OBJ_SIZE" +#define SML_DATA_SYNC_CONFIG_MAX_MSG_CHANGES "MAX_MSG_CHANGES" #define SML_DATA_SYNC_CONFIG_FAKE_DEVICE "FAKE_DEVICE" #define SML_DATA_SYNC_CONFIG_FAKE_MANUFACTURER "FAKE_MANUFACTURER" Modified: trunk/libsyncml/data_sync_api/sml_data_sync_private.h ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync_private.h Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/data_sync_api/sml_data_sync_private.h Wed Sep 30 13:11:44 2009 (r1291) @@ -46,6 +46,7 @@ gboolean use_wbxml; gsize max_obj_size; gsize max_msg_size; + gsize max_msg_changes; SmlProtocolVersion version; SmlDataSyncInternalStateType state; Modified: trunk/libsyncml/sml_manager.c ============================================================================== --- trunk/libsyncml/sml_manager.c Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/sml_manager.c Wed Sep 30 13:11:44 2009 (r1291) @@ -876,6 +876,14 @@ else smlSessionUseLargeObjects(session, FALSE); + /* configure maximum number of changes in one message + * + * This is necessary if the user of the library implement + * own caching strategies which can block (e.g. OpenSync). + */ + if (manager->localMaxMsgChanges) + smlSessionSetLocalMaxMsgChanges(session, manager->localMaxMsgChanges); + smlSessionSetEventCallback(session, _event_callback, manager); smlSessionSetDataCallback(session, _data_send_callback, sess); @@ -1440,6 +1448,14 @@ manager->localMaxObjSize = size; } +void +smlManagerSetLocalMaxMsgChanges (SmlManager *manager, + gsize size) +{ + smlAssert(manager); + manager->localMaxMsgChanges = size; +} + gsize smlManagerGetNewSessionID (SmlManager *manager) { Modified: trunk/libsyncml/sml_manager.h ============================================================================== --- trunk/libsyncml/sml_manager.h Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/sml_manager.h Wed Sep 30 13:11:44 2009 (r1291) @@ -82,8 +82,9 @@ void smlManagerDispatch (SmlManager *manager); gboolean smlManagerCheck (SmlManager *manager); -void smlManagerSetLocalMaxMsgSize (SmlManager *manager, gsize size); -void smlManagerSetLocalMaxObjSize (SmlManager *manager, gsize size); +void smlManagerSetLocalMaxMsgSize (SmlManager *manager, gsize size); +void smlManagerSetLocalMaxObjSize (SmlManager *manager, gsize size); +void smlManagerSetLocalMaxMsgChanges (SmlManager *manager, gsize size); gsize smlManagerGetNewSessionID (SmlManager *manager); Modified: trunk/libsyncml/sml_manager_internals.h ============================================================================== --- trunk/libsyncml/sml_manager_internals.h Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/sml_manager_internals.h Wed Sep 30 13:11:44 2009 (r1291) @@ -60,6 +60,7 @@ gsize localMaxMsgSize; gsize localMaxObjSize; + gsize localMaxMsgChanges; }; typedef struct SmlManagerEvent { Modified: trunk/libsyncml/sml_session.c ============================================================================== --- trunk/libsyncml/sml_session.c Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/sml_session.c Wed Sep 30 13:11:44 2009 (r1291) @@ -2501,6 +2501,19 @@ return result; } +void +smlSessionSetLocalMaxMsgChanges (SmlSession *session, + gsize size) +{ + smlTrace(TRACE_ENTRY, "%s(%p, %u)", __func__, session, size); + smlAssert(session); + + session->localMaxMsgChanges = size; + + smlTrace(TRACE_EXIT, "%s - %u", __func__, session->localMaxMsgChanges); +} + + /** Sets the obj size that will get transmitted to the remote side in the * <MaxObjSize> tag. So this sets the maximum size of the object we want to receive. * If an item is larger, we return an error Modified: trunk/libsyncml/sml_session.h ============================================================================== --- trunk/libsyncml/sml_session.h Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/sml_session.h Wed Sep 30 13:11:44 2009 (r1291) @@ -64,10 +64,11 @@ void smlSessionSetEstablished (SmlSession *session, gboolean estabished); gboolean smlSessionGetEstablished (SmlSession *session); -void smlSessionSetRemoteMaxMsgSize (SmlSession *session, gsize size); -void smlSessionSetLocalMaxMsgSize (SmlSession *session, gsize size); -gsize smlSessionGetRemoteMaxMsgSize (SmlSession *session); -gsize smlSessionGetLocalMaxMsgSize (SmlSession *session); +void smlSessionSetRemoteMaxMsgSize (SmlSession *session, gsize size); +void smlSessionSetLocalMaxMsgSize (SmlSession *session, gsize size); +gsize smlSessionGetRemoteMaxMsgSize (SmlSession *session); +gsize smlSessionGetLocalMaxMsgSize (SmlSession *session); +void smlSessionSetLocalMaxMsgChanges (SmlSession *session, gsize size); void smlSessionSetLocalMaxObjSize (SmlSession *session, gsize limit); void smlSessionSetRemoteMaxObjSize (SmlSession *session, gsize limit); Modified: trunk/libsyncml/sml_session_internals.h ============================================================================== --- trunk/libsyncml/sml_session_internals.h Mon Sep 28 17:21:15 2009 (r1290) +++ trunk/libsyncml/sml_session_internals.h Wed Sep 30 13:11:44 2009 (r1291) @@ -56,6 +56,7 @@ */ gsize localMaxMsgSize; gsize localMaxObjSize; + gsize localMaxMsgChanges; GList *pendingReplies; |
From: <svn...@op...> - 2009-09-29 23:30:30
|
Author: cdfrey Date: Wed Sep 30 01:30:16 2009 New Revision: 5863 URL: http://www.opensync.org/changeset/5863 Log: Forgot to add my name to the comments Modified: trunk/opensync/group/opensync_group_env.c Modified: trunk/opensync/group/opensync_group_env.c ============================================================================== --- trunk/opensync/group/opensync_group_env.c Wed Sep 30 01:25:57 2009 (r5862) +++ trunk/opensync/group/opensync_group_env.c Wed Sep 30 01:30:16 2009 (r5863) @@ -1,6 +1,7 @@ /* * libopensync - A synchronization framework * Copyright (C) 2004-2005 Armin Bauer <arm...@op...> + * Copyright (C) 2009 Chris Frey <cd...@fo...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public |
From: <svn...@op...> - 2009-09-29 23:26:10
|
Author: cdfrey Date: Wed Sep 30 01:25:57 2009 New Revision: 5862 URL: http://www.opensync.org/changeset/5862 Log: pkgconfig: renamed libopensync.pc.in to libopensync1.pc.in Modified: branches/3rd-party-cmake-modules/modules/FindOpenSync.cmake Modified: branches/3rd-party-cmake-modules/modules/FindOpenSync.cmake ============================================================================== --- branches/3rd-party-cmake-modules/modules/FindOpenSync.cmake Wed Sep 30 01:25:31 2009 (r5861) +++ branches/3rd-party-cmake-modules/modules/FindOpenSync.cmake Wed Sep 30 01:25:57 2009 (r5862) @@ -24,15 +24,15 @@ ENDIF ( OpenSync_FIND_REQUIRED ) IF ( OPENSYNC_MIN_VERSION ) - PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync >=${OPENSYNC_MIN_VERSION} ) + PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync1 >=${OPENSYNC_MIN_VERSION} ) ELSE ( OPENSYNC_MIN_VERSION ) - PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync ) + PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync1 ) ENDIF ( OPENSYNC_MIN_VERSION ) FIND_PROGRAM( PKGCONFIG_EXECUTABLE NAMES pkg-config ) IF ( PKGCONFIG_EXECUTABLE ) - EXEC_PROGRAM( ${PKGCONFIG_EXECUTABLE} ARGS libopensync --variable=datadir OUTPUT_VARIABLE _opensync_data_DIR ) + EXEC_PROGRAM( ${PKGCONFIG_EXECUTABLE} ARGS libopensync1 --variable=datadir OUTPUT_VARIABLE _opensync_data_DIR ) STRING( REGEX REPLACE "[\r\n]" " " _opensync_data_DIR "${_opensync_data_DIR}" ) ENDIF ( PKGCONFIG_EXECUTABLE ) |
From: <svn...@op...> - 2009-09-29 23:25:43
|
Author: cdfrey Date: Wed Sep 30 01:25:31 2009 New Revision: 5861 URL: http://www.opensync.org/changeset/5861 Log: pkgconfig: renamed libopensync.pc.in to libopensync1.pc.in Added: trunk/libopensync1.pc.in (props changed) - copied unchanged from r5860, trunk/libopensync.pc.in Deleted: trunk/libopensync.pc.in Modified: trunk/CMakeLists.txt Modified: trunk/CMakeLists.txt ============================================================================== --- trunk/CMakeLists.txt Wed Sep 30 01:20:47 2009 (r5860) +++ trunk/CMakeLists.txt Wed Sep 30 01:25:31 2009 (r5861) @@ -146,11 +146,11 @@ ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") CONFIGURE_FILE( "config.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/config.h" ) -CONFIGURE_FILE( "libopensync.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libopensync.pc" ) +CONFIGURE_FILE( "libopensync1.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libopensync1.pc" ) ########## INSTALL ############################## -INSTALL( FILES "${CMAKE_CURRENT_BINARY_DIR}/libopensync.pc" DESTINATION ${LIBDATA_INSTALL_DIR}/pkgconfig/ ) +INSTALL( FILES "${CMAKE_CURRENT_BINARY_DIR}/libopensync1.pc" DESTINATION ${LIBDATA_INSTALL_DIR}/pkgconfig/ ) ### CPack ######################################## |
From: <svn...@op...> - 2009-09-29 23:21:03
|
Author: cdfrey Date: Wed Sep 30 01:20:47 2009 New Revision: 5860 URL: http://www.opensync.org/changeset/5860 Log: opensync_group_env.c: added 0.22 -> 0.40 copy upgrade behaviour The first time that opensync runs and creates its default directory (which will not exist on any pure 0.22 system because the new default directory has a version number in it) opensync will search for old 0.22 group configs in the ~/.opensync directory, and if found, copy them all to the new $XDG_CONFIG_HOME (~/.config/opensync/0.40) directory. After this copy is complete, it is safe to run OSyncUpdater on the new 0.40 config directory. Note: this patch contains two generic functions: osync_glob_copy() and osync_copy_file() which perhaps should be moved into somewhere genericly useful. The OSyncUpdater code could possibly use these functions too... they were based on OSyncUpdater code. Modified: trunk/opensync/group/opensync_group_env.c Modified: trunk/opensync/group/opensync_group_env.c ============================================================================== --- trunk/opensync/group/opensync_group_env.c Wed Sep 30 01:19:39 2009 (r5859) +++ trunk/opensync/group/opensync_group_env.c Wed Sep 30 01:20:47 2009 (r5860) @@ -136,6 +136,152 @@ return g_mkdir_with_parents(full_path, 0700); } +static osync_bool osync_copy_file(const char *srcdir, const char *filename, const char *destdir, OSyncError **error) +{ + char *path = NULL; + char *destpath = NULL; + gchar *content = NULL; + osync_bool ret = FALSE; + gsize length; + GError *gerror = NULL; + + path = osync_strdup_printf("%s%c%s", srcdir, G_DIR_SEPARATOR, filename); + destpath = osync_strdup_printf("%s%c%s", destdir, G_DIR_SEPARATOR, filename); + + if (!g_file_get_contents(path, &content, &length, &gerror)) { + osync_error_set(error, OSYNC_ERROR_IO_ERROR, "Failed reading file '%s': %s", path, gerror->message); + g_error_free(gerror); + goto destroy; + } + + if (!g_file_set_contents(destpath, content, length, &gerror)) { + osync_error_set(error, OSYNC_ERROR_IO_ERROR, "Failed writing file '%s': %s", destpath, gerror->message); + g_error_free(gerror); + goto destroy; + } + + /* success */ + ret = TRUE; + +destroy: + if (content) + g_free(content); + if (destpath) + osync_free(destpath); + if (path) + osync_free(path); + return ret; +} + +/* copies all matching files and subdirectories, recursively */ +static osync_bool osync_glob_copy(const char *srcdir, const char *glob, const char *destdir, OSyncError **error) +{ + GDir *dir = NULL; + GError *gerror = NULL; + const char *name = NULL; + osync_bool ret = FALSE; + GPatternSpec *pattern = NULL; + char *path = NULL; + char *newdestdir = NULL; + + dir = g_dir_open(srcdir, 0, &gerror); + if (!dir) { + osync_error_set(error, OSYNC_ERROR_IO_ERROR, "Unable to open source directory '%s' for copy: %s", srcdir, gerror->message); + g_error_free(gerror); + return FALSE; + } + + pattern = g_pattern_spec_new(glob); + if (!pattern) + goto destroy; + + while ((name = g_dir_read_name(dir))) { + if (g_pattern_match_string(pattern, name)) { + path = osync_strdup_printf("%s%c%s", srcdir, G_DIR_SEPARATOR, name); + + /* copy file */ + if (g_file_test(path, G_FILE_TEST_IS_REGULAR)) { + if (!osync_copy_file(srcdir, name, destdir, error)) + goto destroy; + } + /* copy subdirectory */ + else if (g_file_test(path, G_FILE_TEST_IS_DIR)) { + newdestdir = osync_strdup_printf("%s%c%s", destdir, G_DIR_SEPARATOR, name); + + if (g_mkdir(newdestdir, 0755) < 0 ) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to create directory at %s: %s", newdestdir, g_strerror(errno)); + goto destroy; + } + + if (!osync_glob_copy(path, "*", newdestdir, error)) + goto destroy; + + osync_free(newdestdir); + newdestdir = NULL; + } + + osync_free(path); + path = NULL; + } + } + + /* success */ + ret = TRUE; + +destroy: + if (newdestdir) + osync_free(newdestdir); + if (path) + osync_free(path); + if (pattern) + g_pattern_spec_free(pattern); + g_dir_close(dir); + return ret; +} + +/* This function assumes that the default config dir does not yet + * exist, and so creates it in the XDG_CONFIG_HOME compatible location, + * and copies all existing 0.22 group directories into it, if an 0.22 + * config is found. This function only looks in the ~/.opensync + * directory for 0.22 group configs. + * + * After this function completes, it is safe to run OSyncUpdater on + * the new 0.40 config directory. + */ +static osync_bool osync_group_env_setup_config_dir(const char *groupsdir, OSyncError **error) +{ + const char *homedir = NULL; + char *osync22dir = NULL; + osync_bool ret = FALSE; + + if (osync_xdg_make_config_dir(groupsdir) < 0) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to create group directory at %s: %s", groupsdir, g_strerror(errno)); + goto destroy; + } + + /* find an opensync 0.22 directory */ + /* Use $HOME instead of passwd home, in case someone runs + * with OpenSync with sudo. The behaviour of sudo might + * differ on different systems, depending on the sudoers + * configuration. For more details see ticket #751 + */ + homedir = g_getenv("HOME"); + if (homedir == NULL) + homedir = g_get_home_dir(); + + osync22dir = osync_strdup_printf("%s%c.opensync", homedir, G_DIR_SEPARATOR); + if (!osync_glob_copy(osync22dir, "group*", groupsdir, error)) + goto destroy; + + osync_trace(TRACE_INTERNAL, "Created groups configdir %s\n", groupsdir); + ret = TRUE; + +destroy: + if (osync22dir) + osync_free(osync22dir); + return ret; +} + osync_bool osync_group_env_load_groups(OSyncGroupEnv *env, const char *path, OSyncError **error) { GDir *dir = NULL; @@ -158,11 +304,8 @@ osync_free(homedir); if (!g_file_test(env->groupsdir, G_FILE_TEST_EXISTS)) { - if (osync_xdg_make_config_dir(env->groupsdir) < 0) { - osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to create group directory at %s: %s", env->groupsdir, g_strerror(errno)); + if (!osync_group_env_setup_config_dir(env->groupsdir, error)) goto error_free_path; - } - osync_trace(TRACE_INTERNAL, "Created groups configdir %s\n", env->groupsdir); } } else { if (!g_path_is_absolute(path)) { |
From: <svn...@op...> - 2009-09-29 23:19:53
|
Author: cdfrey Date: Wed Sep 30 01:19:39 2009 New Revision: 5859 URL: http://www.opensync.org/changeset/5859 Log: opensync_group_env.c: added XDG_CONFIG_HOME support Opensync 0.40's config directory is now $XDG_CONFIG_HOME/opensync/0.40 and falling back to $HOME/.config/opensync/0.40 Modified: trunk/opensync/group/opensync_group_env.c Modified: trunk/opensync/group/opensync_group_env.c ============================================================================== --- trunk/opensync/group/opensync_group_env.c Wed Sep 30 00:18:03 2009 (r5858) +++ trunk/opensync/group/opensync_group_env.c Wed Sep 30 01:19:39 2009 (r5859) @@ -89,6 +89,53 @@ osync_trace(TRACE_EXIT, "%s", __func__); } +/* Returns const char* containing the result of XDG_CONFIG_HOME + * according to the spec. It is the caller's responsibility to + * free the returned string. + * + * If HOME does not exist, then the current user's home directory + * is used. In any case, ".config" is always in the generated + * default directory name, so it is safe to use non-dot directory + * names to build on. + * + * On fatal error, NULL is returned. + */ +static char *osync_xdg_get_config_home(void) +{ + /* http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html */ + + /* XDG_CONFIG_HOME is the base directory to use instead of HOME. + If it does not exist, or if the value is an empty string, + then use the default: $HOME/.config */ + + const char *configdir = g_getenv("XDG_CONFIG_HOME"); + if (configdir != NULL && strlen(configdir) != 0) + return osync_strdup(configdir); + + /* Use $HOME instead of passwd home, in case someone runs + * with OpenSync with sudo. The behaviour of sudo might + * differ on different systems, depending on the sudoers + * configuration. For more details see ticket #751 + */ + const char *homedir = g_getenv("HOME"); + if (homedir == NULL) { + homedir = g_get_home_dir(); + if (homedir == NULL) + return NULL; + } + + return osync_strdup_printf("%s%c.config", homedir, G_DIR_SEPARATOR); +} + +/* The XDG_CONFIG_HOME spec states that any new directories are created + * with mode 0700. This function is a simple wrapper for + * g_mkdir_with_parents() that enforces this. + */ +static int osync_xdg_make_config_dir(const char *full_path) +{ + return g_mkdir_with_parents(full_path, 0700); +} + osync_bool osync_group_env_load_groups(OSyncGroupEnv *env, const char *path, OSyncError **error) { GDir *dir = NULL; @@ -102,19 +149,16 @@ /* Create the correct path and test it */ if (!path) { - /* Use $HOME instead of passwd home, in case someone runs with OpenSync - * with sudo. The behavoir of sudo might differ on different systems, - * depending on the sudoers configuration. For more details see ticket #751 - */ - const char *homedir = g_getenv("HOME"); + char *homedir = osync_xdg_get_config_home(); if (!homedir) - homedir = g_get_home_dir(); + return FALSE; - env->groupsdir = osync_strdup_printf("%s%c.opensync", homedir, G_DIR_SEPARATOR); + env->groupsdir = osync_strdup_printf("%s%copensync%c0.40", homedir, G_DIR_SEPARATOR, G_DIR_SEPARATOR); osync_trace(TRACE_INTERNAL, "Default home dir: %s", env->groupsdir); + osync_free(homedir); if (!g_file_test(env->groupsdir, G_FILE_TEST_EXISTS)) { - if (g_mkdir(env->groupsdir, 0700) < 0) { + if (osync_xdg_make_config_dir(env->groupsdir) < 0) { osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to create group directory at %s: %s", env->groupsdir, g_strerror(errno)); goto error_free_path; } |
From: <svn...@op...> - 2009-09-29 22:18:23
|
Author: Graham Cobb Date: Wed Sep 30 00:18:03 2009 New Revision: 5858 URL: http://www.opensync.org/changeset/5858 Log: Temporarily disable pending limit Modified: trunk/opensync/client/opensync_client.c Modified: trunk/opensync/client/opensync_client.c ============================================================================== --- trunk/opensync/client/opensync_client.c Mon Sep 28 11:39:10 2009 (r5857) +++ trunk/opensync/client/opensync_client.c Wed Sep 30 00:18:03 2009 (r5858) @@ -1713,7 +1713,12 @@ goto error; client->incoming = osync_queue_ref(incoming); + + /* FIXME: temporarily disable pending limit. + Re-enable this once the syncml pending limit deadlock has been fixed */ +#if 0 osync_queue_set_pending_limit(incoming, OSYNC_QUEUE_PENDING_LIMIT); +#endif return TRUE; |
From: <svn...@op...> - 2009-09-28 15:21:31
|
Author: bellmich Date: Mon Sep 28 17:21:15 2009 New Revision: 1290 URL: http://libsyncml.opensync.org/changeset/1290 Log: The setup of a new data sync session must be thread safe. Otherwise it can happen that two parallel threads create two new data sync sessions for one SyncML session. Modified: trunk/libsyncml/data_sync_api/sml_data_sync.c trunk/libsyncml/data_sync_api/sml_data_sync_private.h Modified: trunk/libsyncml/data_sync_api/sml_data_sync.c ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync.c Mon Sep 28 17:19:45 2009 (r1289) +++ trunk/libsyncml/data_sync_api/sml_data_sync.c Mon Sep 28 17:21:15 2009 (r1290) @@ -171,6 +171,8 @@ /* cleanup sessions */ g_hash_table_remove_all(self->priv->data_sync_sessions); g_hash_table_remove_all(self->priv->sessions); + if (self->priv->session_mutex) + g_mutex_free(self->priv->session_mutex); // /* cleanup authentication */ @@ -603,7 +605,7 @@ sml_data_sync_initialize (SmlDataSync *self, GError **error) { - smlTrace(TRACE_ENTRY, "%s", __func__); + smlTrace(TRACE_ENTRY, "%s (%p, %p)", __func__, self, error); sml_return_val_error_if_fail (SML_IS_DATA_SYNC (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDataSync object."); GList *h = self->priv->data_stores; @@ -621,6 +623,7 @@ } self->priv->manager_mutex = g_mutex_new(); + self->priv->session_mutex = g_mutex_new(); if (self->priv->func_tsp_init && !self->priv->func_tsp_init(self, error)) @@ -762,21 +765,25 @@ SmlSession *session, GError **error) { + g_mutex_lock(self->priv->session_mutex); SmlDataSyncSession *data_sync_session = g_hash_table_lookup(self->priv->sessions, session); - if (data_sync_session) { - return data_sync_session; - } else { + if (!data_sync_session) { data_sync_session = sml_data_sync_session_new(session, self, error); if (!data_sync_session) - return NULL; + goto error; g_hash_table_insert(self->priv->data_sync_sessions, data_sync_session, data_sync_session); g_hash_table_insert(self->priv->sessions, session, data_sync_session); g_object_ref(data_sync_session); g_object_ref(data_sync_session); g_object_ref(data_sync_session); smlSessionRef(session); - return data_sync_session; } + g_mutex_unlock(self->priv->session_mutex); + smlTrace(TRACE_EXIT, "%s - %p", __func__, data_sync_session); + return data_sync_session; +error: + g_mutex_unlock(self->priv->session_mutex); + return NULL; } SmlDsSessionAlertCb Modified: trunk/libsyncml/data_sync_api/sml_data_sync_private.h ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync_private.h Mon Sep 28 17:19:45 2009 (r1289) +++ trunk/libsyncml/data_sync_api/sml_data_sync_private.h Mon Sep 28 17:21:15 2009 (r1290) @@ -89,6 +89,7 @@ GHashTable* data_sync_sessions; GHashTable* sessions; + GMutex* session_mutex; GSourceFuncs* functions; SmlThread* thread; |
From: <svn...@op...> - 2009-09-28 15:20:05
|
Author: bellmich Date: Mon Sep 28 17:19:45 2009 New Revision: 1289 URL: http://libsyncml.opensync.org/changeset/1289 Log: added missing trace statement Modified: trunk/libsyncml/data_sync_api/data_sync_server.c Modified: trunk/libsyncml/data_sync_api/data_sync_server.c ============================================================================== --- trunk/libsyncml/data_sync_api/data_sync_server.c Fri Sep 25 16:17:01 2009 (r1288) +++ trunk/libsyncml/data_sync_api/data_sync_server.c Mon Sep 28 17:19:45 2009 (r1289) @@ -222,6 +222,7 @@ sml_data_sync_server_init (SmlDataSync *self, GError **error) { + smlTrace(TRACE_ENTRY, "%s (%p, %p)", __func__, self, error); CHECK_ERROR_REF /* The manager responsible for handling the other objects */ |
From: <svn...@op...> - 2009-09-28 09:39:28
|
Author: bricks Date: Mon Sep 28 11:39:10 2009 New Revision: 5857 URL: http://www.opensync.org/changeset/5857 Log: create a xmlfield if value is an empty string ("") added testcase for xmlfield_set_key_value fixes #1155 Modified: trunk/opensync/xmlformat/opensync_xmlfield.c trunk/tests/capabilities-tests/check_xmlformat.c Modified: trunk/opensync/xmlformat/opensync_xmlfield.c ============================================================================== --- trunk/opensync/xmlformat/opensync_xmlfield.c Sun Sep 27 16:36:12 2009 (r5856) +++ trunk/opensync/xmlformat/opensync_xmlfield.c Mon Sep 28 11:39:10 2009 (r5857) @@ -399,8 +399,8 @@ osync_assert(xmlfield); osync_assert(key); - // If value is null or empty we don't add it to a xmlfield - if (!value || strlen(value) == 0) + // If value is null we don't add it to a xmlfield + if (!value) return TRUE; cur = xmlfield->node->children; Modified: trunk/tests/capabilities-tests/check_xmlformat.c ============================================================================== --- trunk/tests/capabilities-tests/check_xmlformat.c Sun Sep 27 16:36:12 2009 (r5856) +++ trunk/tests/capabilities-tests/check_xmlformat.c Mon Sep 28 11:39:10 2009 (r5857) @@ -97,6 +97,38 @@ } END_TEST +START_TEST (xmlfield_set_key_value) +{ + char *testbed = setup_testbed("xmlformats"); + + OSyncError *error = NULL; + const char * value = NULL; + + OSyncXMLFormat *xmlformat = osync_xmlformat_new("contact", &error); + fail_unless(xmlformat != NULL, NULL); + fail_unless(error == NULL, NULL); + + OSyncXMLField *xmlfield = osync_xmlfield_new(xmlformat, "Name", &error); + fail_unless(xmlfield != NULL, NULL); + fail_unless(error == NULL, NULL); + + fail_unless( osync_xmlfield_set_key_value(xmlfield, "Name", "Foo", &error) == TRUE); + fail_unless(error == NULL, NULL); + value = osync_xmlfield_get_value(xmlfield); + fail_unless(strcmp("Foo", "Foo") == 0); + + fail_unless(osync_xmlfield_set_key_value(xmlfield, "Firstname", "", &error) == TRUE); + fail_unless(error == NULL, NULL); + OSyncXMLField *next = osync_xmlfield_get_child(xmlfield); + fail_if(next == NULL); + value = osync_xmlfield_get_key_value(xmlfield, "Firstname"); + fail_if(value == NULL); + + osync_xmlformat_unref(xmlformat); + + destroy_testbed(testbed); +} +END_TEST START_TEST (xmlformat_search_field) { @@ -204,28 +236,28 @@ START_TEST (xmlformat_schema_validate) { - char *testbed = setup_testbed("xmlformats"); - char *buffer; - unsigned int size; - OSyncError *error = NULL; - OSyncXMLFormatSchema *schema = NULL; + char *testbed = setup_testbed("xmlformats"); + char *buffer; + unsigned int size; + OSyncError *error = NULL; + OSyncXMLFormatSchema *schema = NULL; - fail_unless(osync_file_read("mockobjtype.xml", &buffer, &size, &error), NULL); - fail_unless(error == NULL, NULL); + fail_unless(osync_file_read("mockobjtype.xml", &buffer, &size, &error), NULL); + fail_unless(error == NULL, NULL); - OSyncXMLFormat *xmlformat = osync_xmlformat_parse(buffer, size, &error); - fail_unless(error == NULL, NULL); + OSyncXMLFormat *xmlformat = osync_xmlformat_parse(buffer, size, &error); + fail_unless(error == NULL, NULL); - g_free(buffer); - schema = osync_xmlformat_schema_new_xmlformat(xmlformat, testbed, &error); - fail_if( schema == NULL ); - fail_unless( osync_xmlformat_schema_validate(schema, xmlformat, &error) ); + g_free(buffer); + schema = osync_xmlformat_schema_new_xmlformat(xmlformat, testbed, &error); + fail_if( schema == NULL ); + fail_unless( osync_xmlformat_schema_validate(schema, xmlformat, &error) ); - osync_xmlformat_schema_unref(schema); + osync_xmlformat_schema_unref(schema); - osync_xmlformat_unref(xmlformat); + osync_xmlformat_unref(xmlformat); - destroy_testbed(testbed); + destroy_testbed(testbed); } END_TEST @@ -234,20 +266,20 @@ */ START_TEST (xmlfield_childlink_for_getter_setter) { - char *testbed = setup_testbed(NULL); - OSyncError *error = NULL; + char *testbed = setup_testbed(NULL); + OSyncError *error = NULL; OSyncXMLFormat *xmlformat = osync_xmlformat_new("top", &error); - OSyncXMLField *foo = osync_xmlfield_new(xmlformat, "foo", &error); - osync_xmlfield_set_key_value(foo, "fookeyname1", "foorandomvalue", &error); - fail_unless(error == NULL, NULL); + OSyncXMLField *foo = osync_xmlfield_new(xmlformat, "foo", &error); + osync_xmlfield_set_key_value(foo, "fookeyname1", "foorandomvalue", &error); + fail_unless(error == NULL, NULL); fail_unless(osync_xmlfield_get_child(foo) != NULL); - osync_xmlformat_unref(xmlformat); + osync_xmlformat_unref(xmlformat); - destroy_testbed(testbed); + destroy_testbed(testbed); } END_TEST @@ -264,6 +296,7 @@ // xmlfield OSYNC_TESTCASE_ADD(xmlfield_new) OSYNC_TESTCASE_ADD(xmlfield_sort) +OSYNC_TESTCASE_ADD(xmlfield_set_key_value) OSYNC_TESTCASE_ADD(xmlfield_childlink_for_getter_setter) OSYNC_TESTCASE_END |
From: <svn...@op...> - 2009-09-27 14:36:27
|
Author: paule Date: Sun Sep 27 16:36:12 2009 New Revision: 5856 URL: http://www.opensync.org/changeset/5856 Log: opie-sync: apply patch from ticket #996 to fix potential segfault in contact format conversion code. Patch courtesy of Daniel Gollub. Modified: plugins/opie-sync/src/opie_format.c Modified: plugins/opie-sync/src/opie_format.c ============================================================================== --- plugins/opie-sync/src/opie_format.c Sun Sep 27 07:49:22 2009 (r5855) +++ plugins/opie-sync/src/opie_format.c Sun Sep 27 16:36:12 2009 (r5856) @@ -385,9 +385,9 @@ } } const char *telloc = osync_xmlfield_get_attr(in_xmlfield, "Location"); - if ( !strcmp( telloc, "Home" ) ) + if ( telloc && !strcmp( telloc, "Home" ) ) type |= PT_HOME; - else if ( !strcmp( telloc, "Work") ) + else if ( telloc && !strcmp( telloc, "Work") ) type |= PT_WORK; const char *number = osync_xmlfield_get_key_value(in_xmlfield, "Content"); |
From: <svn...@op...> - 2009-09-27 05:49:34
|
Author: cdfrey Date: Sun Sep 27 07:49:22 2009 New Revision: 5855 URL: http://www.opensync.org/changeset/5855 Log: opensync_group.c: fixed missing error checking of sscanf() Modified: trunk/opensync/group/opensync_group.c Modified: trunk/opensync/group/opensync_group.c ============================================================================== --- trunk/opensync/group/opensync_group.c Sun Sep 27 07:01:09 2009 (r5854) +++ trunk/opensync/group/opensync_group.c Sun Sep 27 07:49:22 2009 (r5855) @@ -1062,7 +1062,12 @@ if (!version_str) goto end; - sscanf((const char *) version_str, "%u.%u", &version_major, &version_minor); + if (sscanf((const char *) version_str, "%u.%u", &version_major, &version_minor) != 2) { + /* unparsable version string, can't compare versions, + assume update is required */ + osync_trace(TRACE_ERROR, "%s: cannot parse version string: %s", __func__, version_str); + goto end; + } osync_trace(TRACE_INTERNAL, "Version: %s (current %u.%u required %u.%u)", version_str, version_major, version_minor, |
From: <svn...@op...> - 2009-09-27 05:01:23
|
Author: cdfrey Date: Sun Sep 27 07:01:09 2009 New Revision: 5854 URL: http://www.opensync.org/changeset/5854 Log: opensync_group_env.c: fixed printing of null pointers osync_group_env_load_groups() used 'path' where it should have used 'env->groupsdir' when printing status and error messages Modified: trunk/opensync/group/opensync_group_env.c Modified: trunk/opensync/group/opensync_group_env.c ============================================================================== --- trunk/opensync/group/opensync_group_env.c Sat Sep 26 15:37:36 2009 (r5853) +++ trunk/opensync/group/opensync_group_env.c Sun Sep 27 07:01:09 2009 (r5854) @@ -115,10 +115,10 @@ if (!g_file_test(env->groupsdir, G_FILE_TEST_EXISTS)) { if (g_mkdir(env->groupsdir, 0700) < 0) { - osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to create group directory at %s: %s", path, g_strerror(errno)); + osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to create group directory at %s: %s", env->groupsdir, g_strerror(errno)); goto error_free_path; } - osync_trace(TRACE_INTERNAL, "Created groups configdir %s\n", path); + osync_trace(TRACE_INTERNAL, "Created groups configdir %s\n", env->groupsdir); } } else { if (!g_path_is_absolute(path)) { @@ -133,7 +133,7 @@ goto error_free_path; } - /* Open the firectory */ + /* Open the directory */ dir = g_dir_open(env->groupsdir, 0, &gerror); if (!dir) { osync_error_set(error, OSYNC_ERROR_IO_ERROR, "Unable to open main configdir %s: %s", env->groupsdir, gerror->message); |
From: <svn...@op...> - 2009-09-26 14:16:54
|
Author: paule Date: Sat Sep 26 15:37:36 2009 New Revision: 5853 URL: http://www.opensync.org/changeset/5853 Log: opie-sync: fix code indenting style Modified: plugins/opie-sync/src/opie_qcop.c plugins/opie-sync/src/opie_qcop.h Modified: plugins/opie-sync/src/opie_qcop.c ============================================================================== --- plugins/opie-sync/src/opie_qcop.c Fri Sep 25 21:44:39 2009 (r5852) +++ plugins/opie-sync/src/opie_qcop.c Sat Sep 26 15:37:36 2009 (r5853) @@ -58,84 +58,84 @@ gboolean expect(qcop_conn* qconn, char* str, char *failstr, char* errmsg); /* globals */ -pthread_t monitor_thd = 0; +pthread_t monitor_thd = 0; - + /* get_line - * + * * helper function to receive a all characters up to the next newline from the socket * caller is responsible for g_free()ing the returned string resp. for checking that * a string was returned at all. */ gchar* get_line(qcop_conn* qconn) { - GString* buffer; - char* retval = NULL; - gchar* curr_char; - ssize_t received; - - buffer = g_string_new(""); - curr_char = g_strndup("",1); - while ((received = read(qconn->socket, curr_char, 1)) && !strstr(curr_char, "\n")) - { - if(received < 0) - { - /* TODO - recv failed - log */ - - break; - } - else - g_string_append(buffer,curr_char); - } - - if(buffer->str && (buffer->len > 0)) - { - retval = g_strdup(buffer->str); - g_free(curr_char); - g_string_free(buffer,TRUE); - } - else retval = NULL; - - /* caller must g_free() retval */ - return(retval); + GString* buffer; + char* retval = NULL; + gchar* curr_char; + ssize_t received; + + buffer = g_string_new(""); + curr_char = g_strndup("",1); + while ((received = read(qconn->socket, curr_char, 1)) && !strstr(curr_char, "\n")) + { + if(received < 0) + { + /* TODO - recv failed - log */ + + break; + } + else + g_string_append(buffer,curr_char); + } + + if(buffer->str && (buffer->len > 0)) + { + retval = g_strdup(buffer->str); + g_free(curr_char); + g_string_free(buffer,TRUE); + } + else retval = NULL; + + /* caller must g_free() retval */ + return(retval); } /* send_allof * * helper function to send strings of arbitrary length to socket - * returns: + * returns: */ gboolean send_allof(qcop_conn* qconn, char* str) { - int len,bytes_sent; - char* msg; - gboolean rc = TRUE; - - if(str) - { - msg = g_strdup(str); - bytes_sent = 0; - len = strlen(str); - while (bytes_sent < len) - { - bytes_sent = send(qconn->socket, str, (len - bytes_sent), 0); - if(bytes_sent < 0) - { - /* TODO - error log */ - rc = FALSE; - break; - } - else - { - str = str + bytes_sent; - len = strlen(str); - } - } - g_free(msg); - } - - return rc; + int len,bytes_sent; + char* msg; + gboolean rc = TRUE; + + if(str) + { + msg = g_strdup(str); + bytes_sent = 0; + len = strlen(str); + while (bytes_sent < len) + { + bytes_sent = send(qconn->socket, str, (len - bytes_sent), 0); + if(bytes_sent < 0) + { + /* TODO - error log */ + rc = FALSE; + break; + } + else + { + str = str + bytes_sent; + len = strlen(str); + } + } + g_free(msg); + } + + return rc; } /* @@ -150,41 +150,41 @@ gboolean expect(qcop_conn* qconn, char* str, char* failstr, char* errmsg) { - char* pc; + char* pc; - pc = get_line(qconn); - if (pc) /* did we get anything at all? */ - { - if (strstr(pc,str)) /* wait for desired substring */ - { - g_free(pc); - return TRUE; - } - else - { - if (failstr && (strlen(failstr) > 0) && (strstr(pc, failstr))) { - qconn->resultmsg = g_strdup(errmsg); - return FALSE; - } - - if (strstr(pc,"cancelSync")) - { - g_free(pc); - qconn->resultmsg = g_strdup("User cancelled sync"); - return FALSE; - } - else - { - g_free(pc); - return expect(qconn, str, failstr, errmsg); - } - } - } - else - { - qconn->resultmsg = g_strdup(errmsg); - return FALSE; - } + pc = get_line(qconn); + if (pc) /* did we get anything at all? */ + { + if (strstr(pc,str)) /* wait for desired substring */ + { + g_free(pc); + return TRUE; + } + else + { + if (failstr && (strlen(failstr) > 0) && (strstr(pc, failstr))) { + qconn->resultmsg = g_strdup(errmsg); + return FALSE; + } + + if (strstr(pc,"cancelSync")) + { + g_free(pc); + qconn->resultmsg = g_strdup("User cancelled sync"); + return FALSE; + } + else + { + g_free(pc); + return expect(qconn, str, failstr, errmsg); + } + } + } + else + { + qconn->resultmsg = g_strdup(errmsg); + return FALSE; + } } /* Waits for a line from the qcop server that must match one of the substrings @@ -193,44 +193,44 @@ */ gboolean expect_special(qcop_conn* qconn, char* errmsg, gboolean flushing) { - char* pc; + char* pc; - pc = get_line(qconn); - if (pc) - { - if (strstr(pc,"599") || strstr(pc,"200")) - { - if(strstr(pc,"200") && flushing) - { - g_free(pc); - return expect(qconn, "flushDone", NULL, errmsg); - } - else - { - g_free(pc); - return TRUE; - } - } - else - { - if (strstr(pc,"cancelSync")) - { - g_free(pc); - qconn->resultmsg = g_strdup("User cancelled sync"); - return FALSE; - } - else - { - g_free(pc); - return expect_special(qconn, errmsg, flushing); - } - } - } - else - { - qconn->resultmsg = g_strdup(errmsg); - return FALSE; - } + pc = get_line(qconn); + if (pc) + { + if (strstr(pc,"599") || strstr(pc,"200")) + { + if(strstr(pc,"200") && flushing) + { + g_free(pc); + return expect(qconn, "flushDone", NULL, errmsg); + } + else + { + g_free(pc); + return TRUE; + } + } + else + { + if (strstr(pc,"cancelSync")) + { + g_free(pc); + qconn->resultmsg = g_strdup("User cancelled sync"); + return FALSE; + } + else + { + g_free(pc); + return expect_special(qconn, errmsg, flushing); + } + } + } + else + { + qconn->resultmsg = g_strdup(errmsg); + return FALSE; + } } /* @@ -240,56 +240,56 @@ */ qcop_conn* qcop_connect(gchar* addr, gchar* username, gchar* password) { - struct sockaddr_in host_addr; - qcop_conn* qconn = NULL; + struct sockaddr_in host_addr; + qcop_conn* qconn = NULL; - host_addr.sin_family = AF_INET; /* host byte order */ - host_addr.sin_port = htons(OPIEQCOP_PORT); /* short, network byte order */ - host_addr.sin_addr.s_addr = inet_addr(addr); - memset(&(host_addr.sin_zero), '\0', 8); /* zero the rest of the struct */ - - qconn = g_malloc0(sizeof(qcop_conn)); - - qconn->socket = socket(AF_INET, SOCK_STREAM, 0); - qconn->result = FALSE; /* Only set to TRUE if successful */ - if(qconn->socket < 0) - { - qconn->resultmsg = g_strdup_printf("Could not create socket: %s", strerror(errno)); - return qconn; - } - - /* connect to the QCopBridgeServer */ - if (connect(qconn->socket, (struct sockaddr *)&host_addr, sizeof(host_addr)) != -1) - { - - if (expect(qconn, "220", NULL, "Failed to log into server - please check sync security settings on device")) - { - send_allof(qconn, "USER "); - send_allof(qconn, username); - send_allof(qconn, "\n"); - } - else - return qconn; - - if(expect(qconn, "331", "530", "Failed to log into server - please check username")) - { - send_allof(qconn, "PASS "); - send_allof(qconn, password); - send_allof(qconn, "\n"); - } - else - return qconn; - - if(!expect(qconn, "230", "530", "Failed to log into server - please check username / password")) - return qconn; - - /* connected OK */ - qconn->result = TRUE; - } - else - qconn->resultmsg = g_strdup_printf("Could not connect to server: %s", strerror(errno)); - - return qconn; + host_addr.sin_family = AF_INET; /* host byte order */ + host_addr.sin_port = htons(OPIEQCOP_PORT); /* short, network byte order */ + host_addr.sin_addr.s_addr = inet_addr(addr); + memset(&(host_addr.sin_zero), '\0', 8); /* zero the rest of the struct */ + + qconn = g_malloc0(sizeof(qcop_conn)); + + qconn->socket = socket(AF_INET, SOCK_STREAM, 0); + qconn->result = FALSE; /* Only set to TRUE if successful */ + if(qconn->socket < 0) + { + qconn->resultmsg = g_strdup_printf("Could not create socket: %s", strerror(errno)); + return qconn; + } + + /* connect to the QCopBridgeServer */ + if (connect(qconn->socket, (struct sockaddr *)&host_addr, sizeof(host_addr)) != -1) + { + + if (expect(qconn, "220", NULL, "Failed to log into server - please check sync security settings on device")) + { + send_allof(qconn, "USER "); + send_allof(qconn, username); + send_allof(qconn, "\n"); + } + else + return qconn; + + if(expect(qconn, "331", "530", "Failed to log into server - please check username")) + { + send_allof(qconn, "PASS "); + send_allof(qconn, password); + send_allof(qconn, "\n"); + } + else + return qconn; + + if(!expect(qconn, "230", "530", "Failed to log into server - please check username / password")) + return qconn; + + /* connected OK */ + qconn->result = TRUE; + } + else + qconn->resultmsg = g_strdup_printf("Could not connect to server: %s", strerror(errno)); + + return qconn; } @@ -298,16 +298,16 @@ */ void qcop_disconnect(qcop_conn* qconn) { - if(qconn) - { - if(qconn->socket) - { - send_allof(qconn, "QUIT\n"); - close(qconn->socket); - } - - qcop_freeqconn(qconn); - } + if(qconn) + { + if(qconn->socket) + { + send_allof(qconn, "QUIT\n"); + close(qconn->socket); + } + + qcop_freeqconn(qconn); + } } @@ -316,12 +316,12 @@ */ void qcop_freeqconn(qcop_conn* qconn) { - if (qconn) - { - if (qconn->resultmsg) - g_free(qconn->resultmsg); - g_free(qconn); - } + if (qconn) + { + if (qconn->resultmsg) + g_free(qconn->resultmsg); + g_free(qconn); + } } @@ -330,59 +330,59 @@ */ char* qcop_get_root(qcop_conn* qconn) { - gchar* temp = NULL; - char* start; - gchar* pc; - - send_allof(qconn, "CALL QPE/System sendHandshakeInfo()\n"); - - if (!expect(qconn, "200", NULL, "Failed to obtain HandshakeInfo")) - return NULL; - pc = get_line(qconn); - if(!strstr(pc, "handshakeInfo(QString,bool)")) - { - qconn->resultmsg = g_strdup_printf("Unrecognised response: %s", pc); - g_free(pc); - return NULL; - } - - if ((start=strstr(strstr(pc,"/")+1,"/"))) /* We need the second slash */ - { - /* caller responsible for free()ing temp */ - temp = g_strndup(start,strstr(start," ")-start); /* from slash to blank is our path */ - } - else if((start=strstr(pc,") ")+2)) - { - /* Qtopia sends back a base64 encoded utf-16 (big-endian) string */ - guchar *decoded; - char *startc; - gsize len = 0; - gsize len2 = 0; - GError *err = NULL; - - decoded = g_base64_decode(start, &len); - if(len > 0) { - /* first four bytes seem to be \0 \0 \0 (string length) */ - len = decoded[3]; - startc = decoded + 4; - temp = g_convert(startc, len, "UTF8", "UTF16BE", NULL, &len2, &err); - if (err != NULL) { - fprintf(stderr, "UTF16 convert error: %s\n", err->message); - g_error_free(err); - if(temp) { - /* Don't accept partial conversions */ - g_free(temp); - temp = NULL; - } - } - } - } + gchar* temp = NULL; + char* start; + gchar* pc; + + send_allof(qconn, "CALL QPE/System sendHandshakeInfo()\n"); + + if (!expect(qconn, "200", NULL, "Failed to obtain HandshakeInfo")) + return NULL; + pc = get_line(qconn); + if(!strstr(pc, "handshakeInfo(QString,bool)")) + { + qconn->resultmsg = g_strdup_printf("Unrecognised response: %s", pc); + g_free(pc); + return NULL; + } + + if ((start=strstr(strstr(pc,"/")+1,"/"))) /* We need the second slash */ + { + /* caller responsible for free()ing temp */ + temp = g_strndup(start,strstr(start," ")-start); /* from slash to blank is our path */ + } + else if((start=strstr(pc,") ")+2)) + { + /* Qtopia sends back a base64 encoded utf-16 (big-endian) string */ + guchar *decoded; + char *startc; + gsize len = 0; + gsize len2 = 0; + GError *err = NULL; + + decoded = g_base64_decode(start, &len); + if(len > 0) { + /* first four bytes seem to be \0 \0 \0 (string length) */ + len = decoded[3]; + startc = decoded + 4; + temp = g_convert(startc, len, "UTF8", "UTF16BE", NULL, &len2, &err); + if (err != NULL) { + fprintf(stderr, "UTF16 convert error: %s\n", err->message); + g_error_free(err); + if(temp) { + /* Don't accept partial conversions */ + g_free(temp); + temp = NULL; + } + } + } + } - if(!temp) - qconn->resultmsg = g_strdup_printf("Unrecognised response: %s", pc); + if(!temp) + qconn->resultmsg = g_strdup_printf("Unrecognised response: %s", pc); - g_free(pc); - return temp; + g_free(pc); + return temp; } @@ -391,48 +391,48 @@ */ void qcop_start_sync(qcop_conn* qconn, void (*cancel_routine)()) { - qcop_monitor_data* data; + qcop_monitor_data* data; - qconn->result = FALSE; /* ..until proven otherwise */ + qconn->result = FALSE; /* ..until proven otherwise */ - /* first lock the UI */ - send_allof(qconn, "CALL QPE/System startSync(QString) OpenSync\n"); - if(!expect(qconn, "200", NULL, "Failed to bring up sync screen!")) - return; - /* Flush addressbook to storage */ - send_allof(qconn, "CALL QPE/Application/addressbook flush()\n"); - if (!expect_special(qconn,"Failed to flush addressbook",TRUE)) - return; - /* Flush datebook to storage */ - send_allof(qconn, "CALL QPE/Application/datebook flush()\n"); - if (!expect_special(qconn,"Failed to flush datebook",TRUE)) - return; - /* Flush todolist to storage */ - send_allof(qconn, "CALL QPE/Application/todolist flush()\n"); - if (!expect_special(qconn,"Failed to flush todolist",TRUE)) - return; - - /* spawn the monitor thread */ - data = g_malloc0(sizeof(qcop_monitor_data)); - data->qconn = qconn; - data->cancel_routine = cancel_routine; - qconn->syncing = TRUE; - pthread_mutex_init(&qconn->access_mutex,NULL); - /* FIXME the monitor thread interferes with reading data from - the socket in the main thread (in a non-deterministic way - even!); since we don't support cancelling at the moment anyway - I have disabled the monitor thread until I can figure out the - proper way of doing this. */ -/* if(pthread_create(&monitor_thd, - NULL, - (void *)monitor_thread_main, - (void*)data) != 0) - {*/ - /* error creating thread */ - /* TODO - log */ -/* }*/ - qconn->result = TRUE; - return; + /* first lock the UI */ + send_allof(qconn, "CALL QPE/System startSync(QString) OpenSync\n"); + if(!expect(qconn, "200", NULL, "Failed to bring up sync screen!")) + return; + /* Flush addressbook to storage */ + send_allof(qconn, "CALL QPE/Application/addressbook flush()\n"); + if (!expect_special(qconn,"Failed to flush addressbook",TRUE)) + return; + /* Flush datebook to storage */ + send_allof(qconn, "CALL QPE/Application/datebook flush()\n"); + if (!expect_special(qconn,"Failed to flush datebook",TRUE)) + return; + /* Flush todolist to storage */ + send_allof(qconn, "CALL QPE/Application/todolist flush()\n"); + if (!expect_special(qconn,"Failed to flush todolist",TRUE)) + return; + + /* spawn the monitor thread */ + data = g_malloc0(sizeof(qcop_monitor_data)); + data->qconn = qconn; + data->cancel_routine = cancel_routine; + qconn->syncing = TRUE; + pthread_mutex_init(&qconn->access_mutex,NULL); + /* FIXME the monitor thread interferes with reading data from + the socket in the main thread (in a non-deterministic way + even!); since we don't support cancelling at the moment anyway + I have disabled the monitor thread until I can figure out the + proper way of doing this. */ +/* if(pthread_create(&monitor_thd, + NULL, + (void *)monitor_thread_main, + (void*)data) != 0) + {*/ + /* error creating thread */ + /* TODO - log */ +/* }*/ + qconn->result = TRUE; + return; } @@ -441,35 +441,35 @@ */ void qcop_stop_sync(qcop_conn* qconn) { - if(qconn && qconn->syncing) - { - pthread_mutex_lock(&qconn->access_mutex); - qconn->result = FALSE; /* ..until... */ - qconn->syncing = FALSE; - pthread_mutex_unlock(&qconn->access_mutex); - if (monitor_thd) - pthread_join(monitor_thd,NULL); - pthread_mutex_destroy(&qconn->access_mutex); - /* Reload addressbook data */ - send_allof(qconn, "CALL QPE/Application/addressbook reload()\n"); - if(!expect_special(qconn,"Failed to reload addressbook",FALSE)) - return; - /* Reload datebook data */ - send_allof(qconn, "CALL QPE/Application/datebook reload()\n"); - if(!expect_special(qconn,"Failed to reload datebook",FALSE)) - return; - /* Reload todolist data */ - send_allof(qconn, "CALL QPE/Application/todolist reload()\n"); - if(!expect_special(qconn,"Failed to reload todolist",FALSE)) - return; - /* unlock the GUI */ - send_allof(qconn, "CALL QPE/System stopSync()\n"); - if(!expect(qconn, "200", NULL, "Failed to close sync screen")) - return; - qconn->result = TRUE; - } - - return; + if(qconn && qconn->syncing) + { + pthread_mutex_lock(&qconn->access_mutex); + qconn->result = FALSE; /* ..until... */ + qconn->syncing = FALSE; + pthread_mutex_unlock(&qconn->access_mutex); + if (monitor_thd) + pthread_join(monitor_thd,NULL); + pthread_mutex_destroy(&qconn->access_mutex); + /* Reload addressbook data */ + send_allof(qconn, "CALL QPE/Application/addressbook reload()\n"); + if(!expect_special(qconn,"Failed to reload addressbook",FALSE)) + return; + /* Reload datebook data */ + send_allof(qconn, "CALL QPE/Application/datebook reload()\n"); + if(!expect_special(qconn,"Failed to reload datebook",FALSE)) + return; + /* Reload todolist data */ + send_allof(qconn, "CALL QPE/Application/todolist reload()\n"); + if(!expect_special(qconn,"Failed to reload todolist",FALSE)) + return; + /* unlock the GUI */ + send_allof(qconn, "CALL QPE/System stopSync()\n"); + if(!expect(qconn, "200", NULL, "Failed to close sync screen")) + return; + qconn->result = TRUE; + } + + return; } @@ -478,57 +478,57 @@ */ void monitor_thread_main(qcop_monitor_data* data) { - /* listen on the socket and read the input, looking for the cancel - * when the cancel is found, call the supplied cancel routine - */ - fd_set qcop_socket; - struct timeval tv; - int retval; - gchar* mon_pc; - - FD_ZERO(&qcop_socket); - FD_SET(data->qconn->socket,&qcop_socket); - - while(1) - { - /* qconn is ours for the time being */ - pthread_mutex_lock(&data->qconn->access_mutex); - - /* wait for one second with each select() */ - tv.tv_sec = 1; - tv.tv_usec = 0; - - retval=select(data->qconn->socket+1,&qcop_socket,NULL,NULL,&tv); - if (retval > 0) - { - mon_pc = get_line(data->qconn); - if ( mon_pc ) - { - if (strstr(mon_pc,"cancelSync()")) - { - g_free(mon_pc); - data->qconn->syncing = FALSE; - (data->cancel_routine)(); - } - else - { - perror("Error on select() call or no data"); - g_free(mon_pc); - } - } - } - - /* we are done */ - if (!data->qconn->syncing) - { - pthread_mutex_unlock(&data->qconn->access_mutex); - g_free(data); - pthread_exit(NULL); - } - - /* unlock for a moment allow access for other threads */ - pthread_mutex_unlock(&data->qconn->access_mutex); - sleep(1); - } + /* listen on the socket and read the input, looking for the cancel + * when the cancel is found, call the supplied cancel routine + */ + fd_set qcop_socket; + struct timeval tv; + int retval; + gchar* mon_pc; + + FD_ZERO(&qcop_socket); + FD_SET(data->qconn->socket,&qcop_socket); + + while(1) + { + /* qconn is ours for the time being */ + pthread_mutex_lock(&data->qconn->access_mutex); + + /* wait for one second with each select() */ + tv.tv_sec = 1; + tv.tv_usec = 0; + + retval=select(data->qconn->socket+1,&qcop_socket,NULL,NULL,&tv); + if (retval > 0) + { + mon_pc = get_line(data->qconn); + if ( mon_pc ) + { + if (strstr(mon_pc,"cancelSync()")) + { + g_free(mon_pc); + data->qconn->syncing = FALSE; + (data->cancel_routine)(); + } + else + { + perror("Error on select() call or no data"); + g_free(mon_pc); + } + } + } + + /* we are done */ + if (!data->qconn->syncing) + { + pthread_mutex_unlock(&data->qconn->access_mutex); + g_free(data); + pthread_exit(NULL); + } + + /* unlock for a moment allow access for other threads */ + pthread_mutex_unlock(&data->qconn->access_mutex); + sleep(1); + } } Modified: plugins/opie-sync/src/opie_qcop.h ============================================================================== --- plugins/opie-sync/src/opie_qcop.h Fri Sep 25 21:44:39 2009 (r5852) +++ plugins/opie-sync/src/opie_qcop.h Sat Sep 26 15:37:36 2009 (r5853) @@ -32,24 +32,26 @@ typedef struct { - gboolean result; /* result of the previous operation */ - char* resultmsg; /* string associated with the result (error msg, etc) */ - int socket; /* socket open to the QCopBridge server */ - gboolean syncing; /* Tells us whether we are currently syncing */ - pthread_mutex_t access_mutex; /* At times we have two threads sharing access, so we need this */ + gboolean result; /* result of the previous operation */ + char* resultmsg; /* string associated with the result (error msg, etc) */ + int socket; /* socket open to the QCopBridge server */ + gboolean syncing; /* Tells us whether we are currently syncing */ + pthread_mutex_t access_mutex; /* At times we have two threads sharing access, so we need this */ } qcop_conn; typedef struct { - qcop_conn* qconn; /* the socket */ - void (*cancel_routine)(); /* routine to call if the user cancels the sync */ + qcop_conn* qconn; /* the socket */ + void (*cancel_routine)(); /* routine to call if the user cancels the sync */ } qcop_monitor_data; qcop_conn* qcop_connect(gchar* addr, gchar* username, gchar* password); void qcop_disconnect(qcop_conn* qconn); void qcop_freeqconn(qcop_conn* qconn); +gboolean qcop_send(qcop_conn* qconn, const char *message, const char *args); +char *qcop_wait_for(qcop_conn* qconn, const char *message); char* qcop_get_root(qcop_conn* qconn); void qcop_start_sync(qcop_conn* qconn, void (*cancel_routine)()); void qcop_stop_sync(qcop_conn* qconn); |
From: <svn...@op...> - 2009-09-25 19:44:56
|
Author: paule Date: Fri Sep 25 21:44:39 2009 New Revision: 5852 URL: http://www.opensync.org/changeset/5852 Log: opie-sync: remove the password configuration option, and instead generate it randomly on first sync and store it in the main sink's state db. (From the Opie side this was never meant to be something the user can configure, and users usually (mistakenly) end up using their actual root password which is not really desirable.) Modified: plugins/opie-sync/README plugins/opie-sync/src/opie-sync plugins/opie-sync/src/opie_sync.c Modified: plugins/opie-sync/README ============================================================================== --- plugins/opie-sync/README Fri Sep 25 21:36:03 2009 (r5851) +++ plugins/opie-sync/README Fri Sep 25 21:44:39 2009 (r5852) @@ -53,13 +53,6 @@ Username User name to log into the device as (default root). - Password - Password to log into the device with (default Qtopia). Note that this is - the synchronisation password and _not_ the actual password for the user. - Note: in current versions of Opie this password must begin with "Qtopia" - or "rootme" and the two characters after that are ignored. This will be - fixed in later versions. - Advanced Options The "advanced options" specific to opie-sync are as follows: @@ -127,8 +120,7 @@ Make sure you have set the security options properly on the Opie side - go to Settings->Security->Sync and set the "Accept sync from network" option to an appropriate value for your network setup. You should also check the - username and password set in the configuration for the plugin. See the notes - under the "Password" option above. + username set in the configuration for the plugin (should usually be "root"). Syncing freezes at a particular point Modified: plugins/opie-sync/src/opie-sync ============================================================================== --- plugins/opie-sync/src/opie-sync Fri Sep 25 21:36:03 2009 (r5851) +++ plugins/opie-sync/src/opie-sync Fri Sep 25 21:44:39 2009 (r5852) @@ -39,7 +39,6 @@ </AdvancedOptions> <Authentication> <Username>root</Username> - <Password>Qtopia</Password> </Authentication> <Connection> <Network> Modified: plugins/opie-sync/src/opie_sync.c ============================================================================== --- plugins/opie-sync/src/opie_sync.c Fri Sep 25 21:36:03 2009 (r5851) +++ plugins/opie-sync/src/opie_sync.c Fri Sep 25 21:44:39 2009 (r5852) @@ -49,7 +49,6 @@ /* Set defaults */ env->username = g_strdup("root"); - env->password = g_strdup("Qtopia"); env->host = g_strdup("192.168.0.202"); env->device_type = OPIE_SYNC_OPIE; env->conn_type = OPIE_CONN_FTP; @@ -84,11 +83,6 @@ g_free(env->username); env->username = g_strdup(username); } - const char *password = osync_plugin_authentication_get_password(auth); - if(password) { - g_free(env->password); - env->password = g_strdup(password); - } } OSyncList *advoptions = osync_plugin_config_get_advancedoptions(config); @@ -253,7 +247,26 @@ OSyncError *error = NULL; g_mutex_lock(env->plugin_env->plugin_mutex); - + + /* Get the sync key (password) + We generate this ourselves rather than allowing the user to set it - + that's how it's supposed to be done */ + OSyncSinkStateDB *state_db = osync_objtype_sink_get_state_db(sink); + char *key = osync_sink_state_get(state_db, "sync_key", &error); + if(!key) { + g_mutex_unlock(env->plugin_env->plugin_mutex); + goto error; + } + g_free(env->plugin_env->password); + if(strlen(key) == 0) { + g_free(key); + key = osync_rand_str(10, &error); + env->plugin_env->password = g_strdup_printf("QtopiaXX%s", key); + } + else + env->plugin_env->password = g_strdup(key); + osync_free(key); + if(!env->plugin_env->connected) { /* We only want to connect once per session */ |
From: <svn...@op...> - 2009-09-25 19:36:23
|
Author: paule Date: Fri Sep 25 21:36:03 2009 New Revision: 5851 URL: http://www.opensync.org/changeset/5851 Log: opie-sync: add main sink and move shared device connect/disconnect to it Modified: plugins/opie-sync/src/opie_sync.c plugins/opie-sync/src/opie_sync.h Modified: plugins/opie-sync/src/opie_sync.c ============================================================================== --- plugins/opie-sync/src/opie_sync.c Fri Sep 25 21:26:37 2009 (r5850) +++ plugins/opie-sync/src/opie_sync.c Fri Sep 25 21:36:03 2009 (r5851) @@ -245,11 +245,10 @@ return FALSE; } - -static void opie_sync_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +static void opie_sync_main_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) { osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); - OpieSinkEnv *env = (OpieSinkEnv *)data; + OpieMainSinkEnv *env = (OpieMainSinkEnv *)data; OSyncError *error = NULL; @@ -257,26 +256,75 @@ if(!env->plugin_env->connected) { /* We only want to connect once per session */ - + if (!device_connect(env->plugin_env, &error)) { g_mutex_unlock(env->plugin_env->plugin_mutex); goto error; } env->plugin_env->connected = TRUE; } - + if(!env->plugin_env->categories_doc) { /* Fetch categories */ opie_fetch_file(env->plugin_env, OPIE_OBJECT_TYPE_CATEGORY, OPIE_CATEGORY_FILE, &env->plugin_env->categories_doc, NULL, ctx); } - + g_mutex_unlock(env->plugin_env->plugin_mutex); + + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); + return; + +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); +} + +static void opie_sync_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); + OpieSinkEnv *env = (OpieSinkEnv *)data; + + OSyncError *error = NULL; + + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); + return; + +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); +} + +static void opie_sync_get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %d, %p)", __func__, sink, info, ctx, slow_sync, data); + OpieSinkEnv *env = (OpieSinkEnv *)data; + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); + + OSyncError *error = NULL; + + g_mutex_lock(env->plugin_env->plugin_mutex); + gboolean connected = env->plugin_env->connected; + g_mutex_unlock(env->plugin_env->plugin_mutex); + + if(!connected) { + char *errmsg; + errmsg = g_strdup_printf("Device not connected"); + osync_error_set(&error, OSYNC_ERROR_GENERIC, errmsg); + g_free(errmsg); + goto error; + } + /* pull the required data back */ if(!opie_fetch_sink(env, ctx)) { /* failed */ char *errmsg; + /* FIXME this should be being done already? */ device_disconnect(env->plugin_env, &error); errmsg = g_strdup_printf("Failed to load data from device %s", env->plugin_env->host); osync_error_set(&error, OSYNC_ERROR_GENERIC, errmsg); @@ -294,24 +342,6 @@ osync_context_report_slowsync(ctx); } - osync_context_report_success(ctx); - osync_trace(TRACE_EXIT, "%s", __func__); - return; - -error: - osync_context_report_osyncerror(ctx, error); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); - osync_error_unref(&error); -} - -static void opie_sync_get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %d, %p)", __func__, sink, info, ctx, slow_sync, data); - OpieSinkEnv *env = (OpieSinkEnv *)data; - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); - - OSyncError *error = NULL; - if (slow_sync) { osync_trace(TRACE_INTERNAL, "Slow sync requested"); @@ -432,6 +462,11 @@ //Now we need to answer the call osync_context_report_success(ctx); osync_trace(TRACE_EXIT, "%s", __func__); + return; +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); } static void opie_sync_commit_change(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data) @@ -569,6 +604,27 @@ osync_error_unref(&error); } +static void opie_sync_main_sync_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); + OpieMainSinkEnv *env = (OpieMainSinkEnv *)data; + OSyncError *error = NULL; + + /* Put categories */ + if(env->plugin_env->categories_doc && env->plugin_env->categories_doc->_private == 0) { + opie_put_file(env->plugin_env, OPIE_OBJECT_TYPE_CATEGORY, OPIE_CATEGORY_FILE, env->plugin_env->categories_doc); + } + + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); + return; + +error: + osync_context_report_osyncerror(ctx, error); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); + osync_error_unref(&error); +} + static void opie_sync_disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) { OpieSinkEnv *env = (OpieSinkEnv *)data; @@ -577,6 +633,19 @@ osync_context_report_success(ctx); } +static void opie_sync_main_disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + OpieMainSinkEnv *env = (OpieMainSinkEnv *)data; + + OSyncError *error = NULL; + device_disconnect(env->plugin_env, &error); + + comms_shutdown(); + + //Answer the call + osync_context_report_success(ctx); +} + OpieSinkEnv *opie_sync_create_sink_env(OpiePluginEnv *env, OSyncPluginInfo *info, const char *objtype, const char *objformat, OPIE_OBJECT_TYPE opie_objtype, const char *remotefile, const char *listelement, const char *itemelement, OSyncError **error) { OSyncObjTypeSink *sink = osync_plugin_info_find_objtype(info, objtype); @@ -628,6 +697,21 @@ env->backuppath = NULL; env->plugin_mutex = g_mutex_new(); + + /* Main sink */ + env->main_sink_env = osync_try_malloc0(sizeof(OpieMainSinkEnv), error); + env->main_sink_env->plugin_env = env; + env->main_sink_env->sink = osync_objtype_main_sink_new(error); + if(!env->main_sink_env->sink) + goto error_free_env; + + osync_objtype_sink_set_connect_func(env->main_sink_env->sink, opie_sync_main_connect); + osync_objtype_sink_set_disconnect_func(env->main_sink_env->sink, opie_sync_main_disconnect); + osync_objtype_sink_set_sync_done_func(env->main_sink_env->sink, opie_sync_main_sync_done); + osync_objtype_sink_set_userdata(env->main_sink_env->sink, env->main_sink_env); + osync_objtype_sink_enable_state_db(env->main_sink_env->sink, TRUE); + + osync_plugin_info_set_main_sink(info, env->main_sink_env->sink); /* Contacts sink */ env->contact_env = opie_sync_create_sink_env(env, info, "contact", OPIE_FORMAT_XML_CONTACT, OPIE_OBJECT_TYPE_CONTACT, OPIE_ADDRESS_FILE, "Contacts", "Contact", error); @@ -670,16 +754,6 @@ osync_trace(TRACE_ENTRY, "%s(%p)", __func__, userdata); OpiePluginEnv *env = (OpiePluginEnv *)userdata; - /* Put categories */ - if(env->categories_doc && env->categories_doc->_private == 0) { - opie_put_file(env, OPIE_OBJECT_TYPE_CATEGORY, OPIE_CATEGORY_FILE, env->categories_doc); - } - - OSyncError *error = NULL; - device_disconnect(env, &error); - - comms_shutdown(); - g_mutex_free(env->plugin_mutex); g_free(env->contact_env); @@ -697,7 +771,7 @@ static osync_bool opie_sync_discover(OSyncPluginInfo *info, void *data, OSyncError **error) { - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, error); + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, info, data, error); OSyncList *l, *list = NULL; list = osync_plugin_info_get_objtype_sinks(info); Modified: plugins/opie-sync/src/opie_sync.h ============================================================================== --- plugins/opie-sync/src/opie_sync.h Fri Sep 25 21:26:37 2009 (r5850) +++ plugins/opie-sync/src/opie_sync.h Fri Sep 25 21:36:03 2009 (r5851) @@ -36,6 +36,7 @@ typedef struct OpiePluginEnv OpiePluginEnv; typedef struct OpieSinkEnv OpieSinkEnv; +typedef struct OpieMainSinkEnv OpieMainSinkEnv; typedef enum { OPIE_SYNC_QTOPIA_2, @@ -81,6 +82,7 @@ OpieSinkEnv* todo_env; OpieSinkEnv* event_env; OpieSinkEnv* note_env; + OpieMainSinkEnv* main_sink_env; GMutex* plugin_mutex; }; @@ -96,6 +98,11 @@ OPIE_OBJECT_TYPE objtype; }; +struct OpieMainSinkEnv { + OpiePluginEnv* plugin_env; + OSyncObjTypeSink* sink; +}; + #define OPIE_FORMAT_XML_CONTACT "opie-xml-contact" #define OPIE_FORMAT_XML_TODO "opie-xml-todo" #define OPIE_FORMAT_XML_EVENT "opie-xml-event" |
From: <svn...@op...> - 2009-09-25 19:26:56
|
Author: paule Date: Fri Sep 25 21:26:37 2009 New Revision: 5850 URL: http://www.opensync.org/changeset/5850 Log: opie-sync: fixes for XMLFormat schema changes for alarms Modified: plugins/opie-sync/src/opie_format.c Modified: plugins/opie-sync/src/opie_format.c ============================================================================== --- plugins/opie-sync/src/opie_format.c Fri Sep 25 13:04:00 2009 (r5849) +++ plugins/opie-sync/src/opie_format.c Fri Sep 25 21:26:37 2009 (r5850) @@ -1002,8 +1002,6 @@ /* Alarm */ char *alarmminsstr = xmlGetProp(icur, "alarm"); if(alarmminsstr) { - out_xmlfield = osync_xmlfield_new(out_xmlformat, "Alarm", error); - int alarmsound = 0; char *alarmsoundstr = xmlGetProp(icur, "sound"); if(alarmsoundstr) { @@ -1011,10 +1009,14 @@ alarmsound = 1; xmlFree(alarmsoundstr); } - if(alarmsound == 1) + if(alarmsound == 1) { + out_xmlfield = osync_xmlfield_new(out_xmlformat, "AlarmAudio", error); osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "AUDIO", error); - else + } + else { + out_xmlfield = osync_xmlfield_new(out_xmlformat, "AlarmDisplay", error); osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "DISPLAY", error); + } int alarmseconds = -(atoi(alarmminsstr) * 60); char *alarmdu = osync_time_sec2alarmdu(alarmseconds); @@ -1691,8 +1693,6 @@ gchar** alarmentries = g_strsplit(alarmstr, ";", 0); int i,j; for(j=0; alarmentries[j] != NULL; j++) { - OSyncXMLField *out_xmlfield = osync_xmlfield_new(out_xmlformat, "Alarm", error); - // Opie alarm entry format: ddmmyyyyhhmmss:0:<0=silent,1=loud>:[;nextalarmentry] char *alarmdatestr = NULL; int alarmsound = 0; @@ -1709,12 +1709,17 @@ alarmsound = atoi(alarmargs[i]); } g_strfreev(alarmargs); - - if(alarmsound == 1) + + OSyncXMLField *out_xmlfield; + if(alarmsound == 1) { + out_xmlfield = osync_xmlfield_new(out_xmlformat, "AlarmAudio", error); osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "AUDIO", error); - else + } + else { + out_xmlfield = osync_xmlfield_new(out_xmlformat, "AlarmDisplay", error); osync_xmlfield_set_key_value(out_xmlfield, "AlarmAction", "DISPLAY", error); - + } + if(alarmdatestr) { struct tm *alarmtm = osync_time_vtime2tm(alarmdatestr, error); time_t alarmtime = mktime(alarmtm); @@ -1745,7 +1750,7 @@ OSyncXMLField *in_xmlfield = osync_xmlformat_get_first_field(in_xmlformat); while(in_xmlfield) { const char *fieldname = osync_xmlfield_get_name(in_xmlfield); - if(!strcmp("Alarm", fieldname)) { + if(!strcmp("AlarmAudio", fieldname) || !strcmp("AlarmDisplay", fieldname)) { char *alarmdatestr = NULL; const char *trigger = osync_xmlfield_get_key_value(in_xmlfield, "AlarmTrigger"); if(trigger) { @@ -1799,7 +1804,7 @@ OSyncXMLField *in_xmlfield = osync_xmlformat_get_first_field(in_xmlformat); while(in_xmlfield) { const char *fieldname = osync_xmlfield_get_name(in_xmlfield); - if(!strcmp("Alarm", fieldname)) { + if(!strcmp("AlarmAudio", fieldname) || !strcmp("AlarmDisplay", fieldname)) { const char *trigger = osync_xmlfield_get_key_value(in_xmlfield, "AlarmTrigger"); if(trigger) alarmseconds = osync_time_alarmdu2sec(trigger); |
From: <svn...@op...> - 2009-09-25 14:17:11
|
Author: bellmich Date: Fri Sep 25 16:17:01 2009 New Revision: 1288 URL: http://libsyncml.opensync.org/changeset/1288 Log: added notice about patch from Jim Radford Modified: trunk/ChangeLog Modified: trunk/ChangeLog ============================================================================== --- trunk/ChangeLog Fri Sep 25 16:16:36 2009 (r1287) +++ trunk/ChangeLog Fri Sep 25 16:17:01 2009 (r1288) @@ -1,6 +1,8 @@ * Only data sync and dev inf API survive API renewal * server can handle now several sessions at once * map fragmentation is supported + * Jim Radford <ra...@bl...> supplied a fix for some hangs on + 64 bit machines because of mixed data types (r1285). 2009-06-04 Michael Bell <mic...@we...> * Released 0.5.4 |
From: <svn...@op...> - 2009-09-25 14:16:47
|
Author: bellmich Date: Fri Sep 25 16:16:36 2009 New Revision: 1287 URL: http://libsyncml.opensync.org/changeset/1287 Log: fixed binary content type test (base64 conversion is tested now) Modified: trunk/tests/check_data_sync_api.c Modified: trunk/tests/check_data_sync_api.c ============================================================================== --- trunk/tests/check_data_sync_api.c Fri Sep 25 16:13:12 2009 (r1286) +++ trunk/tests/check_data_sync_api.c Fri Sep 25 16:16:36 2009 (r1287) @@ -36,6 +36,7 @@ GList *items; SmlDataSync *client; SmlDataSyncDataStore *data_store; + gboolean is_binary; } SmlDataSyncTestClient; SmlDataSync *server; @@ -117,7 +118,11 @@ SmlDataSyncChangeItem *item = sml_data_sync_change_item_new(); sml_data_sync_change_item_set_action(item, SML_CHANGE_ADD); - sml_fail_unless(sml_data_sync_change_item_set_data(item, list->data, 0, error), "%s", GET_ERROR_MESSAGE((*error))); + if (client->is_binary) { + sml_fail_unless(sml_data_sync_change_item_set_binary_data(item, list->data, strlen(list->data), error), "%s", GET_ERROR_MESSAGE((*error))); + } else { + sml_fail_unless(sml_data_sync_change_item_set_data(item, list->data, 0, error), "%s", GET_ERROR_MESSAGE((*error))); + } sml_fail_unless(sml_data_sync_change_item_set_location(item, loc, error), "%s", GET_ERROR_MESSAGE((*error))); g_object_unref(loc); loc = NULL; @@ -233,9 +238,7 @@ count++; /* test the uid */ - smlTrace(TRACE_INTERNAL, "%s - case 1 %p %p", __func__, item, sml_data_sync_change_item_get_location(item)); const gchar *uid = sml_location_get_full_uri(sml_data_sync_change_item_get_location(item)); - smlTrace(TRACE_INTERNAL, "%s - case 1", __func__); char *name = g_strdup_printf("%d", count); if (strcmp(name, uid)) { smlSafeCFree(&name); @@ -245,8 +248,22 @@ /* item with correct uid */ const gchar *data = sml_data_sync_change_item_get_data(item); - if (strcmp(list->data, data)) { - sml_fail_unless(FALSE, "The data of the item %s was wrong(%s != %s).", uid, data, list->data); + if (client->is_binary) { + /* this is a base64 encoded item */ + if (!strcmp(list->data, data)) { + sml_fail_unless(FALSE, "The binary item was not base64 encoded.", uid, data, list->data); + } + gchar *binary = NULL; + gsize size = 0; + sml_fail_unless(sml_data_sync_change_item_get_binary_data(item, &binary, &size, error), "%s", GET_ERROR_MESSAGE((*error))); + sml_fail_unless(strlen(list->data) == size, "The length of the decoded item is wrong."); + sml_fail_unless(strcmp(list->data, binary) == 0, "The data of the decoded item is wrong."); + smlSafeCFree(&binary); + } else { + /* this is a plain text item */ + if (strcmp(list->data, data)) { + sml_fail_unless(FALSE, "The data of the item %s was wrong(%s != %s).", uid, data, list->data); + } } } @@ -691,6 +708,7 @@ client->data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (client->data_store, "image/jpeg"); sml_data_sync_data_store_set_local_uri (client->data_store, "dcim"); + client->is_binary = TRUE; sml_data_sync_data_store_register_change_callback(client->data_store, clientRecvChangeCallback, NULL); if (!sml_data_sync_add_data_store(client->client, client->data_store, &error)) goto error; |
From: <svn...@op...> - 2009-09-25 14:13:26
|
Author: bellmich Date: Fri Sep 25 16:13:12 2009 New Revision: 1286 URL: http://libsyncml.opensync.org/changeset/1286 Log: added support for the decoding of base64 encoded content sml_data_sync_change_item_get_binary_data Modified: trunk/libsyncml/data_sync_api/sml_data_sync_change_item.c trunk/libsyncml/data_sync_api/sml_data_sync_change_item.h trunk/tests/CMakeLists.txt trunk/tests/check_data_sync_api_change_item.c Modified: trunk/libsyncml/data_sync_api/sml_data_sync_change_item.c ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync_change_item.c Thu Sep 24 19:22:21 2009 (r1285) +++ trunk/libsyncml/data_sync_api/sml_data_sync_change_item.c Fri Sep 25 16:13:12 2009 (r1286) @@ -351,6 +351,42 @@ } /** + * sml_data_sync_change_item_get_binary_data: + * @self: A #SmlDataSyncChangeItem + * @data: A pointer of a #gchar pointer + * @size: A pointer of #gsize + * + * Gets the data property. + * + * Return value: + */ +gboolean +sml_data_sync_change_item_get_binary_data (SmlDataSyncChangeItem *self, + gchar **data, + gsize *size, + GError **error) +{ + CHECK_ERROR_REF + sml_return_val_error_if_fail (SML_IS_DATA_SYNC_CHANGE_ITEM (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDataSyncChangeItem object."); + sml_return_val_error_if_fail (data, FALSE, error, SML_ERROR_GENERIC, "The data pointer must be present."); + sml_return_val_error_if_fail (*data == NULL, FALSE, error, SML_ERROR_GENERIC, "The data pointer must be empty."); + sml_return_val_error_if_fail (size, FALSE, error, SML_ERROR_GENERIC, "The size pointer must be present."); + sml_return_val_error_if_fail (*size == 0, FALSE, error, SML_ERROR_GENERIC, "The size pointer must be 0."); + + /* check if there is something to convert */ + if (self->priv->data == NULL || + strlen(self->priv->data) == 0) { + *data = NULL; + *size = 0; + return TRUE; + } + *data = g_base64_decode(self->priv->data, size); + sml_return_val_error_if_fail (size != 0, FALSE, error, SML_ERROR_GENERIC, "The base64 decoding failed."); + + return TRUE; +} + +/** * sml_data_sync_change_item_set_binary_data: * @self: A #SmlDataSyncChangeItem * @data: Modified: trunk/libsyncml/data_sync_api/sml_data_sync_change_item.h ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync_change_item.h Thu Sep 24 19:22:21 2009 (r1285) +++ trunk/libsyncml/data_sync_api/sml_data_sync_change_item.h Fri Sep 25 16:13:12 2009 (r1286) @@ -63,6 +63,7 @@ gboolean sml_data_sync_change_item_set_location (SmlDataSyncChangeItem *self, SmlLocation* remote, GError **error); G_CONST_RETURN gchar* sml_data_sync_change_item_get_data (SmlDataSyncChangeItem *self); gboolean sml_data_sync_change_item_set_data (SmlDataSyncChangeItem *self, const gchar *data, gsize size, GError **error); +gboolean sml_data_sync_change_item_get_binary_data (SmlDataSyncChangeItem *self, gchar **data, gsize *size, GError **error); gboolean sml_data_sync_change_item_set_binary_data (SmlDataSyncChangeItem *self, const gchar *data, gsize size, GError **error); G_CONST_RETURN gchar* sml_data_sync_change_item_get_content_type (SmlDataSyncChangeItem *self); SmlChangeType sml_data_sync_change_item_get_action (SmlDataSyncChangeItem *self); Modified: trunk/tests/CMakeLists.txt ============================================================================== --- trunk/tests/CMakeLists.txt Thu Sep 24 19:22:21 2009 (r1285) +++ trunk/tests/CMakeLists.txt Fri Sep 25 16:13:12 2009 (r1286) @@ -104,6 +104,8 @@ SML_ADD_TESTCASE( change_item_get_data_with_limit ) SML_ADD_TESTCASE( change_item_get_data_with_length ) SML_ADD_TESTCASE( change_item_get_data_with_overflow ) + SML_ADD_TESTCASE( change_item_set_binary_data ) + SML_ADD_TESTCASE( change_item_get_binary_data ) SML_ADD_TESTCASE( change_item_set_planned_size ) SML_ADD_TESTCASE( change_item_get_planned_size ) SML_ADD_TESTCASE( change_item_set_content_type ) Modified: trunk/tests/check_data_sync_api_change_item.c ============================================================================== --- trunk/tests/check_data_sync_api_change_item.c Thu Sep 24 19:22:21 2009 (r1285) +++ trunk/tests/check_data_sync_api_change_item.c Fri Sep 25 16:13:12 2009 (r1286) @@ -195,9 +195,10 @@ SmlDataSyncChangeItem *item = sml_data_sync_change_item_new(); sml_fail_unless(item != NULL, NULL); - sml_fail_unless(sml_data_sync_change_item_set_location(item, NULL, &error), "%s", error?error->message:"No GError set."); - sml_fail_unless(error == NULL, NULL); + sml_fail_unless(!sml_data_sync_change_item_set_data(item, NULL, 0, &error), "There must be some data."); + sml_fail_unless(error != NULL, NULL); + g_error_free(error); g_object_unref(item); } END_TEST @@ -293,6 +294,55 @@ g_object_unref(item); } +END_TEST + +START_TEST (change_item_set_binary_data) +{ + setup_testbed(NULL); + + GError *error = NULL; + + SmlDataSyncChangeItem *item = sml_data_sync_change_item_new(); + sml_fail_unless(item != NULL, NULL); + + const gchar* data = "I am an image."; + sml_fail_unless(sml_data_sync_change_item_set_binary_data(item, data, strlen(data), &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(error == NULL, NULL); + + g_object_unref(item); +} +END_TEST + +START_TEST (change_item_get_binary_data) +{ + setup_testbed(NULL); + + GError *error = NULL; + + SmlDataSyncChangeItem *item = sml_data_sync_change_item_new(); + sml_fail_unless(item != NULL, NULL); + + sml_fail_unless(sml_data_sync_change_item_get_data(item) == NULL, NULL); + + const gchar* data = "I am an image."; + const gchar* encoded = "SSBhbSBhbiBpbWFnZS4="; + sml_fail_unless(sml_data_sync_change_item_set_binary_data(item, data, strlen(data), &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(error == NULL, NULL); + + const char* result = sml_data_sync_change_item_get_data(item); + sml_fail_unless(result != NULL, "The data must be present."); + sml_fail_unless(strcmp(result, encoded) == 0, "The encoded data must be '%s' and not '%s'.", encoded, result); + + gchar* binary = NULL; + gsize size = 0; + sml_fail_unless(sml_data_sync_change_item_get_binary_data(item, &binary, &size, &error), "%s", error?error->message:"No GError set."); + sml_fail_unless(binary != NULL, "The binary data must be present."); + sml_fail_unless(size == strlen(data), "The decoded data has a different length then the original."); + sml_fail_unless(strcmp(binary, data) == 0, "The decoced data must be '%s' and not '%s'.", data, binary); + smlSafeCFree(&binary); + + g_object_unref(item); +} END_TEST START_TEST (change_item_set_planned_size) |
From: <svn...@op...> - 2009-09-25 11:04:40
|
Author: svnbot Date: Fri Sep 25 13:04:00 2009 New Revision: 5849 URL: http://www.opensync.org/changeset/5849 Log: Pinned svn:externals to revision r5814 for tag osynctool/tags/osynctool-0.39/ Modified: osynctool/tags/osynctool-0.39/ (props changed) |
From: <svn...@op...> - 2009-09-25 11:04:04
|
Author: svnbot Date: Fri Sep 25 13:03:51 2009 New Revision: 5848 URL: http://www.opensync.org/changeset/5848 Log: Pinned svn:externals to revision r3722 for tag tags/opensync-0.38/ Modified: tags/opensync-0.38/cmake/ (props changed) tags/opensync-0.38/docs/example-plugin/ (props changed) |
Author: svnbot Date: Fri Sep 25 13:03:35 2009 New Revision: 5847 URL: http://www.opensync.org/changeset/5847 Log: Pinned svn:externals to revision r3723 for tag tags/plugins-0.38/ Modified: tags/plugins-0.38/evolution2/ (props changed) tags/plugins-0.38/file-sync/ (props changed) tags/plugins-0.38/gnokii-sync/ (props changed) tags/plugins-0.38/google-calendar/ (props changed) tags/plugins-0.38/gpe/ (props changed) tags/plugins-0.38/irmc-sync/ (props changed) tags/plugins-0.38/kdepim/ (props changed) tags/plugins-0.38/moto-sync/ (props changed) tags/plugins-0.38/opie-sync/ (props changed) tags/plugins-0.38/palm/ (props changed) tags/plugins-0.38/python-module/ (props changed) tags/plugins-0.38/syncml/ (props changed) tags/plugins-0.38/tomboy-sync/ (props changed) |
From: <svn...@op...> - 2009-09-25 11:03:34
|
Author: svnbot Date: Fri Sep 25 13:03:19 2009 New Revision: 5846 URL: http://www.opensync.org/changeset/5846 Log: Pinned svn:externals to revision r3724 for tag tags/format-plugins-0.38/ Modified: tags/format-plugins-0.38/tomboy-note/ (props changed) tags/format-plugins-0.38/vformat/ (props changed) |
From: <svn...@op...> - 2009-09-25 11:03:30
|
Author: svnbot Date: Fri Sep 25 13:03:10 2009 New Revision: 5845 URL: http://www.opensync.org/changeset/5845 Log: Pinned svn:externals to revision r5821 for tag tags/format-plugins-0.39/ Modified: tags/format-plugins-0.39/tomboy-note/ (props changed) tags/format-plugins-0.39/vformat/ (props changed) tags/format-plugins-0.39/xmlformat/trunk/ (props changed) tags/format-plugins-0.39/xsltformat/ (props changed) |