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...> - 2010-11-30 08:11:15
|
Author: deloptes Date: Tue Nov 30 09:11:04 2010 New Revision: 6162 URL: http://www.opensync.org/changeset/6162 Log: - fix for dependency on binary build dir Modified: plugins/akonadi-sync/trunk/src/CMakeLists.txt Modified: plugins/akonadi-sync/trunk/src/CMakeLists.txt ============================================================================== --- plugins/akonadi-sync/trunk/src/CMakeLists.txt Mon Nov 15 20:23:35 2010 (r6161) +++ plugins/akonadi-sync/trunk/src/CMakeLists.txt Tue Nov 30 09:11:04 2010 (r6162) @@ -19,7 +19,7 @@ include_directories( ${QT_INCLUDE_DIR} ) # include_directories( ${OPENSYNC_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/src" ${GLIB2_INCLUDE_DIR} ${GLIB2_MAIN_INCLUDE_DIR}) -include_directories( "../build/src") +include_directories( "${CMAKE_BINARY_DIR}/src" ) # link_directories( ${AKONADI_LIB_DIR} ${KDE4_LIB_DIR} ${KDEPIMLIBS_LIB_DIR} ${OPENSYNC_LIBRARIES_DIR} ${glib2LibDir} ) |
From: <svn...@op...> - 2010-11-15 19:23:46
|
Author: scriptor Date: Mon Nov 15 20:23:35 2010 New Revision: 6161 URL: http://www.opensync.org/changeset/6161 Log: Fixed one of those "Could be used uninitialized"-bugs. Modified: plugins/ldap-sync/misc/ldap_format_convert.c plugins/ldap-sync/tests/check_do_convert_from_to.c Modified: plugins/ldap-sync/misc/ldap_format_convert.c ============================================================================== --- plugins/ldap-sync/misc/ldap_format_convert.c Mon Nov 15 20:23:27 2010 (r6160) +++ plugins/ldap-sync/misc/ldap_format_convert.c Mon Nov 15 20:23:35 2010 (r6161) @@ -941,6 +941,7 @@ OSyncFormatEnv *format_env = NULL; OSyncObjFormat *sourceformat = NULL; conv_detection detection_type = TARGET_AUTO; + const char *sourceformat_name = NULL; char *program = NULL; char *format_config = NULL; char *input_filename = NULL; @@ -1148,17 +1149,14 @@ goto error; } - - - if (sourceformat == NULL) { - osync_error_set(&error, OSYNC_ERROR_GENERIC, "%s:%i: ERROR: sourceformat = NULL. Source format could not be recognized.", __FILE__, __LINE__); + + sourceformat_name = osync_objformat_get_name(sourceformat); + if (sourceformat_name == NULL) { + osync_error_set(&error, OSYNC_ERROR_GENERIC, "%s:%i: ERROR: sourceformat_name = NULL. Source format could not be recognized.", __FILE__, __LINE__); goto error; } - char *sourceformat_name = (char *)osync_objformat_get_name(sourceformat); - - // Tell the data object what kind of source format we have just found. osync_data_set_objformat(data, sourceformat); if (osync_error_is_set(&error)) { Modified: plugins/ldap-sync/tests/check_do_convert_from_to.c ============================================================================== --- plugins/ldap-sync/tests/check_do_convert_from_to.c Mon Nov 15 20:23:27 2010 (r6160) +++ plugins/ldap-sync/tests/check_do_convert_from_to.c Mon Nov 15 20:23:35 2010 (r6161) @@ -941,6 +941,7 @@ OSyncFormatEnv *format_env = NULL; OSyncObjFormat *sourceformat = NULL; conv_detection detection_type = TARGET_AUTO; + const char *sourceformat_name = NULL; char *program = NULL; char *format_config = NULL; char *input_filename = NULL; @@ -1148,17 +1149,14 @@ goto error; } - - - if (sourceformat == NULL) { - osync_error_set(&error, OSYNC_ERROR_GENERIC, "%s:%i: ERROR: sourceformat = NULL. Source format could not be recognized.", __FILE__, __LINE__); + + sourceformat_name = osync_objformat_get_name(sourceformat); + if (sourceformat_name == NULL) { + osync_error_set(&error, OSYNC_ERROR_GENERIC, "%s:%i: ERROR: sourceformat_name = NULL. Source format could not be recognized.", __FILE__, __LINE__); goto error; } - char *sourceformat_name = (char *)osync_objformat_get_name(sourceformat); - - // Tell the data object what kind of source format we have just found. osync_data_set_objformat(data, sourceformat); if (osync_error_is_set(&error)) { |
From: <svn...@op...> - 2010-11-15 19:23:38
|
Author: scriptor Date: Mon Nov 15 20:23:27 2010 New Revision: 6160 URL: http://www.opensync.org/changeset/6160 Log: Removed an unused variable. Modified: plugins/ldap-sync/src/ldap_plugin.c Modified: plugins/ldap-sync/src/ldap_plugin.c ============================================================================== --- plugins/ldap-sync/src/ldap_plugin.c Mon Nov 15 20:23:20 2010 (r6159) +++ plugins/ldap-sync/src/ldap_plugin.c Mon Nov 15 20:23:27 2010 (r6160) @@ -558,7 +558,6 @@ // Get the latest stored anchor from the device - char *path_field = g_strdup_printf("path_%s", osync_objtype_sink_get_name(sinkenv->sink)); osync_bool state_match; OSyncSinkStateDB *state_db = osync_objtype_sink_get_state_db(sinkenv->sink); if (state_db == NULL) { @@ -638,10 +637,6 @@ out: // Clean up - if (path_field) { - g_free(path_field); - path_field = NULL; - } if (timestamp) { g_free(timestamp); @@ -654,11 +649,6 @@ error: // Clean up - if (path_field) { - g_free(path_field); - path_field = NULL; - } - if (timestamp) { g_free(timestamp); timestamp = NULL; |
From: <svn...@op...> - 2010-11-15 19:23:33
|
Author: scriptor Date: Mon Nov 15 20:23:20 2010 New Revision: 6159 URL: http://www.opensync.org/changeset/6159 Log: The default is now: No trace files. Modified: plugins/ldap-sync/tests/test.conf Modified: plugins/ldap-sync/tests/test.conf ============================================================================== --- plugins/ldap-sync/tests/test.conf Tue Nov 9 23:31:56 2010 (r6158) +++ plugins/ldap-sync/tests/test.conf Mon Nov 15 20:23:20 2010 (r6159) @@ -10,8 +10,8 @@ ########## If you want to have libopensync trace files, define this variable: # If the variable is empty, tracing is disabled. -TRACE_FILES="/tmp/trace" -#TRACE_FILES="" +#TRACE_FILES="/tmp/trace" +TRACE_FILES="" export debug="no" |
From: <svn...@op...> - 2010-11-09 22:32:06
|
Author: deloptes Date: Tue Nov 9 23:31:56 2010 New Revision: 6158 URL: http://www.opensync.org/changeset/6158 Log: - updated "important" note Modified: plugins/akonadi-sync/trunk/README Modified: plugins/akonadi-sync/trunk/README ============================================================================== --- plugins/akonadi-sync/trunk/README Tue Nov 9 12:05:55 2010 (r6157) +++ plugins/akonadi-sync/trunk/README Tue Nov 9 23:31:56 2010 (r6158) @@ -10,8 +10,7 @@ Important ========= -Currently Calendar does not work. - +This code was not tested well, so you've been warned! Requirements ============ |
From: <svn...@op...> - 2010-11-09 11:06:05
|
Author: cstender Date: Tue Nov 9 12:05:55 2010 New Revision: 6157 URL: http://www.opensync.org/changeset/6157 Log: Build fix. Patch by matz (ticket 1271) Modified: plugins/kdepim/src/kdepim_sync.cpp Modified: plugins/kdepim/src/kdepim_sync.cpp ============================================================================== --- plugins/kdepim/src/kdepim_sync.cpp Mon Nov 8 14:49:22 2010 (r6156) +++ plugins/kdepim/src/kdepim_sync.cpp Tue Nov 9 12:05:55 2010 (r6157) @@ -203,7 +203,9 @@ osync_plugin_set_finalize(plugin, kde_finalize); osync_plugin_set_discover(plugin, kde_discover); - osync_plugin_env_register_plugin(env, plugin); + if (!osync_plugin_env_register_plugin(env, plugin, error)) + goto error; + osync_plugin_unref(plugin); osync_trace(TRACE_EXIT, "%s", __func__); |
From: <svn...@op...> - 2010-11-08 13:49:32
|
Author: cstender Date: Mon Nov 8 14:49:22 2010 New Revision: 6156 URL: http://www.opensync.org/changeset/6156 Log: silenced gcc warnings. cabledev can only hold 20 bytes. Modified: plugins/irmc-sync/src/irmc_sync.c Modified: plugins/irmc-sync/src/irmc_sync.c ============================================================================== --- plugins/irmc-sync/src/irmc_sync.c Mon Nov 8 14:29:45 2010 (r6155) +++ plugins/irmc-sync/src/irmc_sync.c Mon Nov 8 14:49:22 2010 (r6156) @@ -188,7 +188,7 @@ { const char *devnode; osync_plugin_connection_serial_set_devicenode( conn, devnode ); - strncpy( config->cabledev, devnode, 127 ); + strncpy( config->cabledev, devnode, 19 ); } const char *dtstmp = osync_plugin_config_get_advancedoption_value_by_name(configdata, "donttellsync"); if( dtstmp ) |
From: <svn...@op...> - 2010-11-08 13:29:55
|
Author: cstender Date: Mon Nov 8 14:29:45 2010 New Revision: 6155 URL: http://www.opensync.org/changeset/6155 Log: * src/xmlformat-vcalendar.c (handle_vcal_alarm_attribute): do not include AlarmRepeat, AlarmRepeatDuration, AlarmTrigger in XML if the fields in the DALARM are null (bug #1268) Patch by Graham Cobb Deleted: format-plugins/vformat/ChangeLog Modified: format-plugins/vformat/src/xmlformat-vcalendar.c Modified: format-plugins/vformat/src/xmlformat-vcalendar.c ============================================================================== --- format-plugins/vformat/src/xmlformat-vcalendar.c Sun Nov 7 14:07:12 2010 (r6154) +++ format-plugins/vformat/src/xmlformat-vcalendar.c Mon Nov 8 14:29:45 2010 (r6155) @@ -174,9 +174,13 @@ FIXME_xmlfield_set_key_value(xmlfield, "AlarmDescription", vformat_attribute_get_nth_value(attr, 3)); } - FIXME_xmlfield_set_key_value(xmlfield, "AlarmRepeat", vformat_attribute_get_nth_value(attr, 2)); - FIXME_xmlfield_set_key_value(xmlfield, "AlarmRepeatDuration", vformat_attribute_get_nth_value(attr, 1)); - FIXME_xmlfield_set_key_value(xmlfield, "AlarmTrigger", vformat_attribute_get_nth_value(attr, 0)); + const char *v; + v = vformat_attribute_get_nth_value(attr, 2); + if (v && *v) FIXME_xmlfield_set_key_value(xmlfield, "AlarmRepeat", v); + v = vformat_attribute_get_nth_value(attr, 1); + if (v && *v) FIXME_xmlfield_set_key_value(xmlfield, "AlarmRepeatDuration", v); + v = vformat_attribute_get_nth_value(attr, 0); + if (v && *v) FIXME_xmlfield_set_key_value(xmlfield, "AlarmTrigger", v); return xmlfield; } |
From: <svn...@op...> - 2010-11-07 13:42:54
|
Author: bellmich Date: Sun Nov 7 14:42:44 2010 New Revision: 232 URL: http://libwbxml.opensync.org/changeset/232 Log: fixed ticket #46 Modified: wbxml2/trunk/ChangeLog wbxml2/trunk/src/wbxml_tree.c Modified: wbxml2/trunk/ChangeLog ============================================================================== --- wbxml2/trunk/ChangeLog Fri Oct 15 17:06:51 2010 (r231) +++ wbxml2/trunk/ChangeLog Sun Nov 7 14:42:44 2010 (r232) @@ -2,6 +2,8 @@ The overflow causes crashs or wrong wbxml messages. * Fixed location of variable definitions (changes from ticket #42) This fixes some compiler errors from MS VisualStudio 2008. + * Added support for recursion in wbxml_tree_node_elt_get_from_name + (ticket #46) 2010-03-29 Michael Bell <mic...@we...> * Released 0.10.8 Modified: wbxml2/trunk/src/wbxml_tree.c ============================================================================== --- wbxml2/trunk/src/wbxml_tree.c Fri Oct 15 17:06:51 2010 (r231) +++ wbxml2/trunk/src/wbxml_tree.c Sun Nov 7 14:42:44 2010 (r232) @@ -1,7 +1,7 @@ /* * libwbxml, the WBXML Library. * Copyright (C) 2002-2008 Aymerick Jehanne <aym...@je...> - * Copyright (C) 2008-2009 Michael Bell <mic...@op...> + * Copyright (C) 2008-2010 Michael Bell <mic...@op...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -752,34 +752,42 @@ WBXML_DECLARE(WBXMLTreeNode *) wbxml_tree_node_elt_get_from_name(WBXMLTreeNode *node, const char *name, WB_BOOL recurs) { WBXMLTreeNode *current_node = NULL; - WB_BOOL node_found = FALSE; + WBXMLTreeNode *recurs_node = NULL; if ((node == NULL) || (name == NULL)) return NULL; - /** @todo Handle 'recurs' TRUE */ - /* Let's go through the tree */ current_node = node; while (current_node != NULL) { - /* Is this the Node we searched ? */ - if ((current_node->type == WBXML_TREE_ELEMENT_NODE) && - (WBXML_STRCMP(wbxml_tag_get_xml_name(current_node->name), name) == 0)) + /* Is this a normal node? */ + if (current_node->type == WBXML_TREE_ELEMENT_NODE) { - node_found = TRUE; - break; - } - else { - /* Go to next Sibbling Node */ - current_node = current_node->next; + /* Is this the Node we searched ? */ + if (WBXML_STRCMP(wbxml_tag_get_xml_name(current_node->name), name) == 0) + { + return current_node; + } + + /* Sould we start a recursive search? */ + if (recurs && current_node->children) + { + recurs_node = wbxml_tree_node_elt_get_from_name(current_node->children, name, TRUE); + /* Is this the Node we searched ? */ + if (recurs_node) + { + return recurs_node; + } + } } - } - if (node_found) - return current_node; + /* Go to next Sibbling Node */ + current_node = current_node->next; + } + /* A node with the specified name could not be found. */ return NULL; } |
From: <svn...@op...> - 2010-11-07 13:07:22
|
Author: deloptes Date: Sun Nov 7 14:07:12 2010 New Revision: 6154 URL: http://www.opensync.org/changeset/6154 Log: - clean up and fix smaller issues - consolidated version info - updated debugging info Modified: plugins/akonadi-sync/trunk/README plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/akonadisink.cpp plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/sinkbase.cpp plugins/akonadi-sync/trunk/src/sinkbase.h Modified: plugins/akonadi-sync/trunk/README ============================================================================== --- plugins/akonadi-sync/trunk/README Thu Nov 4 00:31:40 2010 (r6153) +++ plugins/akonadi-sync/trunk/README Sun Nov 7 14:07:12 2010 (r6154) @@ -32,16 +32,22 @@ ============ 1. After installation configure the plugin with "--configure" option. - (I'm planning to make this step optional) + (This is optional if you want to have all supported sync types) 2. Discover supported features on both sides (sync members and akonadi) with "--discover" option. This step will discover sync features (supported formats) and akonadi collection. They will be available in the configuration - file for further setup. + file for further setup (but will be disabled by default). 3. Reconfigure the plugin with "--configure" option. Most likely you will need to enable or disable sync with given collection represented as a ressource in - the configuration file. + the configuration file (step2 above). 4. Sync with the "--sync" or similar option +Known Issues +============ + +If you modify an item try to sync and reject, then things got messed up. +I'm still trying to understand why. + Links ===== Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Thu Nov 4 00:31:40 2010 (r6153) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sun Nov 7 14:07:12 2010 (r6154) @@ -130,7 +130,7 @@ /* FIXME: this is probably a bug in opoensync * replace & */ - static QString toXml(QString str) { + QString toXml(QString str) { str.replace("<","<").replace(">",">").replace("&","and"); return str; } @@ -214,11 +214,11 @@ if ( !strcmp(myObjType, osync_objtype_sink_get_name(sink)) ) { if ( !strcmp(myUrl , "default") ) { - osync_plugin_resource_set_name( myRes, toXml(col.name()).toLatin1() ); - osync_plugin_resource_set_url(myRes, col.url().url().toLatin1()); - osync_plugin_resource_set_mime(myRes, mimeType.toLatin1() ); + osync_plugin_resource_set_name( myRes, toXml(col.name()).toLatin1().data() ); + osync_plugin_resource_set_url(myRes, col.url().url().toLatin1().data() ); + osync_plugin_resource_set_mime(myRes, mimeType.toLatin1().data() ); configured = true; - } else if ( !strcmp(myUrl, col.url().url().toLatin1()) && !strcmp(myMimeType, mimeType.toLatin1()) ) { + } else if ( !strcmp(myUrl, col.url().url().toLatin1().data()) && !strcmp(myMimeType, mimeType.toLatin1().data()) ) { kDebug() << "aleady configured" << myObjType; configured = true; } @@ -307,8 +307,10 @@ { OSyncVersion *version = osync_version_new(error); osync_version_set_plugin(version, "akonadi-sync"); - osync_version_set_softwareversion(version, "0.40"); - osync_version_set_identifier(version, "akonadi-sync"); + osync_version_set_modelversion(version, "1"); +// osync_version_set_softwareversion(version, "0.40"); + osync_version_set_vendor(version, "Deloptes"); +// osync_version_set_identifier(version, "akonadi-sync"); osync_plugin_info_set_version(info, version); osync_version_unref(version); } @@ -344,6 +346,7 @@ osync_plugin_set_name(plugin, "akonadi-sync"); osync_plugin_set_longname(plugin, "Akonadi OpenSync Plugin"); osync_plugin_set_description(plugin, "Plugin to synchronize with Akonadi"); + osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_OPTIONAL_CONFIGURATION); osync_plugin_set_initialize(plugin, akonadi_initialize); osync_plugin_set_finalize(plugin, akonadi_finalize); Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Thu Nov 4 00:31:40 2010 (r6153) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Sun Nov 7 14:07:12 2010 (r6154) @@ -38,6 +38,7 @@ kDebug(); OSyncObjTypeSink *sink = osync_objtype_main_sink_new( error ); wrapSink( sink ); +// osync_objtype_sink_set_userdata ( sink, this ); osync_plugin_info_set_main_sink( info, sink ); osync_objtype_sink_unref(sink); return true; Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Thu Nov 4 00:31:40 2010 (r6153) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Sun Nov 7 14:07:12 2010 (r6154) @@ -151,13 +151,14 @@ } } +// this adds preffered to the resource configuration if not set if ( ! preferred || strcmp(preferred,m_Format.toLatin1().data() ) ) osync_plugin_resource_set_preferred_format( resource, m_Format.toLatin1().data() ); kDebug() << "Has objformat: " << m_Format; - osync_objtype_sink_set_userdata ( sink, this ); wrapSink ( sink ); +// osync_objtype_sink_set_userdata ( sink, this ); osync_objtype_sink_enable_hashtable ( sink , true ); @@ -215,6 +216,7 @@ { kDebug() << "No collection"; osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + error ( OSYNC_ERROR_GENERIC, "No collection"); return; } @@ -245,92 +247,100 @@ if ( checker.isWantedItem( item ) ) reportChange ( item ); else - kDebug() << item.mimeType() << "skipped!"; + kDebug() << item.id() << item.mimeType() << "skipped!"; } kDebug() << "slotItemsReceived done"; } void DataSink::reportChange ( const Item& item ) { - kDebug(); + kDebug() << ">>>>>>>>>>>>>>>>>>>"; kDebug() << "Id:" << item.id() << "\n"; kDebug() << "RemoteId:" << item.remoteId() << "\n"; kDebug() << "Mime:" << item.mimeType() << "\n"; kDebug() << "Revision:" << item.revision() << "\n"; kDebug() << "StorageCollectionId:" << item.storageCollectionId() << "\n"; kDebug() << "Url:" << item.url() << "\n"; - + kDebug() << "mtime:" << item.modificationTime().toString(Qt::ISODate) << "\n"; +// kDebug() << "mtime:" << (uint) item.modificationTime().toTime_t () << "\n"; + + if ( item.remoteId().isEmpty() ) + { + error( OSYNC_ERROR_EXPECTED, "item remote identifier missing" ); + return; + } + OSyncChange *change = 0; QString hash = getHash( item.id(), item.revision() ) ; - + kDebug() << hash; kDebug() << "item.payloadData().data()" << "\n" << item.payloadData().data(); OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); - - OSyncError *error = 0; + + OSyncError *oerror = 0; OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - OSyncChange *change = osync_change_new ( &error ); + change = osync_change_new ( &oerror ); if ( !change ) { osync_change_unref ( change ); - warning ( error ); + warning ( oerror ); return; } osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); // osync_change_set_uid ( change, QString::number( item.id() ).toLatin1() ); osync_change_set_hash ( change, getHash( item.id(), item.revision() ).toLatin1().data() ); + OSyncChangeType changetype = osync_hashtable_get_changetype(hashtable, change); osync_change_set_changetype(change, changetype); - osync_hashtable_update_change ( hashtable, change ); + osync_hashtable_update_change ( hashtable, change ); if ( changetype == OSYNC_CHANGE_TYPE_UNMODIFIED ) { + kDebug()<< "skipped (unmodified)" << change; osync_change_unref(change); - osync_error_unref(&error); + osync_error_unref(&oerror); return; } // Now you can set the data for the object - // Set the last argument to FALSE if the real data - // should be queried later in a "get_data" function OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1().data() ); int newDataSize = item.payloadData().size(); char newData[newDataSize]; memcpy(newData, item.payloadData().data(), newDataSize); // OSyncData *odata = osync_data_new ( item.payloadData().data() , item.payloadData().size(), format, &error ); - OSyncData *odata = osync_data_new ( newData, newDataSize, format, &error ); + OSyncData *odata = osync_data_new ( newData, newDataSize, format, &oerror ); if ( !odata ) { - osync_change_unref(change); - warning(error); - return; + osync_change_unref((OSyncChange*) change); + warning(oerror); + return; } - - osync_error_unref(&error); - - kDebug()<< "change" << change; - kDebug()<< "data " << odata; - kDebug()<< "context" << context(); + osync_error_unref(&oerror); + kDebug()<< "context" << context(); // do I need this here - osync_data_set_objtype( odata, m_Name.toLatin1().data() ); +// osync_data_set_objtype( odata, m_Name.toLatin1().data() ); osync_change_set_data ( change, odata ); + kDebug()<< "data " << odata; +// not sure but it gets probably delete together with change below +// osync_data_unref ( (OSyncData *) odata ); +// osync_hashtable_update_change ( hashtable, change ); //Do we need an update after setting data? -// not sure but it gets probably delete together with data -// osync_data_unref ( odata ); osync_context_report_change ( context(), change ); -// osync_hashtable_update_change ( hashtable, change ); //????? - +// osync_hashtable_update_change ( hashtable, change ); +// kDebug()<< "change" << change; osync_change_unref ( change ); + kDebug()<< "<<<<<<<<<<<<<< change done"; + } void DataSink::slotGetChangesFinished ( KJob * ) { kDebug(); - OSyncError *error = 0; + OSyncError *oerror = 0; OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); @@ -340,11 +350,11 @@ QString uid ( ( char * ) u->data ); kDebug() << "going to delete with uid:" << uid; - OSyncChange *change = osync_change_new ( &error ); + OSyncChange *change = osync_change_new ( &oerror ); if ( !change ) { osync_change_unref ( change ); - warning ( error ); + warning ( oerror ); continue; } @@ -354,28 +364,27 @@ osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1().data() ); - error = 0; - OSyncData *data = osync_data_new( NULL, 0, format, &error ); + oerror = 0; + OSyncData *data = osync_data_new( NULL, 0, format, &oerror ); if ( !data ) { - osync_data_unref ( data ); osync_change_unref( change ); - warning( error ); + warning( oerror ); continue; } osync_data_set_objtype( data, m_Name.toLatin1().data() ); osync_change_set_data( change, data ); - osync_data_unref(data); - osync_hashtable_update_change ( hashtable, change ); + osync_data_unref((OSyncData *)data); +// osync_hashtable_update_change ( hashtable, change ); osync_context_report_change ( context(), change ); -// osync_hashtable_update_change ( hashtable, change ); + osync_hashtable_update_change ( hashtable, change ); osync_change_unref ( change ); } osync_list_free ( uids ); - osync_error_unref(&error); + osync_error_unref(&oerror); kDebug() << "got all changes success()."; success(); @@ -387,13 +396,12 @@ OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); -// kDebug() << "change hash:" << osync_change_get_hash ( change ) ; - QString remoteId = QString::fromLatin1 ( osync_change_get_uid ( change ) ); QString hash = QString::fromLatin1 ( osync_change_get_hash ( change ) ); - + //TODO: use id to identify items int id = idFromHash(hash); + kDebug() << "change id:" << id; kDebug() << "change uid:" << remoteId; kDebug() << "change hash:" << hash; @@ -403,7 +411,7 @@ Akonadi::Collection col = collection(); if ( !col.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Invalid collction."); + error( OSYNC_ERROR_GENERIC, "Invalid collection."); return; } @@ -412,7 +420,7 @@ case OSYNC_CHANGE_TYPE_ADDED: { Item item; - char *plain = 0; + char *plain = 0; // plain is freed by data osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); QString str = QString::fromUtf8( plain ); // QString str = QString::fromLatin1( plain ); @@ -440,26 +448,27 @@ case OSYNC_CHANGE_TYPE_MODIFIED: { - char *plain = 0; + char *plain = 0; // plain is freed by data osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); QString str = QString::fromUtf8( plain ); - kDebug() << "data" << str; - Item item = fetchItem ( remoteId ); + + Item item = fetchItem ( remoteId ); if ( ! item.isValid() ) { error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); return; } setPayload ( &item, str ); + kDebug() << "data" << str; ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); if ( ! modifyJob->exec() ) { - error ( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + error ( OSYNC_ERROR_GENERIC, "Unable to run modify job."); return; } else { item = modifyJob->item(); if ( ! item.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + error( OSYNC_ERROR_GENERIC, "Unable to modify item."); return; } osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); @@ -473,17 +482,19 @@ { Item item = fetchItem ( remoteId ); if ( ! item.isValid() ) { + // FIXME break or return? // error( OSYNC_ERROR_GENERIC, "Unable to fetch item"); - break; // FIXME break or return? + break; } +// kDebug() << "deleted: (testing skipped)" << remoteId; +// comment out to skip deleting for testing ItemDeleteJob *job = new ItemDeleteJob( item ); if ( ! job->exec() ) { -// error( OSYNC_ERROR_GENERIC, "Unable to delete item"); - break; + error( OSYNC_ERROR_GENERIC, "Unable to delete item"); + return; } - osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); - kDebug() << "deleted: (testing skipped)" << remoteId; + osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); break; } @@ -571,6 +582,7 @@ } // no such item found? + // we'll check after calling this function return Item(); } @@ -585,9 +597,10 @@ if ( item.remoteId() == remoteId ) return item; // no such item found? - // this will be handled as invalid item + // we'll check after calling this function return Item(); } + void DataSink::syncDone() { kDebug() << "sync for sink member done"; Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Thu Nov 4 00:31:40 2010 (r6153) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Sun Nov 7 14:07:12 2010 (r6154) @@ -44,7 +44,7 @@ static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { WRAP( ) sb->disconnect(); - osync_objtype_sink_unref(sink); + osync_objtype_sink_unref(sink); //needed? osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } @@ -97,11 +97,11 @@ m_canDisconnect(false), m_canCommit (false), m_canCommitAll (false), -// unused m_canBatchCommit(false), m_canGetChanges(false), m_canWrite (false), m_canRead (false), m_canSyncDone (false), + m_canBatchCommit(false), m_SlowSync (false) { @@ -112,7 +112,7 @@ m_canWrite = ( features & Write ) ? true : false; m_canCommitAll = ( features & CommittedAll ) ? true : false; m_canRead = ( features & Read ) ? true : false; -// unused m_canBatchCommit = ( features & BatchCommit ) ? true : false; + m_canBatchCommit = ( features & BatchCommit ) ? true : false; m_canSyncDone = ( features & SyncDone ) ? true : false; } @@ -228,6 +228,7 @@ kDebug() << ">> m_canCommitAll:" << m_canCommitAll; kDebug() << ">> m_canRead:" << m_canRead; kDebug() << ">> m_canSyncDone:" << m_canSyncDone; + kDebug() << ">> m_canBatchCommit:" << m_canBatchCommit; if ( m_canConnect ) { osync_objtype_sink_set_connect_func(sink, connect_wrapper); Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Thu Nov 4 00:31:40 2010 (r6153) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Sun Nov 7 14:07:12 2010 (r6154) @@ -91,8 +91,8 @@ mutable OSyncContext *mContext; // what do we have and what can we do bool m_canConnect, m_canDisconnect, m_canCommit, m_canCommitAll, - m_canGetChanges, m_canWrite, m_canRead, m_canSyncDone; -// unused bool m_canCommitRead, m_canBatchCommit; + m_canGetChanges, m_canWrite, m_canRead, m_canSyncDone, m_canBatchCommit; +// unused bool m_canCommitRead; osync_bool m_SlowSync; }; |
From: <svn...@op...> - 2010-11-03 23:31:49
|
Author: deloptes Date: Thu Nov 4 00:31:40 2010 New Revision: 6153 URL: http://www.opensync.org/changeset/6153 Log: - few last changes on update/report change Modified: plugins/akonadi-sync/trunk/src/datasink.cpp Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Wed Nov 3 09:18:17 2010 (r6152) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Thu Nov 4 00:31:40 2010 (r6153) @@ -283,9 +283,9 @@ osync_change_set_hash ( change, getHash( item.id(), item.revision() ).toLatin1().data() ); OSyncChangeType changetype = osync_hashtable_get_changetype(hashtable, change); osync_change_set_changetype(change, changetype); - osync_hashtable_update_change ( hashtable, change ); + if ( changetype == OSYNC_CHANGE_TYPE_UNMODIFIED ) { osync_change_unref(change); osync_error_unref(&error); @@ -321,6 +321,7 @@ // not sure but it gets probably delete together with data // osync_data_unref ( odata ); osync_context_report_change ( context(), change ); +// osync_hashtable_update_change ( hashtable, change ); //????? osync_change_unref ( change ); @@ -348,6 +349,8 @@ } osync_change_set_uid ( change, uid.toLatin1().data() ); + QString hash = osync_change_get_hash(change); + kDebug() << "hash:" << hash; osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1().data() ); @@ -388,13 +391,14 @@ QString remoteId = QString::fromLatin1 ( osync_change_get_uid ( change ) ); QString hash = QString::fromLatin1 ( osync_change_get_hash ( change ) ); + int id = idFromHash(hash); kDebug() << "change id:" << id; kDebug() << "change uid:" << remoteId; kDebug() << "change hash:" << hash; kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); - kDebug(); +// kDebug(); Akonadi::Collection col = collection(); @@ -587,12 +591,13 @@ void DataSink::syncDone() { kDebug() << "sync for sink member done"; - OSyncError *error = 0; - osync_objtype_sink_save_hashtable ( sink() , &error ); - if ( error ) { - warning ( error ); - return; - } + // Do we need this in 0.40??? +// OSyncError *error = 0; +// osync_objtype_sink_save_hashtable ( sink() , &error ); +// if ( error ) { +// warning ( error ); +// return; +// } success(); } |
From: <svn...@op...> - 2010-11-03 08:18:25
|
Author: deloptes Date: Wed Nov 3 09:18:17 2010 New Revision: 6152 URL: http://www.opensync.org/changeset/6152 Log: - forgot to remove some testing code Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp plugins/akonadi-sync/trunk/src/akonadisink.h plugins/akonadi-sync/trunk/src/sinkbase.h Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Wed Nov 3 09:11:10 2010 (r6151) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Wed Nov 3 09:18:17 2010 (r6152) @@ -30,10 +30,6 @@ AkonadiSink::~AkonadiSink() { -// Q_FOREACH (DataSink *ds, m_SinkList) { -// delete ds; -// } -// m_SinkList.clear(); } bool AkonadiSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncError ** error) @@ -47,18 +43,12 @@ return true; } -// void AkonadiSink::setSink(OSyncObjTypeSink *sink) -// { -// -// } - void AkonadiSink::connect() { osync_trace(TRACE_ENTRY, "%s(%p, %p)", __PRETTY_FUNCTION__, pluginInfo(), context()); kDebug(); -// OSyncError *oerror = 0; + if ( !Akonadi::Control::start() ) { -// osync_error_set_type(&oerror,OSYNC_ERROR_NO_CONNECTION); kDebug() << "Could not start Akonadi." ; error( OSYNC_ERROR_NO_CONNECTION, "Could not start Akonadi." ); osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, "Could not start Akonadi."); @@ -69,11 +59,4 @@ osync_trace(TRACE_EXIT, "%s", __PRETTY_FUNCTION__); } -// void AkonadiSink::addSink(DataSink* ds) -// { -// Q_ASSERT(ds == 0 ); -// m_SinkList.append(ds); -// } - - #include "akonadisink.moc" Modified: plugins/akonadi-sync/trunk/src/akonadisink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.h Wed Nov 3 09:11:10 2010 (r6151) +++ plugins/akonadi-sync/trunk/src/akonadisink.h Wed Nov 3 09:18:17 2010 (r6152) @@ -19,7 +19,7 @@ #ifndef AKONADISINK_H #define AKONADISINK_H -// #include "datasink.h" + #include "sinkbase.h" /** @@ -36,11 +36,7 @@ bool initialize( OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error ); void connect(); - -// void addSink(DataSink* ds); - -// private: -// QList<DataSink*> m_SinkList; + }; #endif Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Wed Nov 3 09:11:10 2010 (r6151) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Wed Nov 3 09:18:17 2010 (r6152) @@ -83,7 +83,6 @@ OSyncObjTypeSink* sink() const { return mSink; } -// bool m_isContact, m_isEvent, m_isTodo, m_isNote, m_isJournal; //TODO intended to be private private: |
From: <svn...@op...> - 2010-11-03 08:11:20
|
Author: deloptes Date: Wed Nov 3 09:11:10 2010 New Revision: 6151 URL: http://www.opensync.org/changeset/6151 Log: - some progress on syncing multiple objects KNOWN ISSUE: 1. it behaves strange when rejecting forecast 2. when synced it suggests modification to the member on the next sync TODO: implement search or some kind of check on item and/or UID (remoteId) instead only on remoteId Modified: plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/akonadisink.cpp plugins/akonadi-sync/trunk/src/akonadisink.h plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/datasink.h plugins/akonadi-sync/trunk/src/sinkbase.cpp plugins/akonadi-sync/trunk/src/sinkbase.h Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Wed Nov 3 09:11:10 2010 (r6151) @@ -41,20 +41,13 @@ <Url>default</Url> </Resource> <Resource> - <Enabled>0</Enabled> + <Enabled>1</Enabled> <Formats> <Format> - <Name>vjournal</Name> + <Name>vnote11</Name> </Format> - </Formats> - <ObjType>note</ObjType> - <Url>default</Url> - </Resource> - <Resource> - <Enabled>0</Enabled> - <Formats> <Format> - <Name>vnote11</Name> + <Name>vjournal</Name> </Format> </Formats> <ObjType>note</ObjType> Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Wed Nov 3 09:11:10 2010 (r6151) @@ -55,21 +55,22 @@ static void* akonadi_initialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) { - kDebug(); osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, plugin, info, error); if ( !app ) app = new QCoreApplication( fakeArgc, fakeArgv ); if ( !kcd ) - kcd = new KComponentData( "akonadi_opensync" ); + kcd = new KComponentData( "akonadi-sync" ); + kDebug(); // main sink AkonadiSink *mainSink = new AkonadiSink(); - if ( !mainSink->initialize( plugin, info, error ) ) { + if ( !mainSink->initialize(plugin, info, error ) ) { delete mainSink; osync_trace(TRACE_EXIT_ERROR, "%s: NULL", __func__); return 0; } +// QList<DataSink*> sinkList; // object type sinks // http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 @@ -77,7 +78,8 @@ // --------------------------------- // osync_plugin_get_config_type(); - unsigned int objects_supported = 4; +// unsigned int objects_supported = 4; + QList<DataSink*> sinkList; OSyncList *s = NULL, *list = osync_plugin_info_get_objtype_sinks(info); for ( s = list; s; s = s->next ) { @@ -99,17 +101,21 @@ continue; // there might be something more intelligent to check how to return below - if ( !ds->initialize( plugin, info, sink, error ) ) { - osync_objtype_sink_set_enabled(sink, false); + if ( !ds->initialize(plugin, info, sink, error ) ) { +// osync_objtype_sink_set_enabled(sink, false); osync_objtype_sink_set_available(sink, false); delete ds; - objects_supported--; - } +// objects_supported--; + continue; + } +// osync_objtype_sink_set_enabled(sink, true); +// mainSink->addSink(ds); + sinkList.append(ds); + osync_objtype_sink_set_available(sink, true); } - // if we support at least one object return the mainSink - if ( objects_supported >= 1 ) { + if ( ! sinkList.isEmpty() ) { osync_trace(TRACE_EXIT, " %s: %p", __func__, mainSink); return mainSink; } @@ -282,12 +288,8 @@ osync_objtype_sink_set_available(sink, true); } else if ( ! strcmp(myType,"note") ) { - if ( ! testSupport(sink, config, "application/x-vnd.akonadi.calendar.journal", error) ) - osync_objtype_sink_set_available(sink, false); - else - osync_objtype_sink_set_available(sink, true); - - if ( ! testSupport(sink, config, "application/x-vnd.kde.notes", error) ) + if ( ! testSupport(sink, config, "application/x-vnd.akonadi.calendar.journal", error) + && ! testSupport(sink, config, "application/x-vnd.kde.notes", error) ) osync_objtype_sink_set_available(sink, false); else osync_objtype_sink_set_available(sink, true); @@ -304,7 +306,7 @@ // set information about the peer (KDE itself) { OSyncVersion *version = osync_version_new(error); - osync_version_set_plugin(version, "Akonadi-sync"); + osync_version_set_plugin(version, "akonadi-sync"); osync_version_set_softwareversion(version, "0.40"); osync_version_set_identifier(version, "akonadi-sync"); osync_plugin_info_set_version(info, version); @@ -319,8 +321,8 @@ { osync_trace(TRACE_ENTRY, "%s(%p)", __func__, userdata); kDebug(); - AkonadiSink *sink = reinterpret_cast<AkonadiSink*>( userdata ); - sink->disconnect(); + AkonadiSink *mainSink = reinterpret_cast<AkonadiSink*>( userdata ); + mainSink->disconnect(); delete kcd; kcd = 0; delete app; @@ -340,13 +342,14 @@ } osync_plugin_set_name(plugin, "akonadi-sync"); - osync_plugin_set_longname(plugin, "Akonadi"); + osync_plugin_set_longname(plugin, "Akonadi OpenSync Plugin"); osync_plugin_set_description(plugin, "Plugin to synchronize with Akonadi"); osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_OPTIONAL_CONFIGURATION); osync_plugin_set_initialize(plugin, akonadi_initialize); - osync_plugin_set_finalize_timeout(plugin, 5); osync_plugin_set_finalize(plugin, akonadi_finalize); + osync_plugin_set_finalize_timeout(plugin, 5); osync_plugin_set_discover(plugin, akonadi_discover); + osync_plugin_set_discover_timeout(plugin, 5); osync_plugin_set_start_type(plugin, OSYNC_START_TYPE_PROCESS); if ( ! osync_plugin_env_register_plugin(env, plugin, error) ) { Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Wed Nov 3 09:11:10 2010 (r6151) @@ -1,8 +1,5 @@ /* Copyright (c) 2008 Volker Krause <vk...@kd...> - Copyright (c) 2010 Emanoil Kotsev <del...@ya...> - - $Id$ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by @@ -26,53 +23,57 @@ #include <KDebug> -#include <opensync/opensync-plugin.h> -#include <opensync/opensync-data.h> -#include <opensync/opensync-format.h> - AkonadiSink::AkonadiSink() : - SinkBase( Connect ) + SinkBase( Connect ) { } AkonadiSink::~AkonadiSink() { +// Q_FOREACH (DataSink *ds, m_SinkList) { +// delete ds; +// } +// m_SinkList.clear(); } bool AkonadiSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncError ** error) { - Q_UNUSED( plugin ); - kDebug(); - - if ( !Akonadi::Control::start() ) - return false; - - OSyncObjTypeSink *sink = osync_objtype_main_sink_new( error ); - if (!sink) { - - kDebug() << "No sink "; - return false; - } - osync_plugin_info_set_main_sink( info, sink ); - wrapSink( sink ); - osync_objtype_sink_set_userdata(sink, this); - - return true; + Q_UNUSED(plugin) + kDebug(); + OSyncObjTypeSink *sink = osync_objtype_main_sink_new( error ); + wrapSink( sink ); + osync_plugin_info_set_main_sink( info, sink ); + osync_objtype_sink_unref(sink); + return true; } +// void AkonadiSink::setSink(OSyncObjTypeSink *sink) +// { +// +// } + void AkonadiSink::connect() { - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __PRETTY_FUNCTION__, pluginInfo(), context()); - kDebug(); + osync_trace(TRACE_ENTRY, "%s(%p, %p)", __PRETTY_FUNCTION__, pluginInfo(), context()); + kDebug(); +// OSyncError *oerror = 0; + if ( !Akonadi::Control::start() ) { +// osync_error_set_type(&oerror,OSYNC_ERROR_NO_CONNECTION); + kDebug() << "Could not start Akonadi." ; + error( OSYNC_ERROR_NO_CONNECTION, "Could not start Akonadi." ); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, "Could not start Akonadi."); + return; + } - if ( !Akonadi::Control::start() ) { - error( OSYNC_ERROR_NO_CONNECTION, "Could not start Akonadi." ); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, "Could not start Akonadi."); - return; - } - success(); - osync_trace(TRACE_EXIT, "%s", __PRETTY_FUNCTION__); + success(); + osync_trace(TRACE_EXIT, "%s", __PRETTY_FUNCTION__); } +// void AkonadiSink::addSink(DataSink* ds) +// { +// Q_ASSERT(ds == 0 ); +// m_SinkList.append(ds); +// } + #include "akonadisink.moc" Modified: plugins/akonadi-sync/trunk/src/akonadisink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.h Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/akonadisink.h Wed Nov 3 09:11:10 2010 (r6151) @@ -1,8 +1,5 @@ /* Copyright (c) 2008 Volker Krause <vk...@kd...> - Copyright (c) 2010 Emanoil Kotsev <del...@ya...> - - $Id$ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by @@ -22,7 +19,7 @@ #ifndef AKONADISINK_H #define AKONADISINK_H - +// #include "datasink.h" #include "sinkbase.h" /** @@ -30,16 +27,20 @@ */ class AkonadiSink : public SinkBase { - Q_OBJECT + Q_OBJECT -public: + public: AkonadiSink(); ~AkonadiSink(); bool initialize( OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error ); void connect(); - + +// void addSink(DataSink* ds); + +// private: +// QList<DataSink*> m_SinkList; }; #endif Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Wed Nov 3 09:11:10 2010 (r6151) @@ -25,6 +25,11 @@ #include <akonadi/collectionfetchjob.h> #include <akonadi/collectionfetchscope.h> #include <akonadi/itemdeletejob.h> +#include <akonadi/itemmodifyjob.h> +#include <akonadi/itemcreatejob.h> +#include <akonadi/itemfetchscope.h> +#include <akonadi/mimetypechecker.h> + // calendar includes #include <kcal/incidence.h> @@ -53,14 +58,7 @@ m_Format("default"), m_Url("default") { - kDebug() << "Constr.objtype:" << type; m_type = type; - - m_isEvent = ( type == DataSink::Calendars ) ? true : false; - m_isContact = ( type == DataSink::Contacts ) ? true : false; - m_isNote = ( type == DataSink::Notes ) ? true : false; - m_isTodo = ( type == DataSink::Todos ) ? true : false; - } DataSink::~DataSink() @@ -70,7 +68,8 @@ bool DataSink::initialize ( OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncObjTypeSink *sink, OSyncError ** error ) { - kDebug() << "initializing" << osync_objtype_sink_get_name ( sink ); + m_Name = osync_objtype_sink_get_name ( sink ); + kDebug() << "initializing" << m_Name; Q_UNUSED ( plugin ); // Q_UNUSED ( info ); Q_UNUSED ( error ); @@ -79,7 +78,7 @@ OSyncPluginConfig *config = osync_plugin_info_get_config ( info ); if ( !config ) { - osync_error_set ( error, OSYNC_ERROR_GENERIC, "Unable to get config." ); +// osync_error_set ( error, OSYNC_ERROR_GENERIC, "Unable to get config." ); return false; } @@ -99,6 +98,8 @@ OSyncObjFormatSink *objformatsink = ( OSyncObjFormatSink * ) r->data; const char* tobjformat = osync_objformat_sink_get_objformat ( objformatsink ); + // NOTE "application/x-vnd.kde.contactgroup" is used for contact groups ... we can use it probably later + // TODO how can I negotiate format ... is this here enough? switch ( m_type ) { @@ -109,6 +110,7 @@ // always prefer newer format if ( !strcmp ( "vcard30", tobjformat ) ) m_Format = "vcard30"; + m_MimeType = "text/directory"; break; } case Calendars: @@ -118,14 +120,19 @@ // always prefer newer format if ( !strcmp ( "vevent20", tobjformat ) ) m_Format = "vevent20"; + m_MimeType = "application/x-vnd.akonadi.calendar.event"; break; } case Notes: { - if ( !strcmp ( "vnote11", tobjformat ) ) + if ( !strcmp ( "vnote11", tobjformat ) ) { m_Format = "vnote11"; - if ( !strcmp ( "vjournal", tobjformat ) ) + m_MimeType = "application/x-vnd.kde.notes"; + } + if ( !strcmp ( "vjournal", tobjformat ) ) { m_Format = "vjournal"; + m_MimeType = "application/x-vnd.akonadi.calendar.journal"; + } break; } case Todos: @@ -135,6 +142,7 @@ // always prefer newer format if ( !strcmp ( "vtodo20", tobjformat ) ) m_Format = "vtodo20"; + m_MimeType = "application/x-vnd.akonadi.calendar.todo"; break; } @@ -151,14 +159,7 @@ osync_objtype_sink_set_userdata ( sink, this ); wrapSink ( sink ); -// osync_objtype_sink_set_enabled ( sink, true ); -// osync_objtype_sink_set_available ( sink, true ); -// set hashtable - OSyncHashTable *hashtable = NULL; - if ( osync_objtype_sink_load_hashtable ( sink , info, error ) ) - hashtable = osync_objtype_sink_get_hashtable(sink); - if ( ! hashtable ) - osync_objtype_sink_enable_hashtable ( sink , true ); + osync_objtype_sink_enable_hashtable ( sink , true ); return true; } @@ -189,6 +190,7 @@ if ( !hashtable ) { kDebug() << "No hashtable"; + error ( OSYNC_ERROR_FILE_NOT_FOUND, "No hashtable"); osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); return; } @@ -235,16 +237,15 @@ { kDebug(); kDebug() << "retrieved" << items.count() << "items"; - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1().data() ); - + Akonadi::MimeTypeChecker checker; + checker.addWantedMimeType( m_MimeType ); Q_FOREACH ( const Item& item, items ) { - if ( getMimeWithFormat(format) != item.mimeType() ) { + // report only items of given mimeType + if ( checker.isWantedItem( item ) ) + reportChange ( item ); + else kDebug() << item.mimeType() << "skipped!"; - continue; - } - reportChange ( item ); } kDebug() << "slotItemsReceived done"; } @@ -258,7 +259,11 @@ kDebug() << "Revision:" << item.revision() << "\n"; kDebug() << "StorageCollectionId:" << item.storageCollectionId() << "\n"; kDebug() << "Url:" << item.url() << "\n"; - kDebug() << "item.payloadData().data()" << "\n" << item.payloadData().data() ; + + QString hash = getHash( item.id(), item.revision() ) ; + + kDebug() << hash; + kDebug() << "item.payloadData().data()" << "\n" << item.payloadData().data(); OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); @@ -274,14 +279,9 @@ } osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); - osync_change_set_hash ( change, QString::number( item.revision() ).toLatin1() ); +// osync_change_set_uid ( change, QString::number( item.id() ).toLatin1() ); + osync_change_set_hash ( change, getHash( item.id(), item.revision() ).toLatin1().data() ); OSyncChangeType changetype = osync_hashtable_get_changetype(hashtable, change); - if ( ! changetype ) { - kDebug() << "No change type"; - osync_change_unref ( change ); - warning ( error ); - return; - } osync_change_set_changetype(change, changetype); osync_hashtable_update_change ( hashtable, change ); @@ -296,23 +296,33 @@ // should be queried later in a "get_data" function OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1().data() ); - char *cvtToString = item.payloadData().data(); - OSyncData *odata = osync_data_new ( cvtToString , strlen(cvtToString), format, &error ); + int newDataSize = item.payloadData().size(); + char newData[newDataSize]; + memcpy(newData, item.payloadData().data(), newDataSize); +// OSyncData *odata = osync_data_new ( item.payloadData().data() , item.payloadData().size(), format, &error ); + OSyncData *odata = osync_data_new ( newData, newDataSize, format, &error ); if ( !odata ) { - osync_data_unref ( odata ); osync_change_unref(change); warning(error); return; } - osync_data_set_objtype( odata, osync_objtype_sink_get_name( sink() ) ); - osync_change_set_data ( change, odata ); + + osync_error_unref(&error); + + kDebug()<< "change" << change; + kDebug()<< "data " << odata; + kDebug()<< "context" << context(); - osync_data_unref ( odata ); +// do I need this here + osync_data_set_objtype( odata, m_Name.toLatin1().data() ); + osync_change_set_data ( change, odata ); +// not sure but it gets probably delete together with data +// osync_data_unref ( odata ); osync_context_report_change ( context(), change ); - osync_error_unref(&error); + osync_change_unref ( change ); } @@ -328,10 +338,7 @@ { QString uid ( ( char * ) u->data ); kDebug() << "going to delete with uid:" << uid; -// if ( getMimeWithFormat(format) != ) { -// kDebug() << item.mimeType() << "skipped!"; -// return; -// } + OSyncChange *change = osync_change_new ( &error ); if ( !change ) { @@ -353,43 +360,22 @@ continue; } - osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); + osync_data_set_objtype( data, m_Name.toLatin1().data() ); osync_change_set_data( change, data ); osync_data_unref(data); + osync_hashtable_update_change ( hashtable, change ); osync_context_report_change ( context(), change ); - osync_hashtable_update_change ( hashtable, change ); +// osync_hashtable_update_change ( hashtable, change ); osync_change_unref ( change ); } - osync_list_free ( u ); osync_list_free ( uids ); osync_error_unref(&error); - success(); kDebug() << "got all changes success()."; -} - -// NOTE "application/x-vnd.kde.contactgroup" is used for contact groups ... we can use it probably later - -QString DataSink::getMimeWithFormat ( OSyncObjFormat * format ) { - const char* name = osync_objformat_get_name (format); - if (!strcmp(name,"vcard21") || !strcmp(name,"vcard30") ) - return "text/directory"; - else if (!strcmp(name,"vevent10") || !strcmp(name,"vevent20") ) -// return "text/calendar"; - return "application/x-vnd.akonadi.calendar.event"; - else if (!strcmp(name,"vtodo10") || !strcmp(name,"vtodo20")) -// return "text/calendar"; - return "application/x-vnd.akonadi.calendar.todo"; - else if (!strcmp(name,"vnote11") ) - return "application/x-vnd.kde.notes"; - else if (!strcmp(name,"vjournal")) -// return "text/calendar"; - return "application/x-vnd.akonadi.calendar.journal"; - else - return NULL; + success(); } void DataSink::commit ( OSyncChange *change ) @@ -397,10 +383,16 @@ kDebug(); OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - QString mimeType = getMimeWithFormat(osync_change_get_objformat(change)); - QString id = QString::fromLatin1 ( osync_change_get_uid ( change ) ); - kDebug() << "change uid:" << id; +// kDebug() << "change hash:" << osync_change_get_hash ( change ) ; + + QString remoteId = QString::fromLatin1 ( osync_change_get_uid ( change ) ); + QString hash = QString::fromLatin1 ( osync_change_get_hash ( change ) ); + + int id = idFromHash(hash); + kDebug() << "change id:" << id; + kDebug() << "change uid:" << remoteId; + kDebug() << "change hash:" << hash; kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); kDebug(); @@ -418,25 +410,27 @@ Item item; char *plain = 0; osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); - QString str = QString::fromLatin1 ( plain ); - setPayload ( &item, mimeType, str ); - item.setRemoteId( id ); + QString str = QString::fromUtf8( plain ); +// QString str = QString::fromLatin1( plain ); +// QString str = QString::fromLocal8Bit( plain ); + kDebug() << "data: " << str; + setPayload ( &item, str ); + item.setRemoteId( remoteId ); ItemCreateJob *job = new Akonadi::ItemCreateJob ( item, col ); if ( ! job->exec() ) { error( OSYNC_ERROR_GENERIC, "Unable to create job for item."); return; - } - - item = job->item(); // handle !job->exec in return too.. - if ( ! item.isValid() ) { + } else { + item = job->item(); // handle !job->exec in return too.. + if ( ! item.isValid() ) { error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); return; - } - osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1().data() ); -// osync_change_set_hash(change, "0"); - kDebug() << "data" << str; + } + osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); + osync_change_set_hash ( change, getHash( item.id(), item.revision() ).toLatin1().data() ); + + } break; } @@ -444,46 +438,48 @@ { char *plain = 0; osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); - QString str = QString::fromLatin1 ( plain ); - Item item = fetchItem ( id ); + QString str = QString::fromUtf8( plain ); + kDebug() << "data" << str; + Item item = fetchItem ( remoteId ); if ( ! item.isValid() ) { error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); return; } - setPayload ( &item, mimeType, str ); + setPayload ( &item, str ); ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); if ( ! modifyJob->exec() ) { error ( OSYNC_ERROR_GENERIC, "Unable to fetch item."); return; - } - - item = modifyJob->item(); - if ( ! item.isValid() ) { + } else { + item = modifyJob->item(); + if ( ! item.isValid() ) { error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); return; - } - osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1().data() ); -// osync_change_set_hash(change, "0"); - kDebug() << "data" << str; + } + osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); + osync_change_set_hash ( change, getHash( item.id(), item.revision() ).toLatin1().data() ); + + } break; } case OSYNC_CHANGE_TYPE_DELETED: { - Item item = fetchItem ( id ); + Item item = fetchItem ( remoteId ); if ( ! item.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Unable to fetch item"); - return; // FIXME break or return? +// error( OSYNC_ERROR_GENERIC, "Unable to fetch item"); + break; // FIXME break or return? } ItemDeleteJob *job = new ItemDeleteJob( item ); if ( ! job->exec() ) { - error( OSYNC_ERROR_GENERIC, "Unable to delete item"); - return; +// error( OSYNC_ERROR_GENERIC, "Unable to delete item"); + break; } + osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); + kDebug() << "deleted: (testing skipped)" << remoteId; break; } @@ -500,14 +496,15 @@ } osync_hashtable_update_change ( hashtable, change ); + success(); } -bool DataSink::setPayload ( Item *item, const QString mimeType, const QString &str ) +bool DataSink::setPayload ( Item *item, const QString &str ) { kDebug(); - item->setMimeType ( mimeType ); - kDebug()<< "To mimetype: " << mimeType; + item->setMimeType ( m_MimeType ); + kDebug()<< "To mimetype: " << m_MimeType; switch ( m_type ) { case Contacts: @@ -554,7 +551,26 @@ return true; } -const Item DataSink::fetchItem ( const QString& id ) +const Item DataSink::fetchItem ( int id ) +{ + kDebug(); + ItemFetchJob *fetchJob = new ItemFetchJob( Item( id ) ); + fetchJob->fetchScope().fetchFullPayload(); + + if( fetchJob->exec() ) { + foreach ( const Item &item, fetchJob->items() ) { + if( item.id() == id ) { + kDebug() << "got item"; + return item; + } + } + } + + // no such item found? + return Item(); +} + +const Item DataSink::fetchItem ( const QString& remoteId ) { kDebug(); @@ -562,13 +578,12 @@ fetchJob->fetchScope().fetchFullPayload(); if ( fetchJob->exec() ) foreach ( const Item &item, fetchJob->items() ) - if ( !strcmp(item.remoteId().toLatin1().data(), id.toLatin1().data() )) + if ( item.remoteId() == remoteId ) return item; // no such item found? // this will be handled as invalid item return Item(); } - void DataSink::syncDone() { kDebug() << "sync for sink member done"; @@ -581,4 +596,14 @@ success(); } +QString DataSink::getHash( int id, int rev ) { + return QString::number(id) + "-" + QString::number( rev ) ; +} + +int DataSink::idFromHash( const QString hash) { + QString str = hash; + str.remove(QRegExp("-.*")); + kDebug() << str; + return str.toInt(); +} #include "datasink.moc" Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/datasink.h Wed Nov 3 09:11:10 2010 (r6151) @@ -1,8 +1,5 @@ /* Copyright (c) 2008 Volker Krause <vk...@kd...> - Copyright (c) 2010 Emanoil Kotsev <del...@ya...> - - $Id$ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by @@ -27,17 +24,12 @@ #include <akonadi/collection.h> #include <akonadi/itemfetchjob.h> -#include <akonadi/itemcreatejob.h> -#include <akonadi/itemmodifyjob.h> -#include <akonadi/itemfetchscope.h> #include <opensync/opensync.h> #include <opensync/opensync-plugin.h> #include <opensync/opensync-data.h> #include <opensync/opensync-format.h> -#include <KUrl> - #include <boost/shared_ptr.hpp> using namespace Akonadi; @@ -50,12 +42,12 @@ Q_OBJECT public: - enum Type { Calendars = 0, Contacts, Todos, Notes }; + enum Type { Calendars = 0, Contacts, Notes, Todos }; DataSink( int type ); ~DataSink(); - bool initialize( OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncObjTypeSink *sink, OSyncError **error ); + bool initialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncObjTypeSink *sink, OSyncError **error ); void getChanges(); void commit( OSyncChange *change ); @@ -66,7 +58,6 @@ void slotItemsReceived( const Akonadi::Item::List & ); protected: - /** * Returns the collection we are supposed to sync with. */ @@ -78,26 +69,42 @@ void reportChange( const Item& item, const QString& format ); /** - * Reimplement in subclass to provide data about changes to opensync. - * Note, that you must call DataSink::reportChange( Item, QString, int ) - * after you have organized data to be send to opensync. + * Reimplement in subclass to provide data about changes to opensync. Note, that you must call DataSink::reportChange( Item, QString, int ) after you have organized data to be send to opensync. */ void reportChange( const Item & item ); /** + * Creates a new item based on the data given by opensync. + */ +// const Item createItem( OSyncChange *change ); + /** + * Modified an item based on the data given by opensync. + */ +// const Item modifyItem( OSyncChange *change ); + /** * Deletes an item based on the data given by opensync. */ - void deleteItem( OSyncChange *change ); +// void deleteItem( OSyncChange *change ); + private: + const Item createAkonadiItem( OSyncChange *change ); const Item fetchItem( const QString& id ); - bool setPayload( Item *item, const QString mimeType, const QString &str ); - QString getMimeWithFormat(OSyncObjFormat* format); + const Item fetchItem( int id ); + const QString formatName(); + bool setPayload( Item *item, const QString &str ); + QString getHash(int id, int rev); + int idFromHash(QString hash); + private: + int m_type; + QString m_Name; QString m_Format; + QString m_MimeType; QString m_Url; + }; #endif Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Wed Nov 3 09:11:10 2010 (r6151) @@ -25,9 +25,11 @@ #define WRAP() \ osync_trace( TRACE_ENTRY, "%s(%p,%p, %p, %p)", __PRETTY_FUNCTION__, sink, info, ctx, userdata); \ - SinkBase *sb = reinterpret_cast<SinkBase*>(userdata ); \ - sb->setContext( ctx ); \ - sb->setPluginInfo( info ); + kDebug() << osync_objtype_sink_get_name( sink );\ + SinkBase *sb = reinterpret_cast<SinkBase*>(userdata); \ + sb->setSink(sink);\ + sb->setPluginInfo( info );\ + sb->setContext( ctx ); extern "C" { @@ -40,38 +42,38 @@ } static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP( ) + WRAP( ) sb->disconnect(); + osync_objtype_sink_unref(sink); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - WRAP ( ) - if ( slow_sync ) - sb->setSlowSink(slow_sync); + WRAP ( ) + sb->setSlowSink(slow_sync); sb->getChanges(); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP( ) + WRAP( ) sb->syncDone(); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void commit_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { - WRAP( ) + WRAP( ) sb->commit(change); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } - static void commitAll_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP( ) - sb->commitAll(); - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); - } - +// static void commitAll_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { +// WRAP( ) +// sb->commitAll(); +// osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); +// } +// // static void read_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { // WRAP( ) // sb->commit(change); @@ -88,9 +90,9 @@ SinkBase::SinkBase( int features ) : - mContext( 0 ), mSink( 0 ), mPluginInfo( 0 ), + mContext( 0 ), m_canConnect(false), m_canDisconnect(false), m_canCommit (false), @@ -117,12 +119,12 @@ SinkBase::~SinkBase() { - if ( mContext) - osync_context_unref(mContext); +// if ( mContext) +// osync_context_unref(mContext); if ( mSink ) osync_objtype_sink_unref( mSink ); - if (mPluginInfo) - osync_plugin_info_unref(mPluginInfo); +// if (mPluginInfo) +// osync_plugin_info_unref(mPluginInfo); } void SinkBase::connect() @@ -132,50 +134,54 @@ void SinkBase::setSlowSink(osync_bool s) { - Q_ASSERT( m_SlowSync ); + kDebug(); m_SlowSync = s; } osync_bool SinkBase::getSlowSink() { - Q_ASSERT( m_SlowSync ); + kDebug(); return m_SlowSync; } void SinkBase::disconnect() { + kDebug(); Q_ASSERT( false ); } void SinkBase::getChanges() { + kDebug(); Q_ASSERT( false ); } void SinkBase::commit(OSyncChange * chg) { + kDebug(); Q_UNUSED( chg ); Q_ASSERT( false ); } -void SinkBase::commitAll() -{ - Q_ASSERT( false ); -} - -void SinkBase::write() -{ - Q_ASSERT( false ); -} - -void SinkBase::read() -{ - Q_ASSERT( false ); -} +// void SinkBase::commitAll() +// { +// Q_ASSERT( false ); +// } +// +// void SinkBase::write() +// { +// Q_ASSERT( false ); +// } +// +// void SinkBase::read() +// { +// Q_ASSERT( false ); +// } void SinkBase::syncDone() { + kDebug(); Q_ASSERT( false ); } @@ -184,13 +190,18 @@ kDebug(); Q_ASSERT( mContext ); osync_context_report_success( mContext ); + mContext = 0; } -void SinkBase::error(OSyncErrorType type, const QString &msg) const +void SinkBase::error(OSyncErrorType type, QString msg) const { kDebug(); Q_ASSERT( mContext ); - osync_context_report_error(mContext, type, "%s", msg.toLatin1().data() ); + OSyncError *oerror; + osync_error_set(&oerror, type, "%s", msg.toUtf8().data() ); + osync_context_report_osyncerror(mContext, oerror ); + osync_error_unref( &oerror ); + mContext = 0; } void SinkBase::warning(OSyncError * error) const @@ -199,6 +210,7 @@ Q_ASSERT( mContext ); osync_context_report_osyncwarning( mContext, error ); osync_error_unref( &error ); + mContext = 0; } void SinkBase::wrapSink(OSyncObjTypeSink* sink) @@ -212,10 +224,10 @@ kDebug() << ">> m_canDisconnect:" << m_canDisconnect; kDebug() << ">> m_canCommit:" << m_canCommit; kDebug() << ">> m_canGetChanges:" << m_canGetChanges; - kDebug() << ">> m_canWrite:" << m_canConnect; - kDebug() << ">> m_canCommitAll:" << m_canGetChanges; - kDebug() << ">> m_canRead:" << m_canConnect; - kDebug() << ">> m_canSyncDone:" << m_canGetChanges; + kDebug() << ">> m_canWrite:" << m_canWrite; + kDebug() << ">> m_canCommitAll:" << m_canCommitAll; + kDebug() << ">> m_canRead:" << m_canRead; + kDebug() << ">> m_canSyncDone:" << m_canSyncDone; if ( m_canConnect ) { osync_objtype_sink_set_connect_func(sink, connect_wrapper); @@ -233,10 +245,10 @@ osync_objtype_sink_set_commit_func(sink, commit_wrapper); osync_objtype_sink_set_commit_timeout(sink, 15); } - if ( m_canCommitAll ) { - osync_objtype_sink_set_committed_all_func(sink, commitAll_wrapper); - osync_objtype_sink_set_committedall_timeout(sink, 15); - } +// if ( m_canCommitAll ) { +// osync_objtype_sink_set_committed_all_func(sink, commitAll_wrapper); +// osync_objtype_sink_set_committedall_timeout(sink, 15); +// } if ( m_canSyncDone ) { osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); osync_objtype_sink_set_syncdone_timeout(sink, 15); @@ -249,16 +261,27 @@ // osync_objtype_sink_set_read_timeout(sink, 5); // } + osync_objtype_sink_set_userdata ( sink, this ); + +} + +void SinkBase::setSink(OSyncObjTypeSink *sink) +{ + kDebug(); + Q_ASSERT( sink == mSink ); + mSink = sink; } void SinkBase::setPluginInfo(OSyncPluginInfo * info) { + kDebug(); Q_ASSERT( mPluginInfo == 0 || mPluginInfo == info ); mPluginInfo = info; } void SinkBase::setContext(OSyncContext * context) { + kDebug(); Q_ASSERT( mContext == 0 || context == mContext ); // ### do I need to ref() that here? and then probably deref() the old one somewhere above? mContext = context; Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Thu Oct 21 15:55:57 2010 (r6150) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Wed Nov 3 09:11:10 2010 (r6151) @@ -56,38 +56,40 @@ virtual void disconnect(); virtual void getChanges(); virtual void commit( OSyncChange *chg ); - virtual void write(); - virtual void read(); - virtual void commitAll(); +// virtual void write(); +// virtual void read(); +// virtual void commitAll(); virtual void syncDone(); OSyncContext* context() const { return mContext; } - void setContext( OSyncContext *context ); OSyncPluginInfo *pluginInfo() const { return mPluginInfo; } + osync_bool getSlowSink (); + void setPluginInfo( OSyncPluginInfo *info ); + void setContext( OSyncContext *context ); + void setSink( OSyncObjTypeSink *sink); void setSlowSink (osync_bool); - osync_bool getSlowSink (); protected: void success() const; - void error( OSyncErrorType type, const QString &msg ) const; + void error(OSyncErrorType type, QString msg) const; void warning( OSyncError *error ) const; - void wrapSink( OSyncObjTypeSink* sink ); + void wrapSink(OSyncObjTypeSink* sink ); OSyncObjTypeSink* sink() const { return mSink; } - bool m_isContact, m_isEvent, m_isTodo, m_isNote, m_isJournal; //TODO intended to be private +// bool m_isContact, m_isEvent, m_isTodo, m_isNote, m_isJournal; //TODO intended to be private private: - mutable OSyncContext *mContext; OSyncObjTypeSink *mSink; OSyncPluginInfo *mPluginInfo; + mutable OSyncContext *mContext; // what do we have and what can we do bool m_canConnect, m_canDisconnect, m_canCommit, m_canCommitAll, m_canGetChanges, m_canWrite, m_canRead, m_canSyncDone; |
From: <svn...@op...> - 2010-10-21 13:56:12
|
Author: ianmartin Date: Thu Oct 21 15:55:57 2010 New Revision: 6150 URL: http://www.opensync.org/changeset/6150 Log: Check if system specfic macros are defined rather than their value Fixes #1263 Thanks to Eckhart Wörner <ewo...@kd...> for patch Modified: trunk/opensync/opensync.h Modified: trunk/opensync/opensync.h ============================================================================== --- trunk/opensync/opensync.h Thu Oct 21 03:26:25 2010 (r6149) +++ trunk/opensync/opensync.h Thu Oct 21 15:55:57 2010 (r6150) @@ -45,11 +45,11 @@ #define __func__ __FUNCTION__ #define OSYNC_EXPORT __declspec(dllexport) -#elif __GNUC__ +#elif defined(__GNUC__) #include <unistd.h> #define OSYNC_EXPORT __attribute__ ((visibility("default"))) -#elif __sun +#elif defined(__sun) #include <unistd.h> #define OSYNC_EXPORT __global |
From: <svn...@op...> - 2010-10-21 01:26:37
|
Author: deloptes Date: Thu Oct 21 03:26:25 2010 New Revision: 6149 URL: http://www.opensync.org/changeset/6149 Log: - fixed many things, so that it works more stable now, but still not stable enough - fixed return for mimetype - did tested todo and it seems to be working TODO: a problem is to have all items synced toghether Modified: plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/datasink.h Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Tue Oct 19 22:16:51 2010 (r6148) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Thu Oct 21 03:26:25 2010 (r6149) @@ -28,7 +28,7 @@ <Url>default</Url> </Resource> <Resource> - <Enabled>0</Enabled> + <Enabled>1</Enabled> <Formats> <Format> <Name>vtodo10</Name> Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Tue Oct 19 22:16:51 2010 (r6148) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Thu Oct 21 03:26:25 2010 (r6149) @@ -51,7 +51,6 @@ DataSink::DataSink ( int type ) : SinkBase ( GetChanges | Commit | SyncDone ), m_Format("default"), - m_Enabled(false), m_Url("default") { kDebug() << "Constr.objtype:" << type; @@ -76,7 +75,7 @@ // Q_UNUSED ( info ); Q_UNUSED ( error ); - +// require configuration OSyncPluginConfig *config = osync_plugin_info_get_config ( info ); if ( !config ) { @@ -84,16 +83,15 @@ return false; } -// FIXME enable checks on sync/commit etc!! +// require enabled ressource OSyncPluginResource *resource = osync_plugin_config_find_active_resource ( config, osync_objtype_sink_get_name ( sink ) ); - if ( ! resource || ! osync_plugin_resource_is_enabled(resource) ) { - m_Enabled = FALSE; + if ( ! resource || ! osync_plugin_resource_is_enabled(resource) ) return false; - } else - m_Enabled = TRUE; +// get url m_Url = osync_plugin_resource_get_url ( resource ); +// set format OSyncList *objfrmtList = osync_plugin_resource_get_objformat_sinks ( resource ); const char *preferred = osync_plugin_resource_get_preferred_format(resource); for ( OSyncList *r = objfrmtList;r;r = r->next ) @@ -150,12 +148,17 @@ kDebug() << "Has objformat: " << m_Format; + osync_objtype_sink_set_userdata ( sink, this ); wrapSink ( sink ); - osync_objtype_sink_set_enabled ( sink, true ); - osync_objtype_sink_set_available ( sink, true ); - osync_objtype_sink_set_userdata ( sink, this ); - osync_objtype_sink_enable_hashtable ( sink , true ); +// osync_objtype_sink_set_enabled ( sink, true ); +// osync_objtype_sink_set_available ( sink, true ); +// set hashtable + OSyncHashTable *hashtable = NULL; + if ( osync_objtype_sink_load_hashtable ( sink , info, error ) ) + hashtable = osync_objtype_sink_get_hashtable(sink); + if ( ! hashtable ) + osync_objtype_sink_enable_hashtable ( sink , true ); return true; } @@ -184,13 +187,12 @@ OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); -// if ( !hashtable ) { -// kDebug() << "No hashtable"; -// osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); -// return; -// } + if ( !hashtable ) { + kDebug() << "No hashtable"; + osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + return; + } -// FIXME: I don't understand this completely well if ( getSlowSink() ) { kDebug() << "we're in the middle of slow-syncing..."; @@ -198,12 +200,15 @@ if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) { osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); -// error ( OSYNC_ERROR_GENERIC, osync_error_print ( &oerror) ); + error ( OSYNC_ERROR_GENERIC, osync_error_print ( &oerror) ); osync_error_unref(&oerror); + return; } } Akonadi::Collection col = collection() ; + +// col.setContentMimeTypes( QStringList() << getMimeWithFormat(format) ); if ( !col.isValid() ) { kDebug() << "No collection"; @@ -230,8 +235,16 @@ { kDebug(); kDebug() << "retrieved" << items.count() << "items"; + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1().data() ); + + Q_FOREACH ( const Item& item, items ) { - reportChange ( item ); + if ( getMimeWithFormat(format) != item.mimeType() ) { + kDebug() << item.mimeType() << "skipped!"; + continue; + } + reportChange ( item ); } kDebug() << "slotItemsReceived done"; } @@ -247,6 +260,8 @@ kDebug() << "Url:" << item.url() << "\n"; kDebug() << "item.payloadData().data()" << "\n" << item.payloadData().data() ; + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); + OSyncError *error = 0; OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); @@ -257,33 +272,30 @@ warning ( error ); return; } -// TODO Do I need to filter here some items -// osync_change_get_objformat( change ); -// if ( strcmp(m_MimeType.toLatin1(),item.mimeType().toLatin1()) ) { -// osync_change_unref ( change ); -// // warning ( error ); -// return; -// } osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); osync_change_set_hash ( change, QString::number( item.revision() ).toLatin1() ); OSyncChangeType changetype = osync_hashtable_get_changetype(hashtable, change); + if ( ! changetype ) { + kDebug() << "No change type"; + osync_change_unref ( change ); + warning ( error ); + return; + } osync_change_set_changetype(change, changetype); osync_hashtable_update_change ( hashtable, change ); if ( changetype == OSYNC_CHANGE_TYPE_UNMODIFIED ) { - osync_change_unref(change); + osync_error_unref(&error); return; } // Now you can set the data for the object // Set the last argument to FALSE if the real data // should be queried later in a "get_data" function - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1().data() ); - char *cvtToString = item.payloadData().data(); OSyncData *odata = osync_data_new ( cvtToString , strlen(cvtToString), format, &error ); if ( !odata ) @@ -299,6 +311,8 @@ osync_data_unref ( odata ); osync_context_report_change ( context(), change ); + + osync_error_unref(&error); } @@ -308,21 +322,28 @@ OSyncError *error = 0; OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1().data() ); OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); OSyncList *u, *uids = osync_hashtable_get_deleted ( hashtable ); for ( u = uids; u; u = u->next ) { QString uid ( ( char * ) u->data ); kDebug() << "going to delete with uid:" << uid; - +// if ( getMimeWithFormat(format) != ) { +// kDebug() << item.mimeType() << "skipped!"; +// return; +// } OSyncChange *change = osync_change_new ( &error ); if ( !change ) { osync_change_unref ( change ); warning ( error ); continue; - } + } + + osync_change_set_uid ( change, uid.toLatin1().data() ); + osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); + + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1().data() ); error = 0; OSyncData *data = osync_data_new( NULL, 0, format, &error ); if ( !data ) { @@ -332,23 +353,22 @@ continue; } - osync_change_set_uid ( change, uid.toLatin1().data() ); - osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); - osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); osync_change_set_data( change, data ); - - osync_hashtable_update_change ( hashtable, change ); + osync_data_unref(data); osync_context_report_change ( context(), change ); - osync_data_unref(data); + osync_hashtable_update_change ( hashtable, change ); + osync_change_unref ( change ); } + osync_list_free ( u ); osync_list_free ( uids ); - - success(); - kDebug() << "got all changes success()."; + osync_error_unref(&error); + + success(); + kDebug() << "got all changes success()."; } // NOTE "application/x-vnd.kde.contactgroup" is used for contact groups ... we can use it probably later @@ -357,7 +377,7 @@ const char* name = osync_objformat_get_name (format); if (!strcmp(name,"vcard21") || !strcmp(name,"vcard30") ) return "text/directory"; - else if (!strcmp(name,"vevent10") || !strcmp(name,"vevent10") ) + else if (!strcmp(name,"vevent10") || !strcmp(name,"vevent20") ) // return "text/calendar"; return "application/x-vnd.akonadi.calendar.event"; else if (!strcmp(name,"vtodo10") || !strcmp(name,"vtodo20")) @@ -369,7 +389,7 @@ // return "text/calendar"; return "application/x-vnd.akonadi.calendar.journal"; else - return false; + return NULL; } void DataSink::commit ( OSyncChange *change ) @@ -377,16 +397,12 @@ kDebug(); OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - char *plain = 0; - osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); - QString str = QString::fromLatin1 ( plain ); - QString id = QString::fromLatin1 ( osync_change_get_uid ( change ) ); QString mimeType = getMimeWithFormat(osync_change_get_objformat(change)); + QString id = QString::fromLatin1 ( osync_change_get_uid ( change ) ); kDebug() << "change uid:" << id; kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); kDebug(); - kDebug() << "data" << str; Akonadi::Collection col = collection(); @@ -395,11 +411,14 @@ return; } - switch ( osync_change_get_changetype ( change ) ) + switch ( (OSyncChangeType) osync_change_get_changetype ( change ) ) { case OSYNC_CHANGE_TYPE_ADDED: { Item item; + char *plain = 0; + osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); + QString str = QString::fromLatin1 ( plain ); setPayload ( &item, mimeType, str ); item.setRemoteId( id ); @@ -416,11 +435,16 @@ } osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1().data() ); +// osync_change_set_hash(change, "0"); + kDebug() << "data" << str; break; } case OSYNC_CHANGE_TYPE_MODIFIED: { + char *plain = 0; + osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); + QString str = QString::fromLatin1 ( plain ); Item item = fetchItem ( id ); if ( ! item.isValid() ) { @@ -442,6 +466,8 @@ } osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1().data() ); +// osync_change_set_hash(change, "0"); + kDebug() << "data" << str; break; } @@ -450,7 +476,7 @@ Item item = fetchItem ( id ); if ( ! item.isValid() ) { error( OSYNC_ERROR_GENERIC, "Unable to fetch item"); - return; + return; // FIXME break or return? } ItemDeleteJob *job = new ItemDeleteJob( item ); @@ -474,7 +500,6 @@ } osync_hashtable_update_change ( hashtable, change ); - success(); } @@ -482,6 +507,7 @@ { kDebug(); item->setMimeType ( mimeType ); + kDebug()<< "To mimetype: " << mimeType; switch ( m_type ) { case Contacts: @@ -534,7 +560,6 @@ ItemFetchJob *fetchJob = new ItemFetchJob ( collection() ); fetchJob->fetchScope().fetchFullPayload(); -// fetchJob->start(); if ( fetchJob->exec() ) foreach ( const Item &item, fetchJob->items() ) if ( !strcmp(item.remoteId().toLatin1().data(), id.toLatin1().data() )) Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Tue Oct 19 22:16:51 2010 (r6148) +++ plugins/akonadi-sync/trunk/src/datasink.h Thu Oct 21 03:26:25 2010 (r6149) @@ -95,12 +95,9 @@ QString getMimeWithFormat(OSyncObjFormat* format); private: -// OSyncHashTable *m_hashtable; int m_type; QString m_Format; - bool m_Enabled; QString m_Url; -// QString m_MimeType; }; #endif |
From: <svn...@op...> - 2010-10-19 20:17:02
|
Author: deloptes Date: Tue Oct 19 22:16:51 2010 New Revision: 6148 URL: http://www.opensync.org/changeset/6148 Log: - fixed anissue with reporting success in getChanges Modified: plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/datasink.h Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Sat Oct 16 19:11:56 2010 (r6147) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Tue Oct 19 22:16:51 2010 (r6148) @@ -73,7 +73,7 @@ { kDebug() << "initializing" << osync_objtype_sink_get_name ( sink ); Q_UNUSED ( plugin ); - Q_UNUSED ( info ); +// Q_UNUSED ( info ); Q_UNUSED ( error ); @@ -145,8 +145,8 @@ } } - if ( ! preferred || strcmp(preferred,m_Format.toLatin1() ) ) - osync_plugin_resource_set_preferred_format( resource, m_Format.toLatin1() ); + if ( ! preferred || strcmp(preferred,m_Format.toLatin1().data() ) ) + osync_plugin_resource_set_preferred_format( resource, m_Format.toLatin1().data() ); kDebug() << "Has objformat: " << m_Format; @@ -184,72 +184,69 @@ OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - if ( !hashtable ) - { - kDebug() << "No hashtable"; - osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); - return; - } - - Akonadi::Collection col = collection() ; - if ( !col.isValid() ) - { - kDebug() << "No collection"; - osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); - return; - } +// if ( !hashtable ) { +// kDebug() << "No hashtable"; +// osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); +// return; +// } + // FIXME: I don't understand this completely well - if ( getSlowSink() ) + if ( getSlowSink() ) { kDebug() << "we're in the middle of slow-syncing..."; osync_trace ( TRACE_INTERNAL, "resetting hashtable" ); if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) { - warning ( oerror ); osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); - return; +// error ( OSYNC_ERROR_GENERIC, osync_error_print ( &oerror) ); + osync_error_unref(&oerror); } } - ItemFetchJob *job = new ItemFetchJob ( col ); - job->fetchScope().fetchFullPayload(); - kDebug() << "Fetched full payload"; + Akonadi::Collection col = collection() ; + if ( !col.isValid() ) + { + kDebug() << "No collection"; + osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + return; + } - QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); - QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); + ItemFetchJob *job = new ItemFetchJob ( col ); + job->fetchScope().fetchFullPayload(); + kDebug() << "Fetched full payload"; - if ( !job->exec() ) - { - error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); - return; - } + QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); + QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); - kDebug() << "success()"; - success(); + if ( !job->exec() ) + { + error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); + return; + } + } void DataSink::slotItemsReceived ( const Item::List &items ) { kDebug(); kDebug() << "retrieved" << items.count() << "items"; - Q_FOREACH ( const Item& item, items ) + Q_FOREACH ( const Item& item, items ) { reportChange ( item ); - kDebug() << "done"; + } + kDebug() << "slotItemsReceived done"; } void DataSink::reportChange ( const Item& item ) { kDebug(); kDebug() << "Id:" << item.id() << "\n"; + kDebug() << "RemoteId:" << item.remoteId() << "\n"; kDebug() << "Mime:" << item.mimeType() << "\n"; kDebug() << "Revision:" << item.revision() << "\n"; kDebug() << "StorageCollectionId:" << item.storageCollectionId() << "\n"; kDebug() << "Url:" << item.url() << "\n"; kDebug() << "item.payloadData().data()" << "\n" << item.payloadData().data() ; - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1() ); - OSyncError *error = 0; OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); @@ -268,59 +265,52 @@ // return; // } + osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); + osync_change_set_hash ( change, QString::number( item.revision() ).toLatin1() ); + OSyncChangeType changetype = osync_hashtable_get_changetype(hashtable, change); + osync_change_set_changetype(change, changetype); + osync_hashtable_update_change ( hashtable, change ); + + if ( changetype == OSYNC_CHANGE_TYPE_UNMODIFIED ) { + + osync_change_unref(change); + return; + } // Now you can set the data for the object // Set the last argument to FALSE if the real data // should be queried later in a "get_data" function - QString cvtToString = QString ( item.payloadData().data() ); - OSyncData *odata = osync_data_new ( cvtToString.toLatin1().data() , cvtToString.size(), format, &error ); + + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1().data() ); + + char *cvtToString = item.payloadData().data(); + OSyncData *odata = osync_data_new ( cvtToString , strlen(cvtToString), format, &error ); if ( !odata ) { - warning(error); osync_data_unref ( odata ); + osync_change_unref(change); + warning(error); return; } - - osync_change_set_uid ( change, item.remoteId().toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); osync_data_set_objtype( odata, osync_objtype_sink_get_name( sink() ) ); osync_change_set_data ( change, odata ); osync_data_unref ( odata ); - OSyncChangeType changetype = osync_hashtable_get_changetype ( hashtable, change ); - osync_change_set_changetype ( change, changetype ); - osync_hashtable_update_change ( hashtable, change ); - - if ( changetype != OSYNC_CHANGE_TYPE_UNMODIFIED ) - osync_context_report_change ( context(), change ); + osync_context_report_change ( context(), change ); - /* - kDebug() - << "changeid:" << osync_change_get_uid ( change ) << "; " - << "itemid:" << item.id() << "; " - << "revision:" << item.revision() << "; " - << "changetype:" << changetype << "; " - << "hash:" << osync_hashtable_get_hash ( hashtable, osync_change_get_uid ( change ) ) << "; " - << "objtype:" << osync_change_get_objtype ( change ) << "; " - << "m_Format:" << m_Format << "; " - << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ) << "; " - << "sinkname:" << osync_objtype_sink_get_name ( sink() ); - */ -// osync_error_unref(&error); -// osync_objformat_unref(format); -// osync_format_env_unref(formatenv); } void DataSink::slotGetChangesFinished ( KJob * ) { kDebug(); OSyncError *error = 0; - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - OSyncList *u, *uids = osync_hashtable_get_deleted ( hashtable ); OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1() ); + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1().data() ); + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); + OSyncList *u, *uids = osync_hashtable_get_deleted ( hashtable ); for ( u = uids; u; u = u->next ) { QString uid ( ( char * ) u->data ); @@ -336,25 +326,29 @@ error = 0; OSyncData *data = osync_data_new( NULL, 0, format, &error ); if ( !data ) { + osync_data_unref ( data ); osync_change_unref( change ); warning( error ); continue; } - osync_change_set_uid ( change, uid.toLatin1() ); + osync_change_set_uid ( change, uid.toLatin1().data() ); osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); osync_change_set_data( change, data ); + osync_hashtable_update_change ( hashtable, change ); + osync_context_report_change ( context(), change ); - osync_change_unref ( change ); osync_data_unref(data); + osync_change_unref ( change ); } osync_list_free ( uids ); - kDebug() << "got all changes."; + success(); + kDebug() << "got all changes success()."; } // NOTE "application/x-vnd.kde.contactgroup" is used for contact groups ... we can use it probably later @@ -364,12 +358,15 @@ if (!strcmp(name,"vcard21") || !strcmp(name,"vcard30") ) return "text/directory"; else if (!strcmp(name,"vevent10") || !strcmp(name,"vevent10") ) +// return "text/calendar"; return "application/x-vnd.akonadi.calendar.event"; else if (!strcmp(name,"vtodo10") || !strcmp(name,"vtodo20")) +// return "text/calendar"; return "application/x-vnd.akonadi.calendar.todo"; else if (!strcmp(name,"vnote11") ) return "application/x-vnd.kde.notes"; else if (!strcmp(name,"vjournal")) +// return "text/calendar"; return "application/x-vnd.akonadi.calendar.journal"; else return false; @@ -393,19 +390,18 @@ Akonadi::Collection col = collection(); + if ( !col.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Invalid collction."); + return; + } + switch ( osync_change_get_changetype ( change ) ) { case OSYNC_CHANGE_TYPE_ADDED: { - - if ( !col.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Invalid collction."); - return; - } - Item item; setPayload ( &item, mimeType, str ); - item.setRemoteId( id.toLatin1() ); + item.setRemoteId( id ); ItemCreateJob *job = new Akonadi::ItemCreateJob ( item, col ); if ( ! job->exec() ) { @@ -418,20 +414,20 @@ error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); return; } - osync_change_set_uid ( change, item.remoteId().toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1().data() ); break; } case OSYNC_CHANGE_TYPE_MODIFIED: { - Item item = fetchItem ( id ); - setPayload ( &item, mimeType, str ); + Item item = fetchItem ( id ); if ( ! item.isValid() ) { error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); return; } + setPayload ( &item, mimeType, str ); ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); if ( ! modifyJob->exec() ) { @@ -440,9 +436,12 @@ } item = modifyJob->item(); - - osync_change_set_uid ( change, item.remoteId().toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + if ( ! item.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + return; + } + osync_change_set_uid ( change, item.remoteId().toLatin1().data() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1().data() ); break; } @@ -475,7 +474,7 @@ } osync_hashtable_update_change ( hashtable, change ); - + success(); } @@ -535,10 +534,10 @@ ItemFetchJob *fetchJob = new ItemFetchJob ( collection() ); fetchJob->fetchScope().fetchFullPayload(); - +// fetchJob->start(); if ( fetchJob->exec() ) foreach ( const Item &item, fetchJob->items() ) - if ( !strcmp(item.remoteId().toLatin1(), id.toLatin1() )) + if ( !strcmp(item.remoteId().toLatin1().data(), id.toLatin1().data() )) return item; // no such item found? // this will be handled as invalid item Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Sat Oct 16 19:11:56 2010 (r6147) +++ plugins/akonadi-sync/trunk/src/datasink.h Tue Oct 19 22:16:51 2010 (r6148) @@ -95,7 +95,7 @@ QString getMimeWithFormat(OSyncObjFormat* format); private: - OSyncHashTable *m_hashtable; +// OSyncHashTable *m_hashtable; int m_type; QString m_Format; bool m_Enabled; |
From: <svn...@op...> - 2010-10-16 17:12:06
|
Author: Graham Cobb Date: Sat Oct 16 19:11:56 2010 New Revision: 6147 URL: http://www.opensync.org/changeset/6147 Log: GPE plugin updated to latest API Modified: plugins/gpe/CMakeLists.txt plugins/gpe/ChangeLog plugins/gpe/gpe-sync-basic.xml plugins/gpe/gpe-sync-old.xml plugins/gpe/src/calendar.c plugins/gpe/src/contacts.c plugins/gpe/src/gpe_sync.c plugins/gpe/src/todo.c plugins/gpe/src/utils.c Modified: plugins/gpe/CMakeLists.txt ============================================================================== --- plugins/gpe/CMakeLists.txt Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/CMakeLists.txt Sat Oct 16 19:11:56 2010 (r6147) @@ -16,9 +16,9 @@ ADD_SUBDIRECTORY( src ) OPENSYNC_PACKAGE( ${PROJECT_NAME} ${VERSION} ) -OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-base-description.xml ) -OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-1.0.0-description.xml ) -OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-1.1.1-description.xml ) -OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-1.2.2-description.xml ) -OPENSYNC_PLUGIN_CAPABILITIES( gpe-sync-basic.xml ) -OPENSYNC_PLUGIN_CAPABILITIES( gpe-sync-old.xml ) +#OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-base-description.xml ) +#OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-1.0.0-description.xml ) +#OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-1.1.1-description.xml ) +#OPENSYNC_PLUGIN_DESCRIPTIONS( gpe-sync-1.2.2-description.xml ) +#OPENSYNC_PLUGIN_CAPABILITIES( gpe-sync-basic.xml ) +#OPENSYNC_PLUGIN_CAPABILITIES( gpe-sync-old.xml ) Modified: plugins/gpe/ChangeLog ============================================================================== --- plugins/gpe/ChangeLog Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/ChangeLog Sat Oct 16 19:11:56 2010 (r6147) @@ -1,3 +1,22 @@ +2010-10-16 Graham Cobb <g+...@co...> + + * CMakeLists.txt: Disable capabilities for now + + * gpe-sync-basic.xml: Add copyright notice. + + * gpe-sync-old.xml: Add copyright notice. + + * src/utils.c: Fix compiler warnings + + * src/todo.c: Fix compiler warnings + + * src/contacts.c: Fix compiler warnings + + * src/calendar.c: Fix compiler warnings + + * src/gpe_sync.c: Fix compiler warnings + (get_sync_info): Add error argument to osync_plugin_env_register_plugin + 2009-05-14 Graham Cobb <g+...@co...> * src/utils.c: Add hashtable assertions Modified: plugins/gpe/gpe-sync-basic.xml ============================================================================== --- plugins/gpe/gpe-sync-basic.xml Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/gpe-sync-basic.xml Sat Oct 16 19:11:56 2010 (r6147) @@ -1,4 +1,26 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + * gpe-sync - A plugin for the opensync framework + * Copyright (C) 2010 Graham R. Cobb <g+o...@co...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * --> +<!-- + * This file is the capabilities file for the GPE-SYNC plugin itself. + * These capabilities were added in gpesyncd protocol version 1.3.3. +--> <capabilities> <contact> <AddressLabel/> Modified: plugins/gpe/gpe-sync-old.xml ============================================================================== --- plugins/gpe/gpe-sync-old.xml Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/gpe-sync-old.xml Sat Oct 16 19:11:56 2010 (r6147) @@ -1,4 +1,26 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + * gpe-sync - A plugin for the opensync framework + * Copyright (C) 2010 Graham R. Cobb <g+o...@co...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * --> +<!-- + * This file is the capabilities file for gpesyncd protocol + * versions 1.0.0, 1.1.1 and 1.2.2. +--> <capabilities> <contact> <AddressLabel/> Modified: plugins/gpe/src/calendar.c ============================================================================== --- plugins/gpe/src/calendar.c Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/src/calendar.c Sat Oct 16 19:11:56 2010 (r6147) @@ -188,7 +188,7 @@ if (parse_value_modified ((gchar *)iter->data, &uid, &modified) == FALSE) { - osync_context_report_error (ctx, OSYNC_ERROR_CONVERT, "Wrong uidlist item: %s"); + osync_context_report_error (ctx, OSYNC_ERROR_CONVERT, "Wrong uidlist item: %s", uid); g_slist_free (uid_list); osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: Wrong uidlist item: %s", __func__, uid); return; @@ -253,7 +253,4 @@ exit: osync_trace(TRACE_EXIT, "GPE-SYNC %s: TRUE", __func__); return TRUE; - error: - osync_trace(TRACE_EXIT, "GPE-SYNC %s: FALSE", __func__); - return FALSE; } Modified: plugins/gpe/src/contacts.c ============================================================================== --- plugins/gpe/src/contacts.c Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/src/contacts.c Sat Oct 16 19:11:56 2010 (r6147) @@ -250,7 +250,4 @@ exit: osync_trace(TRACE_EXIT, "GPE-SYNC %s: TRUE", __func__); return TRUE; - error: - osync_trace(TRACE_EXIT, "GPE-SYNC %s: FALSE", __func__); - return FALSE; } Modified: plugins/gpe/src/gpe_sync.c ============================================================================== --- plugins/gpe/src/gpe_sync.c Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/src/gpe_sync.c Sat Oct 16 19:11:56 2010 (r6147) @@ -149,7 +149,7 @@ if (resource) { // Is calendar name specified? env->calendar = osync_plugin_resource_get_path(resource); - if (env->calendar) osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: calendar = %d", __func__, env->calendar); + if (env->calendar) osync_trace(TRACE_INTERNAL, "GPE-SYNC %s: calendar = %s", __func__, env->calendar); } env->configured = TRUE; @@ -426,8 +426,6 @@ */ static void sync_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) { - OSyncError *error = NULL; - osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); sink_environment *sinkenv = (sink_environment *)data; @@ -445,11 +443,6 @@ osync_context_report_success(ctx); osync_trace(TRACE_EXIT, "GPE-SYNC %s", __func__); return; - -error: - osync_context_report_osyncerror(ctx, error); - osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: %s", __func__, osync_error_print(&error)); - osync_error_unref(&error); } static void free_sink(sink_environment *sinkenv) @@ -490,8 +483,6 @@ */ static void *initialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) { - const char *configdata = NULL; - osync_trace(TRACE_ENTRY, "GPE-SYNC %s(%p, %p, %p)", __func__, plugin, info, error); gpe_environment *env = osync_try_malloc0(sizeof(gpe_environment), error); @@ -556,7 +547,8 @@ osync_plugin_set_finalize(plugin, finalize); osync_plugin_set_discover(plugin, discover); - osync_plugin_env_register_plugin(env, plugin); + if (!osync_plugin_env_register_plugin(env, plugin, error)) + goto error; osync_plugin_unref(plugin); //If you like, you can overwrite the default timeouts of your plugin @@ -569,7 +561,6 @@ return TRUE; error: osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: Unable to register: %s", __func__, osync_error_print(error)); - osync_error_unref(error); return FALSE; } Modified: plugins/gpe/src/todo.c ============================================================================== --- plugins/gpe/src/todo.c Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/src/todo.c Sat Oct 16 19:11:56 2010 (r6147) @@ -187,7 +187,7 @@ if (parse_value_modified ((gchar *)iter->data, &uid, &modified) == FALSE) { - osync_context_report_error (ctx, OSYNC_ERROR_CONVERT, "Wrong uidlist item: %s"); + osync_context_report_error (ctx, OSYNC_ERROR_CONVERT, "Wrong uidlist item: %s", uid); g_slist_free (uid_list); osync_trace(TRACE_EXIT_ERROR, "GPE-SYNC %s: Wrong uidlist item: %s", __func__, uid); return; @@ -250,7 +250,4 @@ exit: osync_trace(TRACE_EXIT, "GPE-SYNC %s: TRUE", __func__); return TRUE; - error: - osync_trace(TRACE_EXIT, "GPE-SYNC %s: FALSE", __func__); - return FALSE; } Modified: plugins/gpe/src/utils.c ============================================================================== --- plugins/gpe/src/utils.c Fri Oct 15 16:44:04 2010 (r6146) +++ plugins/gpe/src/utils.c Sat Oct 16 19:11:56 2010 (r6147) @@ -1,7 +1,7 @@ /* * gpe-sync - A plugin for the opensync framework * Copyright (C) 2005 Martin Felis <ma...@si...> - * Copyright (C) 2007 Graham R. Cobb <g+o...@co...> + * Copyright (C) 2007, 2010 Graham R. Cobb <g+o...@co...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -143,7 +143,6 @@ gpe_assert(hashtable); //check for deleted entries ... via hashtable - int i; OSyncList *u, *uids = osync_hashtable_get_deleted(hashtable); for (u = uids; u; u = u->next) { OSyncChange *change = osync_change_new(&error); |
From: <svn...@op...> - 2010-10-15 15:07:01
|
Author: bellmich Date: Fri Oct 15 17:06:51 2010 New Revision: 231 URL: http://libwbxml.opensync.org/changeset/231 Log: - fixed ignored parameter flow_mode in wbxml_encoder - fixed several warnings Modified: wbxml2/trunk/src/wbxml_buffers.c wbxml2/trunk/src/wbxml_encoder.c wbxml2/trunk/src/wbxml_parser.c Modified: wbxml2/trunk/src/wbxml_buffers.c ============================================================================== --- wbxml2/trunk/src/wbxml_buffers.c Tue Oct 12 15:10:30 2010 (r230) +++ wbxml2/trunk/src/wbxml_buffers.c Fri Oct 15 17:06:51 2010 (r231) @@ -167,7 +167,7 @@ WBXML_DECLARE(WB_BOOL) wbxml_buffer_get_char(WBXMLBuffer *buffer, WB_ULONG pos, WB_UTINY *result) { - if ((buffer == NULL) || (pos >= buffer->len) || (pos < 0)) + if ((buffer == NULL) || (pos >= buffer->len)) return FALSE; *result = buffer->data[pos]; @@ -359,8 +359,7 @@ if ((len = wbxml_buffer_len(buffer)) > 0) { end = len = len - 1; while (wbxml_buffer_get_char(buffer, end, &ch) && - isspace(ch) && - end >= 0) + isspace(ch)) { end--; } @@ -706,7 +705,7 @@ */ static WB_BOOL grow_buff(WBXMLBuffer *buffer, WB_ULONG size) { - if ((buffer == NULL) || buffer->is_static || (size < 0)) + if ((buffer == NULL) || buffer->is_static) return FALSE; /* Make room for the invisible terminating NUL */ Modified: wbxml2/trunk/src/wbxml_encoder.c ============================================================================== --- wbxml2/trunk/src/wbxml_encoder.c Tue Oct 12 15:10:30 2010 (r230) +++ wbxml2/trunk/src/wbxml_encoder.c Fri Oct 15 17:06:51 2010 (r231) @@ -625,10 +625,14 @@ if (encoder == NULL) return WBXML_ERROR_BAD_PARAMETER; - encoder->flow_mode = TRUE; + encoder->flow_mode = flow_mode; - /* Don't use String Tables */ - wbxml_encoder_set_use_strtbl(encoder, FALSE); + /* The string tables must only be disabled during flow mode. */ + if (flow_mode) + { + /* Don't use String Tables */ + wbxml_encoder_set_use_strtbl(encoder, FALSE); + } return WBXML_OK; } @@ -3023,7 +3027,8 @@ static WBXMLError wbxml_encode_wv_integer(WBXMLEncoder *encoder, WB_UTINY *buffer) { WB_UTINY octets[4]; - WB_ULONG the_int = 0, i = 0, start = 0; + WB_ULONG the_int = 0, start = 0; + WB_LONG i = 0; if ((encoder == NULL) || (buffer == NULL)) return WBXML_ERROR_INTERNAL; Modified: wbxml2/trunk/src/wbxml_parser.c ============================================================================== --- wbxml2/trunk/src/wbxml_parser.c Tue Oct 12 15:10:30 2010 (r230) +++ wbxml2/trunk/src/wbxml_parser.c Fri Oct 15 17:06:51 2010 (r231) @@ -242,8 +242,9 @@ ret = parse_version(parser); CHECK_ERROR - if ((WB_UTINY)parser->version > WBXML_VERSION_13) + if ((WB_UTINY)parser->version > WBXML_VERSION_13) { WBXML_WARNING((WBXML_PARSER, "This library only supports WBXML " WBXML_VERSION_TEXT_13)); + } /* WBXML Public ID */ ret = parse_publicid(parser); @@ -1094,8 +1095,9 @@ { WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing switchPage", parser->pos)); - if ((WB_UTINY) parser->version < (WB_UTINY) WBXML_VERSION_12) + if ((WB_UTINY) parser->version < (WB_UTINY) WBXML_VERSION_12) { WBXML_WARNING((WBXML_PARSER, "No Switch Page mecanism possible in WBXML < %s (current: %d)", WBXML_VERSION_TEXT_12, (WB_UTINY) parser->version)); + } /* Skip SWITCH_PAGE token */ parser->pos++; @@ -1746,8 +1748,9 @@ WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing opaque", parser->pos)); - if (parser->version < WBXML_VERSION_11) + if (parser->version < WBXML_VERSION_11) { WBXML_WARNING((WBXML_PARSER, "No 'opaque' support in WBXML < %s", WBXML_VERSION_TEXT_11)); + } /* Skip OPAQUE */ parser->pos++; |
From: <svn...@op...> - 2010-10-15 14:44:13
|
Author: deloptes Date: Fri Oct 15 16:44:04 2010 New Revision: 6146 URL: http://www.opensync.org/changeset/6146 Log: - Fix for bug DataSink::DataSink() - constructor - intiger overload in QString(int) Modified: plugins/akonadi-sync/trunk/src/datasink.cpp Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Thu Oct 14 00:16:11 2010 (r6145) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Fri Oct 15 16:44:04 2010 (r6146) @@ -50,9 +50,9 @@ DataSink::DataSink ( int type ) : SinkBase ( GetChanges | Commit | SyncDone ), - m_Format(0), + m_Format("default"), m_Enabled(false), - m_Url(0) + m_Url("default") { kDebug() << "Constr.objtype:" << type; m_type = type; |
From: <svn...@op...> - 2010-10-13 22:16:21
|
Author: deloptes Date: Thu Oct 14 00:16:11 2010 New Revision: 6145 URL: http://www.opensync.org/changeset/6145 Log: datasink.h datasink.cpp akonadi_opensync.cpp I've fixed few issues with formats and added better support for mimetypes needed by akonadi I'm not sure if I need to keep the mimetype as object property in datasink akonadi-sync vnote11 is a ressource of type note that needs to be enabled explicitely as it is identified by different mimetype and is represented as separate collection in akonadi CMakeLists.txt I added some debugging options (not sure if it is working as intended) Modified: plugins/akonadi-sync/trunk/CMakeLists.txt plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/datasink.h Modified: plugins/akonadi-sync/trunk/CMakeLists.txt ============================================================================== --- plugins/akonadi-sync/trunk/CMakeLists.txt Sun Oct 10 23:46:01 2010 (r6144) +++ plugins/akonadi-sync/trunk/CMakeLists.txt Thu Oct 14 00:16:11 2010 (r6145) @@ -21,8 +21,9 @@ # SET( CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -ggdb -g -O2 -Wall -W " ${CMAKE_CXX_FLAGS_DEBUG} ${KDE4_ENABLE_EXCEPTIONS} ) #ADD_DEFINITIONS(-g -O2 -fsigned-char -freg-struct-return -Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Winline -Werror) -ADD_DEFINITIONS( -DDEBUG -g -O2 -Wall -W -fexceptions) +# ADD_DEFINITIONS( -DDEBUG -g -O2 -Wall -W -fexceptions) # -Werror +ADD_DEFINITIONS( -ggdb -O2 -Wall -W -fexceptions) FIND_PACKAGE( KdepimLibs REQUIRED ) FIND_PACKAGE( Akonadi REQUIRED ) Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Sun Oct 10 23:46:01 2010 (r6144) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Thu Oct 14 00:16:11 2010 (r6145) @@ -28,7 +28,7 @@ <Url>default</Url> </Resource> <Resource> - <Enabled>1</Enabled> + <Enabled>0</Enabled> <Formats> <Format> <Name>vtodo10</Name> @@ -41,13 +41,20 @@ <Url>default</Url> </Resource> <Resource> - <Enabled>1</Enabled> + <Enabled>0</Enabled> <Formats> <Format> - <Name>vnote11</Name> + <Name>vjournal</Name> </Format> + </Formats> + <ObjType>note</ObjType> + <Url>default</Url> + </Resource> + <Resource> + <Enabled>0</Enabled> + <Formats> <Format> - <Name>vjournal</Name> + <Name>vnote11</Name> </Format> </Formats> <ObjType>note</ObjType> Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sun Oct 10 23:46:01 2010 (r6144) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Thu Oct 14 00:16:11 2010 (r6145) @@ -98,12 +98,12 @@ else continue; - // there might be someting more intelligent to check when to return below + // there might be something more intelligent to check how to return below if ( !ds->initialize( plugin, info, sink, error ) ) { - osync_objtype_sink_set_enabled(sink, false); - osync_objtype_sink_set_available(sink, false); - delete ds; - objects_supported--; + osync_objtype_sink_set_enabled(sink, false); + osync_objtype_sink_set_available(sink, false); + delete ds; + objects_supported--; } } @@ -171,25 +171,14 @@ application/x-vnd.akonadi.calendar.freebusy - this will be most probably ignored, so not checking for it */ - static osync_bool testSupport(OSyncObjTypeSink *sink, OSyncPluginConfig *config, OSyncError **error ) { + static osync_bool testSupport(OSyncObjTypeSink *sink, OSyncPluginConfig *config, QString mimeType, OSyncError **error ) { kDebug(); - QString mimeType; - const char *myType = osync_objtype_sink_get_name(sink); Akonadi::CollectionFetchScope scope; scope.setIncludeUnsubscribed( true ); - if ( ! strcmp(myType,"contact") ) - mimeType = "application/x-vnd.kde.contactgroup" ; // text/directory - else if ( ! strcmp(myType,"event") ) - mimeType = "application/x-vnd.akonadi.calendar.event"; - else if ( ! strcmp(myType,"note") ) - mimeType = "application/x-vnd.akonadi.calendar.journal"; - else if ( ! strcmp(myType,"todo") ) - mimeType = "application/x-vnd.akonadi.calendar.todo"; - else - return false; + bool configured = false; scope.setContentMimeTypes( QStringList() << mimeType ); // fetch all akonadi collections for this mimetype @@ -203,12 +192,11 @@ int col_count = colsList.count(); kDebug() << "found" << col_count << "collections"; bool enabled = false; - bool configured = false; foreach ( const Akonadi::Collection &col, colsList ) { kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); kDebug() << "url " << col.name() << col.url().url(); - configured = false; + configured = false; OSyncList *resList = osync_plugin_config_get_resources(config); for ( OSyncList *r = resList; r; r = r->next ) { @@ -218,40 +206,39 @@ const char *myMimeType = osync_plugin_resource_get_mime(myRes); const char *myUrl = osync_plugin_resource_get_url(myRes); - if ( !strcmp(myObjType, myType) ) { + if ( !strcmp(myObjType, osync_objtype_sink_get_name(sink)) ) { if ( !strcmp(myUrl , "default") ) { osync_plugin_resource_set_name( myRes, toXml(col.name()).toLatin1() ); osync_plugin_resource_set_url(myRes, col.url().url().toLatin1()); osync_plugin_resource_set_mime(myRes, mimeType.toLatin1() ); - configured = true; + configured = true; } else if ( !strcmp(myUrl, col.url().url().toLatin1()) && !strcmp(myMimeType, mimeType.toLatin1()) ) { kDebug() << "aleady configured" << myObjType; - configured = true; + configured = true; } if (! enabled ) - enabled = osync_plugin_resource_is_enabled(myRes); + enabled = osync_plugin_resource_is_enabled(myRes); } } - + if ( ! configured ) { - OSyncPluginResource *newRes = create_resource(myType, error ) ; - osync_plugin_resource_set_name( newRes, toXml(col.name()).toLatin1() ); - osync_plugin_resource_set_url(newRes, col.url().url().toLatin1()); - osync_plugin_resource_set_mime(newRes, mimeType.toLatin1() ); - if ( ! enabled ) { - osync_plugin_resource_enable( newRes, true ); - enabled = true; - } - else { - osync_plugin_resource_enable( newRes, false ); - } - - osync_plugin_config_add_resource(config , newRes); - configured = true; - } - - } + OSyncPluginResource *newRes = create_resource(osync_objtype_sink_get_name(sink), error ) ; + osync_plugin_resource_set_name( newRes, toXml(col.name()).toLatin1() ); + osync_plugin_resource_set_url(newRes, col.url().url().toLatin1()); + osync_plugin_resource_set_mime(newRes, mimeType.toLatin1() ); + if ( ! enabled ) { + osync_plugin_resource_enable( newRes, true ); + enabled = true; + } + else { + osync_plugin_resource_enable( newRes, false ); + } + osync_plugin_config_add_resource(config , newRes); + configured = true; + } + + } return configured; } @@ -275,13 +262,43 @@ OSyncList *sinks = osync_plugin_info_get_objtype_sinks(info); for ( OSyncList *s = sinks; s; s = s->next ) { OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; + const char *myType = osync_objtype_sink_get_name(sink); // check if sync supported - if ( ! testSupport(sink, config, error) ) { - osync_objtype_sink_set_available(sink, false); + if ( ! strcmp(myType,"contact") ) { + /* NOTE + * for groups I think x-vnd.kde.contactgroup is useful ... + * for address book though "text/directory" + * so we check here if there are contact groups + */ + if ( ! testSupport(sink, config, "application/x-vnd.kde.contactgroup", error) ) + osync_objtype_sink_set_available(sink, false); + else + osync_objtype_sink_set_available(sink, true); } - else { - osync_objtype_sink_set_available(sink, true); + else if ( ! strcmp(myType,"event") ) { + if ( ! testSupport(sink, config, "application/x-vnd.akonadi.calendar.event", error) ) + osync_objtype_sink_set_available(sink, false); + else + osync_objtype_sink_set_available(sink, true); } + else if ( ! strcmp(myType,"note") ) { + if ( ! testSupport(sink, config, "application/x-vnd.akonadi.calendar.journal", error) ) + osync_objtype_sink_set_available(sink, false); + else + osync_objtype_sink_set_available(sink, true); + + if ( ! testSupport(sink, config, "application/x-vnd.kde.notes", error) ) + osync_objtype_sink_set_available(sink, false); + else + osync_objtype_sink_set_available(sink, true); + } + else if ( ! strcmp(myType,"todo") ) { + if ( ! testSupport(sink, config, "application/x-vnd.akonadi.calendar.todo", error) ) + osync_objtype_sink_set_available(sink, false); + else + osync_objtype_sink_set_available(sink, true); + } + osync_plugin_info_add_objtype( info, sink ); } // set information about the peer (KDE itself) Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Sun Oct 10 23:46:01 2010 (r6144) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Thu Oct 14 00:16:11 2010 (r6145) @@ -37,9 +37,9 @@ #include <kabc/vcardformat.h> // TODO -// notes includes -// todos includes -// journals includes +// notes, todos, journals & includes are done by icalformat +// I am not quite sure about it, but I think +// this needs to be checked when working on todos and notes #include <KDebug> #include <KLocale> @@ -74,7 +74,7 @@ kDebug() << "initializing" << osync_objtype_sink_get_name ( sink ); Q_UNUSED ( plugin ); Q_UNUSED ( info ); - Q_UNUSED ( error ); + Q_UNUSED ( error ); OSyncPluginConfig *config = osync_plugin_info_get_config ( info ); @@ -86,21 +86,22 @@ // FIXME enable checks on sync/commit etc!! OSyncPluginResource *resource = osync_plugin_config_find_active_resource ( config, osync_objtype_sink_get_name ( sink ) ); - if ( resource && ! osync_plugin_resource_is_enabled(resource) ) { -// osync_error_set( error, OSYNC_ERROR_MISCONFIGURATION, i18n ( "No active resource for type \"%s\" found", m_type ).toLatin1() ); + if ( ! resource || ! osync_plugin_resource_is_enabled(resource) ) { m_Enabled = FALSE; return false; - } else + } else m_Enabled = TRUE; - + m_Url = osync_plugin_resource_get_url ( resource ); OSyncList *objfrmtList = osync_plugin_resource_get_objformat_sinks ( resource ); + const char *preferred = osync_plugin_resource_get_preferred_format(resource); for ( OSyncList *r = objfrmtList;r;r = r->next ) { OSyncObjFormatSink *objformatsink = ( OSyncObjFormatSink * ) r->data; const char* tobjformat = osync_objformat_sink_get_objformat ( objformatsink ); + // TODO how can I negotiate format ... is this here enough? switch ( m_type ) { case Contacts: @@ -142,14 +143,19 @@ default: return false; } - - kDebug() << "Has objformat: " << m_Format; } - + + if ( ! preferred || strcmp(preferred,m_Format.toLatin1() ) ) + osync_plugin_resource_set_preferred_format( resource, m_Format.toLatin1() ); + + kDebug() << "Has objformat: " << m_Format; + wrapSink ( sink ); + osync_objtype_sink_set_enabled ( sink, true ); + osync_objtype_sink_set_available ( sink, true ); osync_objtype_sink_set_userdata ( sink, this ); - osync_objtype_sink_enable_hashtable ( sink , TRUE ); + osync_objtype_sink_enable_hashtable ( sink , true ); return true; } @@ -157,9 +163,9 @@ Akonadi::Collection DataSink::collection() const { kDebug(); - - const KUrl url = KUrl ( m_Url); - + + const KUrl url = KUrl ( m_Url ); + if ( url.isEmpty() ) { error ( OSYNC_ERROR_MISCONFIGURATION, i18n ( "Url for object type \"%s\" is not configured.", m_type) ); @@ -186,37 +192,37 @@ } Akonadi::Collection col = collection() ; - if ( !col.isValid() ) + if ( !col.isValid() ) + { + kDebug() << "No collection"; + osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + return; + } +// FIXME: I don't understand this completely well + if ( getSlowSink() ) + { + kDebug() << "we're in the middle of slow-syncing..."; + osync_trace ( TRACE_INTERNAL, "resetting hashtable" ); + if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) { - kDebug() << "No collection"; + warning ( oerror ); osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); return; } -// FIXME - if ( getSlowSink() ) - { - kDebug() << "we're in the middle of slow-syncing..."; - osync_trace ( TRACE_INTERNAL, "resetting hashtable" ); - if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) - { - warning ( oerror ); - osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); - return; - } - } - - ItemFetchJob *job = new ItemFetchJob ( col ); - job->fetchScope().fetchFullPayload(); - kDebug() << "Fetched full payload"; + } - QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); - QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); + ItemFetchJob *job = new ItemFetchJob ( col ); + job->fetchScope().fetchFullPayload(); + kDebug() << "Fetched full payload"; - if ( !job->exec() ) - { - error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); - return; - } + QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); + QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); + + if ( !job->exec() ) + { + error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); + return; + } kDebug() << "success()"; success(); @@ -226,9 +232,8 @@ { kDebug(); kDebug() << "retrieved" << items.count() << "items"; - Q_FOREACH ( const Item& item, items ) { - reportChange ( item ); - } + Q_FOREACH ( const Item& item, items ) + reportChange ( item ); kDebug() << "done"; } @@ -255,11 +260,19 @@ warning ( error ); return; } +// TODO Do I need to filter here some items +// osync_change_get_objformat( change ); +// if ( strcmp(m_MimeType.toLatin1(),item.mimeType().toLatin1()) ) { +// osync_change_unref ( change ); +// // warning ( error ); +// return; +// } + // Now you can set the data for the object // Set the last argument to FALSE if the real data // should be queried later in a "get_data" function - QString cvtToString = item.payloadData().data() ; + QString cvtToString = QString ( item.payloadData().data() ); OSyncData *odata = osync_data_new ( cvtToString.toLatin1().data() , cvtToString.size(), format, &error ); if ( !odata ) { @@ -334,8 +347,8 @@ osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); osync_change_set_data( change, data ); osync_hashtable_update_change ( hashtable, change ); - osync_context_report_change ( context(), change ); + osync_change_unref ( change ); osync_data_unref(data); } @@ -344,15 +357,34 @@ kDebug() << "got all changes."; } +// NOTE "application/x-vnd.kde.contactgroup" is used for contact groups ... we can use it probably later + +QString DataSink::getMimeWithFormat ( OSyncObjFormat * format ) { + const char* name = osync_objformat_get_name (format); + if (!strcmp(name,"vcard21") || !strcmp(name,"vcard30") ) + return "text/directory"; + else if (!strcmp(name,"vevent10") || !strcmp(name,"vevent10") ) + return "application/x-vnd.akonadi.calendar.event"; + else if (!strcmp(name,"vtodo10") || !strcmp(name,"vtodo20")) + return "application/x-vnd.akonadi.calendar.todo"; + else if (!strcmp(name,"vnote11") ) + return "application/x-vnd.kde.notes"; + else if (!strcmp(name,"vjournal")) + return "application/x-vnd.akonadi.calendar.journal"; + else + return false; +} + void DataSink::commit ( OSyncChange *change ) { kDebug(); - + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); char *plain = 0; osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); QString str = QString::fromLatin1 ( plain ); QString id = QString::fromLatin1 ( osync_change_get_uid ( change ) ); + QString mimeType = getMimeWithFormat(osync_change_get_objformat(change)); kDebug() << "change uid:" << id; kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); @@ -361,95 +393,96 @@ Akonadi::Collection col = collection(); - switch ( osync_change_get_changetype ( change ) ) - { - case OSYNC_CHANGE_TYPE_ADDED: - { + switch ( osync_change_get_changetype ( change ) ) + { + case OSYNC_CHANGE_TYPE_ADDED: + { - if ( !col.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Invalid collction."); - return; - } - - Item item; - setPayload ( &item, str ); - item.setRemoteId( id.toLatin1() ); - - ItemCreateJob *job = new Akonadi::ItemCreateJob ( item, col ); - if ( ! job->exec() ) { - error( OSYNC_ERROR_GENERIC, "Unable to create job for item."); - return; - } - - item = job->item(); // handle !job->exec in return too.. - if ( ! item.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); - return; - } - osync_change_set_uid ( change, item.remoteId().toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); - break; + if ( !col.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Invalid collction."); + return; } - case OSYNC_CHANGE_TYPE_MODIFIED: - { - Item item = fetchItem ( id ); - setPayload ( &item, str ); + Item item; + setPayload ( &item, mimeType, str ); + item.setRemoteId( id.toLatin1() ); + + ItemCreateJob *job = new Akonadi::ItemCreateJob ( item, col ); + if ( ! job->exec() ) { + error( OSYNC_ERROR_GENERIC, "Unable to create job for item."); + return; + } - if ( ! item.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); - return; - } - - ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); - if ( ! modifyJob->exec() ) { - error ( OSYNC_ERROR_GENERIC, "Unable to fetch item."); - return; - } + item = job->item(); // handle !job->exec in return too.. + if ( ! item.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + return; + } + osync_change_set_uid ( change, item.remoteId().toLatin1() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + break; + } - item = modifyJob->item(); + case OSYNC_CHANGE_TYPE_MODIFIED: + { + Item item = fetchItem ( id ); + setPayload ( &item, mimeType, str ); - osync_change_set_uid ( change, item.remoteId().toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); - break; + if ( ! item.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + return; } - case OSYNC_CHANGE_TYPE_DELETED: - { - Item item = fetchItem ( id ); - if ( ! item.isValid() ) { - error( OSYNC_ERROR_GENERIC, "Unable to fetch item"); - return; - } - - ItemDeleteJob *job = new ItemDeleteJob( item ); - if ( ! job->exec() ) { - error( OSYNC_ERROR_GENERIC, "Unable to delete item"); - return; - } - break; + ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); + if ( ! modifyJob->exec() ) { + error ( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + return; } - case OSYNC_CHANGE_TYPE_UNMODIFIED: - { - kDebug() << "UNMODIFIED"; - // should we do something here? - break; + item = modifyJob->item(); + + osync_change_set_uid ( change, item.remoteId().toLatin1() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + break; + } + + case OSYNC_CHANGE_TYPE_DELETED: + { + Item item = fetchItem ( id ); + if ( ! item.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Unable to fetch item"); + return; } - default: - kDebug() << "got invalid changetype?"; - error(OSYNC_ERROR_GENERIC, "got invalid changetype"); + + ItemDeleteJob *job = new ItemDeleteJob( item ); + if ( ! job->exec() ) { + error( OSYNC_ERROR_GENERIC, "Unable to delete item"); return; } + break; + } - osync_hashtable_update_change ( hashtable, change ); + case OSYNC_CHANGE_TYPE_UNMODIFIED: + { + kDebug() << "UNMODIFIED"; + // should we do something here? + break; + } + default: + kDebug() << "got invalid changetype?"; + error(OSYNC_ERROR_GENERIC, "got invalid changetype"); + return; + } + + osync_hashtable_update_change ( hashtable, change ); success(); } -bool DataSink::setPayload ( Item *item, const QString &str ) +bool DataSink::setPayload ( Item *item, const QString mimeType, const QString &str ) { kDebug(); + item->setMimeType ( mimeType ); switch ( m_type ) { case Contacts: @@ -457,7 +490,6 @@ kDebug() << "type = contacts"; KABC::VCardConverter converter; KABC::Addressee vcard = converter.parseVCard ( str.toUtf8() ); - item->setMimeType ( "text/directory" ); item->setPayload<KABC::Addressee> ( vcard ); kDebug() << "payload: " << vcard.toString().toUtf8(); break; @@ -467,7 +499,6 @@ kDebug() << "events"; KCal::ICalFormat format; KCal::Incidence *calEntry = format.fromString ( str.toUtf8() ); - item->setMimeType ( "application/x-vnd.akonadi.calendar.event" ); item->setPayload<IncidencePtr> ( IncidencePtr ( calEntry->clone() ) ); kDebug() << "payload: " << str.toUtf8(); break; @@ -477,7 +508,6 @@ kDebug() << "todos"; KCal::ICalFormat format; KCal::Incidence *todoEntry = format.fromString ( str.toUtf8() ); - item->setMimeType ( "application/x-vnd.akonadi.calendar.todo" ); item->setPayload<IncidencePtr> ( IncidencePtr ( todoEntry->clone() ) ); kDebug() << "payload: " << str.toUtf8(); break; @@ -487,8 +517,6 @@ kDebug() << "notes"; KCal::ICalFormat format; KCal::Incidence *noteEntry = format.fromString ( str.toUtf8() ); -// item->setMimeType ( "application/x-vnd.kde.notes" ); - item->setMimeType ( "application/x-vnd.akonadi.calendar.journal" ); item->setPayload<IncidencePtr> ( IncidencePtr ( noteEntry->clone() ) ); kDebug() << "payload: " << str.toUtf8(); break; @@ -505,13 +533,13 @@ { kDebug(); - ItemFetchJob *fetchJob = new ItemFetchJob ( collection() ); - fetchJob->fetchScope(); + ItemFetchJob *fetchJob = new ItemFetchJob ( collection() ); + fetchJob->fetchScope().fetchFullPayload(); - if ( fetchJob->exec() ) - foreach ( const Item &item, fetchJob->items() ) - if ( !strcmp(item.remoteId().toLatin1(), id.toLatin1() )) - return item; + if ( fetchJob->exec() ) + foreach ( const Item &item, fetchJob->items() ) + if ( !strcmp(item.remoteId().toLatin1(), id.toLatin1() )) + return item; // no such item found? // this will be handled as invalid item return Item(); Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Sun Oct 10 23:46:01 2010 (r6144) +++ plugins/akonadi-sync/trunk/src/datasink.h Thu Oct 14 00:16:11 2010 (r6145) @@ -91,7 +91,8 @@ private: const Item fetchItem( const QString& id ); - bool setPayload( Item *item, const QString &str ); + bool setPayload( Item *item, const QString mimeType, const QString &str ); + QString getMimeWithFormat(OSyncObjFormat* format); private: OSyncHashTable *m_hashtable; @@ -99,7 +100,7 @@ QString m_Format; bool m_Enabled; QString m_Url; - QString m_MimeType; +// QString m_MimeType; }; #endif |
From: <svn...@op...> - 2010-10-12 13:10:41
|
Author: bellmich Date: Tue Oct 12 15:10:30 2010 New Revision: 230 URL: http://libwbxml.opensync.org/changeset/230 Log: Fixed unsigned integer overflow (patch from ticket #41) The overflow causes crashs or wrong wbxml messages. Modified: wbxml2/trunk/ChangeLog wbxml2/trunk/src/wbxml_parser.c Modified: wbxml2/trunk/ChangeLog ============================================================================== --- wbxml2/trunk/ChangeLog Tue Oct 12 12:18:09 2010 (r229) +++ wbxml2/trunk/ChangeLog Tue Oct 12 15:10:30 2010 (r230) @@ -1,5 +1,7 @@ - * Fixed MS VisualStudio 2008 issue with variable definitions - (committed changes from ticket #42) + * Fixed unsigned integer overflow (patch from ticket #41) + The overflow causes crashs or wrong wbxml messages. + * Fixed location of variable definitions (changes from ticket #42) + This fixes some compiler errors from MS VisualStudio 2008. 2010-03-29 Michael Bell <mic...@we...> * Released 0.10.8 Modified: wbxml2/trunk/src/wbxml_parser.c ============================================================================== --- wbxml2/trunk/src/wbxml_parser.c Tue Oct 12 12:18:09 2010 (r229) +++ wbxml2/trunk/src/wbxml_parser.c Tue Oct 12 15:10:30 2010 (r230) @@ -763,7 +763,7 @@ if (strtbl_len > 0) { /* Check this string table length */ - if (parser->pos + strtbl_len > wbxml_buffer_len(parser->wbxml)) + if (strtbl_len > wbxml_buffer_len(parser->wbxml) - parser->pos) return WBXML_ERROR_STRTBL_LENGTH; /* Get String Table */ |
From: <svn...@op...> - 2010-10-12 10:18:19
|
Author: bellmich Date: Tue Oct 12 12:18:09 2010 New Revision: 229 URL: http://libwbxml.opensync.org/changeset/229 Log: Fixed MS VisualStudio 2008 issue with variable definitions (committed changes from ticket #42) Modified: wbxml2/trunk/ChangeLog wbxml2/trunk/src/wbxml_encoder.c wbxml2/trunk/src/wbxml_parser.c wbxml2/trunk/src/wbxml_tree_clb_xml.c Modified: wbxml2/trunk/ChangeLog ============================================================================== --- wbxml2/trunk/ChangeLog Mon Mar 29 11:10:04 2010 (r228) +++ wbxml2/trunk/ChangeLog Tue Oct 12 12:18:09 2010 (r229) @@ -1,3 +1,6 @@ + * Fixed MS VisualStudio 2008 issue with variable definitions + (committed changes from ticket #42) + 2010-03-29 Michael Bell <mic...@we...> * Released 0.10.8 * Removed OMA DM tests because the OMA did not grant a permission Modified: wbxml2/trunk/src/wbxml_encoder.c ============================================================================== --- wbxml2/trunk/src/wbxml_encoder.c Mon Mar 29 11:10:04 2010 (r228) +++ wbxml2/trunk/src/wbxml_encoder.c Tue Oct 12 12:18:09 2010 (r229) @@ -3133,6 +3133,10 @@ WB_UTINY octets[6]; WBXMLBuffer *component = NULL; + /* definitions first ... or some compilers don't like it */ + unsigned int year; + unsigned int month; + len = WBXML_STRLEN(buffer); /* Create temp Buffer */ @@ -3217,7 +3221,7 @@ goto error; } wbxml_buffer_delete(component, 4, 10); - unsigned int year = strtoull((const char *)wbxml_buffer_get_cstr(component), NULL, 10); + year = strtoull((const char *)wbxml_buffer_get_cstr(component), NULL, 10); wbxml_buffer_destroy(component); octets[0] = (WB_UTINY) ((year & 0xfc0) >> 6); /* 6 bits */ octets[1] = (WB_UTINY) (year & 0x3f); /* 6 bits */ @@ -3230,7 +3234,7 @@ } wbxml_buffer_delete(component, 0, 4); wbxml_buffer_delete(component, 2, 8); - unsigned int month = strtoull((const char *)wbxml_buffer_get_cstr(component), NULL, 10); + month = strtoull((const char *)wbxml_buffer_get_cstr(component), NULL, 10); wbxml_buffer_destroy(component); octets[1] <<= 2; octets[1] += (WB_UTINY) ((month & 0xc) >> 2); /* 2 bits */ Modified: wbxml2/trunk/src/wbxml_parser.c ============================================================================== --- wbxml2/trunk/src/wbxml_parser.c Mon Mar 29 11:10:04 2010 (r228) +++ wbxml2/trunk/src/wbxml_parser.c Tue Oct 12 12:18:09 2010 (r229) @@ -714,6 +714,9 @@ */ static WBXMLError parse_charset(WBXMLParser *parser) { + /* definitions first ... or some compilers don't like it */ + const char *charset_name = NULL; + #if defined( WBXML_LIB_VERBOSE ) WB_ULONG startpos = parser->pos; #endif /* WBXML_LIB_VERBOSE */ @@ -726,7 +729,6 @@ return ret; } - const char *charset_name = NULL; if (!wbxml_charset_get_name(charset, &charset_name)) { return WBXML_ERROR_NO_CHARSET_CONV; } Modified: wbxml2/trunk/src/wbxml_tree_clb_xml.c ============================================================================== --- wbxml2/trunk/src/wbxml_tree_clb_xml.c Mon Mar 29 11:10:04 2010 (r228) +++ wbxml2/trunk/src/wbxml_tree_clb_xml.c Tue Oct 12 12:18:09 2010 (r229) @@ -202,6 +202,9 @@ #if defined( WBXML_SUPPORT_SYNCML ) if (WBXML_STRCMP(localName, "syncml:devinf:DevInf") == 0 || WBXML_STRCMP(localName, "syncml:dmddf1.2:MgmtTree") == 0) { + /* definitions first ... or some compilers don't like it */ + const WBXMLLangEntry *lang; + /* Get embedded DevInf or DM DDF Document */ embed_doc = wbxml_buffer_create(tree_ctx->input_buff + tree_ctx->skip_start, XML_GetCurrentByteIndex(tree_ctx->xml_parser) - tree_ctx->skip_start, @@ -229,7 +232,6 @@ } /* Add doctype to give the XML parser a chance */ - const WBXMLLangEntry *lang; if (WBXML_STRCMP(localName, "syncml:dmddf1.2:MgmtTree") == 0 && tree_ctx->tree->lang->langID != WBXML_LANG_SYNCML_SYNCML12) { |
From: <svn...@op...> - 2010-10-10 21:46:11
|
Author: deloptes Date: Sun Oct 10 23:46:01 2010 New Revision: 6144 URL: http://www.opensync.org/changeset/6144 Log: I took advantage to add support for multiple collection. The thing is that I have to run --discover after each --configure and I am not sure if it is intended to work like this. TODO: A. check for ressources and report syncs only if format is supported by the other member(s) in the discover phase B. Work the event/note/todo sync out C. Check why todo is reporting XML validation error. Modified: plugins/akonadi-sync/trunk/README plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/datasink.h plugins/akonadi-sync/trunk/src/sinkbase.cpp Modified: plugins/akonadi-sync/trunk/README ============================================================================== --- plugins/akonadi-sync/trunk/README Wed Oct 6 10:55:48 2010 (r6143) +++ plugins/akonadi-sync/trunk/README Sun Oct 10 23:46:01 2010 (r6144) @@ -4,7 +4,14 @@ OpenSync is a plugin-based application that basically provides a framework for syncing groups which can have two or more members. -This is the Akonadi (KDE 4.x) PIM synchronisation framework +This is the Akonadi (KDE 4.x) PIM synchronisation framework. +It provides sync ability with KDE > 4.5 using the akonadi interface. + +Important +========= + +Currently Calendar does not work. + Requirements ============ @@ -13,14 +20,28 @@ Installation ============ -export PKG_CONFIG_PATH=/opt/custom/opensync/lib/pkgconfig +export PKG_CONFIG_PATH=/path/to/opensync/installation_prefix/lib/pkgconfig mkdir build cd build -cmake -DCMAKE_INSTALL_PREFIX=$prefix /path/to/opensync/source/ +cmake -DCMAKE_INSTALL_PREFIX=$installation_prefix /path/to/opensync/source/ make make install +Usage +============ + +1. After installation configure the plugin with "--configure" option. + (I'm planning to make this step optional) +2. Discover supported features on both sides (sync members and akonadi) + with "--discover" option. This step will discover sync features (supported + formats) and akonadi collection. They will be available in the configuration + file for further setup. +3. Reconfigure the plugin with "--configure" option. Most likely you will need + to enable or disable sync with given collection represented as a ressource in + the configuration file. +4. Sync with the "--sync" or similar option + Links ===== Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Wed Oct 6 10:55:48 2010 (r6143) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Sun Oct 10 23:46:01 2010 (r6144) @@ -5,11 +5,9 @@ <Enabled>1</Enabled> <Formats> <Format> - <Config>VCARD_EXTENSION=KDE</Config> <Name>vcard21</Name> </Format> <Format> - <Config>VCARD_EXTENSION=KDE</Config> <Name>vcard30</Name> </Format> </Formats> @@ -33,6 +31,9 @@ <Enabled>1</Enabled> <Formats> <Format> + <Name>vtodo10</Name> + </Format> + <Format> <Name>vtodo20</Name> </Format> </Formats> Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Wed Oct 6 10:55:48 2010 (r6143) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sun Oct 10 23:46:01 2010 (r6144) @@ -55,6 +55,7 @@ static void* akonadi_initialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) { + kDebug(); osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, plugin, info, error); if ( !app ) @@ -75,6 +76,9 @@ // 10) List looping is more standard // --------------------------------- // osync_plugin_get_config_type(); + + unsigned int objects_supported = 4; + OSyncList *s = NULL, *list = osync_plugin_info_get_objtype_sinks(info); for ( s = list; s; s = s->next ) { OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; @@ -87,97 +91,169 @@ ds = new DataSink( DataSink::Calendars ); else if ( sinkName == "contact" ) ds = new DataSink( DataSink::Contacts ); -// FIXME: implement todos an journal (notes) else if ( sinkName == "note" ) - ds = new DataSink( DataSink::Journals ); + ds = new DataSink( DataSink::Notes ); else if ( sinkName == "todo" ) ds = new DataSink( DataSink::Todos ); -// else if ( sinkName == "note" ) -// ds = new DataSink( DataSink::Notes ); else continue; + // there might be someting more intelligent to check when to return below if ( !ds->initialize( plugin, info, sink, error ) ) { - delete ds; - delete mainSink; - osync_trace(TRACE_EXIT_ERROR, " %s: NULL", __func__); - return 0; + osync_objtype_sink_set_enabled(sink, false); + osync_objtype_sink_set_available(sink, false); + delete ds; + objects_supported--; } } - osync_trace(TRACE_EXIT, " %s: %p", __func__, mainSink); - return mainSink; + + +// if we support at least one object return the mainSink + if ( objects_supported >= 1 ) { + osync_trace(TRACE_EXIT, " %s: %p", __func__, mainSink); + return mainSink; + } + else { + delete mainSink; + osync_trace(TRACE_EXIT_ERROR, " %s: NULL", __func__); + return 0; + } } - - - //FIXME: this probably a bug in opoensync - // replace & + + /* FIXME: this is probably a bug in opoensync + * replace & + */ static QString toXml(QString str) { str.replace("<","<").replace(">",">").replace("&","and"); return str; } - - static osync_bool testSupport(OSyncPluginInfo *info, - OSyncPluginConfig *config, - const char* mType, - const char* mimeType, - const char* objFormat, - OSyncError **error ) { - // fetch all akonadi calendar collections + + static OSyncPluginResource *create_resource (const char* mType , OSyncError **error ) { + //TODO + // check for supported objformat + kDebug(); + OSyncPluginResource *res= osync_plugin_resource_new( error ); + osync_plugin_resource_set_objtype( res, mType ); + + if ( !strcmp(mType,"contact") ) { + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vcard21", error ) ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vcard30", error ) ); + osync_plugin_resource_set_preferred_format( res, "vcard30" ); + } else if ( !strcmp(mType,"event") ) { + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vevent10", error ) ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vevent20", error ) ); + osync_plugin_resource_set_preferred_format( res, "vevent20" ); + } else if ( !strcmp(mType,"todo") ) { + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vtodo10", error ) ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vtodo20", error ) ); + osync_plugin_resource_set_preferred_format( res, "vtodo20" ); + } else if ( !strcmp(mType,"note") ) { + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vnote11", error ) ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vjournal", error ) ); + osync_plugin_resource_set_preferred_format( res, "vjournal" ); + } else + return NULL; + kDebug() << "create resource for" << mType << "done"; + return res; + } + + + /* + Check for support of following types + text/directory - this is the addressbook + application/x-vnd.kde.contactgroup - is contact group ... I'm not sure about it ATM + text/calendar - this is general mime for the whole calendar, but we are interested in the details + application/x-vnd.akonadi.calendar.event, + application/x-vnd.akonadi.calendar.todo, + application/x-vnd.akonadi.calendar.journal, + application/x-vnd.akonadi.calendar.freebusy - this will be most probably ignored, so not checking for it + */ + + static osync_bool testSupport(OSyncObjTypeSink *sink, OSyncPluginConfig *config, OSyncError **error ) { + + kDebug(); + QString mimeType; + + const char *myType = osync_objtype_sink_get_name(sink); Akonadi::CollectionFetchScope scope; scope.setIncludeUnsubscribed( true ); + if ( ! strcmp(myType,"contact") ) + mimeType = "application/x-vnd.kde.contactgroup" ; // text/directory + else if ( ! strcmp(myType,"event") ) + mimeType = "application/x-vnd.akonadi.calendar.event"; + else if ( ! strcmp(myType,"note") ) + mimeType = "application/x-vnd.akonadi.calendar.journal"; + else if ( ! strcmp(myType,"todo") ) + mimeType = "application/x-vnd.akonadi.calendar.todo"; + else + return false; + scope.setContentMimeTypes( QStringList() << mimeType ); - Akonadi::CollectionFetchJob *jobCal = new Akonadi::CollectionFetchJob( + // fetch all akonadi collections for this mimetype + Akonadi::CollectionFetchJob *jobCol = new Akonadi::CollectionFetchJob( Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); - jobCal->setFetchScope(scope); - if ( !jobCal->exec() ) - return FALSE; - - Akonadi::Collection::List colsCal = jobCal->collections(); - kDebug() << "found" << colsCal.count() << "collections"; - -// OSyncFormatEnv *formatEnv = osync_plugin_info_get_format_env(info); - OSyncObjTypeSink *sinkEvent = osync_objtype_sink_new(mType, error); - OSyncPluginResource *res = NULL; - foreach ( const Akonadi::Collection &col, colsCal ) { + jobCol->setFetchScope(scope); + if ( !jobCol->exec() ) + return false; + + Akonadi::Collection::List colsList = jobCol->collections(); + int col_count = colsList.count(); + kDebug() << "found" << col_count << "collections"; + bool enabled = false; + bool configured = false; + + foreach ( const Akonadi::Collection &col, colsList ) { kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); - kDebug() << " " << col.name() << col.url().url(); + kDebug() << "url " << col.name() << col.url().url(); + configured = false; - res = osync_plugin_config_find_active_resource(config ,mType); - if ( ! res) { -// res = osync_plugin_resource_new( error ); -// osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( objFormat, error ) ); -// osync_plugin_resource_enable(res,FALSE); -// osync_plugin_config_add_resource( config, res ); - kDebug() << "No support for " << mType << " disabled"; -// osync_objtype_sink_set_enabled( sinkEvent, FALSE ); - osync_objtype_sink_set_enabled( sinkEvent, FALSE ); - osync_objtype_sink_set_available( sinkEvent, FALSE ); - continue; + OSyncList *resList = osync_plugin_config_get_resources(config); + for ( OSyncList *r = resList; r; r = r->next ) { + OSyncPluginResource *myRes = (OSyncPluginResource*) r->data; + + const char *myObjType = osync_plugin_resource_get_objtype(myRes); + const char *myMimeType = osync_plugin_resource_get_mime(myRes); + const char *myUrl = osync_plugin_resource_get_url(myRes); + + if ( !strcmp(myObjType, myType) ) { + if ( !strcmp(myUrl , "default") ) { + osync_plugin_resource_set_name( myRes, toXml(col.name()).toLatin1() ); + osync_plugin_resource_set_url(myRes, col.url().url().toLatin1()); + osync_plugin_resource_set_mime(myRes, mimeType.toLatin1() ); + configured = true; + } else if ( !strcmp(myUrl, col.url().url().toLatin1()) && !strcmp(myMimeType, mimeType.toLatin1()) ) { + kDebug() << "aleady configured" << myObjType; + configured = true; + } + if (! enabled ) + enabled = osync_plugin_resource_is_enabled(myRes); + } } + + if ( ! configured ) { + OSyncPluginResource *newRes = create_resource(myType, error ) ; + osync_plugin_resource_set_name( newRes, toXml(col.name()).toLatin1() ); + osync_plugin_resource_set_url(newRes, col.url().url().toLatin1()); + osync_plugin_resource_set_mime(newRes, mimeType.toLatin1() ); + if ( ! enabled ) { + osync_plugin_resource_enable( newRes, true ); + enabled = true; + } + else { + osync_plugin_resource_enable( newRes, false ); + } + + osync_plugin_config_add_resource(config , newRes); + configured = true; + } + + } - osync_plugin_resource_set_objtype( res, mType ); - QString myname =QString::fromLatin1( osync_plugin_resource_get_name( res ) ); // - if ( myname.size() > 0 ) - myname.append(';').append(toXml(col.name())); - else - myname = toXml(col.name()); - osync_plugin_resource_set_name( res, myname.toUtf8() ); // TODO: full path instead of the name - // - osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); - osync_plugin_resource_set_mime( res, mimeType ); -// if (osync_plugin_resource_is_enabled(res)) { -// osync_plugin_resource_set_preferred_format( res, objFormat ); -// } - osync_plugin_resource_enable(res,TRUE); - osync_objtype_sink_set_enabled( sinkEvent, TRUE ); - osync_objtype_sink_set_available( sinkEvent, TRUE ); - } - - osync_plugin_info_add_objtype( info, sinkEvent ); - return TRUE; + + return configured; } static osync_bool akonadi_discover(OSyncPluginInfo *info, void *userdata, OSyncError **error ) @@ -191,42 +267,35 @@ osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get config."); return false; } - if ( !Akonadi::Control::start() ) + if ( !Akonadi::Control::start() ) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Akonadi not running."); return false; + } - /* - Check for support of following types - text/directory - this is the addressbook - application/x-vnd.kde.contactgroup - is contact group ... I'm not sure about it ATM - text/calendar - this is general mime for the whole calendar, but we are interested in the details - application/x-vnd.akonadi.calendar.event, - application/x-vnd.akonadi.calendar.todo, - application/x-vnd.akonadi.calendar.journal, - application/x-vnd.akonadi.calendar.freebusy - this will be most probably ignored, so not checkign for it - */ - -// testSupport(info, config, "contact", "application/x-vnd.kde.contactgroup", "vcard20" ,error); - testSupport(info, config, "contact", "application/x-vnd.kde.contactgroup", "vcard30" ,error); - - testSupport(info, config, "event", "application/x-vnd.akonadi.calendar.event", "vevent20" ,error); - -// testSupport(info, config, "todo", "application/x-vnd.akonadi.calendar.todo", "vtodo10" ,error); - testSupport(info, config, "todo", "application/x-vnd.akonadi.calendar.todo", "vtodo20" ,error); - - testSupport(info, config, "note", "application/x-vnd.akonadi.calendar.journal", "vjournal" ,error); -// testSupport(info, config, "note", "application/x-vnd.kde.notes", "vnote11" ,error); - - // set information about the peer (KDE itself) + OSyncList *sinks = osync_plugin_info_get_objtype_sinks(info); + for ( OSyncList *s = sinks; s; s = s->next ) { + OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; + // check if sync supported + if ( ! testSupport(sink, config, error) ) { + osync_objtype_sink_set_available(sink, false); + } + else { + osync_objtype_sink_set_available(sink, true); + } + osync_plugin_info_add_objtype( info, sink ); + } + // set information about the peer (KDE itself) { OSyncVersion *version = osync_version_new(error); osync_version_set_plugin(version, "Akonadi-sync"); - osync_version_set_softwareversion(version, "4.5"); + osync_version_set_softwareversion(version, "0.40"); osync_version_set_identifier(version, "akonadi-sync"); osync_plugin_info_set_version(info, version); osync_version_unref(version); } + osync_list_free(sinks); osync_trace(TRACE_EXIT, "%s", __func__); - return TRUE; + return true; } static void akonadi_finalize(void *userdata) @@ -235,7 +304,6 @@ kDebug(); AkonadiSink *sink = reinterpret_cast<AkonadiSink*>( userdata ); sink->disconnect(); -// delete sink; delete kcd; kcd = 0; delete app; @@ -251,7 +319,7 @@ if ( !plugin ) { osync_trace(TRACE_EXIT_ERROR, "%s: Unable to instantiate: %s", __func__, osync_error_print(error)); osync_error_unref(error); - return FALSE; + return false; } osync_plugin_set_name(plugin, "akonadi-sync"); @@ -267,12 +335,12 @@ if ( ! osync_plugin_env_register_plugin(env, plugin, error) ) { osync_trace(TRACE_EXIT_ERROR, "%s: Unable to register: %s", __func__, osync_error_print(error)); osync_error_unref(error); - return FALSE; + return false; } osync_plugin_unref(plugin); osync_trace(TRACE_EXIT, "%s", __func__); - return TRUE; + return true; } Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Wed Oct 6 10:55:48 2010 (r6143) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Sun Oct 10 23:46:01 2010 (r6144) @@ -43,7 +43,6 @@ #include <KDebug> #include <KLocale> -#include <KUrl> using namespace Akonadi; @@ -51,7 +50,9 @@ DataSink::DataSink ( int type ) : SinkBase ( GetChanges | Commit | SyncDone ), - m_Format(0) + m_Format(0), + m_Enabled(false), + m_Url(0) { kDebug() << "Constr.objtype:" << type; m_type = type; @@ -60,7 +61,6 @@ m_isContact = ( type == DataSink::Contacts ) ? true : false; m_isNote = ( type == DataSink::Notes ) ? true : false; m_isTodo = ( type == DataSink::Todos ) ? true : false; - m_isJournal = ( type == DataSink::Journals ) ? true : false; } @@ -74,7 +74,8 @@ kDebug() << "initializing" << osync_objtype_sink_get_name ( sink ); Q_UNUSED ( plugin ); Q_UNUSED ( info ); - Q_UNUSED ( error ); + Q_UNUSED ( error ); + OSyncPluginConfig *config = osync_plugin_info_get_config ( info ); if ( !config ) @@ -83,23 +84,19 @@ return false; } - osync_bool enabled = osync_objtype_sink_is_enabled ( sink ); - if ( ! enabled ) - { - kDebug() << "sink is not enabled.."; -// osync_objtype_sink_remove_objformat_sink( sink ); - osync_objtype_sink_set_available(sink, FALSE); -// return false; - } else { - osync_objtype_sink_set_available(sink, TRUE); - } - +// FIXME enable checks on sync/commit etc!! OSyncPluginResource *resource = osync_plugin_config_find_active_resource ( config, osync_objtype_sink_get_name ( sink ) ); - OSyncList *objfrmtList = osync_plugin_resource_get_objformat_sinks ( resource ); + if ( resource && ! osync_plugin_resource_is_enabled(resource) ) { +// osync_error_set( error, OSYNC_ERROR_MISCONFIGURATION, i18n ( "No active resource for type \"%s\" found", m_type ).toLatin1() ); + m_Enabled = FALSE; + return false; + } else + m_Enabled = TRUE; + + m_Url = osync_plugin_resource_get_url ( resource ); - OSyncList *r; -// bool hasObjFormat; - for ( r = objfrmtList;r;r = r->next ) + OSyncList *objfrmtList = osync_plugin_resource_get_objformat_sinks ( resource ); + for ( OSyncList *r = objfrmtList;r;r = r->next ) { OSyncObjFormatSink *objformatsink = ( OSyncObjFormatSink * ) r->data; const char* tobjformat = osync_objformat_sink_get_objformat ( objformatsink ); @@ -124,13 +121,7 @@ m_Format = "vevent20"; break; } -// case Notes: -// { -// if ( !strcmp ( "vnote11", tobjformat ) ) -// m_Format = "vnote11"; -// break; -// } - case Journals: + case Notes: { if ( !strcmp ( "vnote11", tobjformat ) ) m_Format = "vnote11"; @@ -151,45 +142,34 @@ default: return false; } + kDebug() << "Has objformat: " << m_Format; } - + + wrapSink ( sink ); osync_objtype_sink_set_userdata ( sink, this ); osync_objtype_sink_enable_hashtable ( sink , TRUE ); - wrapSink ( sink ); - return true; } Akonadi::Collection DataSink::collection() const { kDebug(); - OSyncPluginConfig *config = osync_plugin_info_get_config ( pluginInfo() ); - Q_ASSERT ( config ); - - const char *objtype = osync_objtype_sink_get_name ( sink() ); - - OSyncPluginResource *res = osync_plugin_config_find_active_resource ( config, objtype ); - - if ( !res ) - { - error ( OSYNC_ERROR_MISCONFIGURATION, i18n ( "No active resource for type \"%1\" found", objtype ) ); - return Collection(); - } - - const KUrl url = KUrl ( osync_plugin_resource_get_url ( res ) ); - // TODO osync_plugin_resource_get_mime() ; + + const KUrl url = KUrl ( m_Url); + if ( url.isEmpty() ) { - error ( OSYNC_ERROR_MISCONFIGURATION, i18n ( "Url for object type \"%1\" is not configured.", objtype ) ); + error ( OSYNC_ERROR_MISCONFIGURATION, i18n ( "Url for object type \"%s\" is not configured.", m_type) ); return Collection(); } return Collection::fromUrl ( url ); } + void DataSink::getChanges() { kDebug(); @@ -205,38 +185,38 @@ return; } - Collection col = collection(); - if ( !col.isValid() ) - { - kDebug() << "No collection"; - osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); - return; - } -// FIXME - if ( getSlowSink() ) - { - kDebug() << "we're in the middle of slow-syncing..."; - osync_trace ( TRACE_INTERNAL, "resetting hashtable" ); - if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) + Akonadi::Collection col = collection() ; + if ( !col.isValid() ) { - warning ( oerror ); + kDebug() << "No collection"; osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); return; } - } - - ItemFetchJob *job = new ItemFetchJob ( col ); - job->fetchScope().fetchFullPayload ( true ); - kDebug() << "Fetched FullPayload" ; +// FIXME + if ( getSlowSink() ) + { + kDebug() << "we're in the middle of slow-syncing..."; + osync_trace ( TRACE_INTERNAL, "resetting hashtable" ); + if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) + { + warning ( oerror ); + osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + return; + } + } + + ItemFetchJob *job = new ItemFetchJob ( col ); + job->fetchScope().fetchFullPayload(); + kDebug() << "Fetched full payload"; - QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); - QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); + QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); + QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); - if ( !job->exec() ) - { - error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); - return; - } + if ( !job->exec() ) + { + error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); + return; + } kDebug() << "success()"; success(); @@ -279,11 +259,11 @@ // Now you can set the data for the object // Set the last argument to FALSE if the real data // should be queried later in a "get_data" function -// odata = osync_data_new(NULL, 0, format, &error); QString cvtToString = item.payloadData().data() ; OSyncData *odata = osync_data_new ( cvtToString.toLatin1().data() , cvtToString.size(), format, &error ); if ( !odata ) { + warning(error); osync_data_unref ( odata ); return; } @@ -326,8 +306,8 @@ OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); OSyncList *u, *uids = osync_hashtable_get_deleted ( hashtable ); - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1() ); + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1() ); for ( u = uids; u; u = u->next ) { QString uid ( ( char * ) u->data ); @@ -354,7 +334,7 @@ osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); osync_change_set_data( change, data ); osync_hashtable_update_change ( hashtable, change ); - //FIXME raport if change is at our side + osync_context_report_change ( context(), change ); osync_change_unref ( change ); osync_data_unref(data); @@ -366,86 +346,104 @@ void DataSink::commit ( OSyncChange *change ) { -// kDebug(); -// kDebug() << "change uid:" << osync_change_get_uid ( change ); -// kDebug() << "objtype:" << osync_change_get_objtype ( change ); -// kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); + kDebug(); + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); char *plain = 0; osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); QString str = QString::fromLatin1 ( plain ); QString id = QString::fromLatin1 ( osync_change_get_uid ( change ) ); - Collection col = collection(); - switch ( osync_change_get_changetype ( change ) ) - { - case OSYNC_CHANGE_TYPE_ADDED: - { - // TODO: proper error handling (report errors to the sync engine) - if ( !col.isValid() ) // error handling - return; + kDebug() << "change uid:" << id; + kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); + kDebug(); + kDebug() << "data" << str; - Item item; - setPayload ( &item, str ); - item.setRemoteId( id.toLatin1() ); + Akonadi::Collection col = collection(); - ItemCreateJob *job = new Akonadi::ItemCreateJob ( item, col ); - if ( ! job->exec() ) - return; - item = job->item(); // handle !job->exec in return too.. - if ( ! item.isValid() ) // error handling - return; - osync_change_set_uid ( change, item.remoteId().toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); - break; - } + switch ( osync_change_get_changetype ( change ) ) + { + case OSYNC_CHANGE_TYPE_ADDED: + { - case OSYNC_CHANGE_TYPE_MODIFIED: - { - Item item = fetchItem ( id ); - setPayload ( &item, str ); + if ( !col.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Invalid collction."); + return; + } + + Item item; + setPayload ( &item, str ); + item.setRemoteId( id.toLatin1() ); + + ItemCreateJob *job = new Akonadi::ItemCreateJob ( item, col ); + if ( ! job->exec() ) { + error( OSYNC_ERROR_GENERIC, "Unable to create job for item."); + return; + } + + item = job->item(); // handle !job->exec in return too.. + if ( ! item.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + return; + } + osync_change_set_uid ( change, item.remoteId().toLatin1() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + break; + } - if ( ! item.isValid() ) // TODO proper error handling - return; + case OSYNC_CHANGE_TYPE_MODIFIED: + { + Item item = fetchItem ( id ); + setPayload ( &item, str ); + + if ( ! item.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + return; + } + + ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); + if ( ! modifyJob->exec() ) { + error ( OSYNC_ERROR_GENERIC, "Unable to fetch item."); + return; + } - ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); - if ( ! modifyJob->exec() ) - return; - else item = modifyJob->item(); - osync_change_set_uid ( change, item.remoteId().toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); - break; - } + osync_change_set_uid ( change, item.remoteId().toLatin1() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + break; + } - case OSYNC_CHANGE_TYPE_DELETED: - { - Item item = fetchItem ( id ); - if ( ! item.isValid() ) // TODO proper error handling - return; - kDebug() << "delete with id: " << item.id(); - ItemDeleteJob *job = new ItemDeleteJob( item ); + case OSYNC_CHANGE_TYPE_DELETED: + { + Item item = fetchItem ( id ); + if ( ! item.isValid() ) { + error( OSYNC_ERROR_GENERIC, "Unable to fetch item"); + return; + } + + ItemDeleteJob *job = new ItemDeleteJob( item ); + if ( ! job->exec() ) { + error( OSYNC_ERROR_GENERIC, "Unable to delete item"); + return; + } + break; + } - if ( ! job->exec() ) { - kDebug() << "unable to delete item"; + case OSYNC_CHANGE_TYPE_UNMODIFIED: + { + kDebug() << "UNMODIFIED"; + // should we do something here? + break; + } + default: + kDebug() << "got invalid changetype?"; + error(OSYNC_ERROR_GENERIC, "got invalid changetype"); return; } - break; - } - case OSYNC_CHANGE_TYPE_UNMODIFIED: - { - kDebug() << "UNMODIFIED"; - // should we do something here? - break; - } - default: - kDebug() << "got invalid changetype?"; - return; - } + osync_hashtable_update_change ( hashtable, change ); - osync_hashtable_update_change ( hashtable, change ); success(); } @@ -471,7 +469,7 @@ KCal::Incidence *calEntry = format.fromString ( str.toUtf8() ); item->setMimeType ( "application/x-vnd.akonadi.calendar.event" ); item->setPayload<IncidencePtr> ( IncidencePtr ( calEntry->clone() ) ); - + kDebug() << "payload: " << str.toUtf8(); break; } case Todos: @@ -481,7 +479,7 @@ KCal::Incidence *todoEntry = format.fromString ( str.toUtf8() ); item->setMimeType ( "application/x-vnd.akonadi.calendar.todo" ); item->setPayload<IncidencePtr> ( IncidencePtr ( todoEntry->clone() ) ); - + kDebug() << "payload: " << str.toUtf8(); break; } case Notes: @@ -489,19 +487,10 @@ kDebug() << "notes"; KCal::ICalFormat format; KCal::Incidence *noteEntry = format.fromString ( str.toUtf8() ); - item->setMimeType ( "application/x-vnd.kde.notes" ); - item->setPayload<IncidencePtr> ( IncidencePtr ( noteEntry->clone() ) ); - - break; - } - case Journals: - { - kDebug() << "journals"; - KCal::ICalFormat format; - KCal::Incidence *journalEntry = format.fromString ( str.toUtf8() ); +// item->setMimeType ( "application/x-vnd.kde.notes" ); item->setMimeType ( "application/x-vnd.akonadi.calendar.journal" ); - item->setPayload<IncidencePtr> ( IncidencePtr ( journalEntry->clone() ) ); - + item->setPayload<IncidencePtr> ( IncidencePtr ( noteEntry->clone() ) ); + kDebug() << "payload: " << str.toUtf8(); break; } default: @@ -515,15 +504,16 @@ const Item DataSink::fetchItem ( const QString& id ) { kDebug(); - ItemFetchJob *fetchJob = new ItemFetchJob ( collection() ); - fetchJob->fetchScope().fullPayload(); - if ( fetchJob->exec() ) - foreach ( const Item &item, fetchJob->items() ) - if ( !strcmp(item.remoteId().toLatin1(), id.toLatin1() )) - return item; + ItemFetchJob *fetchJob = new ItemFetchJob ( collection() ); + fetchJob->fetchScope(); + if ( fetchJob->exec() ) + foreach ( const Item &item, fetchJob->items() ) + if ( !strcmp(item.remoteId().toLatin1(), id.toLatin1() )) + return item; // no such item found? + // this will be handled as invalid item return Item(); } @@ -532,9 +522,7 @@ kDebug() << "sync for sink member done"; OSyncError *error = 0; osync_objtype_sink_save_hashtable ( sink() , &error ); - //TODO check for errors - if ( error ) - { + if ( error ) { warning ( error ); return; } Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Wed Oct 6 10:55:48 2010 (r6143) +++ plugins/akonadi-sync/trunk/src/datasink.h Sun Oct 10 23:46:01 2010 (r6144) @@ -36,6 +36,8 @@ #include <opensync/opensync-data.h> #include <opensync/opensync-format.h> +#include <KUrl> + #include <boost/shared_ptr.hpp> using namespace Akonadi; @@ -48,7 +50,7 @@ Q_OBJECT public: - enum Type { Calendars = 0, Contacts, Todos, Notes, Journals }; + enum Type { Calendars = 0, Contacts, Todos, Notes }; DataSink( int type ); ~DataSink(); @@ -64,6 +66,7 @@ void slotItemsReceived( const Akonadi::Item::List & ); protected: + /** * Returns the collection we are supposed to sync with. */ @@ -89,11 +92,14 @@ private: const Item fetchItem( const QString& id ); bool setPayload( Item *item, const QString &str ); - QString m_Format; private: OSyncHashTable *m_hashtable; int m_type; + QString m_Format; + bool m_Enabled; + QString m_Url; + QString m_MimeType; }; #endif Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Wed Oct 6 10:55:48 2010 (r6143) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Sun Oct 10 23:46:01 2010 (r6144) @@ -219,27 +219,27 @@ if ( m_canConnect ) { osync_objtype_sink_set_connect_func(sink, connect_wrapper); - osync_objtype_sink_set_connect_timeout(sink, 5); + osync_objtype_sink_set_connect_timeout(sink, 15); } if ( m_canDisconnect ) { osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); - osync_objtype_sink_set_disconnect_timeout(sink, 5); + osync_objtype_sink_set_disconnect_timeout(sink, 15); } if ( m_canGetChanges ) { osync_objtype_sink_set_get_changes_func(sink, get_changes_wrapper); - osync_objtype_sink_set_getchanges_timeout(sink, 5); + osync_objtype_sink_set_getchanges_timeout(sink, 15); } if ( m_canCommit ) { osync_objtype_sink_set_commit_func(sink, commit_wrapper); - osync_objtype_sink_set_commit_timeout(sink, 5); + osync_objtype_sink_set_commit_timeout(sink, 15); } if ( m_canCommitAll ) { osync_objtype_sink_set_committed_all_func(sink, commitAll_wrapper); - osync_objtype_sink_set_committedall_timeout(sink, 5); + osync_objtype_sink_set_committedall_timeout(sink, 15); } if ( m_canSyncDone ) { osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); - osync_objtype_sink_set_syncdone_timeout(sink, 5); + osync_objtype_sink_set_syncdone_timeout(sink, 15); } // TODO: check if relevant for akonadi // if ( m_canWrite ) |
From: <svn...@op...> - 2010-10-06 08:55:58
|
Author: deloptes Date: Wed Oct 6 10:55:48 2010 New Revision: 6143 URL: http://www.opensync.org/changeset/6143 Log: - working on configure/discover/init and sync Modified: plugins/akonadi-sync/trunk/CMakeLists.txt plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/akonadisink.h plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/datasink.h plugins/akonadi-sync/trunk/src/sinkbase.cpp plugins/akonadi-sync/trunk/src/sinkbase.h Modified: plugins/akonadi-sync/trunk/CMakeLists.txt ============================================================================== --- plugins/akonadi-sync/trunk/CMakeLists.txt Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/CMakeLists.txt Wed Oct 6 10:55:48 2010 (r6143) @@ -21,7 +21,7 @@ # SET( CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -ggdb -g -O2 -Wall -W " ${CMAKE_CXX_FLAGS_DEBUG} ${KDE4_ENABLE_EXCEPTIONS} ) #ADD_DEFINITIONS(-g -O2 -fsigned-char -freg-struct-return -Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Winline -Werror) -# ADD_DEFINITIONS( -DDEBUG -g -O2 -Wall -W -fexceptions) +ADD_DEFINITIONS( -DDEBUG -g -O2 -Wall -W -fexceptions) # -Werror FIND_PACKAGE( KdepimLibs REQUIRED ) Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Wed Oct 6 10:55:48 2010 (r6143) @@ -43,17 +43,10 @@ <Enabled>1</Enabled> <Formats> <Format> - <Name>vjournal</Name> + <Name>vnote11</Name> </Format> - </Formats> - <ObjType>journal</ObjType> - <Url>default</Url> - </Resource> - <Resource> - <Enabled>1</Enabled> - <Formats> <Format> - <Name>vnote11</Name> + <Name>vjournal</Name> </Format> </Formats> <ObjType>note</ObjType> Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Wed Oct 6 10:55:48 2010 (r6143) @@ -88,15 +88,15 @@ else if ( sinkName == "contact" ) ds = new DataSink( DataSink::Contacts ); // FIXME: implement todos an journal (notes) - else if ( sinkName == "journal" ) + else if ( sinkName == "note" ) ds = new DataSink( DataSink::Journals ); else if ( sinkName == "todo" ) ds = new DataSink( DataSink::Todos ); - else if ( sinkName == "note" ) - ds = new DataSink( DataSink::Notes ); +// else if ( sinkName == "note" ) +// ds = new DataSink( DataSink::Notes ); else continue; - + if ( !ds->initialize( plugin, info, sink, error ) ) { delete ds; delete mainSink; @@ -108,13 +108,16 @@ return mainSink; } + + //FIXME: this probably a bug in opoensync // replace & static QString toXml(QString str) { - str.replace("<","<").replace(">",">").replace("&","and"); - return str; + str.replace("<","<").replace(">",">").replace("&","and"); + return str; } + static osync_bool testSupport(OSyncPluginInfo *info, OSyncPluginConfig *config, const char* mType, @@ -144,28 +147,37 @@ res = osync_plugin_config_find_active_resource(config ,mType); if ( ! res) { - res = osync_plugin_resource_new( error ); - osync_plugin_resource_enable(res,FALSE); +// res = osync_plugin_resource_new( error ); +// osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( objFormat, error ) ); +// osync_plugin_resource_enable(res,FALSE); +// osync_plugin_config_add_resource( config, res ); + kDebug() << "No support for " << mType << " disabled"; +// osync_objtype_sink_set_enabled( sinkEvent, FALSE ); + osync_objtype_sink_set_enabled( sinkEvent, FALSE ); + osync_objtype_sink_set_available( sinkEvent, FALSE ); continue; } - osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( objFormat, error ) ); + osync_plugin_resource_set_objtype( res, mType ); - QString myname = toXml(col.name()); + QString myname =QString::fromLatin1( osync_plugin_resource_get_name( res ) ); // + if ( myname.size() > 0 ) + myname.append(';').append(toXml(col.name())); + else + myname = toXml(col.name()); osync_plugin_resource_set_name( res, myname.toUtf8() ); // TODO: full path instead of the name + // osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); - osync_plugin_resource_set_mime( res, mimeType ); - if (osync_plugin_resource_is_enabled(res)) { -// osync_plugin_config_add_resource( config, res ); - osync_objtype_sink_add_objformat_sink(sinkEvent,osync_objformat_sink_new (objFormat, error)); - osync_objtype_sink_set_enabled( sinkEvent, TRUE ); - osync_objtype_sink_set_available( sinkEvent, TRUE ); - } +// if (osync_plugin_resource_is_enabled(res)) { +// osync_plugin_resource_set_preferred_format( res, objFormat ); +// } + osync_plugin_resource_enable(res,TRUE); + osync_objtype_sink_set_enabled( sinkEvent, TRUE ); + osync_objtype_sink_set_available( sinkEvent, TRUE ); } -// osync_objtype_sink_add_objformat_sink( sinkEvent, "vevent20" ); + osync_plugin_info_add_objtype( info, sinkEvent ); - - return TRUE; + return TRUE; } static osync_bool akonadi_discover(OSyncPluginInfo *info, void *userdata, OSyncError **error ) @@ -181,37 +193,30 @@ } if ( !Akonadi::Control::start() ) return false; + + /* + Check for support of following types + text/directory - this is the addressbook + application/x-vnd.kde.contactgroup - is contact group ... I'm not sure about it ATM + text/calendar - this is general mime for the whole calendar, but we are interested in the details + application/x-vnd.akonadi.calendar.event, + application/x-vnd.akonadi.calendar.todo, + application/x-vnd.akonadi.calendar.journal, + application/x-vnd.akonadi.calendar.freebusy - this will be most probably ignored, so not checkign for it + */ - /* - Check for support of following types - - text/calendar - this is general mime for the whole calendar, but we are interested in the details - application/x-vnd.akonadi.calendar.event, - application/x-vnd.akonadi.calendar.todo, - application/x-vnd.akonadi.calendar.journal, - application/x-vnd.akonadi.calendar.freebusy - this will be most probably ignored, so not checkign for it - */ - - if ( ! testSupport(info, config, "event", "application/x-vnd.akonadi.calendar.event", "vevent20" ,error) ) - kDebug() << "NO support for vevent20"; -// return false; - - if ( ! testSupport(info, config, "todo", "application/x-vnd.akonadi.calendar.todo", "vtodo10" ,error) ) - kDebug() << "NO support for vtodo10"; -// return false; - - if ( ! testSupport(info, config, "journal", "application/x-vnd.akonadi.calendar.journal", "vjournal" ,error) ) - kDebug() << "NO support for vjournal"; -// return false; - // fetch all address books - if ( ! testSupport(info, config, "contact", "application/x-vnd.kde.contactgroup", "vcard30" ,error) ) - kDebug() << "NO support for vcard30"; -// return false; - // fetch all notes - if ( ! testSupport(info, config, "note", "application/x-vnd.kde.notes", "vnote11" ,error) ) - kDebug() << "NO support for vnote11"; -// return false; - // set information about the peer (KDE itself) +// testSupport(info, config, "contact", "application/x-vnd.kde.contactgroup", "vcard20" ,error); + testSupport(info, config, "contact", "application/x-vnd.kde.contactgroup", "vcard30" ,error); + + testSupport(info, config, "event", "application/x-vnd.akonadi.calendar.event", "vevent20" ,error); + +// testSupport(info, config, "todo", "application/x-vnd.akonadi.calendar.todo", "vtodo10" ,error); + testSupport(info, config, "todo", "application/x-vnd.akonadi.calendar.todo", "vtodo20" ,error); + + testSupport(info, config, "note", "application/x-vnd.akonadi.calendar.journal", "vjournal" ,error); +// testSupport(info, config, "note", "application/x-vnd.kde.notes", "vnote11" ,error); + + // set information about the peer (KDE itself) { OSyncVersion *version = osync_version_new(error); osync_version_set_plugin(version, "Akonadi-sync"); @@ -229,7 +234,7 @@ osync_trace(TRACE_ENTRY, "%s(%p)", __func__, userdata); kDebug(); AkonadiSink *sink = reinterpret_cast<AkonadiSink*>( userdata ); - sink->disconnect(); + sink->disconnect(); // delete sink; delete kcd; kcd = 0; Modified: plugins/akonadi-sync/trunk/src/akonadisink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.h Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/src/akonadisink.h Wed Oct 6 10:55:48 2010 (r6143) @@ -30,9 +30,9 @@ */ class AkonadiSink : public SinkBase { - Q_OBJECT + Q_OBJECT - public: +public: AkonadiSink(); ~AkonadiSink(); Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Wed Oct 6 10:55:48 2010 (r6143) @@ -48,7 +48,6 @@ using namespace Akonadi; typedef boost::shared_ptr<KCal::Incidence> IncidencePtr; -typedef boost::shared_ptr<KABC::Addressee> Incidence2Ptr; DataSink::DataSink ( int type ) : SinkBase ( GetChanges | Commit | SyncDone ), @@ -89,10 +88,10 @@ { kDebug() << "sink is not enabled.."; // osync_objtype_sink_remove_objformat_sink( sink ); - osync_objtype_sink_set_available(sink, FALSE); - return false; + osync_objtype_sink_set_available(sink, FALSE); +// return false; } else { - osync_objtype_sink_set_available(sink, TRUE); + osync_objtype_sink_set_available(sink, TRUE); } OSyncPluginResource *resource = osync_plugin_config_find_active_resource ( config, osync_objtype_sink_get_name ( sink ) ); @@ -111,7 +110,8 @@ { if ( !strcmp ( "vcard21", tobjformat ) ) m_Format = "vcard21"; - else if ( !strcmp ( "vcard30", tobjformat ) ) + // always prefer newer format + if ( !strcmp ( "vcard30", tobjformat ) ) m_Format = "vcard30"; break; } @@ -119,18 +119,21 @@ { if ( !strcmp ( "vevent10", tobjformat ) ) m_Format = "vevent10"; - else if ( !strcmp ( "vevent20", tobjformat ) ) + // always prefer newer format + if ( !strcmp ( "vevent20", tobjformat ) ) m_Format = "vevent20"; break; } - case Notes: +// case Notes: +// { +// if ( !strcmp ( "vnote11", tobjformat ) ) +// m_Format = "vnote11"; +// break; +// } + case Journals: { if ( !strcmp ( "vnote11", tobjformat ) ) m_Format = "vnote11"; - break; - } - case Journals: - { if ( !strcmp ( "vjournal", tobjformat ) ) m_Format = "vjournal"; break; @@ -139,7 +142,8 @@ { if ( !strcmp ( "vtodo10", tobjformat ) ) m_Format = "vtodo10"; - else if ( !strcmp ( "vtodo20", tobjformat ) ) + // always prefer newer format + if ( !strcmp ( "vtodo20", tobjformat ) ) m_Format = "vtodo20"; break; } @@ -153,7 +157,7 @@ osync_objtype_sink_set_userdata ( sink, this ); osync_objtype_sink_enable_hashtable ( sink , TRUE ); - + wrapSink ( sink ); return true; @@ -200,8 +204,8 @@ osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); return; } - - Collection col = collection(); // osync_objtype_sink_get_name(sink()) + + Collection col = collection(); if ( !col.isValid() ) { kDebug() << "No collection"; @@ -220,7 +224,7 @@ return; } } - + ItemFetchJob *job = new ItemFetchJob ( col ); job->fetchScope().fetchFullPayload ( true ); kDebug() << "Fetched FullPayload" ; @@ -245,7 +249,7 @@ Q_FOREACH ( const Item& item, items ) { reportChange ( item ); } - kDebug() << "done"; + kDebug() << "done"; } void DataSink::reportChange ( const Item& item ) @@ -288,17 +292,17 @@ osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); osync_data_set_objtype( odata, osync_objtype_sink_get_name( sink() ) ); osync_change_set_data ( change, odata ); - + osync_data_unref ( odata ); - + OSyncChangeType changetype = osync_hashtable_get_changetype ( hashtable, change ); osync_change_set_changetype ( change, changetype ); osync_hashtable_update_change ( hashtable, change ); - + if ( changetype != OSYNC_CHANGE_TYPE_UNMODIFIED ) osync_context_report_change ( context(), change ); - - /* + + /* kDebug() << "changeid:" << osync_change_get_uid ( change ) << "; " << "itemid:" << item.id() << "; " @@ -322,6 +326,8 @@ OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); OSyncList *u, *uids = osync_hashtable_get_deleted ( hashtable ); + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, m_Format.toLatin1() ); for ( u = uids; u; u = u->next ) { QString uid ( ( char * ) u->data ); @@ -334,12 +340,24 @@ warning ( error ); continue; } + error = 0; + OSyncData *data = osync_data_new( NULL, 0, format, &error ); + if ( !data ) { + osync_change_unref( change ); + warning( error ); + continue; + } osync_change_set_uid ( change, uid.toLatin1() ); osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); + + osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); + osync_change_set_data( change, data ); osync_hashtable_update_change ( hashtable, change ); -// do we need reporting it osync_context_report_change(context(), change); + //FIXME raport if change is at our side + osync_context_report_change ( context(), change ); osync_change_unref ( change ); + osync_data_unref(data); } osync_list_free ( uids ); @@ -357,13 +375,13 @@ osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); QString str = QString::fromLatin1 ( plain ); QString id = QString::fromLatin1 ( osync_change_get_uid ( change ) ); - Collection col = collection(); + Collection col = collection(); switch ( osync_change_get_changetype ( change ) ) { case OSYNC_CHANGE_TYPE_ADDED: { -// const Item item = createItem ( change ); + // TODO: proper error handling (report errors to the sync engine) if ( !col.isValid() ) // error handling return; @@ -387,7 +405,7 @@ Item item = fetchItem ( id ); setPayload ( &item, str ); - if ( ! item.isValid() ) // TODO proper error handling + if ( ! item.isValid() ) // TODO proper error handling return; ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); @@ -441,9 +459,9 @@ kDebug() << "type = contacts"; KABC::VCardConverter converter; KABC::Addressee vcard = converter.parseVCard ( str.toUtf8() ); - item->setMimeType ( "text/directory" ); + item->setMimeType ( "text/directory" ); item->setPayload<KABC::Addressee> ( vcard ); - kDebug() << "payload: " << vcard.toString().toUtf8(); + kDebug() << "payload: " << vcard.toString().toUtf8(); break; } case Calendars: @@ -497,23 +515,13 @@ const Item DataSink::fetchItem ( const QString& id ) { kDebug(); - Collection col = collection(); - ItemFetchJob *fetchJob = new ItemFetchJob ( col ); + ItemFetchJob *fetchJob = new ItemFetchJob ( collection() ); fetchJob->fetchScope().fullPayload(); if ( fetchJob->exec() ) - { foreach ( const Item &item, fetchJob->items() ) - { - - kDebug() << "item " << item.remoteId(); - if ( item.remoteId().toLatin1() == id ) - { - kDebug() << "got item"; - return item; - } - } - } + if ( !strcmp(item.remoteId().toLatin1(), id.toLatin1() )) + return item; // no such item found? return Item(); Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/src/datasink.h Wed Oct 6 10:55:48 2010 (r6143) @@ -75,7 +75,9 @@ void reportChange( const Item& item, const QString& format ); /** - * Reimplement in subclass to provide data about changes to opensync. Note, that you must call DataSink::reportChange( Item, QString, int ) after you have organized data to be send to opensync. + * Reimplement in subclass to provide data about changes to opensync. + * Note, that you must call DataSink::reportChange( Item, QString, int ) + * after you have organized data to be send to opensync. */ void reportChange( const Item & item ); Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Wed Oct 6 10:55:48 2010 (r6143) @@ -27,7 +27,7 @@ osync_trace( TRACE_ENTRY, "%s(%p,%p, %p, %p)", __PRETTY_FUNCTION__, sink, info, ctx, userdata); \ SinkBase *sb = reinterpret_cast<SinkBase*>(userdata ); \ sb->setContext( ctx ); \ - sb->setPluginInfo( info ); + sb->setPluginInfo( info ); extern "C" { @@ -36,13 +36,13 @@ { WRAP( ) sb->connect(); - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { WRAP( ) sb->disconnect(); - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { @@ -51,19 +51,25 @@ if ( slow_sync ) sb->setSlowSink(slow_sync); sb->getChanges(); - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { WRAP( ) sb->syncDone(); - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void commit_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { WRAP( ) sb->commit(change); - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + } + + static void commitAll_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP( ) + sb->commitAll(); + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } // static void read_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { @@ -71,13 +77,7 @@ // sb->commit(change); // osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); // } -// - static void commitAll_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP( ) - sb->commitAll(); - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); - } -// +// // static void commit_all_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { // WRAP( ) // sb->commitAll(change); @@ -91,16 +91,16 @@ mContext( 0 ), mSink( 0 ), mPluginInfo( 0 ), - m_canConnect(false), - m_canDisconnect(false), - m_canCommit (false), - m_canCommitAll (false), + m_canConnect(false), + m_canDisconnect(false), + m_canCommit (false), + m_canCommitAll (false), // unused m_canBatchCommit(false), - m_canGetChanges(false), - m_canWrite (false), - m_canRead (false), - m_canSyncDone (false), - m_SlowSync (false) + m_canGetChanges(false), + m_canWrite (false), + m_canRead (false), + m_canSyncDone (false), + m_SlowSync (false) { m_canConnect = ( features & Connect ) ? true : false; @@ -117,12 +117,12 @@ SinkBase::~SinkBase() { - if ( mContext) - osync_context_unref(mContext); + if ( mContext) + osync_context_unref(mContext); if ( mSink ) osync_objtype_sink_unref( mSink ); if (mPluginInfo) - osync_plugin_info_unref(mPluginInfo); + osync_plugin_info_unref(mPluginInfo); } void SinkBase::connect() @@ -207,7 +207,7 @@ Q_ASSERT( sink ); Q_ASSERT( mSink == 0 ); mSink = sink; - + kDebug() << ">> m_canConnect:" << m_canConnect; kDebug() << ">> m_canDisconnect:" << m_canDisconnect; kDebug() << ">> m_canCommit:" << m_canCommit; @@ -216,39 +216,38 @@ kDebug() << ">> m_canCommitAll:" << m_canGetChanges; kDebug() << ">> m_canRead:" << m_canConnect; kDebug() << ">> m_canSyncDone:" << m_canGetChanges; - + if ( m_canConnect ) { osync_objtype_sink_set_connect_func(sink, connect_wrapper); - osync_objtype_sink_set_connect_timeout(sink, 5); + osync_objtype_sink_set_connect_timeout(sink, 5); } if ( m_canDisconnect ) { osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); - osync_objtype_sink_set_disconnect_timeout(sink, 5); + osync_objtype_sink_set_disconnect_timeout(sink, 5); } if ( m_canGetChanges ) { osync_objtype_sink_set_get_changes_func(sink, get_changes_wrapper); - osync_objtype_sink_set_getchanges_timeout(sink, 5); + osync_objtype_sink_set_getchanges_timeout(sink, 5); } if ( m_canCommit ) { osync_objtype_sink_set_commit_func(sink, commit_wrapper); - osync_objtype_sink_set_commit_timeout(sink, 5); + osync_objtype_sink_set_commit_timeout(sink, 5); + } + if ( m_canCommitAll ) { + osync_objtype_sink_set_committed_all_func(sink, commitAll_wrapper); + osync_objtype_sink_set_committedall_timeout(sink, 5); + } + if ( m_canSyncDone ) { + osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); + osync_objtype_sink_set_syncdone_timeout(sink, 5); } // TODO: check if relevant for akonadi // if ( m_canWrite ) // osync_objtype_sink_set_write(sink, TRUE); -// if ( m_canCommitAll || m_isContact || m_isEvent || m_isNote || m_isJournal || m_isTodo) { - if ( m_canCommitAll ) { - osync_objtype_sink_set_committed_all_func(sink, commitAll_wrapper); - osync_objtype_sink_set_committedall_timeout(sink, 5); - } // if ( m_canRead ) { // osync_objtype_sink_set_read_func(sink, read_wrapper); // osync_objtype_sink_set_read_timeout(sink, 5); // } - if ( m_canSyncDone ) { - osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); - osync_objtype_sink_set_syncdone_timeout(sink, 5); - } } Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Mon Oct 4 23:20:12 2010 (r6142) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Wed Oct 6 10:55:48 2010 (r6143) @@ -1,7 +1,7 @@ /* Copyright (c) 2008 Volker Krause <vk...@kd...> Copyright (c) 2010 Emanoil Kotsev <del...@ya...> - + $Id$ This library is free software; you can redistribute it and/or modify it @@ -34,19 +34,19 @@ */ class SinkBase : public QObject { - Q_OBJECT + Q_OBJECT - public: +public: enum Feature { - Connect = 1, - Disconnect = 2, - GetChanges = 4, - Commit = 8, - Write = 16, - CommittedAll = 32, - Read = 64, - BatchCommit = 128, - SyncDone = 256 + Connect = 1, + Disconnect = 2, + GetChanges = 4, + Commit = 8, + Write = 16, + CommittedAll = 32, + Read = 64, + BatchCommit = 128, + SyncDone = 256 }; SinkBase( int features ); @@ -61,30 +61,36 @@ virtual void commitAll(); virtual void syncDone(); - OSyncContext* context() const { return mContext; } + OSyncContext* context() const { + return mContext; + } void setContext( OSyncContext *context ); - OSyncPluginInfo *pluginInfo() const { return mPluginInfo; } + OSyncPluginInfo *pluginInfo() const { + return mPluginInfo; + } void setPluginInfo( OSyncPluginInfo *info ); void setSlowSink (osync_bool); osync_bool getSlowSink (); - protected: +protected: void success() const; void error( OSyncErrorType type, const QString &msg ) const; void warning( OSyncError *error ) const; void wrapSink( OSyncObjTypeSink* sink ); - OSyncObjTypeSink* sink() const { return mSink; } + OSyncObjTypeSink* sink() const { + return mSink; + } bool m_isContact, m_isEvent, m_isTodo, m_isNote, m_isJournal; //TODO intended to be private - private: +private: mutable OSyncContext *mContext; OSyncObjTypeSink *mSink; OSyncPluginInfo *mPluginInfo; // what do we have and what can we do - bool m_canConnect, m_canDisconnect, m_canCommit, m_canCommitAll, - m_canGetChanges, m_canWrite, m_canRead, m_canSyncDone; + bool m_canConnect, m_canDisconnect, m_canCommit, m_canCommitAll, + m_canGetChanges, m_canWrite, m_canRead, m_canSyncDone; // unused bool m_canCommitRead, m_canBatchCommit; osync_bool m_SlowSync; }; |
From: <svn...@op...> - 2010-10-04 21:20:23
|
Author: deloptes Date: Mon Oct 4 23:20:12 2010 New Revision: 6142 URL: http://www.opensync.org/changeset/6142 Log: - completed and tested functionality with file-sync and evolution - the akonadi-plugin seem to be working. TODO: look see why evolution is not reporting changes Modified: plugins/akonadi-sync/trunk/CMakeLists.txt plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/akonadisink.cpp plugins/akonadi-sync/trunk/src/datasink.cpp plugins/akonadi-sync/trunk/src/datasink.h plugins/akonadi-sync/trunk/src/sinkbase.cpp plugins/akonadi-sync/trunk/src/sinkbase.h Modified: plugins/akonadi-sync/trunk/CMakeLists.txt ============================================================================== --- plugins/akonadi-sync/trunk/CMakeLists.txt Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/CMakeLists.txt Mon Oct 4 23:20:12 2010 (r6142) @@ -1,6 +1,7 @@ # # # (c) Deloptes del...@ya... +# $Id$ # # @@ -20,7 +21,7 @@ # SET( CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -ggdb -g -O2 -Wall -W " ${CMAKE_CXX_FLAGS_DEBUG} ${KDE4_ENABLE_EXCEPTIONS} ) #ADD_DEFINITIONS(-g -O2 -fsigned-char -freg-struct-return -Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Winline -Werror) -# ADD_DEFINITIONS( -DDEBUG -ggdb -g -O2 -Wall -W ) +# ADD_DEFINITIONS( -DDEBUG -g -O2 -Wall -W -fexceptions) # -Werror FIND_PACKAGE( KdepimLibs REQUIRED ) Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Mon Oct 4 23:20:12 2010 (r6142) @@ -1,2 +1,63 @@ <?xml version="1.0"?> -<config version="1.0"/> +<config version="1.0"> + <Resources> + <Resource> + <Enabled>1</Enabled> + <Formats> + <Format> + <Config>VCARD_EXTENSION=KDE</Config> + <Name>vcard21</Name> + </Format> + <Format> + <Config>VCARD_EXTENSION=KDE</Config> + <Name>vcard30</Name> + </Format> + </Formats> + <ObjType>contact</ObjType> + <Url>default</Url> + </Resource> + <Resource> + <Enabled>1</Enabled> + <Formats> + <Format> + <Name>vevent10</Name> + </Format> + <Format> + <Name>vevent20</Name> + </Format> + </Formats> + <ObjType>event</ObjType> + <Url>default</Url> + </Resource> + <Resource> + <Enabled>1</Enabled> + <Formats> + <Format> + <Name>vtodo20</Name> + </Format> + </Formats> + <ObjType>todo</ObjType> + <Url>default</Url> + </Resource> + <Resource> + <Enabled>1</Enabled> + <Formats> + <Format> + <Name>vjournal</Name> + </Format> + </Formats> + <ObjType>journal</ObjType> + <Url>default</Url> + </Resource> + <Resource> + <Enabled>1</Enabled> + <Formats> + <Format> + <Name>vnote11</Name> + </Format> + </Formats> + <ObjType>note</ObjType> + <Url>default</Url> + </Resource> + </Resources> +</config> Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Mon Oct 4 23:20:12 2010 (r6142) @@ -137,36 +137,31 @@ // OSyncFormatEnv *formatEnv = osync_plugin_info_get_format_env(info); OSyncObjTypeSink *sinkEvent = osync_objtype_sink_new(mType, error); - OSyncPluginResource *res = NULL; + OSyncPluginResource *res = NULL; foreach ( const Akonadi::Collection &col, colsCal ) { kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); kDebug() << " " << col.name() << col.url().url(); res = osync_plugin_config_find_active_resource(config ,mType); - if ( res ) - osync_plugin_resource_enable(res,FALSE); - //TODO add some logic here (compare names etc) -// // osync_plugin_config_remove_resource(config,res); -// -// res = -// } -// if ( ! res) - res = osync_plugin_resource_new( error ); -// osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vevent20", error ) ); + if ( ! res) { + res = osync_plugin_resource_new( error ); + osync_plugin_resource_enable(res,FALSE); + continue; + } osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( objFormat, error ) ); - - osync_plugin_resource_enable(res,TRUE); osync_plugin_resource_set_objtype( res, mType ); QString myname = toXml(col.name()); osync_plugin_resource_set_name( res, myname.toUtf8() ); // TODO: full path instead of the name osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); osync_plugin_resource_set_mime( res, mimeType ); - osync_plugin_config_add_resource( config, res ); + if (osync_plugin_resource_is_enabled(res)) { +// osync_plugin_config_add_resource( config, res ); + osync_objtype_sink_add_objformat_sink(sinkEvent,osync_objformat_sink_new (objFormat, error)); + osync_objtype_sink_set_enabled( sinkEvent, TRUE ); + osync_objtype_sink_set_available( sinkEvent, TRUE ); + } } - osync_objtype_sink_add_objformat_sink(sinkEvent,osync_objformat_sink_new (objFormat, error)); - osync_objtype_sink_set_enabled( sinkEvent, TRUE ); - osync_objtype_sink_set_available( sinkEvent, TRUE ); // osync_objtype_sink_add_objformat_sink( sinkEvent, "vevent20" ); osync_plugin_info_add_objtype( info, sinkEvent ); @@ -209,7 +204,7 @@ kDebug() << "NO support for vjournal"; // return false; // fetch all address books - if ( ! testSupport(info, config, "contact", KABC::Addressee::mimeType().toLatin1(), "vcard30" ,error) ) + if ( ! testSupport(info, config, "contact", "application/x-vnd.kde.contactgroup", "vcard30" ,error) ) kDebug() << "NO support for vcard30"; // return false; // fetch all notes Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Mon Oct 4 23:20:12 2010 (r6142) @@ -3,7 +3,7 @@ Copyright (c) 2010 Emanoil Kotsev <del...@ya...> $Id$ - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your @@ -70,7 +70,7 @@ osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, "Could not start Akonadi."); return; } - success(); + success(); osync_trace(TRACE_EXIT, "%s", __PRETTY_FUNCTION__); } Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Mon Oct 4 23:20:12 2010 (r6142) @@ -20,30 +20,26 @@ 02110-1301, USA. */ -// #include <glib.h> -// #include <glib/ghash.h> - #include "datasink.h" -// #include <opensync/opensync.h> -// #include <opensync/opensync-helper.h> -// #include <opensync/opensync-plugin.h> - #include <akonadi/collectionfetchjob.h> #include <akonadi/collectionfetchscope.h> +#include <akonadi/itemdeletejob.h> // calendar includes #include <kcal/incidence.h> #include <kcal/icalformat.h> // contact includes -#include <kabc/vcardconverter.h> #include <kabc/addressee.h> +#include <kabc/vcardconverter.h> +#include <kabc/vcardparser.h> +#include <kabc/vcardformat.h> -// #include <glib/gtypes.h> -// #include <glib/glist.h> -// notes includes // TODO +// notes includes +// todos includes +// journals includes #include <KDebug> #include <KLocale> @@ -52,174 +48,120 @@ using namespace Akonadi; typedef boost::shared_ptr<KCal::Incidence> IncidencePtr; +typedef boost::shared_ptr<KABC::Addressee> Incidence2Ptr; DataSink::DataSink ( int type ) : - SinkBase ( GetChanges | Commit | SyncDone ) + SinkBase ( GetChanges | Commit | SyncDone ), + m_Format(0) { - kDebug() << "Create obj:" << type; - m_type = type; + kDebug() << "Constr.objtype:" << type; + m_type = type; - m_isEvent = ( type == DataSink::Calendars ) ? true : false; - m_isContact = ( type == DataSink::Contacts ) ? true : false; - m_isNote = ( type == DataSink::Notes ) ? true : false; - m_isTodo = ( type == DataSink::Todos ) ? true : false; - m_isJournal = ( type == DataSink::Journals ) ? true : false; + m_isEvent = ( type == DataSink::Calendars ) ? true : false; + m_isContact = ( type == DataSink::Contacts ) ? true : false; + m_isNote = ( type == DataSink::Notes ) ? true : false; + m_isTodo = ( type == DataSink::Todos ) ? true : false; + m_isJournal = ( type == DataSink::Journals ) ? true : false; } DataSink::~DataSink() { - kDebug() << "DataSink destructor called"; // TODO still needed + kDebug() << "DataSink destructor called"; // TODO still needed } bool DataSink::initialize ( OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncObjTypeSink *sink, OSyncError ** error ) { - kDebug() << "initializing" << osync_objtype_sink_get_name ( sink ); - kDebug() << "TYPE " << m_type; - Q_UNUSED ( plugin ); - Q_UNUSED ( info ); - Q_UNUSED ( error ); + kDebug() << "initializing" << osync_objtype_sink_get_name ( sink ); + Q_UNUSED ( plugin ); + Q_UNUSED ( info ); + Q_UNUSED ( error ); - OSyncPluginConfig *config = osync_plugin_info_get_config ( info ); - if ( !config ) + OSyncPluginConfig *config = osync_plugin_info_get_config ( info ); + if ( !config ) { - osync_error_set ( error, OSYNC_ERROR_GENERIC, "Unable to get config." ); - return false; + osync_error_set ( error, OSYNC_ERROR_GENERIC, "Unable to get config." ); + return false; } - osync_bool enabled = osync_objtype_sink_is_enabled ( sink ); - if ( ! enabled ) + osync_bool enabled = osync_objtype_sink_is_enabled ( sink ); + if ( ! enabled ) { - kDebug() << "sink is not enabled.."; + kDebug() << "sink is not enabled.."; // osync_objtype_sink_remove_objformat_sink( sink ); - return false; + osync_objtype_sink_set_available(sink, FALSE); + return false; + } else { + osync_objtype_sink_set_available(sink, TRUE); } - wrapSink ( sink ); - - - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink ); - - if ( ! hashtable ) - kDebug() << ">> NO hashtable for objtype:" << osync_objtype_sink_get_name ( sink ); + OSyncPluginResource *resource = osync_plugin_config_find_active_resource ( config, osync_objtype_sink_get_name ( sink ) ); + OSyncList *objfrmtList = osync_plugin_resource_get_objformat_sinks ( resource ); - OSyncPluginResource *resource = osync_plugin_config_find_active_resource ( config, osync_objtype_sink_get_name ( sink ) ); - OSyncList *objfrmtList = osync_plugin_resource_get_objformat_sinks ( resource ); - - OSyncList *r; - bool hasObjFormat; - for ( r = objfrmtList;r;r = r->next ) + OSyncList *r; +// bool hasObjFormat; + for ( r = objfrmtList;r;r = r->next ) { - OSyncObjFormatSink *objformatsink = ( OSyncObjFormatSink * ) r->data; + OSyncObjFormatSink *objformatsink = ( OSyncObjFormatSink * ) r->data; + const char* tobjformat = osync_objformat_sink_get_objformat ( objformatsink ); - switch ( m_type ) + switch ( m_type ) { case Contacts: { - if ( !strcmp ( "vcard21", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vcard21"; - break; - } - else - kDebug() << "No objformat vcard21"; - - if ( !strcmp ( "vcard30", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vcard30"; - break; - } - else - kDebug() << "No objformat vcard30"; - - break; + if ( !strcmp ( "vcard21", tobjformat ) ) + m_Format = "vcard21"; + else if ( !strcmp ( "vcard30", tobjformat ) ) + m_Format = "vcard30"; + break; } case Calendars: { - if ( !strcmp ( "vevent10", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vevent10"; - break; - } - else - kDebug() << "No objformat vevent10"; - break; - if ( !strcmp ( "vevent20", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vevent20"; - break; - } - else - kDebug() << "No objformat vevent20"; - break; + if ( !strcmp ( "vevent10", tobjformat ) ) + m_Format = "vevent10"; + else if ( !strcmp ( "vevent20", tobjformat ) ) + m_Format = "vevent20"; + break; } case Notes: { - if ( !strcmp ( "vnote11", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vnote11"; - break; - } - else - kDebug() << "No objformat vnote11"; - break; + if ( !strcmp ( "vnote11", tobjformat ) ) + m_Format = "vnote11"; + break; } case Journals: { - if ( !strcmp ( "vjournal", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vjournal"; - break; - } - else - kDebug() << "No objformat vjournal"; - break; + if ( !strcmp ( "vjournal", tobjformat ) ) + m_Format = "vjournal"; + break; } case Todos: { - if ( !strcmp ( "vtodo10", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vtodo10"; - break; - } - else - kDebug() << "No objformat vtodo10"; - if ( !strcmp ( "vtodo20", osync_objformat_sink_get_objformat ( objformatsink ) ) ) - { - hasObjFormat = true; - kDebug() << "Has objformat vtodo20"; - break; - } - else - kDebug() << "No objformat vtodo20"; - break; + if ( !strcmp ( "vtodo10", tobjformat ) ) + m_Format = "vtodo10"; + else if ( !strcmp ( "vtodo20", tobjformat ) ) + m_Format = "vtodo20"; + break; } default: - continue; + return false; } + kDebug() << "Has objformat: " << m_Format; } -// if (!hasObjFormat) { -// kDebug() << "No objformat vcard30"; -// return false; -// } - osync_objtype_sink_set_userdata ( sink, this ); - osync_objtype_sink_enable_hashtable ( sink , TRUE ); + osync_objtype_sink_set_userdata ( sink, this ); + osync_objtype_sink_enable_hashtable ( sink , TRUE ); + + wrapSink ( sink ); - return true; + return true; } Akonadi::Collection DataSink::collection() const - { +{ + kDebug(); OSyncPluginConfig *config = osync_plugin_info_get_config ( pluginInfo() ); Q_ASSERT ( config ); @@ -228,431 +170,367 @@ OSyncPluginResource *res = osync_plugin_config_find_active_resource ( config, objtype ); if ( !res ) - { + { error ( OSYNC_ERROR_MISCONFIGURATION, i18n ( "No active resource for type \"%1\" found", objtype ) ); return Collection(); - } + } const KUrl url = KUrl ( osync_plugin_resource_get_url ( res ) ); // TODO osync_plugin_resource_get_mime() ; if ( url.isEmpty() ) - { + { error ( OSYNC_ERROR_MISCONFIGURATION, i18n ( "Url for object type \"%1\" is not configured.", objtype ) ); return Collection(); - } + } return Collection::fromUrl ( url ); - } +} void DataSink::getChanges() { - kDebug() << " DataSink::getChanges() called"; - OSyncError *oerror = 0; + kDebug(); + kDebug() << " DataSink::getChanges() called"; + OSyncError *oerror = 0; - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - Collection col = collection(); // osync_objtype_sink_get_name(sink()) - if ( !col.isValid() ) + if ( !hashtable ) { - kDebug() << "No collection"; - osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); - return; + kDebug() << "No hashtable"; + osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + return; + } + + Collection col = collection(); // osync_objtype_sink_get_name(sink()) + if ( !col.isValid() ) + { + kDebug() << "No collection"; + osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + return; } // FIXME - if ( getSlowSink() ) + if ( getSlowSink() ) { - kDebug() << "we're in the middle of slow-syncing..."; - osync_trace ( TRACE_INTERNAL, "resetting hashtable" ); - if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) + kDebug() << "we're in the middle of slow-syncing..."; + osync_trace ( TRACE_INTERNAL, "resetting hashtable" ); + if ( ! osync_hashtable_slowsync ( hashtable, &oerror ) ) { - warning ( oerror ); - osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); - return; + warning ( oerror ); + osync_trace ( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print ( &oerror ) ); + return; } } - ItemFetchJob *job = new ItemFetchJob ( col ); - job->fetchScope().fetchFullPayload ( true ); - kDebug() << "Fetched FullPayload" ; + + ItemFetchJob *job = new ItemFetchJob ( col ); + job->fetchScope().fetchFullPayload ( true ); + kDebug() << "Fetched FullPayload" ; - QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); - QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); + QObject::connect ( job, SIGNAL ( itemsReceived ( const Akonadi::Item::List & ) ), this, SLOT ( slotItemsReceived ( const Akonadi::Item::List & ) ) ); + QObject::connect ( job, SIGNAL ( result ( KJob * ) ), this, SLOT ( slotGetChangesFinished ( KJob * ) ) ); - // FIXME give me a real eventloop please! - if ( !job->exec() ) + if ( !job->exec() ) { - error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); - return; + error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); + return; } - success(); + kDebug() << "success()"; + success(); } void DataSink::slotItemsReceived ( const Item::List &items ) { - kDebug() << "retrieved" << items.count() << "items"; - Q_FOREACH ( const Item& item, items ) - { + kDebug(); + kDebug() << "retrieved" << items.count() << "items"; + Q_FOREACH ( const Item& item, items ) { + reportChange ( item ); + } + kDebug() << "done"; +} + +void DataSink::reportChange ( const Item& item ) +{ + kDebug(); kDebug() << "Id:" << item.id() << "\n"; kDebug() << "Mime:" << item.mimeType() << "\n"; kDebug() << "Revision:" << item.revision() << "\n"; kDebug() << "StorageCollectionId:" << item.storageCollectionId() << "\n"; kDebug() << "Url:" << item.url() << "\n"; - reportChange ( item ); - } -} - -void DataSink::reportChange ( const Item& item ) -{ - -// kDebug() << item.id() << "\n" ; - kDebug() << "item.payloadData().data():" << item.payloadData().data() << "\n" ; + kDebug() << "item.payloadData().data()" << "\n" << item.payloadData().data() ; - OSyncError *error = 0; - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, m_Format.toLatin1() ); + OSyncError *error = 0; + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - OSyncChange *change = osync_change_new ( &error ); - if ( !change ) + OSyncChange *change = osync_change_new ( &error ); + if ( !change ) { - osync_change_unref ( change ); - warning ( error ); - return; + osync_change_unref ( change ); + warning ( error ); + return; } - osync_change_set_uid ( change, QString::number ( item.id() ).toLatin1() ); - - - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, formatName().toLatin1() ); - -// - error = 0; - // Now you can set the data for the object - // Set the last argument to FALSE if the real data - // should be queried later in a "get_data" function + // Now you can set the data for the object + // Set the last argument to FALSE if the real data + // should be queried later in a "get_data" function // odata = osync_data_new(NULL, 0, format, &error); - OSyncData *odata = osync_data_new ( item.payloadData().data() , item.payloadData().size(), format, &error ); - if ( !odata ) - { - osync_change_unref ( change ); - return; + QString cvtToString = item.payloadData().data() ; + OSyncData *odata = osync_data_new ( cvtToString.toLatin1().data() , cvtToString.size(), format, &error ); + if ( !odata ) + { + osync_data_unref ( odata ); + return; } -// // osync_data_set_objtype( odata, osync_objtype_sink_get_name( sink() ) ); -// - osync_change_set_data ( change, odata ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); - OSyncChangeType changetype = osync_hashtable_get_changetype ( hashtable, change ); - osync_change_set_changetype ( change, changetype ); - osync_hashtable_update_change ( hashtable, change ); - - osync_data_unref ( odata ); - - /* */ - kDebug() << "changeid:" << osync_change_get_uid ( change ) << "; " - << "itemid:" << item.id() << "; " - << "revision:" << item.revision() << "; " - << "changetype:" << changetype << "; " - << "hash:" << osync_hashtable_get_hash ( hashtable, osync_change_get_uid ( change ) ) << "; " - << "objtype:" << osync_change_get_objtype ( change ) << "; " - << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ) << "; " - << "sinkname:" << osync_objtype_sink_get_name ( sink() ); - /* */ - - if ( changetype != OSYNC_CHANGE_TYPE_UNMODIFIED ) - osync_context_report_change ( context(), change ); - - + osync_change_set_uid ( change, item.remoteId().toLatin1() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + osync_data_set_objtype( odata, osync_objtype_sink_get_name( sink() ) ); + osync_change_set_data ( change, odata ); + + osync_data_unref ( odata ); + + OSyncChangeType changetype = osync_hashtable_get_changetype ( hashtable, change ); + osync_change_set_changetype ( change, changetype ); + osync_hashtable_update_change ( hashtable, change ); + + if ( changetype != OSYNC_CHANGE_TYPE_UNMODIFIED ) + osync_context_report_change ( context(), change ); + + /* + kDebug() + << "changeid:" << osync_change_get_uid ( change ) << "; " + << "itemid:" << item.id() << "; " + << "revision:" << item.revision() << "; " + << "changetype:" << changetype << "; " + << "hash:" << osync_hashtable_get_hash ( hashtable, osync_change_get_uid ( change ) ) << "; " + << "objtype:" << osync_change_get_objtype ( change ) << "; " + << "m_Format:" << m_Format << "; " + << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ) << "; " + << "sinkname:" << osync_objtype_sink_get_name ( sink() ); + */ +// osync_error_unref(&error); +// osync_objformat_unref(format); +// osync_format_env_unref(formatenv); } void DataSink::slotGetChangesFinished ( KJob * ) { - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, formatName().toLatin1() ); + kDebug(); + OSyncError *error = 0; + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); + OSyncList *u, *uids = osync_hashtable_get_deleted ( hashtable ); - // after the items have been processed, see what's been deleted and send them to opensync - OSyncError *error = 0; -// FIXME: - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - OSyncList *u, *uids = osync_hashtable_get_deleted ( hashtable ); -// - for ( u = uids; u; u = u->next ) + for ( u = uids; u; u = u->next ) { - QString uid ( ( char * ) u->data ); - kDebug() << "going to delete with uid:" << uid; + QString uid ( ( char * ) u->data ); + kDebug() << "going to delete with uid:" << uid; - OSyncChange *change = osync_change_new ( &error ); - if ( !change ) + OSyncChange *change = osync_change_new ( &error ); + if ( !change ) { - osync_change_unref ( change ); - warning ( error ); - continue; + osync_change_unref ( change ); + warning ( error ); + continue; } -// - osync_change_set_uid ( change, uid.toLatin1() ); - osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); - error = 0; - OSyncData *odata = osync_data_new ( NULL, 0, format, &error ); - if ( !odata ) - { - osync_change_unref ( change ); - warning ( error ); - continue; - } - - osync_data_set_objtype ( odata, osync_objtype_sink_get_name ( sink() ) ); - osync_change_set_data ( change, odata ); - osync_data_unref ( odata ); - -// osync_context_report_change(context(), change); - osync_hashtable_update_change ( hashtable, change ); - osync_change_unref ( change ); + osync_change_set_uid ( change, uid.toLatin1() ); + osync_change_set_changetype ( change, OSYNC_CHANGE_TYPE_DELETED ); + osync_hashtable_update_change ( hashtable, change ); +// do we need reporting it osync_context_report_change(context(), change); + osync_change_unref ( change ); } - osync_list_free ( uids ); - - kDebug() << "got all changes.."; + osync_list_free ( uids ); + kDebug() << "got all changes."; } void DataSink::commit ( OSyncChange *change ) { - kDebug() << "change uid:" << osync_change_get_uid ( change ); - kDebug() << "objtype:" << osync_change_get_objtype ( change ); - kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); +// kDebug(); +// kDebug() << "change uid:" << osync_change_get_uid ( change ); +// kDebug() << "objtype:" << osync_change_get_objtype ( change ); +// kDebug() << "objform:" << osync_objformat_get_name ( osync_change_get_objformat ( change ) ); + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); + char *plain = 0; + osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); + QString str = QString::fromLatin1 ( plain ); + QString id = QString::fromLatin1 ( osync_change_get_uid ( change ) ); + Collection col = collection(); - switch ( osync_change_get_changetype ( change ) ) + switch ( osync_change_get_changetype ( change ) ) { case OSYNC_CHANGE_TYPE_ADDED: { - const Item item = createItem ( change ); - osync_change_set_uid ( change, QString::number ( item.id() ).toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); - kDebug() << "ADDED:" << osync_change_get_uid ( change ); - break; +// const Item item = createItem ( change ); + if ( !col.isValid() ) // error handling + return; + + Item item; + setPayload ( &item, str ); + item.setRemoteId( id.toLatin1() ); + + ItemCreateJob *job = new Akonadi::ItemCreateJob ( item, col ); + if ( ! job->exec() ) + return; + item = job->item(); // handle !job->exec in return too.. + if ( ! item.isValid() ) // error handling + return; + osync_change_set_uid ( change, item.remoteId().toLatin1() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + break; } case OSYNC_CHANGE_TYPE_MODIFIED: { - const Item item = modifyItem ( change ); - osync_change_set_uid ( change, QString::number ( item.id() ).toLatin1() ); - osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); - kDebug() << "MODIFIED:" << osync_change_get_uid ( change ); - break; + Item item = fetchItem ( id ); + setPayload ( &item, str ); + + if ( ! item.isValid() ) // TODO proper error handling + return; + + ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); + if ( ! modifyJob->exec() ) + return; + else + item = modifyJob->item(); + + osync_change_set_uid ( change, item.remoteId().toLatin1() ); + osync_change_set_hash ( change, QString::number ( item.revision() ).toLatin1() ); + break; } case OSYNC_CHANGE_TYPE_DELETED: { - deleteItem ( change ); - kDebug() << "DELETED:" << osync_change_get_uid ( change ); - break; + Item item = fetchItem ( id ); + if ( ! item.isValid() ) // TODO proper error handling + return; + kDebug() << "delete with id: " << item.id(); + ItemDeleteJob *job = new ItemDeleteJob( item ); + + if ( ! job->exec() ) { + kDebug() << "unable to delete item"; + return; + } + break; } case OSYNC_CHANGE_TYPE_UNMODIFIED: { - kDebug() << "UNMODIFIED"; - // should we do something here? - break; + kDebug() << "UNMODIFIED"; + // should we do something here? + break; } - default: - kDebug() << "got invalid changetype?"; - } - - osync_hashtable_update_change ( hashtable, change ); - success(); -} - -const Item DataSink::createAkonadiItem ( OSyncChange *change ) -{ - char *plain = 0; - osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); - QString str = QString::fromLatin1 ( plain ); - Akonadi::Item item; - setPayload ( &item, str.toUtf8() ); - return item; -} - -const Item DataSink::createItem ( OSyncChange *change ) -{ - Collection col = collection(); - if ( !col.isValid() ) // error handling - return Item(); - kDebug() << "cuid:" << osync_change_get_uid ( change ); - - ItemCreateJob *job = new Akonadi::ItemCreateJob ( createAkonadiItem ( change ), col ); - - if ( ! job->exec() ) - kDebug() << "creating an item failed"; - - return job->item(); // handle !job->exec in return too.. -} - -const Item DataSink::modifyItem ( OSyncChange *change ) -{ - char *plain = 0; - osync_data_get_data ( osync_change_get_data ( change ), &plain, /*size*/0 ); - QString str = QString::fromLatin1 ( plain ); - - QString id = QString ( osync_change_get_uid ( change ) ); - Item item = fetchItem ( id ); - if ( ! item.isValid() ) // TODO proper error handling - return Item(); - - //event.setMimeType( "application/x-vnd.akonadi.calendar.event" ); - //Item newItem = createAkonadiItem( change ); - setPayload ( &item, str.toUtf8() ); - ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob ( item ); - if ( modifyJob->exec() ) - { - kDebug() << "modification completed"; - return modifyJob->item(); + kDebug() << "got invalid changetype?"; + return; } - else - kDebug() << "unable to modify"; - - - return Item(); -} -void DataSink::deleteItem ( OSyncChange *change ) -{ - QString id = QString ( osync_change_get_uid ( change ) ); - Item item = fetchItem ( id ); - if ( ! item.isValid() ) // TODO proper error handling - return; - - kDebug() << "delete with id: " << item.id(); - // TODO - /*ItemDeleteJob *job = new ItemDeleteJob( item ); - - if( job->exec() ) { - kDebug() << "item deleted"; - } - else - kDebug() << "unable to delete item";*/ - - success(); // TODO + osync_hashtable_update_change ( hashtable, change ); + success(); } bool DataSink::setPayload ( Item *item, const QString &str ) { - switch ( m_type ) + kDebug(); + switch ( m_type ) { case Contacts: { - KABC::VCardConverter converter; - KABC::Addressee vcard = converter.parseVCard ( str.toUtf8() ); - item->setMimeType ( KABC::Addressee::mimeType() ); - item->setPayloadFromData ( vcard.toString().toLatin1() ); - break; + kDebug() << "type = contacts"; + KABC::VCardConverter converter; + KABC::Addressee vcard = converter.parseVCard ( str.toUtf8() ); + item->setMimeType ( "text/directory" ); + item->setPayload<KABC::Addressee> ( vcard ); + kDebug() << "payload: " << vcard.toString().toUtf8(); + break; } case Calendars: { - KCal::ICalFormat format; - KCal::Incidence *calEntry = format.fromString ( str.toUtf8() ); - item->setMimeType ( "application/x-vnd.akonadi.calendar.event" ); - item->setPayload<IncidencePtr> ( IncidencePtr ( calEntry->clone() ) ); + kDebug() << "events"; + KCal::ICalFormat format; + KCal::Incidence *calEntry = format.fromString ( str.toUtf8() ); + item->setMimeType ( "application/x-vnd.akonadi.calendar.event" ); + item->setPayload<IncidencePtr> ( IncidencePtr ( calEntry->clone() ) ); - break; + break; } case Todos: { - KCal::ICalFormat format; - KCal::Incidence *todoEntry = format.fromString ( str.toUtf8() ); - item->setMimeType ( "application/x-vnd.akonadi.calendar.todo" ); - item->setPayload<IncidencePtr> ( IncidencePtr ( todoEntry->clone() ) ); + kDebug() << "todos"; + KCal::ICalFormat format; + KCal::Incidence *todoEntry = format.fromString ( str.toUtf8() ); + item->setMimeType ( "application/x-vnd.akonadi.calendar.todo" ); + item->setPayload<IncidencePtr> ( IncidencePtr ( todoEntry->clone() ) ); - break; + break; } case Notes: { - kDebug() << "notes"; - KCal::ICalFormat format; - KCal::Incidence *noteEntry = format.fromString ( str.toUtf8() ); - item->setMimeType ( "application/x-vnd.kde.notes" ); - item->setPayload<IncidencePtr> ( IncidencePtr ( noteEntry->clone() ) ); + kDebug() << "notes"; + KCal::ICalFormat format; + KCal::Incidence *noteEntry = format.fromString ( str.toUtf8() ); + item->setMimeType ( "application/x-vnd.kde.notes" ); + item->setPayload<IncidencePtr> ( IncidencePtr ( noteEntry->clone() ) ); - break; + break; } case Journals: { - kDebug() << "journals"; - KCal::ICalFormat format; - KCal::Incidence *journalEntry = format.fromString ( str.toUtf8() ); - item->setMimeType ( "application/x-vnd.akonadi.calendar.journal" ); - item->setPayload<IncidencePtr> ( IncidencePtr ( journalEntry->clone() ) ); + kDebug() << "journals"; + KCal::ICalFormat format; + KCal::Incidence *journalEntry = format.fromString ( str.toUtf8() ); + item->setMimeType ( "application/x-vnd.akonadi.calendar.journal" ); + item->setPayload<IncidencePtr> ( IncidencePtr ( journalEntry->clone() ) ); - break; + break; } default: - // should not happen - return false; + // should not happen + return false; } - return true; -} - -const QString DataSink::formatName() -{ - // FIXME -- this should be saved somewhere in the config, why settign and checking here: - QString formatName; - switch ( m_type ) - { - case Calendars: - formatName = "vevent20"; - break; - case Contacts: - formatName = "vcard30"; - break; - case Notes: - formatName = "vjournal"; - break; - case Todos: - formatName = "vtodo20"; - break; - default: - kDebug() << "invalid datasink type"; - return QString(); - } - - return formatName; + return true; } const Item DataSink::fetchItem ( const QString& id ) { - ItemFetchJob *fetchJob = new ItemFetchJob ( Item ( id ) ); - fetchJob->fetchScope().fetchFullPayload(); + kDebug(); + Collection col = collection(); + ItemFetchJob *fetchJob = new ItemFetchJob ( col ); + fetchJob->fetchScope().fullPayload(); - if ( fetchJob->exec() ) + if ( fetchJob->exec() ) { - foreach ( const Item &item, fetchJob->items() ) - { - if ( QString::number ( item.id() ) == id ) - { - kDebug() << "got item"; - return item; - } - } + foreach ( const Item &item, fetchJob->items() ) + { + + kDebug() << "item " << item.remoteId(); + if ( item.remoteId().toLatin1() == id ) + { + kDebug() << "got item"; + return item; + } + } } - // no such item found? - return Item(); + // no such item found? + return Item(); } void DataSink::syncDone() { - kDebug() << "sync for sink member done"; - OSyncError *error = 0; - osync_objtype_sink_save_hashtable ( sink() , &error ); - //TODO check for errors - if ( error ) + kDebug() << "sync for sink member done"; + OSyncError *error = 0; + osync_objtype_sink_save_hashtable ( sink() , &error ); + //TODO check for errors + if ( error ) { - warning ( error ); - return; + warning ( error ); + return; } - success(); + success(); } #include "datasink.moc" Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/src/datasink.h Mon Oct 4 23:20:12 2010 (r6142) @@ -80,26 +80,17 @@ void reportChange( const Item & item ); /** - * Creates a new item based on the data given by opensync. - */ - const Item createItem( OSyncChange *change ); - /** - * Modified an item based on the data given by opensync. - */ - const Item modifyItem( OSyncChange *change ); - /** * Deletes an item based on the data given by opensync. */ void deleteItem( OSyncChange *change ); private: - const Item createAkonadiItem( OSyncChange *change ); const Item fetchItem( const QString& id ); - const QString formatName(); bool setPayload( Item *item, const QString &str ); + QString m_Format; private: -// OSyncHashTable *m_hashtable; + OSyncHashTable *m_hashtable; int m_type; }; Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Mon Oct 4 23:20:12 2010 (r6142) @@ -36,14 +36,12 @@ { WRAP( ) sb->connect(); -// osync_context_report_success(ctx); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { WRAP( ) sb->disconnect(); -// osync_context_report_success(ctx); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } @@ -53,42 +51,36 @@ if ( slow_sync ) sb->setSlowSink(slow_sync); sb->getChanges(); -// osync_context_report_success(ctx); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { WRAP( ) sb->syncDone(); -// osync_context_report_success(ctx); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } static void commit_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { WRAP( ) sb->commit(change); -// osync_context_report_success(ctx); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } // static void read_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { // WRAP( ) // sb->commit(change); -// // osync_context_report_success(ctx); // osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); // } // static void commitAll_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { WRAP( ) sb->commitAll(); -// osync_context_report_success(ctx); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } // // static void commit_all_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { // WRAP( ) // sb->commitAll(change); -// // osync_context_report_success(ctx); // osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); // } @@ -103,7 +95,7 @@ m_canDisconnect(false), m_canCommit (false), m_canCommitAll (false), -// m_canBatchCommit(false), +// unused m_canBatchCommit(false), m_canGetChanges(false), m_canWrite (false), m_canRead (false), @@ -118,7 +110,7 @@ m_canWrite = ( features & Write ) ? true : false; m_canCommitAll = ( features & CommittedAll ) ? true : false; m_canRead = ( features & Read ) ? true : false; -// m_canBatchCommit = ( features & BatchCommit ) ? true : false; +// unused m_canBatchCommit = ( features & BatchCommit ) ? true : false; m_canSyncDone = ( features & SyncDone ) ? true : false; } @@ -192,7 +184,6 @@ kDebug(); Q_ASSERT( mContext ); osync_context_report_success( mContext ); -// mContext = 0; } void SinkBase::error(OSyncErrorType type, const QString &msg) const @@ -200,7 +191,6 @@ kDebug(); Q_ASSERT( mContext ); osync_context_report_error(mContext, type, "%s", msg.toLatin1().data() ); - mContext = 0; } void SinkBase::warning(OSyncError * error) const @@ -226,9 +216,7 @@ kDebug() << ">> m_canCommitAll:" << m_canGetChanges; kDebug() << ">> m_canRead:" << m_canConnect; kDebug() << ">> m_canSyncDone:" << m_canGetChanges; -// kDebug() << ">> NO hashtable for objtype:" << m_canConnect; - -// if ( m_canConnect && ( m_isEvent || m_isContact || m_isJournal || m_isNote || m_isTodo) ) { + if ( m_canConnect ) { osync_objtype_sink_set_connect_func(sink, connect_wrapper); osync_objtype_sink_set_connect_timeout(sink, 5); Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Sat Oct 2 23:13:00 2010 (r6141) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Mon Oct 4 23:20:12 2010 (r6142) @@ -78,14 +78,14 @@ bool m_isContact, m_isEvent, m_isTodo, m_isNote, m_isJournal; //TODO intended to be private private: -// OSyncObjTypeSinkFunctions mWrapedFunctions; + mutable OSyncContext *mContext; OSyncObjTypeSink *mSink; OSyncPluginInfo *mPluginInfo; // what do we have and what can we do bool m_canConnect, m_canDisconnect, m_canCommit, m_canCommitAll, m_canGetChanges, m_canWrite, m_canRead, m_canSyncDone; -// bool m_canCommitRead, m_canBatchCommit; +// unused bool m_canCommitRead, m_canBatchCommit; osync_bool m_SlowSync; }; |