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; |