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-10-02 21:13:10
|
Author: deloptes Date: Sat Oct 2 23:13:00 2010 New Revision: 6141 URL: http://www.opensync.org/changeset/6141 Log: - sync with evolution TODO: fix the setPayload in createAkonadiItem, to create a real akonadi item It's broken and it does not create any item. Modified: 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/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Oct 2 13:11:43 2010 (r6140) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Oct 2 23:13:00 2010 (r6141) @@ -234,7 +234,8 @@ osync_trace(TRACE_ENTRY, "%s(%p)", __func__, userdata); kDebug(); AkonadiSink *sink = reinterpret_cast<AkonadiSink*>( userdata ); - delete sink; + sink->disconnect(); +// delete sink; delete kcd; kcd = 0; delete app; Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Sat Oct 2 13:11:43 2010 (r6140) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Sat Oct 2 23:13:00 2010 (r6141) @@ -54,8 +54,8 @@ return false; } osync_plugin_info_set_main_sink( info, sink ); - osync_objtype_sink_set_userdata(sink, this); wrapSink( sink ); + osync_objtype_sink_set_userdata(sink, this); return true; } @@ -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 13:11:43 2010 (r6140) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Sat Oct 2 23:13:00 2010 (r6141) @@ -53,558 +53,606 @@ typedef boost::shared_ptr<KCal::Incidence> IncidencePtr; -DataSink::DataSink( int type ) : - SinkBase( GetChanges | Commit | SyncDone ) +DataSink::DataSink ( int type ) : + SinkBase ( GetChanges | Commit | SyncDone ) { - kDebug() << "Create obj:" << type; - m_type = type; + kDebug() << "Create obj:" << 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 +DataSink::~DataSink() +{ + kDebug() << "DataSink destructor called"; // TODO still needed } -bool DataSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncObjTypeSink *sink, OSyncError ** error) +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 ); + kDebug() << "TYPE " << m_type; + Q_UNUSED ( plugin ); + Q_UNUSED ( info ); + Q_UNUSED ( error ); - OSyncPluginConfig *config = osync_plugin_info_get_config(info); - if (!config) { - osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get config."); - return false; + OSyncPluginConfig *config = osync_plugin_info_get_config ( info ); + if ( !config ) + { + osync_error_set ( error, OSYNC_ERROR_GENERIC, "Unable to get config." ); + 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 ); + return false; + } + + wrapSink ( sink ); + + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink ); + if ( ! hashtable ) + kDebug() << ">> NO hashtable for objtype:" << osync_objtype_sink_get_name ( sink ); -// kDebug() << "Sink wrapped: " << 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 ); -// TODO -// OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); -// if( hashtable ) -// osync_objtype_sink_enable_hashtable(sink, TRUE); -// if( ! hashtable ) { -// kDebug() << "No hashtable for sync"; -// osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( error ) ); -// 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 ); - return false; + OSyncList *r; + bool hasObjFormat; + for ( r = objfrmtList;r;r = r->next ) + { + OSyncObjFormatSink *objformatsink = ( OSyncObjFormatSink * ) r->data; + + 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; + } + 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; + } + case Notes: + { + if ( !strcmp ( "vnote11", osync_objformat_sink_get_objformat ( objformatsink ) ) ) + { + hasObjFormat = true; + kDebug() << "Has objformat vnote11"; + break; + } + else + kDebug() << "No objformat 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; + } + 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; + } + + default: + continue; + } } - - osync_objtype_sink_set_userdata(sink, this); - osync_objtype_sink_enable_hashtable(sink , TRUE); - 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); - - OSyncList *r; - bool hasObjFormat; - for(r = objfrmtList;r;r = r->next) { - OSyncObjFormatSink *objformatsink = (OSyncObjFormatSink *) r->data; - - 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; - } - 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; - } - case Notes: { - if(!strcmp("vnote11", osync_objformat_sink_get_objformat(objformatsink))) { - hasObjFormat = true; - kDebug() << "Has objformat vnote11"; - break; - } else - kDebug() << "No objformat 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; - } - 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; - } - - default: - continue; - } - } // if (!hasObjFormat) { // kDebug() << "No objformat vcard30"; // return false; // } - - wrapSink( sink ); - - return true; + osync_objtype_sink_set_userdata ( sink, this ); + osync_objtype_sink_enable_hashtable ( sink , TRUE ); + + return true; } Akonadi::Collection DataSink::collection() const -{ - OSyncPluginConfig *config = osync_plugin_info_get_config( pluginInfo() ); - Q_ASSERT( config ); + { + OSyncPluginConfig *config = osync_plugin_info_get_config ( pluginInfo() ); + Q_ASSERT ( config ); - const char *objtype = osync_objtype_sink_get_name( sink() ); + const char *objtype = osync_objtype_sink_get_name ( sink() ); - OSyncPluginResource *res = osync_plugin_config_find_active_resource( config, objtype ); + 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 ) ); + 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 ) ); + 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 ) ); + if ( url.isEmpty() ) + { + error ( OSYNC_ERROR_MISCONFIGURATION, i18n ( "Url for object type \"%1\" is not configured.", objtype ) ); return Collection(); - } + } - return Collection::fromUrl( url ); -} + return Collection::fromUrl ( url ); + } void DataSink::getChanges() { - kDebug() << " DataSink::getChanges() called"; - OSyncError *oerror = 0; - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink()); - - 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; - } + kDebug() << " DataSink::getChanges() called"; + OSyncError *oerror = 0; + + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); + 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() ) { - 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; + 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 ( 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() ) { - error( OSYNC_ERROR_IO_ERROR, job->errorText() ); - return; + // FIXME give me a real eventloop please! + if ( !job->exec() ) + { + error ( OSYNC_ERROR_IO_ERROR, job->errorText() ); + return; } - success(); + + success(); } -void DataSink::slotItemsReceived( const Item::List &items ) +void DataSink::slotItemsReceived ( const Item::List &items ) { - kDebug() << "retrieved" << items.count() << "items"; - Q_FOREACH( const Item& item, items ) { - kDebug() << "Id:" << item.id() << "\n"; - kDebug() << "Mime:" << item.mimeType() << "\n"; - kDebug() << "availablePayloadParts:" << item.availablePayloadParts() << "\n"; - kDebug() << "storageCollectionId:" << item.storageCollectionId() << "\n"; - kDebug() << "url:" << item.url() << "\n"; - reportChange( item ); - } + kDebug() << "retrieved" << items.count() << "items"; + Q_FOREACH ( const Item& item, items ) + { + 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 ) +void DataSink::reportChange ( const Item& item ) { - kDebug() << item.id() << "\n" ; - kDebug() << "item.payloadData().data():" << item.payloadData().data() << "\n" ; - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); +// kDebug() << item.id() << "\n" ; + kDebug() << "item.payloadData().data():" << item.payloadData().data() << "\n" ; + + OSyncError *error = 0; + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable ( sink() ); - OSyncError *error = 0; - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink()); - OSyncChange *change = osync_change_new( &error ); - if ( !change ) { - warning( error ); - return; + OSyncChange *change = osync_change_new ( &error ); + if ( !change ) + { + osync_change_unref ( change ); + warning ( error ); + return; } - osync_change_set_uid( change, QString::number( item.id() ).toLatin1() ); + osync_change_set_uid ( change, QString::number ( item.id() ).toLatin1() ); - error = 0; - - OSyncData *odata = osync_data_new( item.payloadData().data(), item.payloadData().size(), format, &error ); - if ( !odata ) { - osync_change_unref( change ); - warning( error ); - return; + + 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 +// 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; } - osync_data_set_objtype( odata, osync_objtype_sink_get_name( sink() ) ); - osync_change_set_data( change, odata ); +// // 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 ); -// kDebug() << item.id() << "\n" << "DATA:" << osync_data_get_printable( odata , &error) << "\n" ; + osync_data_unref ( odata ); - osync_data_unref( 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 ); + /* */ + 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 ); - /* */ - 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 ); - else - // perhaps this should be only called when an error has happened ie. never after _context_report_change()? - osync_change_unref( change ); // if this gets called, we get broken pipes. any ideas? } -void DataSink::slotGetChangesFinished( KJob * ) +void DataSink::slotGetChangesFinished ( KJob * ) { - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env ( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat ( formatenv, formatName().toLatin1() ); - // after the items have been processed, see what's been deleted and send them to opensync - OSyncError *error = 0; + // 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 ); + 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; - - OSyncChange *change = osync_change_new( &error ); - if ( !change ) { - warning( error ); - continue; + for ( u = uids; u; u = u->next ) + { + QString uid ( ( char * ) u->data ); + kDebug() << "going to delete with uid:" << uid; + + OSyncChange *change = osync_change_new ( &error ); + if ( !change ) + { + osync_change_unref ( change ); + warning ( error ); + continue; } // - osync_change_set_changetype( change, OSYNC_CHANGE_TYPE_DELETED ); - osync_change_set_uid( change, uid.toLatin1() ); - - error = 0; - OSyncData *data = osync_data_new( 0, 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 ); + error = 0; + OSyncData *odata = osync_data_new ( NULL, 0, format, &error ); + if ( !odata ) + { + osync_change_unref ( change ); + warning ( error ); + continue; } -// - 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_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_unref ( change ); } - osync_list_free( uids ); + osync_list_free ( uids ); - kDebug() << "got all changes.."; + kDebug() << "got all changes.."; } -void DataSink::commit(OSyncChange *change) +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() << "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() ); - 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; + 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; } - 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; + 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; } - case OSYNC_CHANGE_TYPE_DELETED: { - deleteItem( change ); - kDebug() << "DELETED:" << osync_change_get_uid( change ); - break; + case OSYNC_CHANGE_TYPE_DELETED: + { + deleteItem ( change ); + kDebug() << "DELETED:" << osync_change_get_uid ( change ); + break; } - case OSYNC_CHANGE_TYPE_UNMODIFIED: { - kDebug() << "UNMODIFIED"; - // should we do something here? - break; + case OSYNC_CHANGE_TYPE_UNMODIFIED: + { + kDebug() << "UNMODIFIED"; + // should we do something here? + break; } default: - kDebug() << "got invalid changetype?"; + kDebug() << "got invalid changetype?"; } - osync_hashtable_update_change( hashtable, change ); - success(); + osync_hashtable_update_change ( hashtable, change ); + success(); } -const Item DataSink::createItem( OSyncChange *change ) +const Item DataSink::createAkonadiItem ( OSyncChange *change ) { - Collection col = collection(); - if ( !col.isValid() ) // error handling - return Item(); - kDebug() << "cuid:" << osync_change_get_uid( 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; +} - ItemCreateJob *job = new Akonadi::ItemCreateJob( createAkonadiItem( change ), col ); +const Item DataSink::createItem ( OSyncChange *change ) +{ + Collection col = collection(); + if ( !col.isValid() ) // error handling + return Item(); + kDebug() << "cuid:" << osync_change_get_uid ( change ); - if ( ! job->exec() ) - kDebug() << "creating an item failed"; + ItemCreateJob *job = new Akonadi::ItemCreateJob ( createAkonadiItem ( change ), col ); - return job->item(); // handle !job->exec in return too.. + if ( ! job->exec() ) + kDebug() << "creating an item failed"; + + return job->item(); // handle !job->exec in return too.. } -const Item DataSink::modifyItem( OSyncChange *change ) +const Item DataSink::modifyItem ( OSyncChange *change ) { - char *plain = 0; - osync_data_get_data( osync_change_get_data( change ), &plain, /*size*/0 ); - QString str = QString::fromUtf8( plain ); + 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(); + 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); - ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob( item ); - if ( modifyJob->exec() ) { - kDebug() << "modification completed"; - return modifyJob->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(); } - else - kDebug() << "unable to modify"; + else + kDebug() << "unable to modify"; - return Item(); + return Item(); } -void DataSink::deleteItem( OSyncChange *change ) +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; + 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(); - /*ItemDeleteJob *job = new ItemDeleteJob( item ); + 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 + if( job->exec() ) { + kDebug() << "item deleted"; + } + else + kDebug() << "unable to delete item";*/ + + success(); // TODO } -bool DataSink::setPayload( Item *item, const QString &str ) +bool DataSink::setPayload ( Item *item, const QString &str ) { - switch ( m_type ) { - case Contacts: { - KABC::VCardConverter converter; - KABC::Addressee vcard = converter.parseVCard( str.toLatin1() ); - kDebug() << vcard.uid() << vcard.name(); - item->setMimeType( KABC::Addressee::mimeType() ); - //item->setPayload<KABC::Addressee>( vcard ); // FIXME - item->setPayloadFromData( vcard.toString().toLatin1() ); // FIXME - //item->setPayload<KABC::Addressee>( vcard.toString() ); // FIXME - break; - } - case Calendars: { - KCal::ICalFormat format; - KCal::Incidence *calEntry = format.fromString( str ); - - item->setMimeType( "application/x-vnd.akonadi.calendar.event" ); - item->setPayload<IncidencePtr>( IncidencePtr( calEntry->clone() ) ); - - break; + 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; } - case Todos: { - KCal::ICalFormat format; - KCal::Incidence *todoEntry = format.fromString(str); //format.fromString( str ); - - item->setMimeType( "application/x-vnd.akonadi.calendar.todo" ); - item->setPayload<IncidencePtr>( IncidencePtr( todoEntry->clone() ) ); + 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() ) ); - break; + break; } - case Notes: { - kDebug() << "notes"; - KCal::ICalFormat format; - KCal::Incidence *noteEntry = format.fromString(str); - - item->setMimeType( "application/x-vnd.kde.notes" ); - item->setPayload<IncidencePtr>( IncidencePtr( noteEntry->clone() ) ); + 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() ) ); - break; + break; } - case Journals: { - kDebug() << "journals"; - KCal::ICalFormat format; - KCal::Incidence *journalEntry = format.fromString(str); - - item->setMimeType( "application/x-vnd.akonadi.calendar.journal" ); - item->setPayload<IncidencePtr>( IncidencePtr( journalEntry->clone() ) ); + 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() ) ); + + 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() ) ); - break; + break; } default: - // should not happen - return false; + // should not happen + return false; } - return true; -} - -const Item DataSink::createAkonadiItem( OSyncChange *change ) -{ - char *plain = 0; - osync_data_get_data( osync_change_get_data( change ), &plain, /*size*/0 ); - QString str = QString::fromUtf8( plain ); - Akonadi::Item item; - setPayload(&item, str); - return item; + 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 ) { + // FIXME -- this should be saved somewhere in the config, why settign and checking here: + QString formatName; + switch ( m_type ) + { case Calendars: - formatName = "vevent20"; - break; + formatName = "vevent20"; + break; case Contacts: - formatName = "vcard30"; - break; + formatName = "vcard30"; + break; case Notes: - formatName = "vjournal"; - break; + formatName = "vjournal"; + break; case Todos: - formatName = "vtodo20"; - break; + formatName = "vtodo20"; + break; default: - kDebug() << "invalid datasink type"; - return QString(); + kDebug() << "invalid datasink type"; + return QString(); } - return formatName; + return formatName; } -const Item DataSink::fetchItem( const QString& id ) +const Item DataSink::fetchItem ( const QString& id ) { - ItemFetchJob *fetchJob = new ItemFetchJob( Item( id ) ); - fetchJob->fetchScope().fetchFullPayload(); + ItemFetchJob *fetchJob = new ItemFetchJob ( Item ( id ) ); + fetchJob->fetchScope().fetchFullPayload(); - if ( fetchJob->exec() ) { - foreach ( const Item &item, fetchJob->items() ) { - if ( QString::number( item.id() ) == id ) { - kDebug() << "got item"; - return item; - } - } + if ( fetchJob->exec() ) + { + foreach ( const Item &item, fetchJob->items() ) + { + if ( QString::number ( item.id() ) == 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 - success(); + 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; + } + success(); } #include "datasink.moc" Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Sat Oct 2 13:11:43 2010 (r6140) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Sat Oct 2 23:13:00 2010 (r6141) @@ -36,7 +36,7 @@ { WRAP( ) sb->connect(); - osync_context_report_success(ctx); +// osync_context_report_success(ctx); osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); } @@ -71,20 +71,20 @@ 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 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); @@ -249,10 +249,10 @@ // 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_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); Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Sat Oct 2 13:11:43 2010 (r6140) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Sat Oct 2 23:13:00 2010 (r6141) @@ -83,7 +83,8 @@ 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; // bool m_canCommitRead, m_canBatchCommit; osync_bool m_SlowSync; }; |
From: <svn...@op...> - 2010-10-02 11:11:51
|
Author: deloptes Date: Sat Oct 2 13:11:43 2010 New Revision: 6140 URL: http://www.opensync.org/changeset/6140 Log: set keypoperty Id Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/akonadisink.cpp plugins/akonadi-sync/trunk/src/akonadisink.h Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Oct 2 13:06:12 2010 (r6139) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Oct 2 13:11:43 2010 (r6140) @@ -2,6 +2,8 @@ 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 the Free Software Foundation; either version 2 of the License, or (at your Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Sat Oct 2 13:06:12 2010 (r6139) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Sat Oct 2 13:11:43 2010 (r6140) @@ -2,6 +2,8 @@ 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 the Free Software Foundation; either version 2 of the License, or (at your Modified: plugins/akonadi-sync/trunk/src/akonadisink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.h Sat Oct 2 13:06:12 2010 (r6139) +++ plugins/akonadi-sync/trunk/src/akonadisink.h Sat Oct 2 13:11:43 2010 (r6140) @@ -2,6 +2,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 under the terms of the GNU Library General Public License as published by |
From: <svn...@op...> - 2010-10-02 11:06:22
|
Author: deloptes Date: Sat Oct 2 13:06:12 2010 New Revision: 6139 URL: http://www.opensync.org/changeset/6139 Log: - cleaned up a lot of testing code and manged to get sync changes exchanged TODO: akonadi is not accepting the changes - why? fix the update of changes Modified: 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/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Fri Oct 1 00:40:36 2010 (r6138) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Oct 2 13:06:12 2010 (r6139) @@ -106,7 +106,8 @@ return mainSink; } - //FIXME: this is not working in opoensync + //FIXME: this probably a bug in opoensync + // replace & static QString toXml(QString str) { str.replace("<","<").replace(">",">").replace("&","and"); return str; @@ -134,11 +135,12 @@ // 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 ) { kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); kDebug() << " " << col.name() << col.url().url(); - OSyncPluginResource *res = osync_plugin_config_find_active_resource(config ,mType); + 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) @@ -165,6 +167,7 @@ osync_objtype_sink_set_available( sinkEvent, TRUE ); // osync_objtype_sink_add_objformat_sink( sinkEvent, "vevent20" ); osync_plugin_info_add_objtype( info, sinkEvent ); + return TRUE; } @@ -193,19 +196,24 @@ */ if ( ! testSupport(info, config, "event", "application/x-vnd.akonadi.calendar.event", "vevent20" ,error) ) - return false; + kDebug() << "NO support for vevent20"; +// return false; if ( ! testSupport(info, config, "todo", "application/x-vnd.akonadi.calendar.todo", "vtodo10" ,error) ) - return false; + kDebug() << "NO support for vtodo10"; +// return false; if ( ! testSupport(info, config, "journal", "application/x-vnd.akonadi.calendar.journal", "vjournal" ,error) ) - return false; + kDebug() << "NO support for vjournal"; +// return false; // fetch all address books if ( ! testSupport(info, config, "contact", KABC::Addressee::mimeType().toLatin1(), "vcard30" ,error) ) - return false; + kDebug() << "NO support for vcard30"; +// return false; // fetch all notes if ( ! testSupport(info, config, "note", "application/x-vnd.kde.notes", "vnote11" ,error) ) - return false; + kDebug() << "NO support for vnote11"; +// return false; // set information about the peer (KDE itself) { OSyncVersion *version = osync_version_new(error); @@ -248,6 +256,7 @@ 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_discover(plugin, akonadi_discover); osync_plugin_set_start_type(plugin, OSYNC_START_TYPE_PROCESS); Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Fri Oct 1 00:40:36 2010 (r6138) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Sat Oct 2 13:06:12 2010 (r6139) @@ -29,7 +29,7 @@ #include <opensync/opensync-format.h> AkonadiSink::AkonadiSink() : - SinkBase( Connect ) + SinkBase( Connect ) { } @@ -40,35 +40,36 @@ 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 ); + kDebug(); - return true; + 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 ); + osync_objtype_sink_set_userdata(sink, this); + wrapSink( sink ); + + return true; } 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(); - 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__); + 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__); } Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Fri Oct 1 00:40:36 2010 (r6138) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Sat Oct 2 13:06:12 2010 (r6139) @@ -59,10 +59,11 @@ kDebug() << "Create obj:" << 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_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; } @@ -84,11 +85,7 @@ return false; } - bool enabled = osync_objtype_sink_is_enabled( sink ); - if ( ! enabled ) { - kDebug() << "sink is not enabled.."; - return false; - } + // kDebug() << "Sink wrapped: " << osync_objtype_sink_get_name(sink); @@ -102,8 +99,20 @@ // return false; // } - wrapSink( sink ); + osync_bool enabled = osync_objtype_sink_is_enabled( sink ); + if ( ! enabled ) { + kDebug() << "sink is not enabled.."; +// osync_objtype_sink_remove_objformat_sink( sink ); + return false; + } + osync_objtype_sink_set_userdata(sink, this); + osync_objtype_sink_enable_hashtable(sink , TRUE); + 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); @@ -112,24 +121,86 @@ for(r = objfrmtList;r;r = r->next) { OSyncObjFormatSink *objformatsink = (OSyncObjFormatSink *) r->data; + 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; - } - } - - if (!hasObjFormat) { + } else kDebug() << "No objformat vcard30"; - return false; + + 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; + } + case Notes: { + if(!strcmp("vnote11", osync_objformat_sink_get_objformat(objformatsink))) { + hasObjFormat = true; + kDebug() << "Has objformat vnote11"; + break; + } else + kDebug() << "No objformat 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; + } + 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; + } + + default: + continue; + } } - - osync_objtype_sink_set_userdata(sink, this); - osync_objtype_sink_enable_hashtable(sink , TRUE); - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); - if ( ! hashtable ) - kDebug() << ">> NO hashtable for objtype:" << osync_objtype_sink_get_name(sink); +// if (!hasObjFormat) { +// kDebug() << "No objformat vcard30"; +// return false; +// } + + + wrapSink( sink ); return true; } @@ -174,17 +245,16 @@ // FIXME if ( getSlowSink() ) { kDebug() << "we're in the middle of slow-syncing..."; - osync_trace( TRACE_INTERNAL, "EKO Got slow-sync, resetting hashtable" ); + 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 ) ); - kDebug() << "Will abort >>> whatever - because of slowsync"; return; } } ItemFetchJob *job = new ItemFetchJob( col ); - job->fetchScope().fetchFullPayload(); + job->fetchScope().fetchFullPayload(true); kDebug() << "Fetched FullPayload" ; QObject::connect( job, SIGNAL( itemsReceived( const Akonadi::Item::List & ) ), this, SLOT( slotItemsReceived( const Akonadi::Item::List & ) ) ); @@ -202,13 +272,20 @@ { kDebug() << "retrieved" << items.count() << "items"; Q_FOREACH( const Item& item, items ) { - kDebug() << item.payloadData(); + kDebug() << "Id:" << item.id() << "\n"; + kDebug() << "Mime:" << item.mimeType() << "\n"; + kDebug() << "availablePayloadParts:" << item.availablePayloadParts() << "\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" ; OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); @@ -224,7 +301,7 @@ osync_change_set_uid( change, QString::number( item.id() ).toLatin1() ); error = 0; - + OSyncData *odata = osync_data_new( item.payloadData().data(), item.payloadData().size(), format, &error ); if ( !odata ) { osync_change_unref( change ); @@ -235,7 +312,7 @@ osync_change_set_data( change, odata ); - kDebug() << item.id() << "\n" << "DATA:" << osync_data_get_printable( odata , &error) << "\n" << "ORIG:" << item.payloadData().data(); +// kDebug() << item.id() << "\n" << "DATA:" << osync_data_get_printable( odata , &error) << "\n" ; osync_data_unref( odata ); osync_change_set_hash( change, QString::number( item.revision() ).toLatin1() ); @@ -244,13 +321,13 @@ /* */ - 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 ) ) + 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() ); /* */ @@ -303,7 +380,7 @@ osync_list_free( uids ); kDebug() << "got all changes.."; - success(); + } void DataSink::commit(OSyncChange *change) @@ -406,20 +483,12 @@ } else kDebug() << "unable to delete item";*/ + success(); // TODO } bool DataSink::setPayload( Item *item, const QString &str ) { switch ( m_type ) { - case Calendars: { - KCal::ICalFormat format; - KCal::Incidence *calEntry = format.fromString( str ); - - item->setMimeType( "application/x-vnd.akonadi.calendar.event" ); - item->setPayload<IncidencePtr>( IncidencePtr( calEntry->clone() ) ); - - break; - } case Contacts: { KABC::VCardConverter converter; KABC::Addressee vcard = converter.parseVCard( str.toLatin1() ); @@ -430,9 +499,18 @@ //item->setPayload<KABC::Addressee>( vcard.toString() ); // FIXME break; } - case Todos: { + case Calendars: { KCal::ICalFormat format; - KCal::Incidence *todoEntry = format.fromString( str ); + KCal::Incidence *calEntry = format.fromString( str ); + + item->setMimeType( "application/x-vnd.akonadi.calendar.event" ); + item->setPayload<IncidencePtr>( IncidencePtr( calEntry->clone() ) ); + + break; + } + case Todos: { + KCal::ICalFormat format; + KCal::Incidence *todoEntry = format.fromString(str); //format.fromString( str ); item->setMimeType( "application/x-vnd.akonadi.calendar.todo" ); item->setPayload<IncidencePtr>( IncidencePtr( todoEntry->clone() ) ); @@ -442,7 +520,7 @@ case Notes: { kDebug() << "notes"; KCal::ICalFormat format; - KCal::Incidence *noteEntry = format.fromString( str ); + KCal::Incidence *noteEntry = format.fromString(str); item->setMimeType( "application/x-vnd.kde.notes" ); item->setPayload<IncidencePtr>( IncidencePtr( noteEntry->clone() ) ); @@ -452,7 +530,7 @@ case Journals: { kDebug() << "journals"; KCal::ICalFormat format; - KCal::Incidence *journalEntry = format.fromString( str ); + KCal::Incidence *journalEntry = format.fromString(str); item->setMimeType( "application/x-vnd.akonadi.calendar.journal" ); item->setPayload<IncidencePtr>( IncidencePtr( journalEntry->clone() ) ); @@ -486,7 +564,7 @@ formatName = "vevent20"; break; case Contacts: - formatName = "vcard10"; + formatName = "vcard30"; break; case Notes: formatName = "vjournal"; @@ -524,10 +602,6 @@ { kDebug() << "sync for sink member done"; OSyncError *error = 0; -// OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink()); -// osync_objtype_sink_save_hashtable( sink, &error ); -// OSyncError *error = 0; -// OSyncObjTypeSink *sink =sink(); osync_objtype_sink_save_hashtable( sink() , &error ); //TODO check for errors success(); Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Fri Oct 1 00:40:36 2010 (r6138) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Sat Oct 2 13:06:12 2010 (r6139) @@ -23,44 +23,75 @@ #include "sinkbase.h" #include <KDebug> -#define WRAP(X) \ +#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 ); \ - sb->X; \ - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + sb->setPluginInfo( info ); extern "C" { static void connect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata ) { - WRAP( connect() ) + 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( disconnect() ) + WRAP( ) + sb->disconnect(); // osync_context_report_success(ctx); + 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 ( getChanges() ) + WRAP ( ) 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( syncDone() ) + 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( commit(change) ) + 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__ ); +// } + } // extern C @@ -68,7 +99,16 @@ mContext( 0 ), mSink( 0 ), mPluginInfo( 0 ), - m_SlowSync( false ) + m_canConnect(false), + m_canDisconnect(false), + m_canCommit (false), + m_canCommitAll (false), +// m_canBatchCommit(false), + m_canGetChanges(false), + m_canWrite (false), + m_canRead (false), + m_canSyncDone (false), + m_SlowSync (false) { m_canConnect = ( features & Connect ) ? true : false; @@ -78,15 +118,19 @@ m_canWrite = ( features & Write ) ? true : false; m_canCommitAll = ( features & CommittedAll ) ? true : false; m_canRead = ( features & Read ) ? true : false; - m_canBatchCommit = ( features & BatchCommit ) ? true : false; +// m_canBatchCommit = ( features & BatchCommit ) ? true : false; m_canSyncDone = ( features & SyncDone ) ? true : false; } SinkBase::~SinkBase() { + if ( mContext) + osync_context_unref(mContext); if ( mSink ) osync_objtype_sink_unref( mSink ); + if (mPluginInfo) + osync_plugin_info_unref(mPluginInfo); } void SinkBase::connect() @@ -122,6 +166,22 @@ Q_ASSERT( false ); } +void SinkBase::commitAll() +{ + Q_ASSERT( false ); +} + +void SinkBase::write() +{ + Q_ASSERT( false ); +} + +void SinkBase::read() +{ + Q_ASSERT( false ); +} + + void SinkBase::syncDone() { Q_ASSERT( false ); @@ -132,7 +192,7 @@ kDebug(); Q_ASSERT( mContext ); osync_context_report_success( mContext ); - mContext = 0; +// mContext = 0; } void SinkBase::error(OSyncErrorType type, const QString &msg) const @@ -157,32 +217,50 @@ Q_ASSERT( sink ); Q_ASSERT( mSink == 0 ); mSink = sink; - kDebug() << ">> m_canConnect:" << m_canConnect; + 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() << ">> NO hashtable for objtype:" << m_canConnect; - if ( ! 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); - if ( ! m_canDisconnect ) + osync_objtype_sink_set_connect_timeout(sink, 5); + } + if ( m_canDisconnect ) { osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); - if ( ! m_canGetChanges || m_isContact || m_isEvent ) + osync_objtype_sink_set_disconnect_timeout(sink, 5); + } + if ( m_canGetChanges ) { osync_objtype_sink_set_get_changes_func(sink, get_changes_wrapper); - - if ( ! m_canCommit || m_isContact || m_isEvent ) + 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); + } // TODO: check if relevant for akonadi - if ( m_canWrite ) - osync_objtype_sink_set_commit_func(sink, 0); - if ( m_canCommitAll ) - osync_objtype_sink_set_commit_func(sink, 0); - if ( m_canRead ) - osync_objtype_sink_set_commit_func(sink, 0); - if ( m_canBatchCommit ) - osync_objtype_sink_set_commit_func(sink, 0); - if ( ! m_canSyncDone || m_isContact || m_isEvent) +// 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 Fri Oct 1 00:40:36 2010 (r6138) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Sat Oct 2 13:06:12 2010 (r6139) @@ -56,6 +56,9 @@ virtual void disconnect(); virtual void getChanges(); virtual void commit( OSyncChange *chg ); + virtual void write(); + virtual void read(); + virtual void commitAll(); virtual void syncDone(); OSyncContext* context() const { return mContext; } @@ -72,7 +75,7 @@ void warning( OSyncError *error ) const; void wrapSink( OSyncObjTypeSink* sink ); OSyncObjTypeSink* sink() const { return mSink; } - bool m_isContact, m_isEvent, m_isTodo, m_isNote; //TODO intended to be private + bool m_isContact, m_isEvent, m_isTodo, m_isNote, m_isJournal; //TODO intended to be private private: // OSyncObjTypeSinkFunctions mWrapedFunctions; @@ -80,8 +83,8 @@ OSyncObjTypeSink *mSink; OSyncPluginInfo *mPluginInfo; // what do we have and what can we do - bool m_canConnect, m_canDisconnect, m_canSyncDone, m_canCommit, m_canGetChanges; - bool m_canWrite, m_canRead, m_canCommitAll, m_canCommitRead, m_canBatchCommit; + bool m_canConnect, m_canDisconnect, m_canCommit, m_canCommitAll, m_canGetChanges, m_canWrite, m_canRead, m_canSyncDone; +// bool m_canCommitRead, m_canBatchCommit; osync_bool m_SlowSync; }; |
From: <svn...@op...> - 2010-09-30 22:40:46
|
Author: deloptes Date: Fri Oct 1 00:40:36 2010 New Revision: 6138 URL: http://www.opensync.org/changeset/6138 Log: It seems that configuration driven approach requires proper configuration. The plugin will use the mimetype and the url to get the data. - added two functions in src/akonadi_opensync.cpp - to check for specific type - workaround to replace & in the name - support for notes, todos, events, journals and contacts TODO: Still I need to get the proper format for the calendar entries, or there is a bug somewhere else. 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/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 Mon Sep 27 20:00:45 2010 (r6137) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Fri Oct 1 00:40:36 2010 (r6138) @@ -1,14 +1,2 @@ <?xml version="1.0"?> -<config version="1.0"> - <Resources> - <Resource> - <Enabled>1</Enabled> - <Formats> - <Format> - <Name>vcard30</Name> - </Format> - </Formats> - <ObjType>contact</ObjType> - </Resource> - </Resources> -</config> +<config version="1.0"/> Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Mon Sep 27 20:00:45 2010 (r6137) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Fri Oct 1 00:40:36 2010 (r6138) @@ -86,8 +86,10 @@ else if ( sinkName == "contact" ) ds = new DataSink( DataSink::Contacts ); // FIXME: implement todos an journal (notes) -// else if ( sinkName == "todo" ) -// ds = new DataSink( DataSink::Todos ); + else if ( sinkName == "journal" ) + ds = new DataSink( DataSink::Journals ); + else if ( sinkName == "todo" ) + ds = new DataSink( DataSink::Todos ); else if ( sinkName == "note" ) ds = new DataSink( DataSink::Notes ); else @@ -104,130 +106,106 @@ return mainSink; } - - static osync_bool akonadi_discover(OSyncPluginInfo *info, void *userdata, OSyncError **error ) - { - osync_trace(TRACE_ENTRY, " %s(%p, %p, %p)", __func__, userdata, info, error); - kDebug(); - - OSyncPluginConfig *config = osync_plugin_info_get_config(info); - - if (!config) { - osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get config."); - return false; - } - if ( !Akonadi::Control::start() ) - return false; - + //FIXME: this is not working in opoensync + 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 Akonadi::CollectionFetchScope scope; scope.setIncludeUnsubscribed( true ); - scope.setContentMimeTypes( QStringList() << "text/calendar" ); + scope.setContentMimeTypes( QStringList() << mimeType ); Akonadi::CollectionFetchJob *jobCal = new Akonadi::CollectionFetchJob( Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); jobCal->setFetchScope(scope); if ( !jobCal->exec() ) - return false; + 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("event", error); + OSyncObjTypeSink *sinkEvent = osync_objtype_sink_new(mType, error); foreach ( const Akonadi::Collection &col, colsCal ) { kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); kDebug() << " " << col.name() << col.url().url(); - OSyncPluginResource *res = osync_plugin_config_find_active_resource(config ,"event"); - if ( res ) - osync_plugin_config_remove_resource(config,res); - res = osync_plugin_resource_new( error ); - osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vevent20", error ) ); + OSyncPluginResource *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 ) ); + 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, "event" ); - osync_plugin_resource_set_name( res, col.name().toUtf8() ); // TODO: full path instead of the name + 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 ); -// osync_plugin_resource_set_mime( config, "text/calendar" ); } - osync_objtype_sink_add_objformat_sink(sinkEvent,osync_objformat_sink_new ("vevent20", error)); + 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 ); - - - // fetch all address books - Akonadi::CollectionFetchJob *jobAddr = new Akonadi::CollectionFetchJob( - Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); - scope.setContentMimeTypes( QStringList() << KABC::Addressee::mimeType() ); - jobAddr->setFetchScope(scope); - if ( !jobAddr->exec() ) - return false; + return TRUE; + } - Akonadi::Collection::List colsAddr = jobAddr->collections(); - kDebug() << "found" << colsAddr.count() << "collections"; - OSyncObjTypeSink *sinkAddr = osync_objtype_sink_new("contact", error); - foreach ( const Akonadi::Collection &col, colsAddr ) { - kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); - kDebug() << " " << col.name() << col.url().url(); - OSyncPluginResource *res = osync_plugin_config_find_active_resource(config ,"contact"); - if ( res ) - osync_plugin_config_remove_resource(config,res); - res = osync_plugin_resource_new( error ); - osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vcard30", error ) ); - osync_plugin_resource_enable(res,TRUE); - osync_plugin_resource_set_objtype( res, "contact" ); - osync_plugin_resource_set_name( res, col.name().toUtf8() ); // TODO: full path instead of the name - osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); + static osync_bool akonadi_discover(OSyncPluginInfo *info, void *userdata, OSyncError **error ) + { + osync_trace(TRACE_ENTRY, " %s(%p, %p, %p)", __func__, userdata, info, error); + kDebug(); - osync_plugin_config_add_resource( config, res ); -// osync_plugin_resource_set_mime( config, "text/calendar" ); - } - osync_objtype_sink_add_objformat_sink(sinkAddr,osync_objformat_sink_new ("vcard30", error)); - osync_objtype_sink_set_enabled( sinkAddr, TRUE ); - osync_objtype_sink_set_available( sinkAddr, TRUE ); -// osync_objtype_sink_add_objformat_sink( sinkAddr, "vcard30" ); - osync_plugin_info_add_objtype( info, sinkAddr ); + OSyncPluginConfig *config = osync_plugin_info_get_config(info); - // fetch all notes - Akonadi::CollectionFetchJob *jobNotes = new Akonadi::CollectionFetchJob( - Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); - scope.setContentMimeTypes( QStringList() << "application/x-vnd.kde.notes" ); - jobNotes->setFetchScope(scope); - if ( !jobNotes->exec() ) + if (!config) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get config."); return false; - - Akonadi::Collection::List colsNotes = jobNotes->collections(); - kDebug() << "found" << colsNotes.count() << "collections"; - OSyncObjTypeSink *sinkNotes = osync_objtype_sink_new("note", error); - - foreach ( const Akonadi::Collection &col, colsNotes ) { - kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); - kDebug() << " " << col.name() << col.url().url(); - OSyncPluginResource *res = osync_plugin_config_find_active_resource(config ,"note"); - if ( res ) - osync_plugin_config_remove_resource(config,res); - res = osync_plugin_resource_new( error ); - osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vnote11", error ) ); - - osync_plugin_resource_enable(res,TRUE); - osync_plugin_resource_set_objtype( res, "note" ); - osync_plugin_resource_set_name( res, col.name().toUtf8() ); // TODO: full path instead of the name - osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); - - osync_plugin_config_add_resource( config, res ); -// osync_plugin_resource_set_mime( config, "text/calendar" ); } - - osync_objtype_sink_add_objformat_sink(sinkNotes,osync_objformat_sink_new ("vnote11", error)); - osync_objtype_sink_set_enabled( sinkNotes, TRUE ); - osync_objtype_sink_set_available( sinkNotes, TRUE ); -// osync_objtype_sink_add_objformat_sink( sinkNotes, "vjournal" ); - osync_plugin_info_add_objtype( info, sinkNotes ); + if ( !Akonadi::Control::start() ) + return false; + + /* + 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) ) + return false; + + if ( ! testSupport(info, config, "todo", "application/x-vnd.akonadi.calendar.todo", "vtodo10" ,error) ) + return false; + + if ( ! testSupport(info, config, "journal", "application/x-vnd.akonadi.calendar.journal", "vjournal" ,error) ) + return false; + // fetch all address books + if ( ! testSupport(info, config, "contact", KABC::Addressee::mimeType().toLatin1(), "vcard30" ,error) ) + return false; + // fetch all notes + if ( ! testSupport(info, config, "note", "application/x-vnd.kde.notes", "vnote11" ,error) ) + return false; // set information about the peer (KDE itself) { OSyncVersion *version = osync_version_new(error); @@ -268,7 +246,7 @@ osync_plugin_set_name(plugin, "akonadi-sync"); osync_plugin_set_longname(plugin, "Akonadi"); osync_plugin_set_description(plugin, "Plugin to synchronize with Akonadi"); - osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_NEEDS_CONFIGURATION); + osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_OPTIONAL_CONFIGURATION); osync_plugin_set_initialize(plugin, akonadi_initialize); osync_plugin_set_finalize(plugin, akonadi_finalize); osync_plugin_set_discover(plugin, akonadi_discover); Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Mon Sep 27 20:00:45 2010 (r6137) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Fri Oct 1 00:40:36 2010 (r6138) @@ -39,7 +39,12 @@ 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) { @@ -48,12 +53,7 @@ } osync_plugin_info_set_main_sink( info, sink ); wrapSink( sink ); -// osync_objtype_sink_unref(sink); -// OSyncHashTable * hashtable = osync_objtype_sink_get_hashtable(sink); -// if( hashtable ) -// osync_objtype_sink_enable_hashtable(sink, TRUE); -// if( ! hashtable ) -// kDebug() << "No hashtable for sync"; + return true; } Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Mon Sep 27 20:00:45 2010 (r6137) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Fri Oct 1 00:40:36 2010 (r6138) @@ -29,6 +29,9 @@ // #include <opensync/opensync-helper.h> // #include <opensync/opensync-plugin.h> +#include <akonadi/collectionfetchjob.h> +#include <akonadi/collectionfetchscope.h> + // calendar includes #include <kcal/incidence.h> #include <kcal/icalformat.h> @@ -90,10 +93,10 @@ // kDebug() << "Sink wrapped: " << osync_objtype_sink_get_name(sink); // TODO -// m_hashtable = osync_objtype_sink_get_hashtable(sink); -// if( m_hashtable ) +// OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); +// if( hashtable ) // osync_objtype_sink_enable_hashtable(sink, TRUE); -// if( ! m_hashtable ) { +// if( ! hashtable ) { // kDebug() << "No hashtable for sync"; // osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( error ) ); // return false; @@ -146,6 +149,7 @@ } 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(); @@ -158,16 +162,15 @@ { 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(); + 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() ) { kDebug() << "we're in the middle of slow-syncing..."; @@ -175,6 +178,7 @@ if ( ! osync_hashtable_slowsync( hashtable, &oerror ) ) { warning( oerror ); osync_trace( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( &oerror ) ); + kDebug() << "Will abort >>> whatever - because of slowsync"; return; } } @@ -426,12 +430,33 @@ //item->setPayload<KABC::Addressee>( vcard.toString() ); // FIXME break; } + case Todos: { + KCal::ICalFormat format; + KCal::Incidence *todoEntry = format.fromString( str ); + + item->setMimeType( "application/x-vnd.akonadi.calendar.todo" ); + item->setPayload<IncidencePtr>( IncidencePtr( todoEntry->clone() ) ); + + break; + } case Notes: { kDebug() << "notes"; + KCal::ICalFormat format; + KCal::Incidence *noteEntry = format.fromString( str ); + + item->setMimeType( "application/x-vnd.kde.notes" ); + item->setPayload<IncidencePtr>( IncidencePtr( noteEntry->clone() ) ); + break; } - case Todos: { - kDebug() << "todos"; + case Journals: { + kDebug() << "journals"; + KCal::ICalFormat format; + KCal::Incidence *journalEntry = format.fromString( str ); + + item->setMimeType( "application/x-vnd.akonadi.calendar.journal" ); + item->setPayload<IncidencePtr>( IncidencePtr( journalEntry->clone() ) ); + break; } default: Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Mon Sep 27 20:00:45 2010 (r6137) +++ plugins/akonadi-sync/trunk/src/datasink.h Fri Oct 1 00:40:36 2010 (r6138) @@ -48,7 +48,7 @@ Q_OBJECT public: - enum Type { Calendars = 0, Contacts, Todos, Notes }; + enum Type { Calendars = 0, Contacts, Todos, Notes, Journals }; DataSink( int type ); ~DataSink(); Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Mon Sep 27 20:00:45 2010 (r6137) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Fri Oct 1 00:40:36 2010 (r6138) @@ -71,15 +71,15 @@ m_SlowSync( false ) { - m_canConnect = ( features & Connect ) ? true : false; + m_canConnect = ( features & Connect ) ? true : false; m_canDisconnect = ( features & Disconnect ) ? true : false; m_canGetChanges = ( features & GetChanges ) ? true : false; - m_canCommit = ( features & Commit ) ? true : false; - m_canWrite = ( features & Write ) ? true : false; - m_canCommitAll = ( features & CommittedAll ) ? true : false; - m_canRead = ( features & Read ) ? true : false; + m_canCommit = ( features & Commit ) ? true : false; + m_canWrite = ( features & Write ) ? true : false; + m_canCommitAll = ( features & CommittedAll ) ? true : false; + m_canRead = ( features & Read ) ? true : false; m_canBatchCommit = ( features & BatchCommit ) ? true : false; - m_canSyncDone = ( features & SyncDone ) ? true : false; + m_canSyncDone = ( features & SyncDone ) ? true : false; } @@ -165,7 +165,7 @@ if ( ! m_canConnect ) osync_objtype_sink_set_connect_func(sink, connect_wrapper); - if ( ! m_canDisconnect || m_isContact || m_isEvent ) + if ( ! m_canDisconnect ) osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); if ( ! m_canGetChanges || m_isContact || m_isEvent ) osync_objtype_sink_set_get_changes_func(sink, get_changes_wrapper); @@ -173,14 +173,14 @@ if ( ! m_canCommit || m_isContact || m_isEvent ) osync_objtype_sink_set_commit_func(sink, commit_wrapper); // TODO: check if relevant for akonadi -// if ( m_canWrite ) -// osync_objtype_sink_set_commit_func(sink, 0); -// if ( m_canCommitAll ) -// osync_objtype_sink_set_commit_func(sink, 0); -// if ( m_canRead ) -// osync_objtype_sink_set_commit_func(sink, 0); -// if ( m_canBatchCommit ) -// osync_objtype_sink_set_commit_func(sink, 0); + if ( m_canWrite ) + osync_objtype_sink_set_commit_func(sink, 0); + if ( m_canCommitAll ) + osync_objtype_sink_set_commit_func(sink, 0); + if ( m_canRead ) + osync_objtype_sink_set_commit_func(sink, 0); + if ( m_canBatchCommit ) + osync_objtype_sink_set_commit_func(sink, 0); if ( ! m_canSyncDone || m_isContact || m_isEvent) osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Mon Sep 27 20:00:45 2010 (r6137) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Fri Oct 1 00:40:36 2010 (r6138) @@ -72,7 +72,7 @@ void warning( OSyncError *error ) const; void wrapSink( OSyncObjTypeSink* sink ); OSyncObjTypeSink* sink() const { return mSink; } - bool m_isContact, m_isEvent, m_isTodo, m_isNote; + bool m_isContact, m_isEvent, m_isTodo, m_isNote; //TODO intended to be private private: // OSyncObjTypeSinkFunctions mWrapedFunctions; |
From: <svn...@op...> - 2010-09-27 18:01:00
|
Author: deloptes Date: Mon Sep 27 20:00:45 2010 New Revision: 6137 URL: http://www.opensync.org/changeset/6137 Log: - get changes in work Modified: 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 plugins/akonadi-sync/trunk/src/sinkbase.h Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Thu Sep 23 03:07:14 2010 (r6136) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Mon Sep 27 20:00:45 2010 (r6137) @@ -92,9 +92,7 @@ ds = new DataSink( DataSink::Notes ); else continue; - kDebug() << "Info:"<< osync_plugin_info_get_groupname(info); - - osync_objtype_sink_set_userdata(sink, ds); + if ( !ds->initialize( plugin, info, sink, error ) ) { delete ds; delete mainSink; Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Thu Sep 23 03:07:14 2010 (r6136) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Mon Sep 27 20:00:45 2010 (r6137) @@ -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 @@ -53,32 +53,27 @@ DataSink::DataSink( int type ) : SinkBase( GetChanges | Commit | SyncDone ) { - kDebug() << "Create obj:" << type; + kDebug() << "Create obj:" << type; m_type = type; - - m_hasEvent = ( type == DataSink::Calendars ) ? true : false; - m_hasContact = ( type == DataSink::Contacts ) ? true : false; - m_hasNote = ( type == DataSink::Notes ) ? true : false; - m_hasTodo = ( type == DataSink::Todos ) ? 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; } 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); - Q_UNUSED( plugin ); - Q_UNUSED( info ); - Q_UNUSED( error ); - - bool enabled = osync_objtype_sink_is_enabled( sink ); - if( ! enabled ) { - kDebug() << "sink is not enabled.."; - return false; - } + kDebug() << "initializing" << osync_objtype_sink_get_name(sink); + kDebug() << "TYPE " << m_type; + Q_UNUSED( plugin ); + Q_UNUSED( info ); + Q_UNUSED( error ); OSyncPluginConfig *config = osync_plugin_info_get_config(info); if (!config) { @@ -86,13 +81,12 @@ return false; } - wrapSink( sink ); - osync_objtype_sink_enable_hashtable(sink , TRUE); - m_hashtable = osync_objtype_sink_get_hashtable(sink); - - if ( ! m_hashtable ) - kDebug() << ">> NO hashtable for objtype:" << osync_objtype_sink_get_name(sink); - + bool enabled = osync_objtype_sink_is_enabled( sink ); + if ( ! enabled ) { + kDebug() << "sink is not enabled.."; + return false; + } + // kDebug() << "Sink wrapped: " << osync_objtype_sink_get_name(sink); // TODO @@ -105,6 +99,35 @@ // return false; // } + wrapSink( 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); + + OSyncList *r; + bool hasObjFormat; + for(r = objfrmtList;r;r = r->next) { + OSyncObjFormatSink *objformatsink = (OSyncObjFormatSink *) r->data; + + if(!strcmp("vcard30", osync_objformat_sink_get_objformat(objformatsink))) { + hasObjFormat = true; + kDebug() << "Has objformat vcard30"; + break; + } + } + + if (!hasObjFormat) { + kDebug() << "No objformat vcard30"; + return false; + } + + osync_objtype_sink_set_userdata(sink, this); + osync_objtype_sink_enable_hashtable(sink , TRUE); + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); + + if ( ! hashtable ) + kDebug() << ">> NO hashtable for objtype:" << osync_objtype_sink_get_name(sink); + return true; } @@ -133,25 +156,23 @@ void DataSink::getChanges() { + kDebug() << " DataSink::getChanges() called"; OSyncError *oerror = 0; - // ### broken in OpenSync, I don't get valid configuration here! -// #if 1 + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink());; + Collection col = collection(); if ( !col.isValid() ) { kDebug() << "No collection"; osync_trace( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( &oerror ) ); return; } -// #else -// Collection col( 409 ); -// #endif // FIXME if ( getSlowSink() ) { kDebug() << "we're in the middle of slow-syncing..."; osync_trace( TRACE_INTERNAL, "EKO Got slow-sync, resetting hashtable" ); - if ( ! osync_hashtable_slowsync( m_hashtable, &oerror ) ) { + if ( ! osync_hashtable_slowsync( hashtable, &oerror ) ) { warning( oerror ); osync_trace( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( &oerror ) ); return; @@ -170,6 +191,7 @@ error( OSYNC_ERROR_IO_ERROR, job->errorText() ); return; } + success(); } void DataSink::slotItemsReceived( const Item::List &items ) @@ -187,6 +209,7 @@ OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); OSyncError *error = 0; + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink()); OSyncChange *change = osync_change_new( &error ); if ( !change ) { @@ -208,24 +231,24 @@ osync_change_set_data( change, odata ); - kDebug() << item.id() << "DATA:" << osync_data_get_printable( odata , &error) << "\n" << "ORIG:" << item.payloadData().data(); + kDebug() << item.id() << "\n" << "DATA:" << osync_data_get_printable( odata , &error) << "\n" << "ORIG:" << item.payloadData().data(); osync_data_unref( odata ); osync_change_set_hash( change, QString::number( item.revision() ).toLatin1() ); - OSyncChangeType changeType = osync_hashtable_get_changetype( m_hashtable, change ); + OSyncChangeType changeType = osync_hashtable_get_changetype( hashtable, change ); osync_change_set_changetype( change, changeType ); - /* + /* */ kDebug() << "changeid:" << osync_change_get_uid( change ) << "itemid:" << item.id() << "revision:" << item.revision() << "changetype:" << changeType - << "hash:" << osync_hashtable_get_hash( m_hashtable, osync_change_get_uid( change ) ) + << "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 ); @@ -242,7 +265,8 @@ // after the items have been processed, see what's been deleted and send them to opensync OSyncError *error = 0; // FIXME: - OSyncList *u, *uids = osync_hashtable_get_deleted( m_hashtable ); + 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 ); @@ -268,7 +292,7 @@ osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); osync_change_set_data( change, data ); - osync_hashtable_update_change( m_hashtable, change ); + osync_hashtable_update_change( hashtable, change ); osync_change_unref( change ); } @@ -283,6 +307,7 @@ 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()); switch ( osync_change_get_changetype( change ) ) { case OSYNC_CHANGE_TYPE_ADDED: { @@ -317,7 +342,7 @@ kDebug() << "got invalid changetype?"; } - osync_hashtable_update_change( m_hashtable, change ); + osync_hashtable_update_change( hashtable, change ); success(); } @@ -473,11 +498,12 @@ void DataSink::syncDone() { kDebug() << "sync for sink member done"; -// OSyncError *error = 0; + OSyncError *error = 0; +// OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink()); // osync_objtype_sink_save_hashtable( sink, &error ); // OSyncError *error = 0; // OSyncObjTypeSink *sink =sink(); -// osync_objtype_sink_save_hashtable( sink , &error ); + osync_objtype_sink_save_hashtable( sink() , &error ); //TODO check for errors success(); } Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Thu Sep 23 03:07:14 2010 (r6136) +++ plugins/akonadi-sync/trunk/src/datasink.h Mon Sep 27 20:00:45 2010 (r6137) @@ -99,7 +99,7 @@ bool setPayload( Item *item, const QString &str ); 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 Thu Sep 23 03:07:14 2010 (r6136) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Mon Sep 27 20:00:45 2010 (r6137) @@ -37,10 +37,12 @@ static void connect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata ) { WRAP( connect() ) + osync_context_report_success(ctx); } static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { WRAP( disconnect() ) +// osync_context_report_success(ctx); } static void get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { @@ -48,6 +50,7 @@ WRAP ( getChanges() ) if ( slow_sync ) sb->setSlowSink(slow_sync); +// osync_context_report_success(ctx); } static void sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { @@ -64,7 +67,8 @@ SinkBase::SinkBase( int features ) : mContext( 0 ), mSink( 0 ), - mPluginInfo( 0 ) + mPluginInfo( 0 ), + m_SlowSync( false ) { m_canConnect = ( features & Connect ) ? true : false; @@ -88,8 +92,6 @@ void SinkBase::connect() { Q_ASSERT( false ); - // Success! - osync_context_report_success(mContext); } void SinkBase::setSlowSink(osync_bool s) @@ -155,15 +157,20 @@ Q_ASSERT( sink ); Q_ASSERT( mSink == 0 ); mSink = sink; + + + kDebug() << ">> m_canConnect:" << m_canConnect; + kDebug() << ">> m_canGetChanges:" << m_canGetChanges; +// kDebug() << ">> NO hashtable for objtype:" << m_canConnect; - if ( ! m_canConnect && ( m_hasEvent || m_hasContact) ) + if ( ! m_canConnect ) osync_objtype_sink_set_connect_func(sink, connect_wrapper); - if ( ! m_canDisconnect && ( m_hasEvent || m_hasContact) ) + if ( ! m_canDisconnect || m_isContact || m_isEvent ) osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); - if ( ! m_canGetChanges && ( m_hasEvent || m_hasContact) ) + if ( ! m_canGetChanges || m_isContact || m_isEvent ) osync_objtype_sink_set_get_changes_func(sink, get_changes_wrapper); - if ( ! m_canCommit && ( m_hasEvent || m_hasContact) ) + if ( ! m_canCommit || m_isContact || m_isEvent ) osync_objtype_sink_set_commit_func(sink, commit_wrapper); // TODO: check if relevant for akonadi // if ( m_canWrite ) @@ -174,7 +181,7 @@ // osync_objtype_sink_set_commit_func(sink, 0); // if ( m_canBatchCommit ) // osync_objtype_sink_set_commit_func(sink, 0); - if ( ! m_canSyncDone && ( m_hasEvent || m_hasContact) ) + if ( ! m_canSyncDone || m_isContact || m_isEvent) osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); } Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Thu Sep 23 03:07:14 2010 (r6136) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Mon Sep 27 20:00:45 2010 (r6137) @@ -72,7 +72,7 @@ void warning( OSyncError *error ) const; void wrapSink( OSyncObjTypeSink* sink ); OSyncObjTypeSink* sink() const { return mSink; } - bool m_hasContact, m_hasEvent, m_hasTodo, m_hasNote; + bool m_isContact, m_isEvent, m_isTodo, m_isNote; private: // OSyncObjTypeSinkFunctions mWrapedFunctions; |
From: <svn...@op...> - 2010-09-23 01:07:24
|
Author: deloptes Date: Thu Sep 23 03:07:14 2010 New Revision: 6136 URL: http://www.opensync.org/changeset/6136 Log: - fixed the connect function TODO: need to fix get_changes Modified: 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 Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Tue Sep 21 09:02:06 2010 (r6135) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Thu Sep 23 03:07:14 2010 (r6136) @@ -93,6 +93,8 @@ else continue; kDebug() << "Info:"<< osync_plugin_info_get_groupname(info); + + osync_objtype_sink_set_userdata(sink, ds); if ( !ds->initialize( plugin, info, sink, error ) ) { delete ds; delete mainSink; Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Tue Sep 21 09:02:06 2010 (r6135) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Thu Sep 23 03:07:14 2010 (r6136) @@ -24,6 +24,10 @@ #include <KDebug> +#include <opensync/opensync-plugin.h> +#include <opensync/opensync-data.h> +#include <opensync/opensync-format.h> + AkonadiSink::AkonadiSink() : SinkBase( Connect ) { @@ -45,6 +49,11 @@ osync_plugin_info_set_main_sink( info, sink ); wrapSink( sink ); // osync_objtype_sink_unref(sink); +// OSyncHashTable * hashtable = osync_objtype_sink_get_hashtable(sink); +// if( hashtable ) +// osync_objtype_sink_enable_hashtable(sink, TRUE); +// if( ! hashtable ) +// kDebug() << "No hashtable for sync"; return true; } Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Tue Sep 21 09:02:06 2010 (r6135) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Thu Sep 23 03:07:14 2010 (r6136) @@ -24,16 +24,10 @@ // #include <glib/ghash.h> #include "datasink.h" -// #include "plugin/opensync_plugin_info_internals.h" -// #include "plugin/opensync_objtype_sink_internals.h" -// #include "helper/opensync_hashtable_internals.h" - -#include <opensync/opensync.h> -#include <opensync/opensync-helper.h> -#include <opensync/opensync-plugin.h> -// #include <opensync/helper/opensync_hashtable.h> -// #include <opensync/helper/opensync_sink_state_db.h> -// #include <opensync/helper/opensync_hashtable.h> + +// #include <opensync/opensync.h> +// #include <opensync/opensync-helper.h> +// #include <opensync/opensync-plugin.h> // calendar includes #include <kcal/incidence.h> @@ -75,35 +69,42 @@ bool DataSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncObjTypeSink *sink, OSyncError ** error) { -// Q_UNUSED( plugin ); -// Q_ASSERT( info ); -// Q_ASSERT( sink ); kDebug() << "initializing" << osync_objtype_sink_get_name(sink); -// Q_UNUSED(plugin); - bool enabled = osync_objtype_sink_is_enabled( sink ); - if ( ! enabled ) { - kDebug() << "sink is not enabled.."; - return false; - } + Q_UNUSED( plugin ); + Q_UNUSED( info ); + Q_UNUSED( error ); + + bool enabled = osync_objtype_sink_is_enabled( sink ); + if( ! enabled ) { + kDebug() << "sink is not enabled.."; + return false; + } OSyncPluginConfig *config = osync_plugin_info_get_config(info); - if (!config) { osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get config."); return false; } - + wrapSink( sink ); + osync_objtype_sink_enable_hashtable(sink , TRUE); + m_hashtable = osync_objtype_sink_get_hashtable(sink); -kDebug() << "Sink wrapped: " << osync_objtype_sink_get_name(sink); -// osync_objtype_sink_set_userdata(sink, env); + if ( ! m_hashtable ) + kDebug() << ">> NO hashtable for objtype:" << osync_objtype_sink_get_name(sink); + +// kDebug() << "Sink wrapped: " << osync_objtype_sink_get_name(sink); + +// TODO +// m_hashtable = osync_objtype_sink_get_hashtable(sink); +// if( m_hashtable ) +// osync_objtype_sink_enable_hashtable(sink, TRUE); +// if( ! m_hashtable ) { +// kDebug() << "No hashtable for sync"; +// osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( error ) ); +// return false; +// } -/* osync_objtype_sink_enable_hashtable(sink, TRUE); - m_hashtable = osync_objtype_sink_get_hashtable(sink); - if ( ! m_hashtable ) { - kDebug() << "No hashtable for sync"; -// return false; - } */ return true; } @@ -137,6 +138,7 @@ // #if 1 Collection col = collection(); if ( !col.isValid() ) { + kDebug() << "No collection"; osync_trace( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( &oerror ) ); return; } @@ -158,7 +160,7 @@ ItemFetchJob *job = new ItemFetchJob( col ); job->fetchScope().fetchFullPayload(); - osync_trace( TRACE_INTERNAL, "EKO fetchFullPayload" ); + 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 * ) ) ); @@ -393,10 +395,10 @@ KABC::VCardConverter converter; KABC::Addressee vcard = converter.parseVCard( str.toLatin1() ); kDebug() << vcard.uid() << vcard.name(); - item->setMimeType( KABC::Addressee::mimeType() ); - // item->setPayload<KABC::Addressee>( str ); // FIXME - item->setPayloadFromData( str.toLatin1() ); // FIXME + //item->setPayload<KABC::Addressee>( vcard ); // FIXME + item->setPayloadFromData( vcard.toString().toLatin1() ); // FIXME + //item->setPayload<KABC::Addressee>( vcard.toString() ); // FIXME break; } case Notes: { @@ -470,10 +472,12 @@ void DataSink::syncDone() { - kDebug(); + kDebug() << "sync for sink member done"; +// OSyncError *error = 0; +// osync_objtype_sink_save_hashtable( sink, &error ); // OSyncError *error = 0; -// osync_objtype_sink_sync_done( m_hashtable, &error ); - +// OSyncObjTypeSink *sink =sink(); +// osync_objtype_sink_save_hashtable( sink , &error ); //TODO check for errors success(); } Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Tue Sep 21 09:02:06 2010 (r6135) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Thu Sep 23 03:07:14 2010 (r6136) @@ -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 @@ -23,60 +23,39 @@ #include "sinkbase.h" #include <KDebug> -#define WRAP0(X) \ - osync_trace( TRACE_ENTRY, "%s(%p,%p, %p, %p)", __PRETTY_FUNCTION__, sink, userdata, info, ctx); \ - SinkBase *sb = reinterpret_cast<SinkBase*>(userdata ); \ - sb->setContext( ctx ); \ - sb->setPluginInfo( info ); \ - sb->X; \ - osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); - -#define WRAP1(X) \ - osync_trace( TRACE_ENTRY, "%s(%p,%p, %p, %p)", __PRETTY_FUNCTION__, sink, userdata, info, ctx); \ +#define WRAP(X) \ + osync_trace( TRACE_ENTRY, "%s(%p,%p, %p, %p)", __PRETTY_FUNCTION__, sink, info, ctx, userdata); \ SinkBase *sb = reinterpret_cast<SinkBase*>(userdata ); \ - if ( slow_sync ) sb->setSlowSink(slow_sync); \ sb->setContext( ctx ); \ sb->setPluginInfo( info ); \ sb->X; \ osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); - - extern "C" { static void connect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata ) { - WRAP0( connect() ) + WRAP( connect() ) } static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP0( disconnect() ) + WRAP( disconnect() ) } - static void contact_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - - WRAP1 ( getChanges() ) - } - - static void event_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - WRAP1 ( getChanges() ) - } + static void get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - static void todo_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - WRAP1( getChanges() ) - } - - static void journal_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - WRAP1( getChanges() ) + WRAP ( getChanges() ) + if ( slow_sync ) + sb->setSlowSink(slow_sync); } static void sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP0( syncDone() ) + WRAP( syncDone() ) } static void commit_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { - WRAP0( commit(change) ) + WRAP( commit(change) ) } } // extern C @@ -109,6 +88,8 @@ void SinkBase::connect() { Q_ASSERT( false ); + // Success! + osync_context_report_success(mContext); } void SinkBase::setSlowSink(osync_bool s) @@ -175,21 +156,14 @@ Q_ASSERT( mSink == 0 ); mSink = sink; - if ( ! m_canConnect ) + if ( ! m_canConnect && ( m_hasEvent || m_hasContact) ) osync_objtype_sink_set_connect_func(sink, connect_wrapper); - if ( ! m_canDisconnect ) + if ( ! m_canDisconnect && ( m_hasEvent || m_hasContact) ) osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); + if ( ! m_canGetChanges && ( m_hasEvent || m_hasContact) ) + osync_objtype_sink_set_get_changes_func(sink, get_changes_wrapper); - if ( ! m_canGetChanges && m_hasContact ) - osync_objtype_sink_set_get_changes_func(sink, contact_get_changes_wrapper); - if ( ! m_canGetChanges && m_hasEvent ) - osync_objtype_sink_set_get_changes_func(sink, event_get_changes_wrapper); - if ( ! m_canGetChanges && m_hasTodo ) - osync_objtype_sink_set_get_changes_func(sink, todo_get_changes_wrapper); - if ( ! m_canGetChanges && m_hasNote ) - osync_objtype_sink_set_get_changes_func(sink, journal_get_changes_wrapper); - - if ( ! m_canCommit ) + if ( ! m_canCommit && ( m_hasEvent || m_hasContact) ) osync_objtype_sink_set_commit_func(sink, commit_wrapper); // TODO: check if relevant for akonadi // if ( m_canWrite ) @@ -200,7 +174,7 @@ // osync_objtype_sink_set_commit_func(sink, 0); // if ( m_canBatchCommit ) // osync_objtype_sink_set_commit_func(sink, 0); - if ( ! m_canSyncDone ) + if ( ! m_canSyncDone && ( m_hasEvent || m_hasContact) ) osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); } |
From: <svn...@op...> - 2010-09-21 07:02:15
|
Author: deloptes Date: Tue Sep 21 09:02:06 2010 New Revision: 6135 URL: http://www.opensync.org/changeset/6135 Log: - overlooked logical & and | - set keyproperty Id Modified: plugins/akonadi-sync/trunk/CMakeLists.txt (props changed) plugins/akonadi-sync/trunk/src/CMakeLists.txt (contents, props changed) plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/akonadisink.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/akonadisink.h (contents, props changed) plugins/akonadi-sync/trunk/src/datasink.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/datasink.h (contents, props changed) plugins/akonadi-sync/trunk/src/sinkbase.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/sinkbase.h (contents, props changed) Modified: plugins/akonadi-sync/trunk/src/CMakeLists.txt ============================================================================== --- plugins/akonadi-sync/trunk/src/CMakeLists.txt Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/CMakeLists.txt Tue Sep 21 09:02:06 2010 (r6135) @@ -1,4 +1,9 @@ + +# +# Copyright (c) 2010 Emanoil Kotsev <del...@ya...> +# $Id: deloptes$ + #INCLUDE_DIRECTORIES( ${OPENSYNC_INCLUDE_DIRS} ${GLIB2_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ) # Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Tue Sep 21 09:02:06 2010 (r6135) @@ -1,6 +1,6 @@ /* - Copyright (c) 2010 Emanoil Kotsev <del...@ya...> Copyright (c) 2008 Volker Krause <vk...@kd...> + Copyright (c) 2010 Emanoil Kotsev <del...@ya...> 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 Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Tue Sep 21 09:02:06 2010 (r6135) @@ -1,5 +1,6 @@ /* Copyright (c) 2008 Volker Krause <vk...@kd...> + Copyright (c) 2010 Emanoil Kotsev <del...@ya...> 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 @@ -41,8 +42,8 @@ kDebug() << "No sink "; return false; } -// wrapSink( sink ); osync_plugin_info_set_main_sink( info, sink ); + wrapSink( sink ); // osync_objtype_sink_unref(sink); return true; } @@ -57,7 +58,6 @@ osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, "Could not start Akonadi."); return; } - connect(); success(); osync_trace(TRACE_EXIT, "%s", __PRETTY_FUNCTION__); } Modified: plugins/akonadi-sync/trunk/src/akonadisink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.h Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/akonadisink.h Tue Sep 21 09:02:06 2010 (r6135) @@ -1,5 +1,7 @@ /* Copyright (c) 2008 Volker Krause <vk...@kd...> + Copyright (c) 2010 Emanoil Kotsev <del...@ya...> + 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 Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Tue Sep 21 09:02:06 2010 (r6135) @@ -1,5 +1,8 @@ /* 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 Modified: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.h Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/datasink.h Tue Sep 21 09:02:06 2010 (r6135) @@ -1,5 +1,8 @@ /* 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 Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Tue Sep 21 09:02:06 2010 (r6135) @@ -1,5 +1,8 @@ /* 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 @@ -172,21 +175,21 @@ Q_ASSERT( mSink == 0 ); mSink = sink; - if ( m_canConnect ) + if ( ! m_canConnect ) osync_objtype_sink_set_connect_func(sink, connect_wrapper); - if ( m_canDisconnect ) + if ( ! m_canDisconnect ) osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); - if ( m_canGetChanges && m_hasContact ) + if ( ! m_canGetChanges && m_hasContact ) osync_objtype_sink_set_get_changes_func(sink, contact_get_changes_wrapper); - if ( m_canGetChanges && m_hasEvent ) + if ( ! m_canGetChanges && m_hasEvent ) osync_objtype_sink_set_get_changes_func(sink, event_get_changes_wrapper); - if ( m_canGetChanges && m_hasTodo ) + if ( ! m_canGetChanges && m_hasTodo ) osync_objtype_sink_set_get_changes_func(sink, todo_get_changes_wrapper); - if ( m_canGetChanges && m_hasNote ) + if ( ! m_canGetChanges && m_hasNote ) osync_objtype_sink_set_get_changes_func(sink, journal_get_changes_wrapper); - if ( m_canCommit ) + if ( ! m_canCommit ) osync_objtype_sink_set_commit_func(sink, commit_wrapper); // TODO: check if relevant for akonadi // if ( m_canWrite ) @@ -197,7 +200,7 @@ // osync_objtype_sink_set_commit_func(sink, 0); // if ( m_canBatchCommit ) // osync_objtype_sink_set_commit_func(sink, 0); - if ( m_canSyncDone ) + if ( ! m_canSyncDone ) osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); } Modified: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.h Tue Sep 21 01:12:57 2010 (r6134) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Tue Sep 21 09:02:06 2010 (r6135) @@ -1,5 +1,8 @@ /* 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 |
From: <svn...@op...> - 2010-09-20 23:13:06
|
Author: deloptes Date: Tue Sep 21 01:12:57 2010 New Revision: 6134 URL: http://www.opensync.org/changeset/6134 Log: - connect working for akonadi mainSink Modified: 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 Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Mon Sep 20 03:08:16 2010 (r6133) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Tue Sep 21 01:12:57 2010 (r6134) @@ -92,7 +92,7 @@ ds = new DataSink( DataSink::Notes ); else continue; - + kDebug() << "Info:"<< osync_plugin_info_get_groupname(info); if ( !ds->initialize( plugin, info, sink, error ) ) { delete ds; delete mainSink; Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Mon Sep 20 03:08:16 2010 (r6133) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Tue Sep 21 01:12:57 2010 (r6134) @@ -36,8 +36,14 @@ { kDebug(); OSyncObjTypeSink *sink = osync_objtype_main_sink_new( error ); + if (!sink) { + + kDebug() << "No sink "; + return false; + } +// wrapSink( sink ); osync_plugin_info_set_main_sink( info, sink ); - wrapSink( sink ); +// osync_objtype_sink_unref(sink); return true; } @@ -51,9 +57,10 @@ osync_trace(TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, "Could not start Akonadi."); return; } - + connect(); success(); osync_trace(TRACE_EXIT, "%s", __PRETTY_FUNCTION__); } + #include "akonadisink.moc" Modified: plugins/akonadi-sync/trunk/src/akonadisink.h ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.h Mon Sep 20 03:08:16 2010 (r6133) +++ plugins/akonadi-sync/trunk/src/akonadisink.h Tue Sep 21 01:12:57 2010 (r6134) @@ -36,6 +36,7 @@ bool initialize( OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error ); void connect(); + }; #endif Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Mon Sep 20 03:08:16 2010 (r6133) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Tue Sep 21 01:12:57 2010 (r6134) @@ -59,10 +59,10 @@ kDebug() << "Create obj:" << type; m_type = type; - m_hasEvent = true ? ( type = DataSink::Calendars ) : false; - m_hasContact = true ? ( type = DataSink::Contacts ) : false; - m_hasNote = true ? ( type = DataSink::Notes ) : false; - m_hasTodo = true ? ( type = DataSink::Todos ) : false; + m_hasEvent = ( type == DataSink::Calendars ) ? true : false; + m_hasContact = ( type == DataSink::Contacts ) ? true : false; + m_hasNote = ( type == DataSink::Notes ) ? true : false; + m_hasTodo = ( type == DataSink::Todos ) ? true : false; } @@ -72,8 +72,11 @@ bool DataSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncObjTypeSink *sink, OSyncError ** error) { +// Q_UNUSED( plugin ); +// Q_ASSERT( info ); +// Q_ASSERT( sink ); kDebug() << "initializing" << osync_objtype_sink_get_name(sink); - Q_UNUSED(plugin); +// Q_UNUSED(plugin); bool enabled = osync_objtype_sink_is_enabled( sink ); if ( ! enabled ) { kDebug() << "sink is not enabled.."; @@ -89,15 +92,15 @@ wrapSink( sink ); -kDebug() << "Sink wrapped" << osync_objtype_sink_get_name(sink); +kDebug() << "Sink wrapped: " << osync_objtype_sink_get_name(sink); // osync_objtype_sink_set_userdata(sink, env); - osync_objtype_sink_enable_hashtable(sink, TRUE); +/* osync_objtype_sink_enable_hashtable(sink, TRUE); m_hashtable = osync_objtype_sink_get_hashtable(sink); if ( ! m_hashtable ) { kDebug() << "No hashtable for sync"; // return false; - } + } */ return true; } |
From: <svn...@op...> - 2010-09-20 01:08:25
|
Author: deloptes Date: Mon Sep 20 03:08:16 2010 New Revision: 6133 URL: http://www.opensync.org/changeset/6133 Log: -removed executable flags for files -working on better initialization Modified: plugins/akonadi-sync/trunk/src/akonadi-sync (props changed) plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp (props changed) plugins/akonadi-sync/trunk/src/akonadisink.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/akonadisink.h (props changed) plugins/akonadi-sync/trunk/src/datasink.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/datasink.h (props changed) plugins/akonadi-sync/trunk/src/sinkbase.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/sinkbase.h (contents, props changed) Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Mon Sep 20 03:04:08 2010 (r6132) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Mon Sep 20 03:08:16 2010 (r6133) @@ -34,7 +34,6 @@ bool AkonadiSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncError ** error) { -// Q_ASSERT( plugin ); kDebug(); OSyncObjTypeSink *sink = osync_objtype_main_sink_new( error ); osync_plugin_info_set_main_sink( info, sink ); Modified: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/datasink.cpp Mon Sep 20 03:04:08 2010 (r6132) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Mon Sep 20 03:08:16 2010 (r6133) @@ -53,27 +53,32 @@ typedef boost::shared_ptr<KCal::Incidence> IncidencePtr; - DataSink::DataSink( int type ) : - SinkBase( GetChanges | Commit | SyncDone ) + SinkBase( GetChanges | Commit | SyncDone ) { - m_type = type; + kDebug() << "Create obj:" << type; + m_type = type; + + m_hasEvent = true ? ( type = DataSink::Calendars ) : false; + m_hasContact = true ? ( type = DataSink::Contacts ) : false; + m_hasNote = true ? ( type = DataSink::Notes ) : false; + m_hasTodo = true ? ( type = DataSink::Todos ) : false; + } DataSink::~DataSink() { -// kDebug() << "del ptr to hashtable"; -// if( m_hashtable ) -// delete m_hashtable ; + kDebug() << "DataSink destructor called"; // TODO still needed } bool DataSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncObjTypeSink *sink, OSyncError ** error) { - Q_UNUSED(plugin); - bool enabled = osync_objtype_sink_is_enabled( sink ); - if( ! enabled ) { - kDebug() << "sink is not enabled.."; - return false; - } + kDebug() << "initializing" << osync_objtype_sink_get_name(sink); + Q_UNUSED(plugin); + bool enabled = osync_objtype_sink_is_enabled( sink ); + if ( ! enabled ) { + kDebug() << "sink is not enabled.."; + return false; + } OSyncPluginConfig *config = osync_plugin_info_get_config(info); @@ -82,58 +87,59 @@ return false; } - wrapSink( sink ); - - // TODO do we need this check here - I don't think so - OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); -// // - if( ! hashtable ) { - osync_trace(TRACE_INTERNAL, "EKO > %s: %s", __PRETTY_FUNCTION__, osync_error_print( error ) ); -// return false; - } -// // - return true; + wrapSink( sink ); + +kDebug() << "Sink wrapped" << osync_objtype_sink_get_name(sink); +// osync_objtype_sink_set_userdata(sink, env); + + osync_objtype_sink_enable_hashtable(sink, TRUE); + m_hashtable = osync_objtype_sink_get_hashtable(sink); + if ( ! m_hashtable ) { + kDebug() << "No hashtable for sync"; +// return false; + } + return true; } Akonadi::Collection DataSink::collection() const { - OSyncPluginConfig *config = osync_plugin_info_get_config( pluginInfo() ); - Q_ASSERT( config ); + OSyncPluginConfig *config = osync_plugin_info_get_config( pluginInfo() ); + Q_ASSERT( config ); - const char *objtype = osync_objtype_sink_get_name( sink() ); + const char *objtype = osync_objtype_sink_get_name( sink() ); - OSyncPluginResource *res = osync_plugin_config_find_active_resource( config, objtype ); + 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(); - } + 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 ) ); - if ( url.isEmpty() ) { - error( OSYNC_ERROR_MISCONFIGURATION, i18n("Url for object type \"%1\" is not configured.", objtype ) ); - return Collection(); - } + const KUrl url = KUrl( osync_plugin_resource_get_url( res ) ); + if ( url.isEmpty() ) { + error( OSYNC_ERROR_MISCONFIGURATION, i18n("Url for object type \"%1\" is not configured.", objtype ) ); + return Collection(); + } - return Collection::fromUrl( url ); + return Collection::fromUrl( url ); } void DataSink::getChanges() { - OSyncError *oerror = 0; - // ### broken in OpenSync, I don't get valid configuration here! + OSyncError *oerror = 0; + // ### broken in OpenSync, I don't get valid configuration here! // #if 1 - Collection col = collection(); - if ( !col.isValid() ) { - osync_trace( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( &oerror ) ); - return; - } + Collection col = collection(); + if ( !col.isValid() ) { + osync_trace( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( &oerror ) ); + return; + } // #else // Collection col( 409 ); // #endif -// FIXME +// FIXME if ( getSlowSink() ) { kDebug() << "we're in the middle of slow-syncing..."; osync_trace( TRACE_INTERNAL, "EKO Got slow-sync, resetting hashtable" ); @@ -146,7 +152,7 @@ ItemFetchJob *job = new ItemFetchJob( col ); job->fetchScope().fetchFullPayload(); - osync_trace( TRACE_INTERNAL, "EKO fetchFullPayload" ); + osync_trace( TRACE_INTERNAL, "EKO fetchFullPayload" ); 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 * ) ) ); @@ -160,306 +166,310 @@ void DataSink::slotItemsReceived( const Item::List &items ) { - kDebug() << "retrieved" << items.count() << "items"; - Q_FOREACH( const Item& item, items ) { - kDebug() << item.payloadData(); - reportChange( item ); - } + kDebug() << "retrieved" << items.count() << "items"; + Q_FOREACH( const Item& item, items ) { + kDebug() << item.payloadData(); + reportChange( item ); + } } void DataSink::reportChange( const Item& item ) { - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); + + OSyncError *error = 0; - OSyncError *error = 0; + OSyncChange *change = osync_change_new( &error ); + if ( !change ) { + warning( error ); + return; + } - OSyncChange *change = osync_change_new( &error ); - if ( !change ) { - warning( error ); - return; - } - - osync_change_set_uid( change, QString::number( item.id() ).toLatin1() ); - - error = 0; - - OSyncData *odata = osync_data_new( item.payloadData().data(), item.payloadData().size(), format, &error ); - if ( !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 ); - - kDebug() << item.id() << "DATA:" << osync_data_get_printable( odata , &error) << "\n" << "ORIG:" << item.payloadData().data(); - - osync_data_unref( odata ); - osync_change_set_hash( change, QString::number( item.revision() ).toLatin1() ); - OSyncChangeType changeType = osync_hashtable_get_changetype( m_hashtable, change ); - osync_change_set_changetype( change, changeType ); - - -/* -kDebug() << "changeid:" << osync_change_get_uid( change ) - << "itemid:" << item.id() - << "revision:" << item.revision() - << "changetype:" << changeType - << "hash:" << osync_hashtable_get_hash( m_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 ); - else - // perhaps this should be only called when an error has happened ie. never after _context_report_change()? - osync_change_unref( change ); // if this gets called, we get broken pipes. any ideas? + osync_change_set_uid( change, QString::number( item.id() ).toLatin1() ); + + error = 0; + + OSyncData *odata = osync_data_new( item.payloadData().data(), item.payloadData().size(), format, &error ); + if ( !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 ); + + kDebug() << item.id() << "DATA:" << osync_data_get_printable( odata , &error) << "\n" << "ORIG:" << item.payloadData().data(); + + osync_data_unref( odata ); + osync_change_set_hash( change, QString::number( item.revision() ).toLatin1() ); + OSyncChangeType changeType = osync_hashtable_get_changetype( m_hashtable, change ); + osync_change_set_changetype( change, changeType ); + + + /* + kDebug() << "changeid:" << osync_change_get_uid( change ) + << "itemid:" << item.id() + << "revision:" << item.revision() + << "changetype:" << changeType + << "hash:" << osync_hashtable_get_hash( m_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 ); + else + // perhaps this should be only called when an error has happened ie. never after _context_report_change()? + osync_change_unref( change ); // if this gets called, we get broken pipes. any ideas? } void DataSink::slotGetChangesFinished( KJob * ) { - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); - OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); - // after the items have been processed, see what's been deleted and send them to opensync - OSyncError *error = 0; + // after the items have been processed, see what's been deleted and send them to opensync + OSyncError *error = 0; // FIXME: - OSyncList *u, *uids = osync_hashtable_get_deleted( m_hashtable ); -// - for( u = uids; u; u = u->next) { - QString uid( (char *)u->data ); - kDebug() << "going to delete with uid:" << uid; - - OSyncChange *change = osync_change_new( &error ); - if( !change ) { - warning( error ); - continue; - } -// - osync_change_set_changetype( change, OSYNC_CHANGE_TYPE_DELETED ); - osync_change_set_uid( change, uid.toLatin1() ); - - error = 0; - OSyncData *data = osync_data_new( 0, 0, format, &error ); - if( !data ) { - osync_change_unref( change ); - warning( error ); - continue; - } -// - osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); - osync_change_set_data( change, data ); + OSyncList *u, *uids = osync_hashtable_get_deleted( m_hashtable ); +// + for ( u = uids; u; u = u->next) { + QString uid( (char *)u->data ); + kDebug() << "going to delete with uid:" << uid; + + OSyncChange *change = osync_change_new( &error ); + if ( !change ) { + warning( error ); + continue; + } +// + osync_change_set_changetype( change, OSYNC_CHANGE_TYPE_DELETED ); + osync_change_set_uid( change, uid.toLatin1() ); + + error = 0; + OSyncData *data = osync_data_new( 0, 0, format, &error ); + if ( !data ) { + osync_change_unref( change ); + warning( error ); + continue; + } +// + osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); + osync_change_set_data( change, data ); - osync_hashtable_update_change( m_hashtable, change ); + osync_hashtable_update_change( m_hashtable, change ); - osync_change_unref( change ); - } - osync_list_free( uids ); + osync_change_unref( change ); + } + osync_list_free( uids ); - kDebug() << "got all changes.."; - success(); + kDebug() << "got all changes.."; + success(); } 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 ) ); + 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 ) ); - 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 ); + 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; + } 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; } + 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; + } case OSYNC_CHANGE_TYPE_DELETED: { - deleteItem( change ); - kDebug() << "DELETED:" << osync_change_get_uid( change ); - break; } + deleteItem( change ); + kDebug() << "DELETED:" << osync_change_get_uid( change ); + 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?"; - } + kDebug() << "got invalid changetype?"; + } - osync_hashtable_update_change( m_hashtable, change ); - success(); + osync_hashtable_update_change( m_hashtable, change ); + success(); } const Item DataSink::createItem( OSyncChange *change ) { - Collection col = collection(); - if ( !col.isValid() ) // error handling - return Item(); - kDebug() << "cuid:" << osync_change_get_uid( 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 ); + ItemCreateJob *job = new Akonadi::ItemCreateJob( createAkonadiItem( change ), col ); - if( ! job->exec() ) - kDebug() << "creating an item failed"; + if ( ! job->exec() ) + kDebug() << "creating an item failed"; - return job->item(); // handle !job->exec in return too.. + 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::fromUtf8( 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); - ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob( item ); - if( modifyJob->exec() ) { - kDebug() << "modification completed"; - return modifyJob->item(); - } - else - kDebug() << "unable to modify"; + char *plain = 0; + osync_data_get_data( osync_change_get_data( change ), &plain, /*size*/0 ); + QString str = QString::fromUtf8( 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); + ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob( item ); + if ( modifyJob->exec() ) { + kDebug() << "modification completed"; + return modifyJob->item(); + } + else + kDebug() << "unable to modify"; - return Item(); + 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(); - /*ItemDeleteJob *job = new ItemDeleteJob( item ); - - if( job->exec() ) { - kDebug() << "item deleted"; - } - else - kDebug() << "unable to delete item";*/ + 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(); + /*ItemDeleteJob *job = new ItemDeleteJob( item ); + + if( job->exec() ) { + kDebug() << "item deleted"; + } + else + kDebug() << "unable to delete item";*/ } bool DataSink::setPayload( Item *item, const QString &str ) { - switch( m_type ) { + switch ( m_type ) { case Calendars: { - KCal::ICalFormat format; - KCal::Incidence *calEntry = format.fromString( str ); + KCal::ICalFormat format; + KCal::Incidence *calEntry = format.fromString( str ); - item->setMimeType( "application/x-vnd.akonadi.calendar.event" ); - item->setPayload<IncidencePtr>( IncidencePtr( calEntry->clone() ) ); + item->setMimeType( "application/x-vnd.akonadi.calendar.event" ); + item->setPayload<IncidencePtr>( IncidencePtr( calEntry->clone() ) ); - break; + break; } case Contacts: { - KABC::VCardConverter converter; - KABC::Addressee vcard = converter.parseVCard( str.toLatin1() ); - kDebug() << vcard.uid() << vcard.name(); - - item->setMimeType( KABC::Addressee::mimeType() ); - // item->setPayload<KABC::Addressee>( str ); // FIXME - item->setPayloadFromData( str.toLatin1() ); // FIXME - break; + KABC::VCardConverter converter; + KABC::Addressee vcard = converter.parseVCard( str.toLatin1() ); + kDebug() << vcard.uid() << vcard.name(); + + item->setMimeType( KABC::Addressee::mimeType() ); + // item->setPayload<KABC::Addressee>( str ); // FIXME + item->setPayloadFromData( str.toLatin1() ); // FIXME + break; } case Notes: { - kDebug() << "notes"; - break; + kDebug() << "notes"; + break; } case Todos: { - kDebug() << "todos"; - break; + kDebug() << "todos"; + break; } default: - // should not happen - return false; - } + // should not happen + return false; + } - return true; + return true; } const Item DataSink::createAkonadiItem( OSyncChange *change ) { - char *plain = 0; - osync_data_get_data( osync_change_get_data( change ), &plain, /*size*/0 ); - QString str = QString::fromUtf8( plain ); - Akonadi::Item item; - setPayload(&item, str); - return item; + char *plain = 0; + osync_data_get_data( osync_change_get_data( change ), &plain, /*size*/0 ); + QString str = QString::fromUtf8( plain ); + Akonadi::Item item; + setPayload(&item, str); + return item; } const QString DataSink::formatName() { - // FIXME -- this should be saved somewhere in the config, why settign and checking here: - QString formatName; - switch( m_type ) { + // FIXME -- this should be saved somewhere in the config, why settign and checking here: + QString formatName; + switch ( m_type ) { case Calendars: - formatName = "vevent20"; - break; + formatName = "vevent20"; + break; case Contacts: - formatName = "vcard10"; - break; + formatName = "vcard10"; + break; case Notes: - formatName = "vjournal"; - break; + formatName = "vjournal"; + break; case Todos: - formatName = "vtodo20"; - break; + formatName = "vtodo20"; + break; default: - kDebug() << "invalid datasink type"; - return QString(); - } + kDebug() << "invalid datasink type"; + return QString(); + } - return formatName; + return formatName; } const Item DataSink::fetchItem( const QString& id ) { - ItemFetchJob *fetchJob = new ItemFetchJob( Item( id ) ); - fetchJob->fetchScope().fetchFullPayload(); + ItemFetchJob *fetchJob = new ItemFetchJob( Item( id ) ); + fetchJob->fetchScope().fetchFullPayload(); - if( fetchJob->exec() ) { - foreach ( const Item &item, fetchJob->items() ) { - if( QString::number( item.id() ) == id ) { - kDebug() << "got item"; - return item; - } + if ( fetchJob->exec() ) { + foreach ( const Item &item, fetchJob->items() ) { + if ( QString::number( item.id() ) == id ) { + kDebug() << "got item"; + return item; + } + } } - } - // no such item found? - return Item(); + // no such item found? + return Item(); } void DataSink::syncDone() { - kDebug(); + kDebug(); // OSyncError *error = 0; // osync_objtype_sink_sync_done( m_hashtable, &error ); - //TODO check for errors - success(); + //TODO check for errors + success(); } #include "datasink.moc" Modified: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/sinkbase.cpp Mon Sep 20 03:04:08 2010 (r6132) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Mon Sep 20 03:08:16 2010 (r6133) @@ -42,168 +42,152 @@ extern "C" { - static void connect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata ) -{ - WRAP0( connect() ) -} + static void connect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata ) + { + WRAP0( connect() ) + } + + static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP0( disconnect() ) + } -static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP0( disconnect() ) -} + static void contact_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { -static void contact_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + WRAP1 ( getChanges() ) + } - WRAP1 ( getChanges() ) -} -// - -static void contact_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP0( syncDone() ) -} - -static void event_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - WRAP1( getChanges() ) -} -// -static void event_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP0( syncDone() ) -} - - -static void todo_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - WRAP1( getChanges() ) -} -// - -static void todo_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP0( syncDone() ) -} - -static void journal_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { - WRAP1( getChanges() ) -} -// - -static void journal_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { - WRAP0( syncDone() ) -} -// -static void commit_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { - WRAP0( commit(change) ) -} + static void event_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + WRAP1 ( getChanges() ) + } + + static void todo_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + WRAP1( getChanges() ) + } + + static void journal_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + WRAP1( getChanges() ) + } + + static void sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP0( syncDone() ) + } + + static void commit_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { + WRAP0( commit(change) ) + } } // extern C SinkBase::SinkBase( int features ) : - mContext( 0 ), - mSink( 0 ), - mPluginInfo( 0 ) + mContext( 0 ), + mSink( 0 ), + mPluginInfo( 0 ) { - m_canConnect = ( features & Connect ) ? true : false; - m_canDisconnect = ( features & Disconnect ) ? true : false; - m_canGetChanges = ( features & GetChanges ) ? true : false; - m_canCommit = ( features & Commit ) ? true : false; - m_canWrite = ( features & Write ) ? true : false; - m_canCommitAll = ( features & CommittedAll ) ? true : false; - m_canRead = ( features & Read ) ? true : false; - m_canBatchCommit = ( features & BatchCommit ) ? true : false; - m_canSyncDone = ( features & SyncDone ) ? true : false; + m_canConnect = ( features & Connect ) ? true : false; + m_canDisconnect = ( features & Disconnect ) ? true : false; + m_canGetChanges = ( features & GetChanges ) ? true : false; + m_canCommit = ( features & Commit ) ? true : false; + m_canWrite = ( features & Write ) ? true : false; + m_canCommitAll = ( features & CommittedAll ) ? true : false; + m_canRead = ( features & Read ) ? true : false; + m_canBatchCommit = ( features & BatchCommit ) ? true : false; + m_canSyncDone = ( features & SyncDone ) ? true : false; } SinkBase::~SinkBase() { - if ( mSink ) - osync_objtype_sink_unref( mSink ); + if ( mSink ) + osync_objtype_sink_unref( mSink ); } void SinkBase::connect() { - Q_ASSERT( false ); + Q_ASSERT( false ); } void SinkBase::setSlowSink(osync_bool s) { - Q_ASSERT( m_SlowSync ); - m_SlowSync = s; + Q_ASSERT( m_SlowSync ); + m_SlowSync = s; } osync_bool SinkBase::getSlowSink() { - Q_ASSERT( m_SlowSync ); - return m_SlowSync; + Q_ASSERT( m_SlowSync ); + return m_SlowSync; } void SinkBase::disconnect() { - Q_ASSERT( false ); + Q_ASSERT( false ); } void SinkBase::getChanges() { - Q_ASSERT( false ); + Q_ASSERT( false ); } void SinkBase::commit(OSyncChange * chg) { - Q_UNUSED( chg ); - Q_ASSERT( false ); + Q_UNUSED( chg ); + Q_ASSERT( false ); } void SinkBase::syncDone() { - Q_ASSERT( false ); + Q_ASSERT( false ); } void SinkBase::success() const { -kDebug(); - Q_ASSERT( mContext ); - osync_context_report_success( mContext ); - mContext = 0; + kDebug(); + Q_ASSERT( mContext ); + osync_context_report_success( mContext ); + mContext = 0; } void SinkBase::error(OSyncErrorType type, const QString &msg) const { - kDebug(); - Q_ASSERT( mContext ); - osync_context_report_error(mContext, type, "%s", msg.toLatin1().data() ); - mContext = 0; + kDebug(); + Q_ASSERT( mContext ); + osync_context_report_error(mContext, type, "%s", msg.toLatin1().data() ); + mContext = 0; } void SinkBase::warning(OSyncError * error) const { -kDebug(); - Q_ASSERT( mContext ); - osync_context_report_osyncwarning( mContext, error ); - osync_error_unref( &error ); + kDebug(); + Q_ASSERT( mContext ); + osync_context_report_osyncwarning( mContext, error ); + osync_error_unref( &error ); } void SinkBase::wrapSink(OSyncObjTypeSink* sink) { - kDebug(); - Q_ASSERT( sink ); - Q_ASSERT( mSink == 0 ); - mSink = sink; - - if ( m_canConnect ) - osync_objtype_sink_set_connect_func(sink, connect_wrapper); - if ( m_canDisconnect ) - osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); - - if ( m_canGetChanges && m_hasContact ) - osync_objtype_sink_set_get_changes_func(sink, contact_get_changes_wrapper); - if ( m_canGetChanges && m_hasEvent ) - osync_objtype_sink_set_get_changes_func(sink, event_get_changes_wrapper); - if ( m_canGetChanges && m_hasTodo ) - osync_objtype_sink_set_get_changes_func(sink, todo_get_changes_wrapper); - if ( m_canGetChanges && m_hasNote ) - osync_objtype_sink_set_get_changes_func(sink, journal_get_changes_wrapper); - - if ( m_canCommit ) - osync_objtype_sink_set_commit_func(sink, commit_wrapper); + kDebug(); + Q_ASSERT( sink ); + Q_ASSERT( mSink == 0 ); + mSink = sink; + + if ( m_canConnect ) + osync_objtype_sink_set_connect_func(sink, connect_wrapper); + if ( m_canDisconnect ) + osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); + + if ( m_canGetChanges && m_hasContact ) + osync_objtype_sink_set_get_changes_func(sink, contact_get_changes_wrapper); + if ( m_canGetChanges && m_hasEvent ) + osync_objtype_sink_set_get_changes_func(sink, event_get_changes_wrapper); + if ( m_canGetChanges && m_hasTodo ) + osync_objtype_sink_set_get_changes_func(sink, todo_get_changes_wrapper); + if ( m_canGetChanges && m_hasNote ) + osync_objtype_sink_set_get_changes_func(sink, journal_get_changes_wrapper); + + if ( m_canCommit ) + osync_objtype_sink_set_commit_func(sink, commit_wrapper); // TODO: check if relevant for akonadi // if ( m_canWrite ) // osync_objtype_sink_set_commit_func(sink, 0); @@ -213,28 +197,22 @@ // osync_objtype_sink_set_commit_func(sink, 0); // if ( m_canBatchCommit ) // osync_objtype_sink_set_commit_func(sink, 0); - if ( m_canSyncDone && m_hasContact ) - osync_objtype_sink_set_sync_done_func(sink, contact_sync_done_wrapper); - if ( m_canSyncDone && m_hasEvent ) - osync_objtype_sink_set_sync_done_func(sink, event_sync_done_wrapper); - if ( m_canSyncDone && m_hasTodo ) - osync_objtype_sink_set_sync_done_func(sink, todo_sync_done_wrapper); - if ( m_canSyncDone && m_hasNote ) - osync_objtype_sink_set_sync_done_func(sink, journal_sync_done_wrapper); - + if ( m_canSyncDone ) + osync_objtype_sink_set_sync_done_func(sink, sync_done_wrapper); + } void SinkBase::setPluginInfo(OSyncPluginInfo * info) { - Q_ASSERT( mPluginInfo == 0 || mPluginInfo == info ); - mPluginInfo = info; + Q_ASSERT( mPluginInfo == 0 || mPluginInfo == info ); + mPluginInfo = info; } void SinkBase::setContext(OSyncContext * context) { - Q_ASSERT( mContext == 0 || context == mContext ); - // ### do I need to ref() that here? and then probably deref() the old one somewhere above? - mContext = context; + 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 Mon Sep 20 03:04:08 2010 (r6132) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Mon Sep 20 03:08:16 2010 (r6133) @@ -69,6 +69,7 @@ void warning( OSyncError *error ) const; void wrapSink( OSyncObjTypeSink* sink ); OSyncObjTypeSink* sink() const { return mSink; } + bool m_hasContact, m_hasEvent, m_hasTodo, m_hasNote; private: // OSyncObjTypeSinkFunctions mWrapedFunctions; @@ -78,7 +79,6 @@ // what do we have and what can we do bool m_canConnect, m_canDisconnect, m_canSyncDone, m_canCommit, m_canGetChanges; bool m_canWrite, m_canRead, m_canCommitAll, m_canCommitRead, m_canBatchCommit; - bool m_hasContact, m_hasEvent, m_hasTodo, m_hasNote; osync_bool m_SlowSync; }; |
From: <svn...@op...> - 2010-09-20 01:04:19
|
Author: deloptes Date: Mon Sep 20 03:04:08 2010 New Revision: 6132 URL: http://www.opensync.org/changeset/6132 Log: - discover of multiple akonadi collections possible Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Sep 18 20:32:44 2010 (r6131) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Mon Sep 20 03:04:08 2010 (r6132) @@ -24,10 +24,11 @@ #include <akonadi/control.h> #include <akonadi/collection.h> #include <akonadi/collectionfetchjob.h> +#include <akonadi/collectionfetchscope.h> +// #include <akonadi/collectionfilterproxymodel.h> #include <akonadi/mimetypechecker.h> #include <kabc/addressee.h> -// #include <akonadi/collectionfilterproxymodel.h> #include <KComponentData> #include <KDebug> @@ -71,7 +72,7 @@ // http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 // 10) List looping is more standard // --------------------------------- - +// osync_plugin_get_config_type(); OSyncList *s = NULL, *list = osync_plugin_info_get_objtype_sinks(info); for ( s = list; s; s = s->next ) { OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; @@ -85,8 +86,8 @@ else if ( sinkName == "contact" ) ds = new DataSink( DataSink::Contacts ); // FIXME: implement todos an journal (notes) - else if ( sinkName == "todo" ) - ds = new DataSink( DataSink::Todos ); +// else if ( sinkName == "todo" ) +// ds = new DataSink( DataSink::Todos ); else if ( sinkName == "note" ) ds = new DataSink( DataSink::Notes ); else @@ -109,73 +110,130 @@ osync_trace(TRACE_ENTRY, " %s(%p, %p, %p)", __func__, userdata, info, error); kDebug(); + OSyncPluginConfig *config = osync_plugin_info_get_config(info); + + if (!config) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get config."); + return false; + } if ( !Akonadi::Control::start() ) return false; - // fetch all akonadi collections - Akonadi::CollectionFetchJob *job = new Akonadi::CollectionFetchJob( + // fetch all akonadi calendar collections + Akonadi::CollectionFetchScope scope; + scope.setIncludeUnsubscribed( true ); + scope.setContentMimeTypes( QStringList() << "text/calendar" ); + + Akonadi::CollectionFetchJob *jobCal = new Akonadi::CollectionFetchJob( Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); - if ( !job->exec() ) + jobCal->setFetchScope(scope); + if ( !jobCal->exec() ) return false; - Akonadi::Collection::List cols = job->collections(); - kDebug() << "found" << cols.count() << "collections"; + 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("event", error); + foreach ( const Akonadi::Collection &col, colsCal ) { + kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); + kDebug() << " " << col.name() << col.url().url(); + OSyncPluginResource *res = osync_plugin_config_find_active_resource(config ,"event"); + if ( res ) + osync_plugin_config_remove_resource(config,res); + res = osync_plugin_resource_new( error ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vevent20", error ) ); + + + osync_plugin_resource_enable(res,TRUE); + osync_plugin_resource_set_objtype( res, "event" ); + osync_plugin_resource_set_name( res, col.name().toUtf8() ); // TODO: full path instead of the name + osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); - foreach ( const Akonadi::Collection &col, cols ) { - kDebug() << "available resource for" << col.name() << col.contentMimeTypes(); + osync_plugin_config_add_resource( config, res ); +// osync_plugin_resource_set_mime( config, "text/calendar" ); } + osync_objtype_sink_add_objformat_sink(sinkEvent,osync_objformat_sink_new ("vevent20", 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 ); + -// Akonadi::MimeTypeChecker todoMimeTypeChecker; -// todoMimeTypeChecker.addWantedMimeType( QLatin1String( "text/??todo" ) ); -// Akonadi::MimeTypeChecker journalMimeTypeChecker; -// journalMimeTypeChecker.addWantedMimeType( QLatin1String( "text/??notes" ) ); - // http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 -// FIXME removing this will make configuration obsolate and we can use the iteration -// over the akonadi items to build our configuration this however is helping - OSyncPluginConfig *config = osync_plugin_info_get_config( info ); - Akonadi::MimeTypeChecker contactMimeChecker; - contactMimeChecker.addWantedMimeType( KABC::Addressee::mimeType() ); - Akonadi::MimeTypeChecker calendarMimeTypeChecker; - calendarMimeTypeChecker.addWantedMimeType( QLatin1String( "text/calendar" ) ); - foreach ( const Akonadi::Collection &col, cols ) { - if ( col.contentMimeTypes().isEmpty() ) - continue; - OSyncPluginResource *res0 = 0; - OSyncObjTypeSink *sink = osync_objtype_sink_new(col.name().toLatin1(), error); - if (! sink ) //TODO errors? - continue; -// // QString formatName; - if ( calendarMimeTypeChecker.isWantedCollection( col ) ) { - kDebug() << "using resource for calendar" << col.name() << col.contentMimeTypes(); -// formatName = "vevent20"; //TODO get the Akonadi object format here? - res0 = osync_plugin_config_find_active_resource(config,"event"); - osync_plugin_resource_set_objtype( res0,"event" ); - } - else if ( contactMimeChecker.isWantedCollection( col ) ) { - kDebug() << "using resource contact for" << col.name() << col.contentMimeTypes(); - res0 = osync_plugin_config_find_active_resource(config,"contact"); - osync_plugin_resource_set_objtype( res0, "contact" ); - osync_plugin_resource_set_url( res0, col.url().url().toLatin1() ); - } else { - kDebug() << "creating resource for" << col.name() << col.contentMimeTypes(); - res0 = osync_plugin_resource_new( error ); - osync_plugin_resource_set_objtype( res0, osync_objtype_sink_get_name( sink ) ); - osync_plugin_resource_add_objformat_sink( res0, osync_objformat_sink_new( "", error ) ); - osync_plugin_config_add_resource( config, res0 ); - } - osync_plugin_resource_set_name( res0, col.name().toUtf8() ); // TODO: full path instead of the name - osync_plugin_resource_set_url( res0, col.url().url().toLatin1() ); - osync_plugin_resource_enable( res0, TRUE ); - osync_objtype_sink_set_enabled( sink, TRUE ); - osync_objtype_sink_set_available( sink, TRUE ); - osync_plugin_info_add_objtype( info, sink ); + // fetch all address books + Akonadi::CollectionFetchJob *jobAddr = new Akonadi::CollectionFetchJob( + Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); + scope.setContentMimeTypes( QStringList() << KABC::Addressee::mimeType() ); + jobAddr->setFetchScope(scope); + if ( !jobAddr->exec() ) + return false; + + Akonadi::Collection::List colsAddr = jobAddr->collections(); + kDebug() << "found" << colsAddr.count() << "collections"; + OSyncObjTypeSink *sinkAddr = osync_objtype_sink_new("contact", error); + foreach ( const Akonadi::Collection &col, colsAddr ) { + kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); + kDebug() << " " << col.name() << col.url().url(); + OSyncPluginResource *res = osync_plugin_config_find_active_resource(config ,"contact"); + if ( res ) + osync_plugin_config_remove_resource(config,res); + res = osync_plugin_resource_new( error ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vcard30", error ) ); + osync_plugin_resource_enable(res,TRUE); + osync_plugin_resource_set_objtype( res, "contact" ); + osync_plugin_resource_set_name( res, col.name().toUtf8() ); // TODO: full path instead of the name + osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); + + osync_plugin_config_add_resource( config, res ); +// osync_plugin_resource_set_mime( config, "text/calendar" ); } + osync_objtype_sink_add_objformat_sink(sinkAddr,osync_objformat_sink_new ("vcard30", error)); + osync_objtype_sink_set_enabled( sinkAddr, TRUE ); + osync_objtype_sink_set_available( sinkAddr, TRUE ); +// osync_objtype_sink_add_objformat_sink( sinkAddr, "vcard30" ); + osync_plugin_info_add_objtype( info, sinkAddr ); + // fetch all notes + Akonadi::CollectionFetchJob *jobNotes = new Akonadi::CollectionFetchJob( + Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); + scope.setContentMimeTypes( QStringList() << "application/x-vnd.kde.notes" ); + jobNotes->setFetchScope(scope); + if ( !jobNotes->exec() ) + return false; + + Akonadi::Collection::List colsNotes = jobNotes->collections(); + kDebug() << "found" << colsNotes.count() << "collections"; + OSyncObjTypeSink *sinkNotes = osync_objtype_sink_new("note", error); + + foreach ( const Akonadi::Collection &col, colsNotes ) { + kDebug() << "processing resource " << col.name() << col.contentMimeTypes(); + kDebug() << " " << col.name() << col.url().url(); + OSyncPluginResource *res = osync_plugin_config_find_active_resource(config ,"note"); + if ( res ) + osync_plugin_config_remove_resource(config,res); + res = osync_plugin_resource_new( error ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( "vnote11", error ) ); + + osync_plugin_resource_enable(res,TRUE); + osync_plugin_resource_set_objtype( res, "note" ); + osync_plugin_resource_set_name( res, col.name().toUtf8() ); // TODO: full path instead of the name + osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); + + osync_plugin_config_add_resource( config, res ); +// osync_plugin_resource_set_mime( config, "text/calendar" ); + } + + osync_objtype_sink_add_objformat_sink(sinkNotes,osync_objformat_sink_new ("vnote11", error)); + osync_objtype_sink_set_enabled( sinkNotes, TRUE ); + osync_objtype_sink_set_available( sinkNotes, TRUE ); +// osync_objtype_sink_add_objformat_sink( sinkNotes, "vjournal" ); + osync_plugin_info_add_objtype( info, sinkNotes ); // 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_identifier(version, "akonadi-sync"); osync_plugin_info_set_version(info, version); osync_version_unref(version); } @@ -210,7 +268,7 @@ osync_plugin_set_name(plugin, "akonadi-sync"); osync_plugin_set_longname(plugin, "Akonadi"); osync_plugin_set_description(plugin, "Plugin to synchronize with Akonadi"); - osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_OPTIONAL_CONFIGURATION); + osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_NEEDS_CONFIGURATION); osync_plugin_set_initialize(plugin, akonadi_initialize); osync_plugin_set_finalize(plugin, akonadi_finalize); osync_plugin_set_discover(plugin, akonadi_discover); @@ -234,3 +292,4 @@ } }// extern "C" + |
From: <svn...@op...> - 2010-09-18 18:32:54
|
Author: deloptes Date: Sat Sep 18 20:32:44 2010 New Revision: 6131 URL: http://www.opensync.org/changeset/6131 Log: Changed discover funtion to discover root akonadi collections TODO: find calendar and other components in collection discover capabilities and objecttypes and format Removed write permitions for CMakeLists.txt and src files. Modified: plugins/akonadi-sync/trunk/CMakeLists.txt (props changed) plugins/akonadi-sync/trunk/src/CMakeLists.txt (props changed) plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp plugins/akonadi-sync/trunk/src/akonadisink.cpp Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Fri Sep 17 21:10:24 2010 (r6130) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Sat Sep 18 20:32:44 2010 (r6131) @@ -10,15 +10,5 @@ </Formats> <ObjType>contact</ObjType> </Resource> - <Resource> - <Enabled>1</Enabled> - <Formats> - <Format> - <Name>vevent20</Name> - </Format> - </Formats> - <ObjType>event</ObjType> - <Url>default</Url> - </Resource> </Resources> </config> Modified: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Fri Sep 17 21:10:24 2010 (r6130) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Sat Sep 18 20:32:44 2010 (r6131) @@ -1,4 +1,5 @@ /* + Copyright (c) 2010 Emanoil Kotsev <del...@ya...> Copyright (c) 2008 Volker Krause <vk...@kd...> This library is free software; you can redistribute it and/or modify it @@ -26,6 +27,7 @@ #include <akonadi/mimetypechecker.h> #include <kabc/addressee.h> +// #include <akonadi/collectionfilterproxymodel.h> #include <KComponentData> #include <KDebug> @@ -75,7 +77,7 @@ OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; QString sinkName( osync_objtype_sink_get_name( sink ) ); kDebug() << "###" << sinkName; - osync_trace(TRACE_INTERNAL, " EKO %s", osync_objtype_sink_get_name( sink )); + osync_trace(TRACE_INTERNAL, " %s", osync_objtype_sink_get_name( sink )); DataSink *ds = NULL; if ( sinkName == "event" ) @@ -93,18 +95,18 @@ if ( !ds->initialize( plugin, info, sink, error ) ) { delete ds; delete mainSink; - osync_trace(TRACE_EXIT_ERROR, "EKO %s: NULL", __func__); + osync_trace(TRACE_EXIT_ERROR, " %s: NULL", __func__); return 0; } } - osync_trace(TRACE_EXIT, "EKO %s: %p", __func__, mainSink); + osync_trace(TRACE_EXIT, " %s: %p", __func__, mainSink); return mainSink; } static osync_bool akonadi_discover(OSyncPluginInfo *info, void *userdata, OSyncError **error ) { - osync_trace(TRACE_ENTRY, "EKO %s(%p, %p, %p)", __func__, userdata, info, error); + osync_trace(TRACE_ENTRY, " %s(%p, %p, %p)", __func__, userdata, info, error); kDebug(); if ( !Akonadi::Control::start() ) @@ -118,70 +120,57 @@ Akonadi::Collection::List cols = job->collections(); kDebug() << "found" << cols.count() << "collections"; - osync_trace(TRACE_INTERNAL, "EKO objs# %i", cols.count()); - OSyncPluginConfig *config = osync_plugin_info_get_config( info ); + foreach ( const Akonadi::Collection &col, cols ) { + kDebug() << "available resource for" << col.name() << col.contentMimeTypes(); + } +// Akonadi::MimeTypeChecker todoMimeTypeChecker; +// todoMimeTypeChecker.addWantedMimeType( QLatin1String( "text/??todo" ) ); +// Akonadi::MimeTypeChecker journalMimeTypeChecker; +// journalMimeTypeChecker.addWantedMimeType( QLatin1String( "text/??notes" ) ); + // http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 +// FIXME removing this will make configuration obsolate and we can use the iteration +// over the akonadi items to build our configuration this however is helping + OSyncPluginConfig *config = osync_plugin_info_get_config( info ); Akonadi::MimeTypeChecker contactMimeChecker; contactMimeChecker.addWantedMimeType( KABC::Addressee::mimeType() ); - - Akonadi::MimeTypeChecker eventMimeTypeChecker; - eventMimeTypeChecker.addWantedMimeType( QLatin1String( "text/calendar" ) ); -// http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 -// FIXME removing this will make configuration obsolate and we can use the iteration -// over the akonadi items to build our configuration - OSyncList *s = NULL, *list = osync_plugin_info_get_objtype_sinks(info); - for ( s = list; s; s = s->next ) { - OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; -//try to replace the resources with akonai own data - foreach ( const Akonadi::Collection &col, cols ) { + Akonadi::MimeTypeChecker calendarMimeTypeChecker; + calendarMimeTypeChecker.addWantedMimeType( QLatin1String( "text/calendar" ) ); + foreach ( const Akonadi::Collection &col, cols ) { + if ( col.contentMimeTypes().isEmpty() ) + continue; + OSyncPluginResource *res0 = 0; + OSyncObjTypeSink *sink = osync_objtype_sink_new(col.name().toLatin1(), error); + if (! sink ) //TODO errors? + continue; +// // QString formatName; + if ( calendarMimeTypeChecker.isWantedCollection( col ) ) { + kDebug() << "using resource for calendar" << col.name() << col.contentMimeTypes(); +// formatName = "vevent20"; //TODO get the Akonadi object format here? + res0 = osync_plugin_config_find_active_resource(config,"event"); + osync_plugin_resource_set_objtype( res0,"event" ); + } + else if ( contactMimeChecker.isWantedCollection( col ) ) { + kDebug() << "using resource contact for" << col.name() << col.contentMimeTypes(); + res0 = osync_plugin_config_find_active_resource(config,"contact"); + osync_plugin_resource_set_objtype( res0, "contact" ); + osync_plugin_resource_set_url( res0, col.url().url().toLatin1() ); + } else { kDebug() << "creating resource for" << col.name() << col.contentMimeTypes(); - QString formatName; - OSyncPluginResource *res = 0; - if ( eventMimeTypeChecker.isWantedCollection( col ) ) { - res = osync_plugin_config_find_active_resource(config, "event"); - formatName = "vevent20"; //TODO get the Akonadi object format here - } - else if ( contactMimeChecker.isWantedCollection( col ) ) { - res = osync_plugin_config_find_active_resource(config, "contact"); - formatName = "vcard30"; - } - else - continue; - - if (! res ) { - res = osync_plugin_resource_new( error ); - osync_plugin_config_add_resource( config, res ); - osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( formatName.toLatin1(), error ) ); - } -// find the object fomat -// OSyncObjFormat *format = 0; -// OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( info ); -// -// OSyncList *objformatsinks = osync_plugin_resource_get_objformat_sinks(res); -// for (OSyncList *r = objformatsinks;r;r = r->next) { -// OSyncObjFormatSink *objformatsink = (OSyncObjFormatSink *) r->data; -// if (!strcmp(formatName.toLatin1(), osync_objformat_sink_get_objformat(objformatsink))) { -// format = osync_format_env_find_objformat( formatenv, formatName.toLatin1() ); -// osync_plugin_resource_set_preferred_format( res, formatName ); -// break; -// } -// } - osync_plugin_resource_set_name( res, col.name().toLatin1() ); // TODO: full path instead of the name -// if ( !strcmp(col.url().url().toLatin1(),osync_plugin_resource_get_url(res) ) ) - osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); - osync_plugin_resource_set_objtype( res, osync_objtype_sink_get_name( sink ) ); - // NOTE here we can overwrite some settings on the fly -// osync_plugin_resource_set_mime(res, xxxx); -// osync_plugin_resource_set_preferred_format(); - - if ( ! osync_plugin_resource_is_enabled(res) ) - osync_plugin_resource_enable( res, TRUE ); - osync_objtype_sink_enable_hashtable(sink, TRUE); + res0 = osync_plugin_resource_new( error ); + osync_plugin_resource_set_objtype( res0, osync_objtype_sink_get_name( sink ) ); + osync_plugin_resource_add_objformat_sink( res0, osync_objformat_sink_new( "", error ) ); + osync_plugin_config_add_resource( config, res0 ); } + osync_plugin_resource_set_name( res0, col.name().toUtf8() ); // TODO: full path instead of the name + osync_plugin_resource_set_url( res0, col.url().url().toLatin1() ); + osync_plugin_resource_enable( res0, TRUE ); + osync_objtype_sink_set_enabled( sink, TRUE ); osync_objtype_sink_set_available( sink, TRUE ); + osync_plugin_info_add_objtype( info, sink ); } - osync_list_free(list); + // set information about the peer (KDE itself) { OSyncVersion *version = osync_version_new(error); @@ -221,7 +210,7 @@ osync_plugin_set_name(plugin, "akonadi-sync"); osync_plugin_set_longname(plugin, "Akonadi"); osync_plugin_set_description(plugin, "Plugin to synchronize with Akonadi"); -// osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_NO_CONFIGURATION); + osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_OPTIONAL_CONFIGURATION); osync_plugin_set_initialize(plugin, akonadi_initialize); osync_plugin_set_finalize(plugin, akonadi_finalize); osync_plugin_set_discover(plugin, akonadi_discover); Modified: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadisink.cpp Fri Sep 17 21:10:24 2010 (r6130) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Sat Sep 18 20:32:44 2010 (r6131) @@ -34,7 +34,7 @@ bool AkonadiSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncError ** error) { - Q_ASSERT( plugin ); +// Q_ASSERT( plugin ); kDebug(); OSyncObjTypeSink *sink = osync_objtype_main_sink_new( error ); osync_plugin_info_set_main_sink( info, sink ); |
From: <svn...@op...> - 2010-09-17 19:10:34
|
Author: deloptes Date: Fri Sep 17 21:10:24 2010 New Revision: 6130 URL: http://www.opensync.org/changeset/6130 Log: - cleaned up discover - todos, notes (journal) and calendar are subtypes TODO: there will be some work on calendar items in initialize - respectively for the initial discover process we use only events and contacts Modified: plugins/akonadi-sync/trunk/src/akonadi-sync plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Modified: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- plugins/akonadi-sync/trunk/src/akonadi-sync Fri Sep 17 13:30:52 2010 (r6129) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Fri Sep 17 21:10:24 2010 (r6130) @@ -20,25 +20,5 @@ <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>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 Fri Sep 17 13:30:52 2010 (r6129) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Fri Sep 17 21:10:24 2010 (r6130) @@ -30,8 +30,6 @@ #include <KComponentData> #include <KDebug> #include <KUrl> -// for different sub mime types -#include <akonadi/kcal/incidencemimetypevisitor.h> #include <QCoreApplication> #include <QStringList> @@ -124,103 +122,66 @@ OSyncPluginConfig *config = osync_plugin_info_get_config( info ); -// TODO do iteration on subtypes -// akonadi/kcal/incidencemimetypevisitor.h -// IncidenceMimeTypeVisitor *mimeTypeVisitor = new IncidenceMimeTypeVisitor(); Akonadi::MimeTypeChecker contactMimeChecker; contactMimeChecker.addWantedMimeType( KABC::Addressee::mimeType() ); -// Akonadi::MimeTypeChecker todoMimeChecker; -// todoMimeChecker.addWantedMimeType( mimeTypeVisitor->todoMimeType() ); - Akonadi::MimeTypeChecker eventMimeTypeChecker; - eventMimeTypeChecker.addWantedMimeType( QLatin1String( "text/calendar" ) ); -// eventMimeTypeChecker.addWantedMimeType( QString ( mimeTypeVisitor->eventMimeType()) ); //was Latin1String -// Akonadi::MimeTypeChecker journalMimeTypeChecker; -// journalMimeTypeChecker.addWantedMimeType( QString ( mimeTypeVisitor->journalMimeType()) ); //was Latin1String -// Akonadi::MimeTypeChecker busyMimeTypeChecker; -// busyMimeTypeChecker.addWantedMimeType( QString ( mimeTypeVisitor->freeBusyMimeType()) ); //was Latin1String - + Akonadi::MimeTypeChecker eventMimeTypeChecker; + eventMimeTypeChecker.addWantedMimeType( QLatin1String( "text/calendar" ) ); // http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 +// FIXME removing this will make configuration obsolate and we can use the iteration +// over the akonadi items to build our configuration OSyncList *s = NULL, *list = osync_plugin_info_get_objtype_sinks(info); for ( s = list; s; s = s->next ) { OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; - osync_objtype_sink_set_available( sink, TRUE ); - } - osync_list_free(list); - -//try to replace the resources with akonai native - foreach ( const Akonadi::Collection &col, cols ) { - kDebug() << "creating resource for" << col.name() << col.contentMimeTypes(); -// osync_trace(TRACE_ENTRY, "EKO %s ->mime: %s", col.name(), col.contentMimeTypes() ); - -// if ( !contactMimeChecker.isWantedCollection( col ) ) // ### TODO -// continue; -// if ( col.contentMimeTypes().isEmpty() ) -// continue; -//FIXME here we rather replace the existing ressources and not add new ones - - QString formatName; - OSyncObjTypeSink *sink = 0; - OSyncPluginResource *res = 0; - OSyncObjFormat *format = 0; - OSyncFormatEnv *formatenv = 0; - if ( eventMimeTypeChecker.isWantedCollection( col ) ) { - sink = osync_plugin_info_find_objtype(info, "event"); - res = osync_plugin_config_find_active_resource(config, "event"); - formatName = "vevent20"; //TODO get the Akonadi object format here - } - else if ( contactMimeChecker.isWantedCollection( col ) ) { - sink = osync_plugin_info_find_objtype(info, "contact"); - res = osync_plugin_config_find_active_resource(config, "contact"); - formatName = "vcard30"; - } -// TODO -// else if ( todoMimeChecker.isWantedCollection( col ) ) { -// sink = osync_plugin_info_find_objtype(info, "todo"); -// res = osync_plugin_config_find_active_resource(config, "todo"); -// formatName = "vtodo20"; -// } -// else if ( journalMimeTypeChecker.isWantedCollection( col ) ) { -// sink = osync_plugin_info_find_objtype(info, "note"); -// res = osync_plugin_config_find_active_resource(config, "note"); -// formatName = "vjournal"; -// } -// NOTE is this needed too? -// else if ( busyMimeTypeChecker.isWantedCollection( col ) ) { -// sink = osync_plugin_info_find_objtype(info, "note"); -// res = osync_plugin_config_find_active_resource(config, "note"); -// formatName = "vjournal"; -// } - else - continue; - -// find the object fomat - formatenv = osync_plugin_info_get_format_env( info ); +//try to replace the resources with akonai own data + foreach ( const Akonadi::Collection &col, cols ) { + kDebug() << "creating resource for" << col.name() << col.contentMimeTypes(); + QString formatName; + OSyncPluginResource *res = 0; + if ( eventMimeTypeChecker.isWantedCollection( col ) ) { + res = osync_plugin_config_find_active_resource(config, "event"); + formatName = "vevent20"; //TODO get the Akonadi object format here + } + else if ( contactMimeChecker.isWantedCollection( col ) ) { + res = osync_plugin_config_find_active_resource(config, "contact"); + formatName = "vcard30"; + } + else + continue; - OSyncList *objformatsinks = osync_plugin_resource_get_objformat_sinks(res); - for (OSyncList *r = objformatsinks;r;r = r->next) { - OSyncObjFormatSink *objformatsink = (OSyncObjFormatSink *) r->data; - if (strcmp(formatName.toLatin1(), osync_objformat_sink_get_objformat(objformatsink))) { - format = osync_format_env_find_objformat( formatenv, formatName.toLatin1() ); - break; + if (! res ) { + res = osync_plugin_resource_new( error ); + osync_plugin_config_add_resource( config, res ); + osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( formatName.toLatin1(), error ) ); } - } -// // TODO error handling? - if ( ! osync_plugin_resource_is_enabled(res) ) - osync_plugin_resource_enable( res, TRUE ); - osync_plugin_resource_set_name( res, col.name().toLatin1() ); // TODO: full path instead of the name - osync_plugin_resource_set_url( res, col.url().url().toLatin1() );// FIXME do I need this -// osync_objtype_sink_enable_hashtable(sink, TRUE); -// { FIXME: Autoadding of format into the config magic I suppose -// OSyncObjFormat *format = osync_format_env_find_objformat(formatenv, "vevent20"); -// osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( formatName.toLatin1(), error ) ); +// find the object fomat +// OSyncObjFormat *format = 0; +// OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( info ); // -// osync_plugin_config_add_resource( config, res ); -// } - if ( sink ) - osync_plugin_resource_set_objtype( res, osync_objtype_sink_get_name( sink ) ); - osync_trace(TRACE_EXIT, "%s", __func__); +// OSyncList *objformatsinks = osync_plugin_resource_get_objformat_sinks(res); +// for (OSyncList *r = objformatsinks;r;r = r->next) { +// OSyncObjFormatSink *objformatsink = (OSyncObjFormatSink *) r->data; +// if (!strcmp(formatName.toLatin1(), osync_objformat_sink_get_objformat(objformatsink))) { +// format = osync_format_env_find_objformat( formatenv, formatName.toLatin1() ); +// osync_plugin_resource_set_preferred_format( res, formatName ); +// break; +// } +// } + osync_plugin_resource_set_name( res, col.name().toLatin1() ); // TODO: full path instead of the name +// if ( !strcmp(col.url().url().toLatin1(),osync_plugin_resource_get_url(res) ) ) + osync_plugin_resource_set_url( res, col.url().url().toLatin1() ); + osync_plugin_resource_set_objtype( res, osync_objtype_sink_get_name( sink ) ); + // NOTE here we can overwrite some settings on the fly +// osync_plugin_resource_set_mime(res, xxxx); +// osync_plugin_resource_set_preferred_format(); + + if ( ! osync_plugin_resource_is_enabled(res) ) + osync_plugin_resource_enable( res, TRUE ); + osync_objtype_sink_enable_hashtable(sink, TRUE); + } + osync_objtype_sink_set_available( sink, TRUE ); } + osync_list_free(list); // set information about the peer (KDE itself) { OSyncVersion *version = osync_version_new(error); @@ -229,6 +190,7 @@ osync_plugin_info_set_version(info, version); osync_version_unref(version); } + osync_trace(TRACE_EXIT, "%s", __func__); return TRUE; } @@ -251,10 +213,10 @@ OSyncPlugin *plugin = osync_plugin_new( error ); if ( !plugin ) { - osync_trace(TRACE_EXIT_ERROR, "%s: Unable to register: %s", __func__, osync_error_print(error)); - osync_error_unref(error); - return FALSE; - } + osync_trace(TRACE_EXIT_ERROR, "%s: Unable to instantiate: %s", __func__, osync_error_print(error)); + osync_error_unref(error); + return FALSE; + } osync_plugin_set_name(plugin, "akonadi-sync"); osync_plugin_set_longname(plugin, "Akonadi"); @@ -266,8 +228,9 @@ osync_plugin_set_start_type(plugin, OSYNC_START_TYPE_PROCESS); if ( ! osync_plugin_env_register_plugin(env, plugin, error) ) { - osync_error_unref(error); - return FALSE; + osync_trace(TRACE_EXIT_ERROR, "%s: Unable to register: %s", __func__, osync_error_print(error)); + osync_error_unref(error); + return FALSE; } osync_plugin_unref(plugin); |
From: <svn...@op...> - 2010-09-17 11:31:03
|
Author: deloptes Date: Fri Sep 17 13:30:52 2010 New Revision: 6129 URL: http://www.opensync.org/changeset/6129 Log: - add a basic README with build instructions - remove /opt/testing/opensync from CMakeLists.txt Added: plugins/akonadi-sync/trunk/README (contents, props changed) Modified: plugins/akonadi-sync/trunk/CMakeLists.txt Modified: plugins/akonadi-sync/trunk/CMakeLists.txt ============================================================================== --- plugins/akonadi-sync/trunk/CMakeLists.txt Fri Sep 17 10:08:16 2010 (r6128) +++ plugins/akonadi-sync/trunk/CMakeLists.txt Fri Sep 17 13:30:52 2010 (r6129) @@ -1,6 +1,7 @@ # # # (c) Deloptes del...@ya... +# # CMAKE_MINIMUM_REQUIRED( VERSION 2.4.4 ) @@ -13,7 +14,8 @@ SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules" ) # SET ( OpenSync_DIR "/opt/testing/opensync" ) -SET (PKG_CONFIG_PATH "/opt/testing/opensync/lib/pkgconfig" ) +#SET (PKG_CONFIG_PATH "/opt/testing/opensync/lib/pkgconfig" ) +SET (PKG_CONFIG_PATH ${PKG_CONFIG_PATH} $ENV{PKG_CONFIG_PATH} ) SET( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS} ) # SET( CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -ggdb -g -O2 -Wall -W " ${CMAKE_CXX_FLAGS_DEBUG} ${KDE4_ENABLE_EXCEPTIONS} ) Added: plugins/akonadi-sync/trunk/README ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/README Fri Sep 17 13:30:52 2010 (r6129) @@ -0,0 +1,29 @@ +OpenSync Framework +================== + +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 + +Requirements +============ +- libopensync1 (v.0.40) + + +Installation +============ +export PKG_CONFIG_PATH=/opt/custom/opensync/lib/pkgconfig + +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=$prefix /path/to/opensync/source/ +make +make install + +Links +===== + +[1] http://www.opensync.org/wiki/download +[2] http://cryptomilch.de/~dgollub/talks/OpenSync_FOSDEM_2007.pdf + |
From: <svn...@op...> - 2010-09-17 08:08:27
|
Author: deloptes Date: Fri Sep 17 10:08:16 2010 New Revision: 6128 URL: http://www.opensync.org/changeset/6128 Log: akonadi-sync pluging - ported to build with kde 4.5 and libopensync1 (v.0.40) Added: plugins/akonadi-sync/trunk/CMakeLists.txt (contents, props changed) plugins/akonadi-sync/trunk/cmake/ plugins/akonadi-sync/trunk/cmake/modules/ plugins/akonadi-sync/trunk/cmake/modules/FindOpenSync.cmake plugins/akonadi-sync/trunk/cmake/modules/OpenSyncDefaults.cmake plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPackaging.cmake plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPlatforms.cmake plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPlugin.cmake plugins/akonadi-sync/trunk/src/ plugins/akonadi-sync/trunk/src/CMakeLists.txt (contents, props changed) plugins/akonadi-sync/trunk/src/akonadi-sync (contents, props changed) plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/akonadisink.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/akonadisink.h (contents, props changed) plugins/akonadi-sync/trunk/src/datasink.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/datasink.h (contents, props changed) plugins/akonadi-sync/trunk/src/sinkbase.cpp (contents, props changed) plugins/akonadi-sync/trunk/src/sinkbase.h (contents, props changed) Added: plugins/akonadi-sync/trunk/CMakeLists.txt ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/CMakeLists.txt Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,58 @@ +# +# +# (c) Deloptes del...@ya... +# + +CMAKE_MINIMUM_REQUIRED( VERSION 2.4.4 ) +PROJECT( top-level C CXX ) + +SET( VERSION "0.40" ) +SET ( PROJECT_NAME akonadi_opensync_plugin ) + +# SET ( CMAKE_INSTALL_PREFIX "/opt/testing/opensync" ) + +SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules" ) +# SET ( OpenSync_DIR "/opt/testing/opensync" ) +SET (PKG_CONFIG_PATH "/opt/testing/opensync/lib/pkgconfig" ) +SET( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS} ) +# 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 ) +# -Werror + +FIND_PACKAGE( KdepimLibs REQUIRED ) +FIND_PACKAGE( Akonadi REQUIRED ) +FIND_PACKAGE( GLIB2 REQUIRED ) +FIND_PACKAGE( KDE4 REQUIRED ) +FIND_PACKAGE( OpenSync REQUIRED ) +FIND_PACKAGE( Automoc4 REQUIRED ) + +INCLUDE( CheckIncludeFile ) + +INCLUDE( Documentation ) +INCLUDE( OpenSyncDefaults ) +INCLUDE ( OpenSyncPlugin ) +INCLUDE( OpenSyncInternal ) +INCLUDE( OpenSyncPackaging ) +# INCLUDE( Testing ) + + + +# include_directories( ${KDE4_INCLUDES} "/opt/testing/opensync/include" ) + +# include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${KDEPIMLIBS_INCLUDE_DIR} ${OPENSYNC_INCLUDE_DIR} "/opt/testing/opensync/include" ) +include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${KDEPIMLIBS_INCLUDE_DIR} ${OPENSYNC_INCLUDE_DIR} ${OPENSYNC_INCLUDE_DIR}/helper ${OPENSYNC_INCLUDE_DIR}/plugin ) + +include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ) + +# include_directories( ) + +# link_directories( ${KDE4_LIB_DIR} ${KDEPIMLIBS_LIB_DIR} ${OPENSYNC_LIBRARIES_DIR} "/opt/testing/opensync/lib" ) +link_directories( ${KDE4_LIB_DIR} ${KDEPIMLIBS_LIB_DIR} ${OPENSYNC_LIBRARIES_DIR} ) + + +ADD_SUBDIRECTORY( src ) + + +OPENSYNC_PACKAGE( ${PROJECT_NAME} ${VERSION} ) Added: plugins/akonadi-sync/trunk/cmake/modules/FindOpenSync.cmake ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/cmake/modules/FindOpenSync.cmake Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,93 @@ +# - Try to find OpenSync +# Find OpenSync headers, libraries and the answer to all questions. +# +# OPENSYNC_FOUND True if OpenSync got found +# OPENSYNC_INCLUDE_DIRS Location of OpenSync headers +# OPENSYNC_LIBRARIES List of libaries to use OpenSync +# +# Copyright (c) 2007 Daniel Gollub <go...@b1...> +# Copyright (c) 2007 Alban Browaeys <pr...@ya...> +# Copyright (c) 2008 Bjoern Ricks <bjo...@go...> +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# $Id: deloptes$ +# + +# Take care about libopensync.pc settings +INCLUDE( FindPkgConfig ) + +IF ( OpenSync_FIND_REQUIRED ) + SET( _pkgconfig_REQUIRED "REQUIRED" ) +ELSE( OpenSync_FIND_REQUIRED ) + SET( _pkgconfig_REQUIRED "" ) +ENDIF ( OpenSync_FIND_REQUIRED ) + +IF ( OPENSYNC_MIN_VERSION ) + PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync1 >=${OPENSYNC_MIN_VERSION} ) +ELSE ( OPENSYNC_MIN_VERSION ) + PKG_SEARCH_MODULE( OPENSYNC ${_pkgconfig_REQUIRED} libopensync1 ) +ENDIF ( OPENSYNC_MIN_VERSION ) + +FIND_PROGRAM( PKGCONFIG_EXECUTABLE NAMES pkg-config ) + +IF ( PKGCONFIG_EXECUTABLE ) + EXEC_PROGRAM( ${PKGCONFIG_EXECUTABLE} ARGS libopensync1 --variable=datadir OUTPUT_VARIABLE _opensync_data_DIR ) + STRING( REGEX REPLACE "[\r\n]" " " _opensync_data_DIR "${_opensync_data_DIR}" ) +ENDIF ( PKGCONFIG_EXECUTABLE ) + +FIND_PATH( OPENSYNC_CMAKE_MODULES "OpenSyncInternal.cmake" PATHS "${_opensync_data_DIR}" PATH_SUFFIXES "cmake/modules" NO_DEFAULT_PATH) +FIND_PATH( OPENSYNC_CMAKE_MODULES "OpenSyncInternal.cmake" PATH_SUFFIXES "cmake/modules" ) + +IF ( OPENSYNC_CMAKE_MODULES ) + SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${OPENSYNC_CMAKE_MODULES}" ) +ELSE ( OPENSYNC_CMAKE_MODULES ) + IF ( OpenSync_FIND_REQUIRED ) + MESSAGE( FATAL_ERROR "OpenSync cmake modules not found. Have you installed opensync core or did you set your PKG_CONFIG_PATH if installing in a non system directory ?" ) + ENDIF ( OpenSync_FIND_REQUIRED ) +ENDIF ( OPENSYNC_CMAKE_MODULES ) + + +# Look for OpenSync include dir and libraries without pkg-config +IF( NOT OPENSYNC_FOUND AND NOT PKG_CONFIG_FOUND ) + # Fallback if pkg-config doesn't exist + FIND_PATH( OPENSYNC_INCLUDE_DIRS opensync/opensync.h PATH_SUFFIXES libopensync libopensync1 + PATHS + /opt/local/include/ + /sw/include/ + /usr/local/include/ + /usr/include + /opt/testing/opensync/include ) + + FIND_LIBRARY( OPENSYNC_LIBRARIES opensync + PATHS + /opt/local/lib + /sw/lib + /usr/lib + /usr/local/lib + /usr/lib64 + /usr/local/lib64 + /opt/lib64 + /opt/testing/opensync/lib ) + + # Report results + IF ( OPENSYNC_LIBRARIES AND OPENSYNC_INCLUDE_DIRS ) + SET( OPENSYNC_FOUND 1 ) + IF ( NOT OpenSync_FIND_QUIETLY ) + MESSAGE( STATUS "Found OpenSync: ${OPENSYNC_LIBRARIES}" ) + ENDIF ( NOT OpenSync_FIND_QUIETLY ) + ELSE ( OPENSYNC_LIBRARIES AND OPENSYNC_INCLUDE_DIRS ) + IF ( OpenSync_FIND_REQUIRED ) + MESSAGE( SEND_ERROR "Could NOT find OpenSync" ) + ELSE ( OpenSync_FIND_REQUIRED ) + IF ( NOT OpenSync_FIND_QUIETLY ) + MESSAGE( STATUS "Could NOT find OpenSync" ) + ENDIF ( NOT OpenSync_FIND_QUIETLY ) + ENDIF ( OpenSync_FIND_REQUIRED ) + ENDIF ( OPENSYNC_LIBRARIES AND OPENSYNC_INCLUDE_DIRS ) +ENDIF( NOT OPENSYNC_FOUND AND NOT PKG_CONFIG_FOUND ) + +# Hide advanced variables from CMake GUIs +MARK_AS_ADVANCED( OPENSYNC_LIBRARIES OPENSYNC_INCLUDE_DIRS ) + Added: plugins/akonadi-sync/trunk/cmake/modules/OpenSyncDefaults.cmake ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/cmake/modules/OpenSyncDefaults.cmake Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,57 @@ +# - OpenSync Internal Definitions and Macros +# Set OpenSync helper macros to build Plugins and internal definitions +# for OpenSync data directories like the locations of capabilities files, +# plugin configuration, ... +# +# OPENSYNC_PLUGINDIR Location of OpenSync plugins +# OPENSYNC_FORMATSDIR Location of OpenSync format plugins +# OPENSYNC_CAPABILITIESDIR Location of OpenSync capabilities files +# OPENSYNC_CONFIGDIR Location of OpenSync plugin default configurations/templates +# OPENSYNC_DESCRIPTIONSDIR Location of OpenSync descriptions files +# OPENSYNC_SCHEMASDIR Location of OpenSync related schema files +# +# OPENSYNC_INCLUDE_DIR Location of OpenSync headers +# OPENSYNC_DATA_DIR Location of OpenSync data directory +# +# OPENSYNC_TRACE True if tracing is enabled (debugging with env. var. OSYNC_TRACE) +# OPENSYNC_DEBUG_MODULES True if modules shouldn't get unloaded by OpenSync, to keep symbols of plugins +# OPENSYNC_UNITTESTS True if unit tests should be build +# +# Copyright (c) 2007-2008 Daniel Gollub <go...@b1...> +# + +INCLUDE( OpenSyncPlatforms ) + +# OpenSync macros and default settings: + +# Installation directories: + +SET( OPENSYNC_API_DIR "libopensync${OPENSYNC_LIBVERSION_SOVERSION}" ) +SET( OPENSYNC_PLUGINDIR "${LIB_INSTALL_DIR}/${OPENSYNC_API_DIR}/plugins" CACHE PATH "OpenSync plugin directory" ) +SET( OPENSYNC_FORMATSDIR "${LIB_INSTALL_DIR}/${OPENSYNC_API_DIR}/formats" CACHE PATH "OpenSync format plugin directory" ) +SET( OPENSYNC_PYTHON_PLUGINDIR "${LIB_INSTALL_DIR}/${OPENSYNC_API_DIR}/python-plugins" CACHE PATH "OpenSync python plugin directory" ) + +SET( OPENSYNC_CAPABILITIESDIR "${SHARE_INSTALL_DIR}/${OPENSYNC_API_DIR}/capabilities" CACHE PATH "OpenSync capabilities directory" ) +SET( OPENSYNC_CONFIGDIR "${SHARE_INSTALL_DIR}/${OPENSYNC_API_DIR}/defaults" CACHE PATH "OpenSync plugin configuration directory" ) +SET( OPENSYNC_DESCRIPTIONSDIR "${SHARE_INSTALL_DIR}/${OPENSYNC_API_DIR}/descriptions" CACHE PATH "OpenSync descriptions directory" ) +SET( OPENSYNC_SCHEMASDIR "${SHARE_INSTALL_DIR}/${OPENSYNC_API_DIR}/schemas" CACHE PATH "OpenSync schemas directory" ) +SET( OPENSYNC_UPDATESDIR "${SHARE_INSTALL_DIR}/${OPENSYNC_API_DIR}/updates" CACHE PATH "OpenSync configuration updates directory" ) + + +SET( OPENSYNC_LIBRARIES_DIR "${LIB_INSTALL_DIR}" CACHE PATH "OpenSync library location" ) +SET( OPENSYNC_LIBEXEC_DIR "${LIBEXEC_INSTALL_DIR}/${OPENSYNC_API_DIR}" CACHE PATH "OpenSync libexec location" ) +SET( OPENSYNC_INCLUDE_DIR "${INCLUDE_INSTALL_DIR}/${OPENSYNC_API_DIR}" CACHE PATH "OpenSync headers location" ) +SET( OPENSYNC_DATA_DIR "${SHARE_INSTALL_DIR}/${OPENSYNC_API_DIR}" CACHE PATH "OpenSync data directory" ) + +# OpenSync build options: + +IF ( NOT CMAKE_BUILD_TYPE ) + SET( CMAKE_BUILD_TYPE RelWithDebInfo ) +ENDIF ( NOT CMAKE_BUILD_TYPE ) + +SET( OPENSYNC_TRACE TRUE CACHE BOOL "Debugging/Trace output of OpenSync" ) +SET( OPENSYNC_DEBUG_MODULES FALSE CACHE BOOL "Debugging modules. Avoid unload of modules." ) +SET( OPENSYNC_UNITTESTS FALSE CACHE BOOL "Build OpenSync unit tests." ) +SET( OPENSYNC_PYTHONBINDINGS TRUE CACHE BOOL "Build OpenSync with Python bindings." ) + + Added: plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPackaging.cmake ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPackaging.cmake Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,9 @@ +MACRO( OPENSYNC_PACKAGE _name _version ) + + SET( CPACK_GENERATOR "TGZ;TBZ2" ) # This line is need for a CMake (Version 2.4.7) Bug - Fixed in CVS + SET( CPACK_SOURCE_GENERATOR "TGZ;TBZ2") + SET( CPACK_SOURCE_PACKAGE_FILE_NAME "${_name}-${_version}" ) + SET( CPACK_SET_DESTDIR ON ) + INCLUDE( CPack ) + +ENDMACRO( OPENSYNC_PACKAGE ) Added: plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPlatforms.cmake ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPlatforms.cmake Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,23 @@ +# Copyright (c) 2007 Daniel Gollub <go...@b1...> + +# OpenSync platform macros: + +SET( LIB_SUFFIX "" CACHE STRING "The library directory suffix. 32bit empty string, 64 for 64bit." ) + +IF (NOT WIN32) + SET( LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" ) + SET( LIBEXEC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" ) + SET( LIBDATA_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The library data directory." ) + SET( BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin" ) + SET( SHARE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share" ) + SET( INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" ) +ELSE (NOT WIN32) + # Windows stuff goes here... + SET( LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" ) + SET( LIBEXEC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" ) + SET( LIBDATA_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The library data directory." ) + SET( BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin" ) + SET( SHARE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share" ) + SET( INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" ) +ENDIF (NOT WIN32) + Added: plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPlugin.cmake ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/cmake/modules/OpenSyncPlugin.cmake Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,50 @@ +## Build OpenSync plugins as module +MACRO( OPENSYNC_PLUGIN_ADD _pluginName ) + + SET( CMAKE_SHARED_MODULE_PREFIX "" ) + ADD_LIBRARY( ${_pluginName} MODULE ${ARGN} ) + +ENDMACRO( OPENSYNC_PLUGIN_ADD ) + +## Build OpenSync format plugins as module +MACRO( OPENSYNC_FORMAT_ADD _formatName ) + + SET( CMAKE_SHARED_MODULE_PREFIX "" ) + ADD_LIBRARY( ${_formatName} MODULE ${ARGN} ) + +ENDMACRO( OPENSYNC_FORMAT_ADD ) + +## Install plugin +MACRO( OPENSYNC_PLUGIN_INSTALL _pluginName ) + INSTALL( TARGETS ${_pluginName} DESTINATION ${OPENSYNC_PLUGINDIR} ) +ENDMACRO( OPENSYNC_PLUGIN_INSTALL ) + +## Install external plugin +### Got introduced to be able in future to move those plugins into +### a seperated directory, without fixing all plugin build environments +MACRO( OPENSYNC_EXTERNAL_PLUGIN_INSTALL _pluginName ) + INSTALL( FILES ${_pluginName} DESTINATION ${OPENSYNC_PLUGINDIR} ) +ENDMACRO( OPENSYNC_EXTERNAL_PLUGIN_INSTALL ) + +## Install format plugin +MACRO( OPENSYNC_FORMAT_INSTALL _pluginName ) + INSTALL( TARGETS ${_pluginName} DESTINATION ${OPENSYNC_FORMATSDIR} ) +ENDMACRO( OPENSYNC_FORMAT_INSTALL ) + +## Install plugin description files +MACRO( OPENSYNC_PLUGIN_DESCRIPTIONS _descFiles ) + INSTALL( FILES ${_descFiles} DESTINATION ${OPENSYNC_DESCRIPTIONSDIR} ) +ENDMACRO( OPENSYNC_PLUGIN_DESCRIPTIONS ) + +## Install plugin capabilities files +MACRO( OPENSYNC_PLUGIN_CAPABILITIES _capFiles ) + INSTALL( FILES ${_capFiles} DESTINATION ${OPENSYNC_CAPABILITIESDIR} ) +ENDMACRO( OPENSYNC_PLUGIN_CAPABILITIES ) + +## Install plugin default configuration +MACRO( OPENSYNC_PLUGIN_CONFIG _pluginConfig ) + + INSTALL( FILES ${_pluginConfig} DESTINATION ${OPENSYNC_CONFIGDIR} ) + +ENDMACRO( OPENSYNC_PLUGIN_CONFIG ) + Added: plugins/akonadi-sync/trunk/src/CMakeLists.txt ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/CMakeLists.txt Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,40 @@ + +#INCLUDE_DIRECTORIES( ${OPENSYNC_INCLUDE_DIRS} ${GLIB2_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ) +# + +SET( AKONADY_OPENSYNC_SRCS + akonadi_opensync.cpp + akonadisink.cpp + datasink.cpp + sinkbase.cpp +) + + +include_directories( ${AKONADI_INCLUDE_DIR} ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${KDEPIMLIBS_INCLUDE_DIR} ) +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") +# +link_directories( ${AKONADI_LIB_DIR} ${KDE4_LIB_DIR} ${KDEPIMLIBS_LIB_DIR} ${OPENSYNC_LIBRARIES_DIR} ${glib2LibDir} ) + +AUTOMOC4( akonadi-sync AKONADY_OPENSYNC_SRCS ) + + +OPENSYNC_PLUGIN_ADD( akonadi-sync ${AKONADY_OPENSYNC_SRCS} ) + +# ADD_DEPENDENCIES( akonadi-opensync akonadi_opensync.o akonadisink.o datasink.o sinkbase.o ) + +TARGET_LINK_LIBRARIES( akonadi-sync + ${OPENSYNC_LIBRARIES} + ${GLIB2_LIBRARIES} + ${KDE4_KDECORE_LIBS} + ${KDEPIMLIBS_AKONADI_LIBS} + ${KDEPIMLIBS_AKONADI_CONTACT_LIBS} + ${KDEPIMLIBS_KCAL_LIBS} +) + +###### INSTALL ################### +OPENSYNC_PLUGIN_INSTALL( akonadi-sync ) +OPENSYNC_PLUGIN_CONFIG( akonadi-sync ) +#INSTALL( FILES akonadi_opensync_plugin DESTINATION "/opt/testing/opensync" ) Added: plugins/akonadi-sync/trunk/src/akonadi-sync ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/akonadi-sync Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,44 @@ +<?xml version="1.0"?> +<config version="1.0"> + <Resources> + <Resource> + <Enabled>1</Enabled> + <Formats> + <Format> + <Name>vcard30</Name> + </Format> + </Formats> + <ObjType>contact</ObjType> + </Resource> + <Resource> + <Enabled>1</Enabled> + <Formats> + <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>note</ObjType> + <Url>default</Url> + </Resource> + </Resources> +</config> Added: plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/akonadi_opensync.cpp Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,284 @@ +/* + Copyright (c) 2008 Volker Krause <vk...@kd...> + + 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 + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "akonadisink.h" +#include "datasink.h" + +#include <akonadi/control.h> +#include <akonadi/collection.h> +#include <akonadi/collectionfetchjob.h> +#include <akonadi/mimetypechecker.h> + +#include <kabc/addressee.h> + +#include <KComponentData> +#include <KDebug> +#include <KUrl> +// for different sub mime types +#include <akonadi/kcal/incidencemimetypevisitor.h> + +#include <QCoreApplication> +#include <QStringList> + +#include <opensync/opensync.h> +#include <opensync/opensync-plugin.h> +#include <opensync/opensync-format.h> +#include <opensync/opensync-version.h> + +static KComponentData *kcd = 0; +static QCoreApplication *app = 0; + +static int fakeArgc = 0; +static char** fakeArgv = 0; + +extern "C" +{ + + static void* akonadi_initialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) + { + 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" ); + + // main sink + AkonadiSink *mainSink = new AkonadiSink(); + if ( !mainSink->initialize( plugin, info, error ) ) { + delete mainSink; + osync_trace(TRACE_EXIT_ERROR, "%s: NULL", __func__); + return 0; + } + + // object type sinks +// http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 +// 10) List looping is more standard +// --------------------------------- + + OSyncList *s = NULL, *list = osync_plugin_info_get_objtype_sinks(info); + for ( s = list; s; s = s->next ) { + OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; + QString sinkName( osync_objtype_sink_get_name( sink ) ); + kDebug() << "###" << sinkName; + osync_trace(TRACE_INTERNAL, " EKO %s", osync_objtype_sink_get_name( sink )); + + DataSink *ds = NULL; + if ( sinkName == "event" ) + ds = new DataSink( DataSink::Calendars ); + else if ( sinkName == "contact" ) + ds = new DataSink( DataSink::Contacts ); +// FIXME: implement todos an journal (notes) + else if ( sinkName == "todo" ) + ds = new DataSink( DataSink::Todos ); + else if ( sinkName == "note" ) + ds = new DataSink( DataSink::Notes ); + else + continue; + + if ( !ds->initialize( plugin, info, sink, error ) ) { + delete ds; + delete mainSink; + osync_trace(TRACE_EXIT_ERROR, "EKO %s: NULL", __func__); + return 0; + } + } + osync_trace(TRACE_EXIT, "EKO %s: %p", __func__, mainSink); + return mainSink; + + } + + static osync_bool akonadi_discover(OSyncPluginInfo *info, void *userdata, OSyncError **error ) + { + osync_trace(TRACE_ENTRY, "EKO %s(%p, %p, %p)", __func__, userdata, info, error); + kDebug(); + + if ( !Akonadi::Control::start() ) + return false; + + // fetch all akonadi collections + Akonadi::CollectionFetchJob *job = new Akonadi::CollectionFetchJob( + Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive ); + if ( !job->exec() ) + return false; + + Akonadi::Collection::List cols = job->collections(); + kDebug() << "found" << cols.count() << "collections"; + osync_trace(TRACE_INTERNAL, "EKO objs# %i", cols.count()); + + OSyncPluginConfig *config = osync_plugin_info_get_config( info ); + +// TODO do iteration on subtypes +// akonadi/kcal/incidencemimetypevisitor.h +// IncidenceMimeTypeVisitor *mimeTypeVisitor = new IncidenceMimeTypeVisitor(); + Akonadi::MimeTypeChecker contactMimeChecker; + contactMimeChecker.addWantedMimeType( KABC::Addressee::mimeType() ); +// Akonadi::MimeTypeChecker todoMimeChecker; +// todoMimeChecker.addWantedMimeType( mimeTypeVisitor->todoMimeType() ); + Akonadi::MimeTypeChecker eventMimeTypeChecker; + eventMimeTypeChecker.addWantedMimeType( QLatin1String( "text/calendar" ) ); + +// eventMimeTypeChecker.addWantedMimeType( QString ( mimeTypeVisitor->eventMimeType()) ); //was Latin1String +// Akonadi::MimeTypeChecker journalMimeTypeChecker; +// journalMimeTypeChecker.addWantedMimeType( QString ( mimeTypeVisitor->journalMimeType()) ); //was Latin1String +// Akonadi::MimeTypeChecker busyMimeTypeChecker; +// busyMimeTypeChecker.addWantedMimeType( QString ( mimeTypeVisitor->freeBusyMimeType()) ); //was Latin1String + +// http://www.opensync.org/wiki/devel/pluginPortingGuide-0.40 + OSyncList *s = NULL, *list = osync_plugin_info_get_objtype_sinks(info); + for ( s = list; s; s = s->next ) { + OSyncObjTypeSink *sink = (OSyncObjTypeSink*) s->data; + osync_objtype_sink_set_available( sink, TRUE ); + } + osync_list_free(list); + +//try to replace the resources with akonai native + foreach ( const Akonadi::Collection &col, cols ) { + kDebug() << "creating resource for" << col.name() << col.contentMimeTypes(); +// osync_trace(TRACE_ENTRY, "EKO %s ->mime: %s", col.name(), col.contentMimeTypes() ); + +// if ( !contactMimeChecker.isWantedCollection( col ) ) // ### TODO +// continue; +// if ( col.contentMimeTypes().isEmpty() ) +// continue; +//FIXME here we rather replace the existing ressources and not add new ones + + QString formatName; + OSyncObjTypeSink *sink = 0; + OSyncPluginResource *res = 0; + OSyncObjFormat *format = 0; + OSyncFormatEnv *formatenv = 0; + if ( eventMimeTypeChecker.isWantedCollection( col ) ) { + sink = osync_plugin_info_find_objtype(info, "event"); + res = osync_plugin_config_find_active_resource(config, "event"); + formatName = "vevent20"; //TODO get the Akonadi object format here + } + else if ( contactMimeChecker.isWantedCollection( col ) ) { + sink = osync_plugin_info_find_objtype(info, "contact"); + res = osync_plugin_config_find_active_resource(config, "contact"); + formatName = "vcard30"; + } +// TODO +// else if ( todoMimeChecker.isWantedCollection( col ) ) { +// sink = osync_plugin_info_find_objtype(info, "todo"); +// res = osync_plugin_config_find_active_resource(config, "todo"); +// formatName = "vtodo20"; +// } +// else if ( journalMimeTypeChecker.isWantedCollection( col ) ) { +// sink = osync_plugin_info_find_objtype(info, "note"); +// res = osync_plugin_config_find_active_resource(config, "note"); +// formatName = "vjournal"; +// } +// NOTE is this needed too? +// else if ( busyMimeTypeChecker.isWantedCollection( col ) ) { +// sink = osync_plugin_info_find_objtype(info, "note"); +// res = osync_plugin_config_find_active_resource(config, "note"); +// formatName = "vjournal"; +// } + else + continue; + +// find the object fomat + formatenv = osync_plugin_info_get_format_env( info ); + + OSyncList *objformatsinks = osync_plugin_resource_get_objformat_sinks(res); + for (OSyncList *r = objformatsinks;r;r = r->next) { + OSyncObjFormatSink *objformatsink = (OSyncObjFormatSink *) r->data; + if (strcmp(formatName.toLatin1(), osync_objformat_sink_get_objformat(objformatsink))) { + format = osync_format_env_find_objformat( formatenv, formatName.toLatin1() ); + break; + } + } +// // TODO error handling? + if ( ! osync_plugin_resource_is_enabled(res) ) + osync_plugin_resource_enable( res, TRUE ); + osync_plugin_resource_set_name( res, col.name().toLatin1() ); // TODO: full path instead of the name + osync_plugin_resource_set_url( res, col.url().url().toLatin1() );// FIXME do I need this +// osync_objtype_sink_enable_hashtable(sink, TRUE); +// { FIXME: Autoadding of format into the config magic I suppose +// OSyncObjFormat *format = osync_format_env_find_objformat(formatenv, "vevent20"); +// osync_plugin_resource_add_objformat_sink( res, osync_objformat_sink_new( formatName.toLatin1(), error ) ); +// +// osync_plugin_config_add_resource( config, res ); +// } + if ( sink ) + osync_plugin_resource_set_objtype( res, osync_objtype_sink_get_name( sink ) ); + osync_trace(TRACE_EXIT, "%s", __func__); + } + // 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_plugin_info_set_version(info, version); + osync_version_unref(version); + } + return TRUE; + } + + static void akonadi_finalize(void *userdata) + { + osync_trace(TRACE_ENTRY, "%s(%p)", __func__, userdata); + kDebug(); + AkonadiSink *sink = reinterpret_cast<AkonadiSink*>( userdata ); + delete sink; + delete kcd; + kcd = 0; + delete app; + app = 0; + osync_trace(TRACE_EXIT, "%s", __func__); + } + + KDE_EXPORT osync_bool get_sync_info(OSyncPluginEnv *env, OSyncError **error) + { + osync_trace(TRACE_ENTRY, "%s(%p)", __func__, env); + + OSyncPlugin *plugin = osync_plugin_new( error ); + if ( !plugin ) { + osync_trace(TRACE_EXIT_ERROR, "%s: Unable to register: %s", __func__, osync_error_print(error)); + osync_error_unref(error); + return FALSE; + } + + osync_plugin_set_name(plugin, "akonadi-sync"); + osync_plugin_set_longname(plugin, "Akonadi"); + osync_plugin_set_description(plugin, "Plugin to synchronize with Akonadi"); +// osync_plugin_set_config_type(plugin, OSYNC_PLUGIN_NO_CONFIGURATION); + osync_plugin_set_initialize(plugin, akonadi_initialize); + osync_plugin_set_finalize(plugin, akonadi_finalize); + osync_plugin_set_discover(plugin, akonadi_discover); + osync_plugin_set_start_type(plugin, OSYNC_START_TYPE_PROCESS); + + if ( ! osync_plugin_env_register_plugin(env, plugin, error) ) { + osync_error_unref(error); + return FALSE; + } + + osync_plugin_unref(plugin); + osync_trace(TRACE_EXIT, "%s", __func__); + return TRUE; + + } + + KDE_EXPORT int get_version(void) + { + return 1; + } + +}// extern "C" Added: plugins/akonadi-sync/trunk/src/akonadisink.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/akonadisink.cpp Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,60 @@ +/* + Copyright (c) 2008 Volker Krause <vk...@kd...> + + 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 + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "akonadisink.h" + +#include <akonadi/control.h> + +#include <KDebug> + +AkonadiSink::AkonadiSink() : + SinkBase( Connect ) +{ +} + +AkonadiSink::~AkonadiSink() +{ +} + +bool AkonadiSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncError ** error) +{ + Q_ASSERT( plugin ); + kDebug(); + OSyncObjTypeSink *sink = osync_objtype_main_sink_new( error ); + osync_plugin_info_set_main_sink( info, sink ); + wrapSink( sink ); + return true; +} + +void AkonadiSink::connect() +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p)", __PRETTY_FUNCTION__, pluginInfo(), context()); + kDebug(); + + 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__); +} + +#include "akonadisink.moc" Added: plugins/akonadi-sync/trunk/src/akonadisink.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/akonadisink.h Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,41 @@ +/* + Copyright (c) 2008 Volker Krause <vk...@kd...> + + 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 + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef AKONADISINK_H +#define AKONADISINK_H + +#include "sinkbase.h" + +/** + * Main sink, does nothing but ensure Akonadi is running. + */ +class AkonadiSink : public SinkBase +{ + Q_OBJECT + + public: + AkonadiSink(); + ~AkonadiSink(); + + bool initialize( OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error ); + + void connect(); +}; + +#endif Added: plugins/akonadi-sync/trunk/src/datasink.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/datasink.cpp Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,465 @@ +/* + Copyright (c) 2008 Volker Krause <vk...@kd...> + + 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 + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +// #include <glib.h> +// #include <glib/ghash.h> + +#include "datasink.h" +// #include "plugin/opensync_plugin_info_internals.h" +// #include "plugin/opensync_objtype_sink_internals.h" +// #include "helper/opensync_hashtable_internals.h" + +#include <opensync/opensync.h> +#include <opensync/opensync-helper.h> +#include <opensync/opensync-plugin.h> +// #include <opensync/helper/opensync_hashtable.h> +// #include <opensync/helper/opensync_sink_state_db.h> +// #include <opensync/helper/opensync_hashtable.h> + +// calendar includes +#include <kcal/incidence.h> +#include <kcal/icalformat.h> + +// contact includes +#include <kabc/vcardconverter.h> +#include <kabc/addressee.h> + +// #include <glib/gtypes.h> +// #include <glib/glist.h> +// notes includes +// TODO + +#include <KDebug> +#include <KLocale> +#include <KUrl> + +using namespace Akonadi; + +typedef boost::shared_ptr<KCal::Incidence> IncidencePtr; + + +DataSink::DataSink( int type ) : + SinkBase( GetChanges | Commit | SyncDone ) +{ + m_type = type; +} + +DataSink::~DataSink() { +// kDebug() << "del ptr to hashtable"; +// if( m_hashtable ) +// delete m_hashtable ; +} + +bool DataSink::initialize(OSyncPlugin * plugin, OSyncPluginInfo * info, OSyncObjTypeSink *sink, OSyncError ** error) +{ + Q_UNUSED(plugin); + bool enabled = osync_objtype_sink_is_enabled( sink ); + if( ! enabled ) { + kDebug() << "sink is not enabled.."; + return false; + } + + OSyncPluginConfig *config = osync_plugin_info_get_config(info); + + if (!config) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get config."); + return false; + } + + wrapSink( sink ); + + // TODO do we need this check here - I don't think so + OSyncHashTable *hashtable = osync_objtype_sink_get_hashtable(sink); +// // + if( ! hashtable ) { + osync_trace(TRACE_INTERNAL, "EKO > %s: %s", __PRETTY_FUNCTION__, osync_error_print( error ) ); +// return false; + } +// // + return true; +} + +Akonadi::Collection DataSink::collection() const +{ + 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 ) ); + 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() +{ + OSyncError *oerror = 0; + // ### broken in OpenSync, I don't get valid configuration here! +// #if 1 + Collection col = collection(); + if ( !col.isValid() ) { + osync_trace( TRACE_EXIT_ERROR, "%s: %s", __PRETTY_FUNCTION__, osync_error_print( &oerror ) ); + return; + } +// #else +// Collection col( 409 ); +// #endif + + +// FIXME + if ( getSlowSink() ) { + kDebug() << "we're in the middle of slow-syncing..."; + osync_trace( TRACE_INTERNAL, "EKO Got slow-sync, resetting hashtable" ); + if ( ! osync_hashtable_slowsync( m_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(); + osync_trace( TRACE_INTERNAL, "EKO fetchFullPayload" ); + + 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() ) { + error( OSYNC_ERROR_IO_ERROR, job->errorText() ); + return; + } +} + +void DataSink::slotItemsReceived( const Item::List &items ) +{ + kDebug() << "retrieved" << items.count() << "items"; + Q_FOREACH( const Item& item, items ) { + kDebug() << item.payloadData(); + reportChange( item ); + } +} + +void DataSink::reportChange( const Item& item ) +{ + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); + + OSyncError *error = 0; + + OSyncChange *change = osync_change_new( &error ); + if ( !change ) { + warning( error ); + return; + } + + osync_change_set_uid( change, QString::number( item.id() ).toLatin1() ); + + error = 0; + + OSyncData *odata = osync_data_new( item.payloadData().data(), item.payloadData().size(), format, &error ); + if ( !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 ); + + kDebug() << item.id() << "DATA:" << osync_data_get_printable( odata , &error) << "\n" << "ORIG:" << item.payloadData().data(); + + osync_data_unref( odata ); + osync_change_set_hash( change, QString::number( item.revision() ).toLatin1() ); + OSyncChangeType changeType = osync_hashtable_get_changetype( m_hashtable, change ); + osync_change_set_changetype( change, changeType ); + + +/* +kDebug() << "changeid:" << osync_change_get_uid( change ) + << "itemid:" << item.id() + << "revision:" << item.revision() + << "changetype:" << changeType + << "hash:" << osync_hashtable_get_hash( m_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 ); + else + // perhaps this should be only called when an error has happened ie. never after _context_report_change()? + osync_change_unref( change ); // if this gets called, we get broken pipes. any ideas? +} + +void DataSink::slotGetChangesFinished( KJob * ) +{ + OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env( pluginInfo() ); + OSyncObjFormat *format = osync_format_env_find_objformat( formatenv, formatName().toLatin1() ); + + // after the items have been processed, see what's been deleted and send them to opensync + OSyncError *error = 0; +// FIXME: + OSyncList *u, *uids = osync_hashtable_get_deleted( m_hashtable ); +// + for( u = uids; u; u = u->next) { + QString uid( (char *)u->data ); + kDebug() << "going to delete with uid:" << uid; + + OSyncChange *change = osync_change_new( &error ); + if( !change ) { + warning( error ); + continue; + } +// + osync_change_set_changetype( change, OSYNC_CHANGE_TYPE_DELETED ); + osync_change_set_uid( change, uid.toLatin1() ); + + error = 0; + OSyncData *data = osync_data_new( 0, 0, format, &error ); + if( !data ) { + osync_change_unref( change ); + warning( error ); + continue; + } +// + osync_data_set_objtype( data, osync_objtype_sink_get_name( sink() ) ); + osync_change_set_data( change, data ); + + osync_hashtable_update_change( m_hashtable, change ); + + osync_change_unref( change ); + } + osync_list_free( uids ); + + kDebug() << "got all changes.."; + success(); +} + +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 ) ); + + 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; } + + 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; } + + case OSYNC_CHANGE_TYPE_DELETED: { + deleteItem( change ); + kDebug() << "DELETED:" << osync_change_get_uid( change ); + break; } + + case OSYNC_CHANGE_TYPE_UNMODIFIED: { + kDebug() << "UNMODIFIED"; + // should we do something here? + break; } + + default: + kDebug() << "got invalid changetype?"; + } + + osync_hashtable_update_change( m_hashtable, change ); + success(); +} + +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::fromUtf8( 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); + ItemModifyJob *modifyJob = new Akonadi::ItemModifyJob( item ); + if( modifyJob->exec() ) { + kDebug() << "modification completed"; + return modifyJob->item(); + } + 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(); + /*ItemDeleteJob *job = new ItemDeleteJob( item ); + + if( job->exec() ) { + kDebug() << "item deleted"; + } + else + kDebug() << "unable to delete item";*/ +} + +bool DataSink::setPayload( Item *item, const QString &str ) +{ + switch( m_type ) { + case Calendars: { + KCal::ICalFormat format; + KCal::Incidence *calEntry = format.fromString( str ); + + item->setMimeType( "application/x-vnd.akonadi.calendar.event" ); + item->setPayload<IncidencePtr>( IncidencePtr( calEntry->clone() ) ); + + break; + } + case Contacts: { + KABC::VCardConverter converter; + KABC::Addressee vcard = converter.parseVCard( str.toLatin1() ); + kDebug() << vcard.uid() << vcard.name(); + + item->setMimeType( KABC::Addressee::mimeType() ); + // item->setPayload<KABC::Addressee>( str ); // FIXME + item->setPayloadFromData( str.toLatin1() ); // FIXME + break; + } + case Notes: { + kDebug() << "notes"; + break; + } + case Todos: { + kDebug() << "todos"; + break; + } + default: + // should not happen + return false; + } + + return true; +} + +const Item DataSink::createAkonadiItem( OSyncChange *change ) +{ + char *plain = 0; + osync_data_get_data( osync_change_get_data( change ), &plain, /*size*/0 ); + QString str = QString::fromUtf8( plain ); + Akonadi::Item item; + setPayload(&item, str); + return item; +} + +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 = "vcard10"; + break; + case Notes: + formatName = "vjournal"; + break; + case Todos: + formatName = "vtodo20"; + break; + default: + kDebug() << "invalid datasink type"; + return QString(); + } + + return formatName; +} + +const Item DataSink::fetchItem( const QString& id ) +{ + ItemFetchJob *fetchJob = new ItemFetchJob( Item( id ) ); + fetchJob->fetchScope().fetchFullPayload(); + + if( fetchJob->exec() ) { + foreach ( const Item &item, fetchJob->items() ) { + if( QString::number( item.id() ) == id ) { + kDebug() << "got item"; + return item; + } + } + } + + // no such item found? + return Item(); +} + +void DataSink::syncDone() +{ + kDebug(); +// OSyncError *error = 0; +// osync_objtype_sink_sync_done( m_hashtable, &error ); + + //TODO check for errors + success(); +} + +#include "datasink.moc" Added: plugins/akonadi-sync/trunk/src/datasink.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/datasink.h Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,103 @@ +/* + Copyright (c) 2008 Volker Krause <vk...@kd...> + + 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 + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef DATASINK_H +#define DATASINK_H + +#include "sinkbase.h" + +#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 <boost/shared_ptr.hpp> + +using namespace Akonadi; + +/** + * Base class for data sink classes, dealing with the type-independent stuff. + */ +class DataSink : public SinkBase +{ + Q_OBJECT + + public: + enum Type { Calendars = 0, Contacts, Todos, Notes }; + + DataSink( int type ); + ~DataSink(); + + bool initialize( OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncObjTypeSink *sink, OSyncError **error ); + + void getChanges(); + void commit( OSyncChange *change ); + void syncDone(); + + public slots: + void slotGetChangesFinished( KJob * ); + void slotItemsReceived( const Akonadi::Item::List & ); + + protected: + /** + * Returns the collection we are supposed to sync with. + */ + Akonadi::Collection collection() const; + + /** + * This reports the change back to opensync + */ + 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. + */ + 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 ); + + private: + OSyncHashTable *m_hashtable; + int m_type; +}; + +#endif Added: plugins/akonadi-sync/trunk/src/sinkbase.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/sinkbase.cpp Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,241 @@ +/* + Copyright (c) 2008 Volker Krause <vk...@kd...> + + 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 + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "sinkbase.h" +#include <KDebug> + +#define WRAP0(X) \ + osync_trace( TRACE_ENTRY, "%s(%p,%p, %p, %p)", __PRETTY_FUNCTION__, sink, userdata, info, ctx); \ + SinkBase *sb = reinterpret_cast<SinkBase*>(userdata ); \ + sb->setContext( ctx ); \ + sb->setPluginInfo( info ); \ + sb->X; \ + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + +#define WRAP1(X) \ + osync_trace( TRACE_ENTRY, "%s(%p,%p, %p, %p)", __PRETTY_FUNCTION__, sink, userdata, info, ctx); \ + SinkBase *sb = reinterpret_cast<SinkBase*>(userdata ); \ + if ( slow_sync ) sb->setSlowSink(slow_sync); \ + sb->setContext( ctx ); \ + sb->setPluginInfo( info ); \ + sb->X; \ + osync_trace( TRACE_EXIT, "%s", __PRETTY_FUNCTION__ ); + + + +extern "C" +{ + + static void connect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata ) +{ + WRAP0( connect() ) +} + +static void disconnect_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP0( disconnect() ) +} + +static void contact_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + + WRAP1 ( getChanges() ) +} +// + +static void contact_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP0( syncDone() ) +} + +static void event_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + WRAP1( getChanges() ) +} +// +static void event_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP0( syncDone() ) +} + + +static void todo_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + WRAP1( getChanges() ) +} +// + +static void todo_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP0( syncDone() ) +} + +static void journal_get_changes_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *userdata) { + WRAP1( getChanges() ) +} +// + +static void journal_sync_done_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *userdata) { + WRAP0( syncDone() ) +} +// +static void commit_wrapper(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *userdata) { + WRAP0( commit(change) ) +} + +} // extern C + + +SinkBase::SinkBase( int features ) : + mContext( 0 ), + mSink( 0 ), + mPluginInfo( 0 ) +{ + + m_canConnect = ( features & Connect ) ? true : false; + m_canDisconnect = ( features & Disconnect ) ? true : false; + m_canGetChanges = ( features & GetChanges ) ? true : false; + m_canCommit = ( features & Commit ) ? true : false; + m_canWrite = ( features & Write ) ? true : false; + m_canCommitAll = ( features & CommittedAll ) ? true : false; + m_canRead = ( features & Read ) ? true : false; + m_canBatchCommit = ( features & BatchCommit ) ? true : false; + m_canSyncDone = ( features & SyncDone ) ? true : false; + +} + +SinkBase::~SinkBase() +{ + if ( mSink ) + osync_objtype_sink_unref( mSink ); +} + +void SinkBase::connect() +{ + Q_ASSERT( false ); +} + +void SinkBase::setSlowSink(osync_bool s) +{ + Q_ASSERT( m_SlowSync ); + m_SlowSync = s; +} + +osync_bool SinkBase::getSlowSink() +{ + Q_ASSERT( m_SlowSync ); + return m_SlowSync; +} + +void SinkBase::disconnect() +{ + Q_ASSERT( false ); +} + +void SinkBase::getChanges() +{ + Q_ASSERT( false ); +} + +void SinkBase::commit(OSyncChange * chg) +{ + Q_UNUSED( chg ); + Q_ASSERT( false ); +} + +void SinkBase::syncDone() +{ + Q_ASSERT( false ); +} + +void SinkBase::success() const +{ +kDebug(); + Q_ASSERT( mContext ); + osync_context_report_success( mContext ); + mContext = 0; +} + +void SinkBase::error(OSyncErrorType type, const QString &msg) const +{ + kDebug(); + Q_ASSERT( mContext ); + osync_context_report_error(mContext, type, "%s", msg.toLatin1().data() ); + mContext = 0; +} + +void SinkBase::warning(OSyncError * error) const +{ +kDebug(); + Q_ASSERT( mContext ); + osync_context_report_osyncwarning( mContext, error ); + osync_error_unref( &error ); +} + +void SinkBase::wrapSink(OSyncObjTypeSink* sink) +{ + kDebug(); + Q_ASSERT( sink ); + Q_ASSERT( mSink == 0 ); + mSink = sink; + + if ( m_canConnect ) + osync_objtype_sink_set_connect_func(sink, connect_wrapper); + if ( m_canDisconnect ) + osync_objtype_sink_set_disconnect_func(sink, disconnect_wrapper); + + if ( m_canGetChanges && m_hasContact ) + osync_objtype_sink_set_get_changes_func(sink, contact_get_changes_wrapper); + if ( m_canGetChanges && m_hasEvent ) + osync_objtype_sink_set_get_changes_func(sink, event_get_changes_wrapper); + if ( m_canGetChanges && m_hasTodo ) + osync_objtype_sink_set_get_changes_func(sink, todo_get_changes_wrapper); + if ( m_canGetChanges && m_hasNote ) + osync_objtype_sink_set_get_changes_func(sink, journal_get_changes_wrapper); + + if ( m_canCommit ) + osync_objtype_sink_set_commit_func(sink, commit_wrapper); +// TODO: check if relevant for akonadi +// if ( m_canWrite ) +// osync_objtype_sink_set_commit_func(sink, 0); +// if ( m_canCommitAll ) +// osync_objtype_sink_set_commit_func(sink, 0); +// if ( m_canRead ) +// osync_objtype_sink_set_commit_func(sink, 0); +// if ( m_canBatchCommit ) +// osync_objtype_sink_set_commit_func(sink, 0); + if ( m_canSyncDone && m_hasContact ) + osync_objtype_sink_set_sync_done_func(sink, contact_sync_done_wrapper); + if ( m_canSyncDone && m_hasEvent ) + osync_objtype_sink_set_sync_done_func(sink, event_sync_done_wrapper); + if ( m_canSyncDone && m_hasTodo ) + osync_objtype_sink_set_sync_done_func(sink, todo_sync_done_wrapper); + if ( m_canSyncDone && m_hasNote ) + osync_objtype_sink_set_sync_done_func(sink, journal_sync_done_wrapper); + +} + +void SinkBase::setPluginInfo(OSyncPluginInfo * info) +{ + Q_ASSERT( mPluginInfo == 0 || mPluginInfo == info ); + mPluginInfo = info; +} + +void SinkBase::setContext(OSyncContext * context) +{ + Q_ASSERT( mContext == 0 || context == mContext ); + // ### do I need to ref() that here? and then probably deref() the old one somewhere above? + mContext = context; +} + + +#include "sinkbase.moc" Added: plugins/akonadi-sync/trunk/src/sinkbase.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/akonadi-sync/trunk/src/sinkbase.h Fri Sep 17 10:08:16 2010 (r6128) @@ -0,0 +1,85 @@ +/* + Copyright (c) 2008 Volker Krause <vk...@kd...> + + 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 + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef SINKBASE_H +#define SINKBASE_H + +#include <QObject> + +#include <opensync/opensync.h> +#inc... [truncated message content] |
From: <svn...@op...> - 2010-09-17 00:02:25
|
Author: cdfrey Date: Fri Sep 17 02:02:17 2010 New Revision: 6127 URL: http://www.opensync.org/changeset/6127 Log: Require libgcal version 0.9.6 Modified: plugins/google-calendar/CMakeLists.txt Modified: plugins/google-calendar/CMakeLists.txt ============================================================================== --- plugins/google-calendar/CMakeLists.txt Fri Sep 17 02:02:12 2010 (r6126) +++ plugins/google-calendar/CMakeLists.txt Fri Sep 17 02:02:17 2010 (r6127) @@ -1,10 +1,12 @@ PROJECT( libopensync-plugin-google-calendar C ) -SET( VERSION "0.38" ) +SET( VERSION "0.39" ) SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules" ) -SET( OPENSYNC_MIN_VERSION "0.37" ) +SET( OPENSYNC_MIN_VERSION "0.39" ) +SET( LIBGCAL_MIN_VERSION "0.9.6" ) +SET( Libgcal_FIND_REQUIRED "yes" ) CMAKE_MINIMUM_REQUIRED( VERSION 2.4.4 ) |
From: <svn...@op...> - 2010-09-17 00:02:21
|
Author: cdfrey Date: Fri Sep 17 02:02:12 2010 New Revision: 6126 URL: http://www.opensync.org/changeset/6126 Log: Added cast for const issues with libgcal libgcal 0.9.6 does not handle const char* correctly yet, so work around it. Modified: plugins/google-calendar/src/gcalendar.c Modified: plugins/google-calendar/src/gcalendar.c ============================================================================== --- plugins/google-calendar/src/gcalendar.c Fri Sep 17 01:51:39 2010 (r6125) +++ plugins/google-calendar/src/gcalendar.c Fri Sep 17 02:02:12 2010 (r6126) @@ -819,7 +819,8 @@ } result = gcal_update_xmlentry(gdata->handle, raw_xml, - &updated_event, osync_change_get_uid(change), etag); + &updated_event, (char*)osync_change_get_uid(change), + etag); if( result == -1 ) { msg = "Failed editing event!\n"; osync_trace(TRACE_INTERNAL, "Failed editing event: (etag: %s). HTTP code: %d, %s, %s\n", |
From: <svn...@op...> - 2010-09-16 23:51:49
|
Author: dgollub Date: Fri Sep 17 01:51:39 2010 New Revision: 6125 URL: http://www.opensync.org/changeset/6125 Log: create akonadi-sync project directory Added: plugins/akonadi-sync/ plugins/akonadi-sync/branches/ plugins/akonadi-sync/tags/ plugins/akonadi-sync/trunk/ |
From: <svn...@op...> - 2010-09-11 06:58:49
|
Author: cdfrey Date: Sat Sep 11 08:58:41 2010 New Revision: 6124 URL: http://www.opensync.org/changeset/6124 Log: Updated contact's get_changes with the working changes for calendar's function TODO: find a way to reduce the massive code duplication, from the old design, once everything works. Modified: plugins/google-calendar/src/gcalendar.c Modified: plugins/google-calendar/src/gcalendar.c ============================================================================== --- plugins/google-calendar/src/gcalendar.c Sat Sep 11 08:58:36 2010 (r6123) +++ plugins/google-calendar/src/gcalendar.c Sat Sep 11 08:58:41 2010 (r6124) @@ -323,9 +323,9 @@ char *timestamp = NULL, *msg = NULL; const char *raw_xml = NULL; char *seen = NULL; - gcal_event_t event; OSyncError *state_db_error = NULL; OSyncSinkStateDB *state_db = NULL; + gcal_event_t event; struct gcal_event_array all_events; state_db = osync_objtype_sink_get_state_db(sink); @@ -346,8 +346,7 @@ result = gcal_get_events(gdata->handle, &all_events); } else { - result = gcal_get_updated_events(gdata->handle, - &all_events, + result = gcal_get_updated_events(gdata->handle, &all_events, timestamp); } @@ -520,45 +519,39 @@ osync_bool slow_sync, void *data) { osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - char buffer[512]; struct gc_gdata *gdata = data; - char slow_sync_flag = 0; OSyncError *error = NULL; OSyncData *odata = NULL; OSyncChange *chg = NULL; int result = 0, i; - char *timestamp = NULL, *msg; + char *timestamp = NULL, *msg = NULL; const char *raw_xml = NULL; - gcal_contact_t contact; + char *seen = NULL; OSyncError *state_db_error = NULL; + OSyncSinkStateDB *state_db = NULL; + gcal_contact_t contact; struct gcal_contact_array all_contacts; - if (!(osync_objtype_sink_get_state_db(sink))) + state_db = osync_objtype_sink_get_state_db(sink); + if( !state_db ) goto error; - timestamp = osync_sink_state_get(osync_objtype_sink_get_state_db(sink), - gdata->timestamp_name, + timestamp = osync_sink_state_get(state_db, gdata->timestamp_name, &state_db_error); if (!timestamp) { msg = "gcontact: Anchor returned is NULL!"; goto error; } - if (strlen(timestamp) > 0) - osync_trace(TRACE_INTERNAL, "timestamp is: %s\n", timestamp); - else - osync_trace(TRACE_INTERNAL, "first sync!\n"); - - if (slow_sync) { - osync_trace(TRACE_INTERNAL, "\n\t\tgcont: Client asked for slow syncing...\n"); - slow_sync_flag = 1; + osync_trace(TRACE_INTERNAL, "timestamp is: '%s'\n", timestamp); + + if (slow_sync || strlen(timestamp) == 0) { + osync_trace(TRACE_INTERNAL, "\n\t\tgcont: slow sync, or first time\n"); result = gcal_get_contacts(gdata->handle, &all_contacts); } else { - osync_trace(TRACE_INTERNAL, "\n\t\tgcont: Client asked for fast syncing...\n"); gcal_deleted(gdata->handle, SHOW); - result = gcal_get_updated_contacts(gdata->handle, - &all_contacts, + result = gcal_get_updated_contacts(gdata->handle, &all_contacts, timestamp); } @@ -570,91 +563,157 @@ osync_trace(TRACE_INTERNAL, "gcontact: got them all!\n"); if (all_contacts.length == 0) { osync_trace(TRACE_INTERNAL, "gcontact: no changes...\n"); - goto no_changes; + goto exit; } else osync_trace(TRACE_INTERNAL, "gcontact: changes count: %d\n", all_contacts.length); // Contacts returns most recently updated entry as last element - contact = gcal_contact_element(&all_contacts, all_contacts.length - 1); - if (!contact) { - msg = "Cannot access last updated contact!\n"; - goto error; - } - gdata->timestamp = strdup(gcal_contact_get_updated(contact)); - if (!gdata->timestamp) { - msg = "Failed copying contact timestamp!\n"; - goto error; - } - for (i = 0; i < all_contacts.length; ++i) { + // cleanup for a fresh run + if (seen) { + osync_free(seen); + seen = NULL; + } + + // grab the next event object contact = gcal_contact_element(&all_contacts, i); - if (!contact) + if (!contact) { + osync_trace(TRACE_INTERNAL, "Cannot access updated contact %d", i); goto error; + } + + // save first timestamp as new "done" mark + if (i == 0) { + if (gdata->timestamp) + free(gdata->timestamp); + gdata->timestamp = strdup(gcal_contact_get_updated(contact)); + if (!gdata->timestamp) { + msg = "Failed copying contact timestamp!\n"; + goto error; + } + } + + // are we done yet? libgcal includes the entry with the + // given timestamp, so if the timestamp of this contact + // is <= to the timestamp we asked for, then we're done + if( !slow_sync && timestamp_cmp(gcal_contact_get_updated(contact), timestamp) <= 0 ) + break; osync_trace(TRACE_INTERNAL, "gcontact: timestamp:%s\tcontact:%s\n", timestamp, gcal_contact_get_updated(contact)); - // Workaround for inclusive returned results - if ((timestamp_cmp(timestamp, gcal_contact_get_updated(contact)) == 0) - && !slow_sync_flag - && !gcal_contact_is_deleted(contact)) { - osync_trace(TRACE_INTERNAL, "gcontact: old contact."); - continue; - } else - osync_trace(TRACE_INTERNAL, "gcontact: new or deleted contact!"); - - raw_xml = gcal_contact_get_xml(contact); - if ((result = xslt_transform(gdata->xslt_google2osync, - raw_xml))) - goto error; - raw_xml = (char*) gdata->xslt_google2osync->xml_str; - odata = osync_data_new(strdup(raw_xml), - strlen(raw_xml), - gdata->format, &error); - if (!odata) - goto cleanup; + // grab ID for current change... this is a Google URL + // the edit_url and etag are required later for modification, + // so save them in the state_db as the "seen" marker + const char *url = gcal_contact_get_url(contact); + const char *etag = gcal_contact_get_etag(contact); + + // check state_db for id to see if we've seen this + // one before + seen = osync_sink_state_get(state_db, url, &state_db_error); - if (!(chg = osync_change_new(&error))) + // determine changetype - we do not use osync_hashtable here + // because I believe that requires us to download all + // contacts in order to feed the timestamp to the hashtable + // function... hashtable is more suited to a local access, + // instead of internet access. + OSyncChangeType ct = OSYNC_CHANGE_TYPE_UNKNOWN; + if( gcal_contact_is_deleted(contact) ) { + ct = OSYNC_CHANGE_TYPE_DELETED; + + // remember this item as deleted + if( !osync_sink_state_set(state_db, url, "", &state_db_error) ) { + msg = "Error setting state_db with url"; + goto error; + } + if( slow_sync || !seen || strlen(seen) == 0 ) { + // in slow sync mode, we don't care about + // deleted objects + continue; + } + } + else { + if( !slow_sync && seen && strlen(seen) > 0 ) { + // we've seen this object before + ct = OSYNC_CHANGE_TYPE_MODIFIED; + } + else { + ct = OSYNC_CHANGE_TYPE_ADDED; + } + + // the etag will have changed for MODIFIED, and + // it's a new item if ADDED, so save the url/etag + // string either way + // FIXME - should perhaps set this only after + // success, such as in the done() plugin call + if( !osync_sink_state_set(state_db, url, etag, &state_db_error) ) { + msg = "Error setting state_db with url/etag"; + goto error; + } + } + + // create change object + chg = osync_change_new(&error); + if( !chg ) goto cleanup; - osync_data_set_objtype(odata, osync_objtype_sink_get_name(sink)); - osync_change_set_data(chg, odata); - osync_data_unref(odata); - osync_change_set_uid(chg, gcal_contact_get_id(contact)); + // setup the change + osync_change_set_uid(chg, url); + osync_change_set_hash(chg, gcal_contact_get_updated(contact)); + osync_change_set_changetype(chg, ct); - if (slow_sync_flag) - osync_change_set_changetype(chg, OSYNC_CHANGE_TYPE_ADDED); - else - if (gcal_contact_is_deleted(contact)) { - osync_change_set_changetype(chg, OSYNC_CHANGE_TYPE_DELETED); - osync_trace(TRACE_INTERNAL, "deleted entry!"); + // fill in the data + if( ct != OSYNC_CHANGE_TYPE_DELETED ) { + raw_xml = gcal_contact_get_xml(contact); + if( xslt_transform(gdata->xslt_google2osync, raw_xml) ) { + osync_change_unref(chg); + goto error; } - else - osync_change_set_changetype(chg, OSYNC_CHANGE_TYPE_MODIFIED); + + raw_xml = (char*) gdata->xslt_google2osync->xml_str; + odata = osync_data_new(strdup(raw_xml), + strlen(raw_xml), + gdata->format, &error); + if( !odata ) { + osync_change_unref(chg); + goto cleanup; + } + } + else { + // deleted changes need empty data sets + odata = osync_data_new(NULL, 0, gdata->format, &error); + if( !odata ) { + osync_change_unref(chg); + goto cleanup; + } + } + + osync_data_set_objtype(odata, + osync_objtype_sink_get_name(sink)); + osync_change_set_data(chg, odata); + osync_data_unref(odata); osync_context_report_change(ctx, chg); osync_change_unref(chg); } -no_changes: - - osync_trace(TRACE_INTERNAL, "\ndone contact: %s\n", buffer); - -//exit: - // osync_sink_state_get uses osync_strdup - osync_free(timestamp); +exit: osync_context_report_success(ctx); - return; + goto cleanup; + +error: + osync_context_report_error(ctx, OSYNC_ERROR_GENERIC, "%s", msg); cleanup: osync_error_unref(&error); + gcal_cleanup_contacts(&all_contacts); + // osync_sink_state_get uses osync_strdup osync_free(timestamp); - gcal_cleanup_contacts(&all_contacts); -error: - osync_context_report_error(ctx, OSYNC_ERROR_GENERIC, "%s", msg); + if (seen) + osync_free(seen); } static void gc_commit_change_calendar(OSyncObjTypeSink *sink, |
From: <svn...@op...> - 2010-09-11 06:58:45
|
Author: cdfrey Date: Sat Sep 11 08:58:36 2010 New Revision: 6123 URL: http://www.opensync.org/changeset/6123 Log: Remove one more piece of duplicated data: timestamp marker key names Modified: plugins/google-calendar/src/gcalendar.c Modified: plugins/google-calendar/src/gcalendar.c ============================================================================== --- plugins/google-calendar/src/gcalendar.c Sat Sep 11 08:58:31 2010 (r6122) +++ plugins/google-calendar/src/gcalendar.c Sat Sep 11 08:58:36 2010 (r6123) @@ -332,7 +332,7 @@ if( !state_db ) goto error; - timestamp = osync_sink_state_get(state_db, "cal_timestamp", + timestamp = osync_sink_state_get(state_db, gdata->timestamp_name, &state_db_error); if (!timestamp) { msg = "gcalendar: Anchor returned is NULL!"; @@ -537,7 +537,8 @@ goto error; timestamp = osync_sink_state_get(osync_objtype_sink_get_state_db(sink), - "cont_timestamp", &state_db_error); + gdata->timestamp_name, + &state_db_error); if (!timestamp) { msg = "gcontact: Anchor returned is NULL!"; goto error; |
From: <svn...@op...> - 2010-09-11 06:58:40
|
Author: cdfrey Date: Sat Sep 11 08:58:31 2010 New Revision: 6122 URL: http://www.opensync.org/changeset/6122 Log: Removed more duplicated code, and used type-specific data for callbacks Callbacks now use their specific struct gdata as their callback userdata, which allows for some duplicated code removal in gc_sync_done() and gc_connect*() Modified: plugins/google-calendar/src/gcalendar.c Modified: plugins/google-calendar/src/gcalendar.c ============================================================================== --- plugins/google-calendar/src/gcalendar.c Sat Sep 11 08:58:24 2010 (r6121) +++ plugins/google-calendar/src/gcalendar.c Sat Sep 11 08:58:31 2010 (r6122) @@ -55,10 +55,8 @@ #include <time.h> #include <sys/time.h> -static void gc_connect_calendar(OSyncObjTypeSink *sink, OSyncPluginInfo *info, - OSyncContext *ctx, void *data); -static void gc_connect_contact(OSyncObjTypeSink *sink, OSyncPluginInfo *info, - OSyncContext *ctx, void *data); +static void gc_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, + OSyncContext *ctx, void *data); static void gc_get_changes_calendar(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data); @@ -199,12 +197,27 @@ return ret; } +struct gc_plgdata; + struct gc_gdata { + // parent + struct gc_plgdata *plgdata; + + // xslt filenames + const char *google2osync_file; + const char *osync2google_file; + + // sync marker + const char *timestamp_name; char *timestamp; + + // sync handle gcal_t handle; + // sink/format OSyncObjFormat *format; + // XSLT context resource struct struct xslt_resources *xslt_google2osync; struct xslt_resources *xslt_osync2google; @@ -254,83 +267,46 @@ g_free(plgdata); } -static void gc_connect_calendar(OSyncObjTypeSink *sink, OSyncPluginInfo *info, - OSyncContext *ctx, void *data) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - int result; - struct gc_plgdata *plgdata = data; - OSyncError *error = NULL; - char buffer[512]; - - result = gcal_get_authentication(plgdata->cal.handle, plgdata->username, - plgdata->password); - if (result == -1) - goto error; - - // google -> osync - snprintf(buffer, sizeof(buffer) - 1, "%sgcal2osync.xslt", - plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->cal.xslt_google2osync, buffer))) - goto error; - osync_trace(TRACE_INTERNAL, "loaded calendar xslt: %s\n", buffer); - - // osync -> google - snprintf(buffer, sizeof(buffer) - 1, "%sosync2gcal.xslt", - plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->cal.xslt_osync2google, buffer))) - goto error; - osync_trace(TRACE_INTERNAL, "loaded calendar xslt: %s\n", buffer); - - osync_context_report_success(ctx); - osync_trace(TRACE_EXIT, "%s", __func__); - return; - -error: - osync_trace(TRACE_INTERNAL, - "Failed to load gcal2osync.xslt stylesheet!\n"); - osync_error_set(&error, OSYNC_ERROR_GENERIC, - "Unable load gcal2osync.xslt stylesheet data."); - osync_context_report_osyncerror(ctx, error); -} - -static void gc_connect_contact(OSyncObjTypeSink *sink, OSyncPluginInfo *info, - OSyncContext *ctx, void *data) +static void gc_connect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, + OSyncContext *ctx, void *data) { osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); int result; - struct gc_plgdata *plgdata = data; + struct gc_gdata *gdata = data; OSyncError *error = NULL; char buffer[512]; + strcpy(buffer, ""); - result = gcal_get_authentication(plgdata->cont.handle, plgdata->username, - plgdata->password); + result = gcal_get_authentication(gdata->handle, + gdata->plgdata->username, + gdata->plgdata->password); if (result == -1) goto error; // google -> osync - snprintf(buffer, sizeof(buffer) - 1, "%sgcont2osync.xslt", - plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->cont.xslt_google2osync, buffer))) + snprintf(buffer, sizeof(buffer) - 1, "%s%s", + gdata->plgdata->xslt_path, + gdata->google2osync_file); + if ((result = xslt_initialize(gdata->xslt_google2osync, buffer))) goto error; - osync_trace(TRACE_INTERNAL, "loaded contact xslt: %s\n", buffer); + osync_trace(TRACE_INTERNAL, "loaded xslt: %s", buffer); // osync -> google - snprintf(buffer, sizeof(buffer) - 1, "%sosync2gcont.xslt", - plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->cont.xslt_osync2google, buffer))) + snprintf(buffer, sizeof(buffer) - 1, "%s%s", + gdata->plgdata->xslt_path, + gdata->osync2google_file); + if ((result = xslt_initialize(gdata->xslt_osync2google, buffer))) goto error; - osync_trace(TRACE_INTERNAL, "loaded contact xslt: %s\n", buffer); + osync_trace(TRACE_INTERNAL, "loaded xslt: %s", buffer); osync_context_report_success(ctx); osync_trace(TRACE_EXIT, "%s", __func__); return; error: - osync_trace(TRACE_INTERNAL, - "Failed to load gcont2osync.xslt stylesheet!\n"); + osync_trace(TRACE_INTERNAL, "Failed to load stylesheet: '%s'", buffer); osync_error_set(&error, OSYNC_ERROR_GENERIC, - "Unable load gcont2osync.xslt stylesheet data."); + "Unable load stylesheet data: '%s'", buffer); osync_context_report_osyncerror(ctx, error); } @@ -339,7 +315,7 @@ osync_bool slow_sync, void *data) { osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - struct gc_plgdata *plgdata = data; + struct gc_gdata *gdata = data; OSyncError *error = NULL; OSyncData *odata = NULL; OSyncChange *chg = NULL; @@ -367,10 +343,10 @@ if (slow_sync || strlen(timestamp) == 0) { osync_trace(TRACE_INTERNAL, "\n\t\tgcal: slow sync, or first time\n"); - result = gcal_get_events(plgdata->cal.handle, &all_events); + result = gcal_get_events(gdata->handle, &all_events); } else { - result = gcal_get_updated_events(plgdata->cal.handle, + result = gcal_get_updated_events(gdata->handle, &all_events, timestamp); } @@ -406,10 +382,10 @@ // save first timestamp as new "done" mark if (i == 0) { - if (plgdata->cal.timestamp) - free(plgdata->cal.timestamp); - plgdata->cal.timestamp = strdup(gcal_event_get_updated(event)); - if (!plgdata->cal.timestamp) { + if (gdata->timestamp) + free(gdata->timestamp); + gdata->timestamp = strdup(gcal_event_get_updated(event)); + if (!gdata->timestamp) { msg = "Failed copying event timestamp!\n"; goto error; } @@ -487,15 +463,15 @@ // fill in the data if( ct != OSYNC_CHANGE_TYPE_DELETED ) { raw_xml = gcal_event_get_xml(event); - if( xslt_transform(plgdata->cal.xslt_google2osync, raw_xml) ) { + if( xslt_transform(gdata->xslt_google2osync, raw_xml) ) { osync_change_unref(chg); goto error; } - raw_xml = (char*) plgdata->cal.xslt_google2osync->xml_str; + raw_xml = (char*) gdata->xslt_google2osync->xml_str; odata = osync_data_new(strdup(raw_xml), strlen(raw_xml), - plgdata->cal.format, &error); + gdata->format, &error); if( !odata ) { osync_change_unref(chg); goto cleanup; @@ -503,8 +479,7 @@ } else { // deleted changes need empty data sets - odata = osync_data_new(NULL, 0, plgdata->cal.format, - &error); + odata = osync_data_new(NULL, 0, gdata->format, &error); if( !odata ) { osync_change_unref(chg); goto cleanup; @@ -546,7 +521,7 @@ { osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); char buffer[512]; - struct gc_plgdata *plgdata = data; + struct gc_gdata *gdata = data; char slow_sync_flag = 0; OSyncError *error = NULL; OSyncData *odata = NULL; @@ -576,12 +551,12 @@ if (slow_sync) { osync_trace(TRACE_INTERNAL, "\n\t\tgcont: Client asked for slow syncing...\n"); slow_sync_flag = 1; - result = gcal_get_contacts(plgdata->cont.handle, &all_contacts); + result = gcal_get_contacts(gdata->handle, &all_contacts); } else { osync_trace(TRACE_INTERNAL, "\n\t\tgcont: Client asked for fast syncing...\n"); - gcal_deleted(plgdata->cont.handle, SHOW); - result = gcal_get_updated_contacts(plgdata->cont.handle, + gcal_deleted(gdata->handle, SHOW); + result = gcal_get_updated_contacts(gdata->handle, &all_contacts, timestamp); } @@ -605,8 +580,8 @@ msg = "Cannot access last updated contact!\n"; goto error; } - plgdata->cont.timestamp = strdup(gcal_contact_get_updated(contact)); - if (!plgdata->cont.timestamp) { + gdata->timestamp = strdup(gcal_contact_get_updated(contact)); + if (!gdata->timestamp) { msg = "Failed copying contact timestamp!\n"; goto error; } @@ -628,14 +603,14 @@ osync_trace(TRACE_INTERNAL, "gcontact: new or deleted contact!"); raw_xml = gcal_contact_get_xml(contact); - if ((result = xslt_transform(plgdata->cont.xslt_google2osync, + if ((result = xslt_transform(gdata->xslt_google2osync, raw_xml))) goto error; - raw_xml = (char*) plgdata->cont.xslt_google2osync->xml_str; + raw_xml = (char*) gdata->xslt_google2osync->xml_str; odata = osync_data_new(strdup(raw_xml), strlen(raw_xml), - plgdata->cont.format, &error); + gdata->format, &error); if (!odata) goto cleanup; @@ -663,14 +638,6 @@ no_changes: - // Load XSLT style to convert osync xmlformat-contact --> gdata - snprintf(buffer, sizeof(buffer) - 1, "%sosync2gcont.xslt", - plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->cont.xslt_google2osync, buffer))) { - msg = "Cannot initialize new XSLT!\n"; - goto error; - } - osync_trace(TRACE_INTERNAL, "\ndone contact: %s\n", buffer); //exit: @@ -696,7 +663,7 @@ osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p, %p)", __func__, sink, info, ctx, change, data); osync_trace(TRACE_INTERNAL, "hello, from calendar!\n"); - struct gc_plgdata *plgdata = data; + struct gc_gdata *gdata = data; gcal_event_t event = NULL; unsigned int size; int result = 55555; // something odd for the logs @@ -727,7 +694,7 @@ } // Convert to gdata format - result = xslt_transform(plgdata->cal.xslt_osync2google, osync_xml); + result = xslt_transform(gdata->xslt_osync2google, osync_xml); if( result ) { msg = "Failed converting from osync xmlevent to gcalendar\n"; osync_trace(TRACE_INTERNAL, "--- osync_uid: %s", @@ -738,9 +705,9 @@ } osync_trace(TRACE_INTERNAL, "--- transformed xml: %s", - (char*) plgdata->cal.xslt_osync2google->xml_str); + (char*) gdata->xslt_osync2google->xml_str); - raw_xml = vtime2gtime((char*)plgdata->cal.xslt_osync2google->xml_str); + raw_xml = vtime2gtime((char*)gdata->xslt_osync2google->xml_str); osync_trace(TRACE_INTERNAL, "--- gtime adjusted: %s", raw_xml); } @@ -754,14 +721,14 @@ switch( osync_change_get_changetype(change) ) { case OSYNC_CHANGE_TYPE_ADDED: - result = gcal_add_xmlentry(plgdata->cal.handle, raw_xml, + result = gcal_add_xmlentry(gdata->handle, raw_xml, &updated_event); if( result == -1 ) { msg = "Failed adding new event!\n"; osync_trace(TRACE_INTERNAL, "Failed adding new event! HTTP code: %d, %s, %s\n", - gcal_status_httpcode(plgdata->cal.handle), - gcal_status_msg(plgdata->cal.handle), - gcal_access_buffer(plgdata->cal.handle)); + gcal_status_httpcode(gdata->handle), + gcal_status_msg(gdata->handle), + gcal_access_buffer(gdata->handle)); goto error; } @@ -791,15 +758,15 @@ goto error; } - result = gcal_update_xmlentry(plgdata->cal.handle, raw_xml, + result = gcal_update_xmlentry(gdata->handle, raw_xml, &updated_event, osync_change_get_uid(change), etag); if( result == -1 ) { msg = "Failed editing event!\n"; osync_trace(TRACE_INTERNAL, "Failed editing event: (etag: %s). HTTP code: %d, %s, %s\n", etag, - gcal_status_httpcode(plgdata->cal.handle), - gcal_status_msg(plgdata->cal.handle), - gcal_access_buffer(plgdata->cal.handle)); + gcal_status_httpcode(gdata->handle), + gcal_status_msg(gdata->handle), + gcal_access_buffer(gdata->handle)); goto error; } @@ -839,13 +806,13 @@ goto error; } - result = gcal_erase_event(plgdata->cal.handle, event); + result = gcal_erase_event(gdata->handle, event); if( result == -1 ) { msg = "Failed deleting event!\n"; osync_trace(TRACE_INTERNAL, "Failed deleting event! HTTP code: %d, %s, %s\n", - gcal_status_httpcode(plgdata->cal.handle), - gcal_status_msg(plgdata->cal.handle), - gcal_access_buffer(plgdata->cal.handle)); + gcal_status_httpcode(gdata->handle), + gcal_status_msg(gdata->handle), + gcal_access_buffer(gdata->handle)); goto error; } @@ -865,19 +832,19 @@ if( event && gcal_event_get_updated(event) ) { // update the timestamp - if( plgdata->cal.timestamp ) { + if( gdata->timestamp ) { // only if newer - if( timestamp_cmp(gcal_event_get_updated(event), plgdata->cal.timestamp) > 0 ) { - free(plgdata->cal.timestamp); - plgdata->cal.timestamp = strdup(gcal_event_get_updated(event)); + if( timestamp_cmp(gcal_event_get_updated(event), gdata->timestamp) > 0 ) { + free(gdata->timestamp); + gdata->timestamp = strdup(gcal_event_get_updated(event)); } } else { - plgdata->cal.timestamp = strdup(gcal_event_get_updated(event)); + gdata->timestamp = strdup(gcal_event_get_updated(event)); } // error check - if (!plgdata->cal.timestamp) { + if (!gdata->timestamp) { msg = "Failed copying contact timestamp!\n"; goto error; } @@ -911,7 +878,7 @@ info, ctx, change, data); osync_trace(TRACE_INTERNAL, "hello, from contacts!\n"); - struct gc_plgdata *plgdata = data; + struct gc_gdata *gdata = data; gcal_contact_t contact = NULL; unsigned int size; int result; @@ -930,20 +897,20 @@ } // Convert to gdata format - if ((result = xslt_transform(plgdata->cont.xslt_google2osync, osync_xml))) { + if ((result = xslt_transform(gdata->xslt_google2osync, osync_xml))) { msg = "Failed converting from osync xmlcontact to gcontact\n"; goto error; } - raw_xml = vtime2gtime( (char*) plgdata->cont.xslt_google2osync->xml_str ); + raw_xml = vtime2gtime( (char*) gdata->xslt_google2osync->xml_str ); osync_trace(TRACE_INTERNAL, "osync: %s\ngcont: %s\n\n", osync_xml, raw_xml); switch (osync_change_get_changetype(change)) { case OSYNC_CHANGE_TYPE_ADDED: - result = gcal_add_xmlentry(plgdata->cont.handle, raw_xml, &updated_contact); + result = gcal_add_xmlentry(gdata->handle, raw_xml, &updated_contact); if (result == -1) { msg = "Failed adding new contact!\n"; - result = gcal_status_httpcode(plgdata->cont.handle); + result = gcal_status_httpcode(gdata->handle); goto error; } @@ -954,7 +921,7 @@ break; case OSYNC_CHANGE_TYPE_MODIFIED: - result = gcal_update_xmlentry(plgdata->cont.handle, + result = gcal_update_xmlentry(gdata->handle, raw_xml, &updated_contact, NULL, NULL); if (result == -1) { msg = "Failed editing contact!\n"; @@ -968,7 +935,7 @@ break; case OSYNC_CHANGE_TYPE_DELETED: - result = gcal_erase_xmlentry(plgdata->cont.handle, raw_xml); + result = gcal_erase_xmlentry(gdata->handle, raw_xml); if (result == -1) { msg = "Failed deleting contact!\n"; goto error; @@ -987,10 +954,10 @@ if (contact) { // update the timestamp - if (plgdata->cont.timestamp) - free(plgdata->cont.timestamp); - plgdata->cont.timestamp = strdup(gcal_contact_get_updated(contact)); - if (!plgdata->cont.timestamp) { + if (gdata->timestamp) + free(gdata->timestamp); + gdata->timestamp = strdup(gcal_contact_get_updated(contact)); + if (!gdata->timestamp) { msg = "Failed copying contact timestamp!\n"; goto error; } @@ -1022,23 +989,15 @@ OSyncContext *ctx, void *data) { osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - struct gc_plgdata *plgdata = data; + struct gc_gdata *gdata = data; OSyncError *state_db_error; - if (plgdata->cal.handle && plgdata->cal.timestamp) { - osync_trace(TRACE_INTERNAL, "query updated timestamp: %s\n", - plgdata->cal.timestamp); + if( gdata->handle && gdata->timestamp ) { + osync_trace(TRACE_INTERNAL, "query updated timestamp: %s: %s\n", + gdata->timestamp_name, gdata->timestamp); osync_sink_state_set(osync_objtype_sink_get_state_db(sink), - "cal_timestamp", plgdata->cal.timestamp, - &state_db_error); - } - - if (plgdata->cont.handle && plgdata->cont.timestamp) { - osync_trace(TRACE_INTERNAL, "query updated timestamp: %s\n", - plgdata->cont.timestamp); - osync_sink_state_set(osync_objtype_sink_get_state_db(sink), - "cont_timestamp", plgdata->cont.timestamp, - &state_db_error); + gdata->timestamp_name, gdata->timestamp, + &state_db_error); } osync_context_report_success(ctx); @@ -1074,10 +1033,24 @@ goto error_freeplg; } + // set parent pointers + plgdata->cal.plgdata = plgdata; + plgdata->cont.plgdata = plgdata; + + // set xslt filenames + plgdata->cal.timestamp_name = "cal_timestamp"; + plgdata->cal.google2osync_file = "gcal2osync.xslt"; + plgdata->cal.osync2google_file = "osync2gcal.xslt"; + plgdata->cont.timestamp_name = "cont_timestamp"; + plgdata->cont.google2osync_file = "gcont2osync.xslt"; + plgdata->cont.osync2google_file = "osync2gcont.xslt"; + + // grab config dir plgdata->xslt_path = strdup(osync_plugin_get_default_configdir()); if( !plgdata->xslt_path ) goto error_freeplg; + // create a gcal handle for each objtype available resources = osync_plugin_config_get_resources(config); for( r = resources; r; r = r->next ) { osync_trace(TRACE_INTERNAL, "field: %s\n", @@ -1163,7 +1136,7 @@ osync_objformat_ref(plgdata->cal.format); - osync_objtype_sink_set_connect_func(sink, gc_connect_calendar); + osync_objtype_sink_set_connect_func(sink, gc_connect); osync_objtype_sink_set_disconnect_func(sink, gc_disconnect); osync_objtype_sink_set_get_changes_func(sink, gc_get_changes_calendar); @@ -1172,7 +1145,7 @@ osync_objtype_sink_set_sync_done_func(sink, gc_sync_done); - osync_objtype_sink_set_userdata(sink, plgdata); + osync_objtype_sink_set_userdata(sink, &plgdata->cal); osync_objtype_sink_enable_state_db(sink, TRUE); } @@ -1198,7 +1171,7 @@ osync_objformat_ref(plgdata->cont.format); - osync_objtype_sink_set_connect_func(sink, gc_connect_contact); + osync_objtype_sink_set_connect_func(sink, gc_connect); osync_objtype_sink_set_disconnect_func(sink, gc_disconnect); osync_objtype_sink_set_get_changes_func(sink, gc_get_changes_contact); @@ -1207,7 +1180,7 @@ osync_objtype_sink_set_sync_done_func(sink, gc_sync_done); - osync_objtype_sink_set_userdata(sink, plgdata); + osync_objtype_sink_set_userdata(sink, &plgdata->cont); osync_objtype_sink_enable_state_db(sink, TRUE); } |
From: <svn...@op...> - 2010-09-11 06:58:35
|
Author: cdfrey Date: Sat Sep 11 08:58:24 2010 New Revision: 6121 URL: http://www.opensync.org/changeset/6121 Log: Split google and type specific data into its own struct Modified: plugins/google-calendar/src/gcalendar.c Modified: plugins/google-calendar/src/gcalendar.c ============================================================================== --- plugins/google-calendar/src/gcalendar.c Wed Sep 8 04:50:10 2010 (r6120) +++ plugins/google-calendar/src/gcalendar.c Sat Sep 11 08:58:24 2010 (r6121) @@ -199,6 +199,16 @@ return ret; } +struct gc_gdata +{ + char *timestamp; + gcal_t handle; + // sink/format + OSyncObjFormat *format; + // XSLT context resource struct + struct xslt_resources *xslt_google2osync; + struct xslt_resources *xslt_osync2google; +}; struct gc_plgdata { @@ -208,50 +218,31 @@ char *timezone; char *xslt_path; // libgcal resources - char *cal_timestamp; - char *cont_timestamp; - gcal_t calendar; - gcal_t contacts; - struct gcal_event_array all_events; - struct gcal_contact_array all_contacts; - // calendar sink/format - OSyncObjFormat *gcal_format; - // contact sink/format - OSyncObjFormat *gcont_format; - // XSLT context resource struct - // google -> osync - struct xslt_resources *xslt_ctx_gcal; - struct xslt_resources *xslt_ctx_gcont; - // osync -> google - struct xslt_resources *xslt_ctx_ocal; - struct xslt_resources *xslt_ctx_ocont; + struct gc_gdata cal; + struct gc_gdata cont; }; +static void free_gdata(struct gc_gdata *gdata) +{ + if( gdata->timestamp ) + free(gdata->timestamp); + if( gdata->handle ) + gcal_delete(gdata->handle); + if( gdata->format) + osync_objformat_unref(gdata->format); + if( gdata->xslt_google2osync ) + xslt_delete(gdata->xslt_google2osync); + if( gdata->xslt_osync2google ) + xslt_delete(gdata->xslt_osync2google); +} + static void free_plg(struct gc_plgdata *plgdata) { - if (plgdata->calendar) { - gcal_delete(plgdata->calendar); - gcal_cleanup_events(&(plgdata->all_events)); - } - if (plgdata->contacts) { - gcal_delete(plgdata->contacts); - gcal_cleanup_contacts(&(plgdata->all_contacts)); - } + free_gdata(&plgdata->cal); + free_gdata(&plgdata->cont); if (plgdata->xslt_path) free(plgdata->xslt_path); - if (plgdata->xslt_ctx_gcal) - xslt_delete(plgdata->xslt_ctx_gcal); - if (plgdata->xslt_ctx_gcont) - xslt_delete(plgdata->xslt_ctx_gcont); - if (plgdata->xslt_ctx_ocal) - xslt_delete(plgdata->xslt_ctx_ocal); - if (plgdata->xslt_ctx_ocont) - xslt_delete(plgdata->xslt_ctx_ocont); - if (plgdata->cal_timestamp) - free(plgdata->cal_timestamp); - if (plgdata->cont_timestamp) - free(plgdata->cont_timestamp); if (plgdata->timezone) free(plgdata->timezone); if (plgdata->url) @@ -260,10 +251,6 @@ xmlFree(plgdata->username); if (plgdata->password) xmlFree(plgdata->password); - if (plgdata->gcal_format) - osync_objformat_unref(plgdata->gcal_format); - if (plgdata->gcont_format) - osync_objformat_unref(plgdata->gcont_format); g_free(plgdata); } @@ -276,7 +263,7 @@ OSyncError *error = NULL; char buffer[512]; - result = gcal_get_authentication(plgdata->calendar, plgdata->username, + result = gcal_get_authentication(plgdata->cal.handle, plgdata->username, plgdata->password); if (result == -1) goto error; @@ -284,14 +271,14 @@ // google -> osync snprintf(buffer, sizeof(buffer) - 1, "%sgcal2osync.xslt", plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->xslt_ctx_gcal, buffer))) + if ((result = xslt_initialize(plgdata->cal.xslt_google2osync, buffer))) goto error; osync_trace(TRACE_INTERNAL, "loaded calendar xslt: %s\n", buffer); // osync -> google snprintf(buffer, sizeof(buffer) - 1, "%sosync2gcal.xslt", plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->xslt_ctx_ocal, buffer))) + if ((result = xslt_initialize(plgdata->cal.xslt_osync2google, buffer))) goto error; osync_trace(TRACE_INTERNAL, "loaded calendar xslt: %s\n", buffer); @@ -316,7 +303,7 @@ OSyncError *error = NULL; char buffer[512]; - result = gcal_get_authentication(plgdata->contacts, plgdata->username, + result = gcal_get_authentication(plgdata->cont.handle, plgdata->username, plgdata->password); if (result == -1) goto error; @@ -324,14 +311,14 @@ // google -> osync snprintf(buffer, sizeof(buffer) - 1, "%sgcont2osync.xslt", plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->xslt_ctx_gcont, buffer))) + if ((result = xslt_initialize(plgdata->cont.xslt_google2osync, buffer))) goto error; osync_trace(TRACE_INTERNAL, "loaded contact xslt: %s\n", buffer); // osync -> google snprintf(buffer, sizeof(buffer) - 1, "%sosync2gcont.xslt", plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->xslt_ctx_ocont, buffer))) + if ((result = xslt_initialize(plgdata->cont.xslt_osync2google, buffer))) goto error; osync_trace(TRACE_INTERNAL, "loaded contact xslt: %s\n", buffer); @@ -363,6 +350,7 @@ gcal_event_t event; OSyncError *state_db_error = NULL; OSyncSinkStateDB *state_db = NULL; + struct gcal_event_array all_events; state_db = osync_objtype_sink_get_state_db(sink); if( !state_db ) @@ -379,11 +367,11 @@ if (slow_sync || strlen(timestamp) == 0) { osync_trace(TRACE_INTERNAL, "\n\t\tgcal: slow sync, or first time\n"); - result = gcal_get_events(plgdata->calendar, &(plgdata->all_events)); + result = gcal_get_events(plgdata->cal.handle, &all_events); } else { - result = gcal_get_updated_events(plgdata->calendar, - &(plgdata->all_events), + result = gcal_get_updated_events(plgdata->cal.handle, + &all_events, timestamp); } @@ -393,16 +381,16 @@ } osync_trace(TRACE_INTERNAL, "gcalendar: got them all!\n"); - if (plgdata->all_events.length == 0) { + if (all_events.length == 0) { osync_trace(TRACE_INTERNAL, "gcalendar: no changes...\n"); goto exit; } else { osync_trace(TRACE_INTERNAL, "gcalendar: changes count: %d\n", - plgdata->all_events.length); + all_events.length); } // Calendar returns most recently updated event as first element - for (i = 0; i < plgdata->all_events.length; ++i) { + for (i = 0; i < all_events.length; ++i) { // cleanup for a fresh run if (seen) { osync_free(seen); @@ -410,7 +398,7 @@ } // grab the next event object - event = gcal_event_element(&(plgdata->all_events), i); + event = gcal_event_element(&all_events, i); if (!event) { osync_trace(TRACE_INTERNAL, "Cannot access updated event %d", i); goto error; @@ -418,10 +406,10 @@ // save first timestamp as new "done" mark if (i == 0) { - if (plgdata->cal_timestamp) - free(plgdata->cal_timestamp); - plgdata->cal_timestamp = strdup(gcal_event_get_updated(event)); - if (!plgdata->cal_timestamp) { + if (plgdata->cal.timestamp) + free(plgdata->cal.timestamp); + plgdata->cal.timestamp = strdup(gcal_event_get_updated(event)); + if (!plgdata->cal.timestamp) { msg = "Failed copying event timestamp!\n"; goto error; } @@ -499,15 +487,15 @@ // fill in the data if( ct != OSYNC_CHANGE_TYPE_DELETED ) { raw_xml = gcal_event_get_xml(event); - if( xslt_transform(plgdata->xslt_ctx_gcal, raw_xml) ) { + if( xslt_transform(plgdata->cal.xslt_google2osync, raw_xml) ) { osync_change_unref(chg); goto error; } - raw_xml = (char*) plgdata->xslt_ctx_gcal->xml_str; + raw_xml = (char*) plgdata->cal.xslt_google2osync->xml_str; odata = osync_data_new(strdup(raw_xml), strlen(raw_xml), - plgdata->gcal_format, &error); + plgdata->cal.format, &error); if( !odata ) { osync_change_unref(chg); goto cleanup; @@ -515,7 +503,7 @@ } else { // deleted changes need empty data sets - odata = osync_data_new(NULL, 0, plgdata->gcal_format, + odata = osync_data_new(NULL, 0, plgdata->cal.format, &error); if( !odata ) { osync_change_unref(chg); @@ -542,6 +530,7 @@ cleanup: osync_error_unref(&error); + gcal_cleanup_events(&all_events); // osync_sink_state_get uses osync_strdup osync_free(timestamp); @@ -567,6 +556,7 @@ const char *raw_xml = NULL; gcal_contact_t contact; OSyncError *state_db_error = NULL; + struct gcal_contact_array all_contacts; if (!(osync_objtype_sink_get_state_db(sink))) goto error; @@ -586,13 +576,13 @@ if (slow_sync) { osync_trace(TRACE_INTERNAL, "\n\t\tgcont: Client asked for slow syncing...\n"); slow_sync_flag = 1; - result = gcal_get_contacts(plgdata->contacts, &(plgdata->all_contacts)); + result = gcal_get_contacts(plgdata->cont.handle, &all_contacts); } else { osync_trace(TRACE_INTERNAL, "\n\t\tgcont: Client asked for fast syncing...\n"); - gcal_deleted(plgdata->contacts, SHOW); - result = gcal_get_updated_contacts(plgdata->contacts, - &(plgdata->all_contacts), + gcal_deleted(plgdata->cont.handle, SHOW); + result = gcal_get_updated_contacts(plgdata->cont.handle, + &all_contacts, timestamp); } @@ -602,28 +592,27 @@ } osync_trace(TRACE_INTERNAL, "gcontact: got them all!\n"); - if (plgdata->all_contacts.length == 0) { + if (all_contacts.length == 0) { osync_trace(TRACE_INTERNAL, "gcontact: no changes...\n"); goto no_changes; } else osync_trace(TRACE_INTERNAL, "gcontact: changes count: %d\n", - plgdata->all_contacts.length); + all_contacts.length); // Contacts returns most recently updated entry as last element - contact = gcal_contact_element(&(plgdata->all_contacts), - (plgdata->all_contacts.length - 1)); + contact = gcal_contact_element(&all_contacts, all_contacts.length - 1); if (!contact) { msg = "Cannot access last updated contact!\n"; goto error; } - plgdata->cont_timestamp = strdup(gcal_contact_get_updated(contact)); - if (!plgdata->cont_timestamp) { + plgdata->cont.timestamp = strdup(gcal_contact_get_updated(contact)); + if (!plgdata->cont.timestamp) { msg = "Failed copying contact timestamp!\n"; goto error; } - for (i = 0; i < plgdata->all_contacts.length; ++i) { - contact = gcal_contact_element(&(plgdata->all_contacts), i); + for (i = 0; i < all_contacts.length; ++i) { + contact = gcal_contact_element(&all_contacts, i); if (!contact) goto error; @@ -639,14 +628,14 @@ osync_trace(TRACE_INTERNAL, "gcontact: new or deleted contact!"); raw_xml = gcal_contact_get_xml(contact); - if ((result = xslt_transform(plgdata->xslt_ctx_gcont, + if ((result = xslt_transform(plgdata->cont.xslt_google2osync, raw_xml))) goto error; - raw_xml = (char*) plgdata->xslt_ctx_gcont->xml_str; + raw_xml = (char*) plgdata->cont.xslt_google2osync->xml_str; odata = osync_data_new(strdup(raw_xml), strlen(raw_xml), - plgdata->gcont_format, &error); + plgdata->cont.format, &error); if (!odata) goto cleanup; @@ -677,7 +666,7 @@ // Load XSLT style to convert osync xmlformat-contact --> gdata snprintf(buffer, sizeof(buffer) - 1, "%sosync2gcont.xslt", plgdata->xslt_path); - if ((result = xslt_initialize(plgdata->xslt_ctx_gcont, buffer))) { + if ((result = xslt_initialize(plgdata->cont.xslt_google2osync, buffer))) { msg = "Cannot initialize new XSLT!\n"; goto error; } @@ -694,6 +683,7 @@ osync_error_unref(&error); // osync_sink_state_get uses osync_strdup osync_free(timestamp); + gcal_cleanup_contacts(&all_contacts); error: osync_context_report_error(ctx, OSYNC_ERROR_GENERIC, "%s", msg); @@ -737,7 +727,7 @@ } // Convert to gdata format - result = xslt_transform(plgdata->xslt_ctx_ocal, osync_xml); + result = xslt_transform(plgdata->cal.xslt_osync2google, osync_xml); if( result ) { msg = "Failed converting from osync xmlevent to gcalendar\n"; osync_trace(TRACE_INTERNAL, "--- osync_uid: %s", @@ -748,9 +738,9 @@ } osync_trace(TRACE_INTERNAL, "--- transformed xml: %s", - (char*) plgdata->xslt_ctx_ocal->xml_str); + (char*) plgdata->cal.xslt_osync2google->xml_str); - raw_xml = vtime2gtime((char*)plgdata->xslt_ctx_ocal->xml_str); + raw_xml = vtime2gtime((char*)plgdata->cal.xslt_osync2google->xml_str); osync_trace(TRACE_INTERNAL, "--- gtime adjusted: %s", raw_xml); } @@ -764,14 +754,14 @@ switch( osync_change_get_changetype(change) ) { case OSYNC_CHANGE_TYPE_ADDED: - result = gcal_add_xmlentry(plgdata->calendar, raw_xml, + result = gcal_add_xmlentry(plgdata->cal.handle, raw_xml, &updated_event); if( result == -1 ) { msg = "Failed adding new event!\n"; osync_trace(TRACE_INTERNAL, "Failed adding new event! HTTP code: %d, %s, %s\n", - gcal_status_httpcode(plgdata->calendar), - gcal_status_msg(plgdata->calendar), - gcal_access_buffer(plgdata->calendar)); + gcal_status_httpcode(plgdata->cal.handle), + gcal_status_msg(plgdata->cal.handle), + gcal_access_buffer(plgdata->cal.handle)); goto error; } @@ -801,15 +791,15 @@ goto error; } - result = gcal_update_xmlentry(plgdata->calendar, raw_xml, + result = gcal_update_xmlentry(plgdata->cal.handle, raw_xml, &updated_event, osync_change_get_uid(change), etag); if( result == -1 ) { msg = "Failed editing event!\n"; osync_trace(TRACE_INTERNAL, "Failed editing event: (etag: %s). HTTP code: %d, %s, %s\n", etag, - gcal_status_httpcode(plgdata->calendar), - gcal_status_msg(plgdata->calendar), - gcal_access_buffer(plgdata->calendar)); + gcal_status_httpcode(plgdata->cal.handle), + gcal_status_msg(plgdata->cal.handle), + gcal_access_buffer(plgdata->cal.handle)); goto error; } @@ -849,13 +839,13 @@ goto error; } - result = gcal_erase_event(plgdata->calendar, event); + result = gcal_erase_event(plgdata->cal.handle, event); if( result == -1 ) { msg = "Failed deleting event!\n"; osync_trace(TRACE_INTERNAL, "Failed deleting event! HTTP code: %d, %s, %s\n", - gcal_status_httpcode(plgdata->calendar), - gcal_status_msg(plgdata->calendar), - gcal_access_buffer(plgdata->calendar)); + gcal_status_httpcode(plgdata->cal.handle), + gcal_status_msg(plgdata->cal.handle), + gcal_access_buffer(plgdata->cal.handle)); goto error; } @@ -875,19 +865,19 @@ if( event && gcal_event_get_updated(event) ) { // update the timestamp - if( plgdata->cal_timestamp ) { + if( plgdata->cal.timestamp ) { // only if newer - if( timestamp_cmp(gcal_event_get_updated(event), plgdata->cal_timestamp) > 0 ) { - free(plgdata->cal_timestamp); - plgdata->cal_timestamp = strdup(gcal_event_get_updated(event)); + if( timestamp_cmp(gcal_event_get_updated(event), plgdata->cal.timestamp) > 0 ) { + free(plgdata->cal.timestamp); + plgdata->cal.timestamp = strdup(gcal_event_get_updated(event)); } } else { - plgdata->cal_timestamp = strdup(gcal_event_get_updated(event)); + plgdata->cal.timestamp = strdup(gcal_event_get_updated(event)); } // error check - if (!plgdata->cal_timestamp) { + if (!plgdata->cal.timestamp) { msg = "Failed copying contact timestamp!\n"; goto error; } @@ -940,20 +930,20 @@ } // Convert to gdata format - if ((result = xslt_transform(plgdata->xslt_ctx_gcont, osync_xml))) { + if ((result = xslt_transform(plgdata->cont.xslt_google2osync, osync_xml))) { msg = "Failed converting from osync xmlcontact to gcontact\n"; goto error; } - raw_xml = vtime2gtime( (char*) plgdata->xslt_ctx_gcont->xml_str ); + raw_xml = vtime2gtime( (char*) plgdata->cont.xslt_google2osync->xml_str ); osync_trace(TRACE_INTERNAL, "osync: %s\ngcont: %s\n\n", osync_xml, raw_xml); switch (osync_change_get_changetype(change)) { case OSYNC_CHANGE_TYPE_ADDED: - result = gcal_add_xmlentry(plgdata->contacts, raw_xml, &updated_contact); + result = gcal_add_xmlentry(plgdata->cont.handle, raw_xml, &updated_contact); if (result == -1) { msg = "Failed adding new contact!\n"; - result = gcal_status_httpcode(plgdata->contacts); + result = gcal_status_httpcode(plgdata->cont.handle); goto error; } @@ -964,7 +954,7 @@ break; case OSYNC_CHANGE_TYPE_MODIFIED: - result = gcal_update_xmlentry(plgdata->contacts, + result = gcal_update_xmlentry(plgdata->cont.handle, raw_xml, &updated_contact, NULL, NULL); if (result == -1) { msg = "Failed editing contact!\n"; @@ -978,7 +968,7 @@ break; case OSYNC_CHANGE_TYPE_DELETED: - result = gcal_erase_xmlentry(plgdata->contacts, raw_xml); + result = gcal_erase_xmlentry(plgdata->cont.handle, raw_xml); if (result == -1) { msg = "Failed deleting contact!\n"; goto error; @@ -997,10 +987,10 @@ if (contact) { // update the timestamp - if (plgdata->cont_timestamp) - free(plgdata->cont_timestamp); - plgdata->cont_timestamp = strdup(gcal_contact_get_updated(contact)); - if (!plgdata->cont_timestamp) { + if (plgdata->cont.timestamp) + free(plgdata->cont.timestamp); + plgdata->cont.timestamp = strdup(gcal_contact_get_updated(contact)); + if (!plgdata->cont.timestamp) { msg = "Failed copying contact timestamp!\n"; goto error; } @@ -1035,19 +1025,19 @@ struct gc_plgdata *plgdata = data; OSyncError *state_db_error; - if (plgdata->calendar && plgdata->cal_timestamp) { + if (plgdata->cal.handle && plgdata->cal.timestamp) { osync_trace(TRACE_INTERNAL, "query updated timestamp: %s\n", - plgdata->cal_timestamp); + plgdata->cal.timestamp); osync_sink_state_set(osync_objtype_sink_get_state_db(sink), - "cal_timestamp", plgdata->cal_timestamp, + "cal_timestamp", plgdata->cal.timestamp, &state_db_error); } - if (plgdata->contacts && plgdata->cont_timestamp) { + if (plgdata->cont.handle && plgdata->cont.timestamp) { osync_trace(TRACE_INTERNAL, "query updated timestamp: %s\n", - plgdata->cont_timestamp); + plgdata->cont.timestamp); osync_sink_state_set(osync_objtype_sink_get_state_db(sink), - "cont_timestamp", plgdata->cont_timestamp, + "cont_timestamp", plgdata->cont.timestamp, &state_db_error); } @@ -1094,24 +1084,24 @@ osync_plugin_resource_get_objtype(r->data)); if( !strcmp(osync_plugin_resource_get_objtype(r->data), "event") ) { - plgdata->calendar = gcal_new(GCALENDAR); - if( !plgdata->calendar ) + plgdata->cal.handle = gcal_new(GCALENDAR); + if( !plgdata->cal.handle ) goto error_freeplg; else { osync_trace(TRACE_INTERNAL, "\tcreated calendar obj!\n"); - gcal_set_store_xml(plgdata->calendar, 1); + gcal_set_store_xml(plgdata->cal.handle, 1); } } if( !strcmp(osync_plugin_resource_get_objtype(r->data), "contact") ) { - plgdata->contacts = gcal_new(GCONTACT); - if( !plgdata->contacts ) + plgdata->cont.handle = gcal_new(GCONTACT); + if( !plgdata->cont.handle ) goto error_freeplg; else { osync_trace(TRACE_INTERNAL, "\tcreated contact obj!\n"); - gcal_set_store_xml(plgdata->contacts, 1); + gcal_set_store_xml(plgdata->cont.handle, 1); } } @@ -1161,16 +1151,16 @@ if( !sink ) { osync_trace(TRACE_ERROR, "%s", "Failed to find objtype event!"); } - if( sink && osync_objtype_sink_is_enabled(sink) && plgdata->calendar ) { + if( sink && osync_objtype_sink_is_enabled(sink) && plgdata->cal.handle ) { osync_trace(TRACE_INTERNAL, "\tcreating calendar sink...\n"); OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env(info); - plgdata->gcal_format = osync_format_env_find_objformat(formatenv, "xmlformat-event-doc"); - if (!plgdata->gcal_format) { + plgdata->cal.format = osync_format_env_find_objformat(formatenv, "xmlformat-event-doc"); + if (!plgdata->cal.format) { osync_trace(TRACE_ERROR, "%s", "Failed to find objformat xmlformat-event!"); goto error_freeplg; } - osync_objformat_ref(plgdata->gcal_format); + osync_objformat_ref(plgdata->cal.format); osync_objtype_sink_set_connect_func(sink, gc_connect_calendar); @@ -1196,16 +1186,16 @@ if( !sink ) { osync_trace(TRACE_ERROR, "%s", "Failed to find objtype contact!"); } - if( sink && osync_objtype_sink_is_enabled(sink) && plgdata->contacts ) { + if( sink && osync_objtype_sink_is_enabled(sink) && plgdata->cont.handle ) { osync_trace(TRACE_INTERNAL, "\tcreating contact sink...\n"); OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env(info); - plgdata->gcont_format = osync_format_env_find_objformat(formatenv, "xmlformat-contact-doc"); - if (!plgdata->gcont_format) { + plgdata->cont.format = osync_format_env_find_objformat(formatenv, "xmlformat-contact-doc"); + if (!plgdata->cont.format) { osync_trace(TRACE_ERROR, "%s", "Failed to find objformat xmlformat-contact!"); goto error_freeplg; } - osync_objformat_ref(plgdata->gcont_format); + osync_objformat_ref(plgdata->cont.format); osync_objtype_sink_set_connect_func(sink, gc_connect_contact); @@ -1222,19 +1212,19 @@ } - if( plgdata->calendar ) { - plgdata->xslt_ctx_gcal = xslt_new(); - plgdata->xslt_ctx_ocal = xslt_new(); - if (!plgdata->xslt_ctx_gcal || !plgdata->xslt_ctx_ocal) + if( plgdata->cal.handle ) { + plgdata->cal.xslt_google2osync = xslt_new(); + plgdata->cal.xslt_osync2google = xslt_new(); + if (!plgdata->cal.xslt_google2osync || !plgdata->cal.xslt_osync2google) goto error_freeplg; else osync_trace(TRACE_INTERNAL, "\tsucceed creating xslt_gcal!\n"); } - if( plgdata->contacts ) { - plgdata->xslt_ctx_gcont = xslt_new(); - plgdata->xslt_ctx_ocont = xslt_new(); - if (!plgdata->xslt_ctx_gcont || !plgdata->xslt_ctx_ocont) + if( plgdata->cont.handle ) { + plgdata->cont.xslt_google2osync = xslt_new(); + plgdata->cont.xslt_osync2google = xslt_new(); + if (!plgdata->cont.xslt_google2osync || !plgdata->cont.xslt_osync2google) goto error_freeplg; else osync_trace(TRACE_INTERNAL, "\tsucceed creating xslt_gcont!\n"); |
From: <svn...@op...> - 2010-09-08 02:50:20
|
Author: cdfrey Date: Wed Sep 8 04:50:10 2010 New Revision: 6120 URL: http://www.opensync.org/changeset/6120 Log: API and compile changes Modified: format-plugins/xsltformat/src/xsltformat.c Modified: format-plugins/xsltformat/src/xsltformat.c ============================================================================== --- format-plugins/xsltformat/src/xsltformat.c Mon Sep 6 01:22:51 2010 (r6119) +++ format-plugins/xsltformat/src/xsltformat.c Wed Sep 8 04:50:10 2010 (r6120) @@ -45,7 +45,7 @@ if ((result = xslt_transform(converter, input))) goto exit; - if (!(*output = strdup(converter->xml_str))) + if (!(*output = strdup((char*)converter->xml_str))) goto exit; *free_input = TRUE; @@ -68,7 +68,7 @@ if ((result = xslt_transform(converter, input))) goto exit; - if (!(*output = strdup(converter->xml_str))) + if (!(*output = strdup((char*)converter->xml_str))) goto exit; *free_input = TRUE; @@ -83,13 +83,14 @@ } +/* static void destroy_format1(char *input, unsigned int inpsize, void *user_data) { - /* - * Here you have to free the data allocated by your format - * - */ + // + // Here you have to free the data allocated by your format + // } +*/ osync_bool get_format_info(OSyncFormatEnv *env, OSyncError **error) { @@ -97,7 +98,8 @@ if (!format) return FALSE; - osync_format_env_register_objformat(env, format); + if( !osync_format_env_register_objformat(env, format, error) ) + return FALSE; osync_objformat_unref(format); return TRUE; @@ -118,15 +120,15 @@ } -void finalize_xslt(void *userdata) +static osync_bool finalize_xslt(void *userdata, OSyncError **error) { struct xslt_resources *converter = NULL; if (!userdata) - return; + return FALSE; converter = (struct xslt_resources *)userdata; xslt_delete(converter); - + return TRUE; } static osync_bool reg_conv(OSyncFormatEnv *env, @@ -140,15 +142,22 @@ from, to, convert_func, &error); if (!conv) - return FALSE; + goto error; osync_converter_set_initialize_func(conv, initialize_func); osync_converter_set_finalize_func(conv, finalize_func); - osync_format_env_register_converter(env, conv); + if( !osync_format_env_register_converter(env, conv, &error) ) + goto error; osync_converter_unref(conv); return TRUE; +error: + if( conv ) + osync_converter_unref(conv); + osync_trace(TRACE_INTERNAL, "%s", osync_error_print(&error)); + osync_error_unref(&error); + return FALSE; } osync_bool get_conversion_info(OSyncFormatEnv *env, OSyncError **error) |
From: <svn...@op...> - 2010-09-05 23:23:00
|
Author: paule Date: Mon Sep 6 01:22:51 2010 New Revision: 6119 URL: http://www.opensync.org/changeset/6119 Log: opie-sync: fix committing changes back to Opie in fast sync mode Modified: plugins/opie-sync/src/opie_sync.c Modified: plugins/opie-sync/src/opie_sync.c ============================================================================== --- plugins/opie-sync/src/opie_sync.c Mon Sep 6 00:51:52 2010 (r6118) +++ plugins/opie-sync/src/opie_sync.c Mon Sep 6 01:22:51 2010 (r6119) @@ -619,8 +619,15 @@ } OSyncChangeType changetype = osync_change_get_changetype(change); - if( env->fastcapable ) + if( env->fastcapable ) { + // Record the change type in the XML itself opie_xml_set_change_type(change_node, changetype); + // Now, we always want to add the entry to the XML document in this case + // (we're making a list of changes to send, not modifying a document containing + // all of the records). Note: this means changetype shouldn't be used for + // any other purpose after the switch statement below! + changetype = OSYNC_CHANGE_TYPE_ADDED; + } switch (changetype) { case OSYNC_CHANGE_TYPE_DELETED: if(!opie_uid) { |
From: <svn...@op...> - 2010-09-05 22:52:02
|
Author: paule Date: Mon Sep 6 00:51:52 2010 New Revision: 6118 URL: http://www.opensync.org/changeset/6118 Log: opie-sync: define static capabilities Added: plugins/opie-sync/src/opie-sync-capabilities.xml plugins/opie-sync/src/opie-sync-description.xml Modified: plugins/opie-sync/src/CMakeLists.txt plugins/opie-sync/src/opie_sync.c Modified: plugins/opie-sync/src/CMakeLists.txt ============================================================================== --- plugins/opie-sync/src/CMakeLists.txt Sun Sep 5 00:45:00 2010 (r6117) +++ plugins/opie-sync/src/CMakeLists.txt Mon Sep 6 00:51:52 2010 (r6118) @@ -25,5 +25,7 @@ OPENSYNC_FORMAT_INSTALL( opie ) OPENSYNC_PLUGIN_INSTALL( opie-sync ) +OPENSYNC_PLUGIN_CAPABILITIES( opie-sync-capabilities.xml ) # install capabilities file +OPENSYNC_PLUGIN_DESCRIPTIONS( opie-sync-description.xml ) # install description file OPENSYNC_PLUGIN_CONFIG( opie-sync ) Added: plugins/opie-sync/src/opie-sync-capabilities.xml ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/opie-sync/src/opie-sync-capabilities.xml Mon Sep 6 00:51:52 2010 (r6118) @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<Caps Version="1.0" CapsFormat="xmlformat"> + <ObjType Name="contact"> + <Cap> + <Name>Address</Name> + <Cap><Name>Country</Name></Cap> + <Cap><Name>Locality</Name></Cap> + <Cap><Name>PostalCode</Name></Cap> + <Cap><Name>Region</Name></Cap> + <Cap><Name>Street</Name></Cap> + </Cap> + <Cap><Name>Anniversary</Name></Cap> + <Cap><Name>Assistant</Name></Cap> + <Cap><Name>Birthday</Name></Cap> + <Cap><Name>BlogUrl</Name></Cap> + <Cap><Name>Categories</Name></Cap> + <Cap><Name>EMail</Name></Cap> + <Cap><Name>FormattedName</Name></Cap> + <Cap> + <Name>Name</Name> + <Cap><Name>FirstName</Name></Cap> + <Cap><Name>LastName</Name></Cap> + </Cap> + <Cap><Name>Manager</Name></Cap> + <Cap> + <Name>Name</Name> + <Cap><Name>FirstName</Name></Cap> + <Cap><Name>LastName</Name></Cap> + </Cap> + <Cap><Name>Nickname</Name></Cap> + <Cap><Name>Note</Name></Cap> + <Cap><Name>Organization</Name></Cap> + <Cap><Name>Profession</Name></Cap> + <Cap><Name>Role</Name></Cap> + <Cap><Name>Spouse</Name></Cap> + <Cap><Name>Telephone</Name></Cap> + <Cap><Name>Title</Name></Cap> + <Cap><Name>Uid</Name></Cap> + <Cap><Name>Url</Name></Cap> + </ObjType> + <ObjType Name="event"> + <Cap><Name>Alarm</Name></Cap> + <Cap><Name>Categories</Name></Cap> + <Cap><Name>Created</Name></Cap> + <Cap><Name>DateEnd</Name></Cap> + <Cap><Name>DateStarted</Name></Cap> + <Cap><Name>Description</Name></Cap> + <Cap><Name>ExceptionDateTime</Name></Cap> + <Cap><Name>Location</Name></Cap> + <Cap><Name>RecurrenceRule</Name></Cap> + <Cap><Name>Summary</Name></Cap> + <Cap><Name>Uid</Name></Cap> + </ObjType> + <ObjType Name="todo"> + <Cap><Name>Alarm</Name></Cap> + <Cap><Name>Categories</Name></Cap> + <Cap><Name>Completed</Name></Cap> + <Cap><Name>DateStarted</Name></Cap> + <Cap><Name>Description</Name></Cap> + <Cap><Name>Due</Name></Cap> + <Cap><Name>PercentComplete</Name></Cap> + <Cap><Name>Priority</Name></Cap> + <Cap><Name>RecurrenceRule</Name></Cap> + <Cap><Name>Status</Name></Cap> + <Cap><Name>Summary</Name></Cap> + </ObjType> + <ObjType Name="note"> + <Cap><Name>Description</Name></Cap> + <Cap><Name>Summary</Name></Cap> + </ObjType> +</Caps> Added: plugins/opie-sync/src/opie-sync-description.xml ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/opie-sync/src/opie-sync-description.xml Mon Sep 6 00:51:52 2010 (r6118) @@ -0,0 +1,13 @@ +<?xml version="1.0"?> +<versions version="0.1"> +<version> +<PlugIn>opie-sync</PlugIn> +<Priority>100</Priority> +<Vendor>Opie</Vendor> +<ModelVersion></ModelVersion> +<FirmwareVersion></FirmwareVersion> +<SoftwareVersion></SoftwareVersion> +<HardwareVersion></HardwareVersion> +<Identifier>opie-sync-capabilities.xml</Identifier> +</version> +</versions> Modified: plugins/opie-sync/src/opie_sync.c ============================================================================== --- plugins/opie-sync/src/opie_sync.c Sun Sep 5 00:45:00 2010 (r6117) +++ plugins/opie-sync/src/opie_sync.c Mon Sep 6 00:51:52 2010 (r6118) @@ -908,6 +908,7 @@ OSyncVersion *version = osync_version_new(error); osync_version_set_plugin(version, "opie-sync"); + osync_version_set_vendor(version, "Opie"); //osync_version_set_modelversion(version, "version"); //osync_version_set_firmwareversion(version, "firmwareversion"); //osync_version_set_softwareversion(version, "softwareversion"); @@ -915,9 +916,6 @@ osync_plugin_info_set_version(info, version); osync_version_unref(version); - - /* FIXME define capabilities */ - osync_trace(TRACE_EXIT, "%s", __func__); return TRUE; } |
From: <svn...@op...> - 2010-09-04 22:45:10
|
Author: paule Date: Sun Sep 5 00:45:00 2010 New Revision: 6117 URL: http://www.opensync.org/changeset/6117 Log: opie-sync: update copyright dates Modified: plugins/opie-sync/src/opie_format.c plugins/opie-sync/src/opie_format.h plugins/opie-sync/src/opie_qcop.c plugins/opie-sync/src/opie_qcop.h plugins/opie-sync/src/opie_sync.c plugins/opie-sync/src/opie_sync.h plugins/opie-sync/src/opie_xml.c plugins/opie-sync/src/opie_xml.h Modified: plugins/opie-sync/src/opie_format.c ============================================================================== --- plugins/opie-sync/src/opie_format.c Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_format.c Sun Sep 5 00:45:00 2010 (r6117) @@ -1,6 +1,7 @@ /* - Copyright 2005 Paul Eggleton & Holger Hans Peter Freyther + Copyright 2005 Holger Hans Peter Freyther + Copyright 2010 Paul Eggleton <blu...@bl...> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal Modified: plugins/opie-sync/src/opie_format.h ============================================================================== --- plugins/opie-sync/src/opie_format.h Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_format.h Sun Sep 5 00:45:00 2010 (r6117) @@ -1,6 +1,7 @@ /* - Copyright 2005 Paul Eggleton & Holger Hans Peter Freyther + Copyright 2005 Holger Hans Peter Freyther + Copyright 2010 Paul Eggleton <blu...@bl...> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal Modified: plugins/opie-sync/src/opie_qcop.c ============================================================================== --- plugins/opie-sync/src/opie_qcop.c Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_qcop.c Sun Sep 5 00:45:00 2010 (r6117) @@ -2,7 +2,7 @@ MultiSync Opie Plugin - Synchronize Opie/Zaurus Devices Copyright (C) 2003 Tom Foottit <to...@fo...> Eike M. Lang <ma...@el...> - Copyright (C) 2009 Paul Eggleton <blu...@bl...> + Copyright (C) 2010 Paul Eggleton <blu...@bl...> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as Modified: plugins/opie-sync/src/opie_qcop.h ============================================================================== --- plugins/opie-sync/src/opie_qcop.h Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_qcop.h Sun Sep 5 00:45:00 2010 (r6117) @@ -5,6 +5,7 @@ MultiSync Opie Plugin - Synchronize Opie/Zaurus Devices Copyright (C) 2003 Tom Foottit <to...@fo...> Eike M. Lang <ma...@el...> + Copyright (C) 2010 Paul Eggleton <blu...@bl...> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as Modified: plugins/opie-sync/src/opie_sync.c ============================================================================== --- plugins/opie-sync/src/opie_sync.c Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_sync.c Sun Sep 5 00:45:00 2010 (r6117) @@ -1,6 +1,7 @@ /* - Copyright 2008 Paul Eggleton & Holger Hans Peter Freyther + Copyright 2005 Holger Hans Peter Freyther + Copyright 2010 Paul Eggleton <blu...@bl...> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal Modified: plugins/opie-sync/src/opie_sync.h ============================================================================== --- plugins/opie-sync/src/opie_sync.h Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_sync.h Sun Sep 5 00:45:00 2010 (r6117) @@ -1,6 +1,7 @@ /* - Copyright 2005 Paul Eggleton & Holger Hans Peter Freyther + Copyright 2005 Holger Hans Peter Freyther + Copyright 2010 Paul Eggleton <blu...@bl...> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal Modified: plugins/opie-sync/src/opie_xml.c ============================================================================== --- plugins/opie-sync/src/opie_xml.c Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_xml.c Sun Sep 5 00:45:00 2010 (r6117) @@ -1,6 +1,6 @@ /* - Copyright 2005 Paul Eggleton + Copyright 2010 Paul Eggleton <blu...@bl...> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal Modified: plugins/opie-sync/src/opie_xml.h ============================================================================== --- plugins/opie-sync/src/opie_xml.h Sun Sep 5 00:28:21 2010 (r6116) +++ plugins/opie-sync/src/opie_xml.h Sun Sep 5 00:45:00 2010 (r6117) @@ -3,7 +3,7 @@ /* - Copyright 2005 Paul Eggleton + Copyright 2010 Paul Eggleton <blu...@bl...> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal |