SyncML is an XML based standard for data synchronization. For example its
supported on a lot of mobile phones and would allow OGo to sync calendering
and contact information with the PIM software of your phone or handheld.
Update 2005-05-17
This project as an Objective-C implementation of SyncML is currently stalled
though parts (like the iCalendar and vCard parsers) are actively continued
as part of SOPE.
On the server side two companies are known to work on Sync4J plugins, but
no results are available yet.
On the client side, OGo already has SyncML support by supporting
MultiSync/EDS as part of the Noodle project.
An Apple iSync plugin is under consideration.
Finally a native GroupDAV plugin for MultiSync was made available today
(thanks to Johannes Schneider).
Old Roadmap
These are the planned steps to get a complete SyncML support into OGo:
- Work with the OGo Code, especially the ZideStore code a little to undestand where best to link in the SyncML framework (done)
- Implement Authentication to OGo via SyncML (done)
- Write an program that recevies the Addressbook from OGo, One-Way-Only, using the same SyncML library (done)
- Write an OSX program that syncronizes OSX Addressbook with OGo, One-Way-Only, using the same SyncML library (done)
- Implement Slow two-way sync (done)
- Implement regular Two-Way Sync (in progress)
- Implement ALL other Features required by the SyncML specification
- Implement other features optional within the SynCML specification
Timeframe
As this is a free time project, there is no telling how and when
things will work the way they should or when things are completed. If
you would like to help out, please contact us. (see above)
Requirements elicitation
- The SyncML Framework should be a seperate library
- It should work with libFoundation or with Apples Foundation Classes
- It should compile with gcc 2.95 and 3.3
- The protocol should fully comply with the SyncML 1.1 specs
Current/Old Status
The SyncML vCardReceiver is finished! It can receive the OGo Contacts
database, and uses fully SyncML compliant messages.
The AddressBookSync Application for OS X now works! It is able to receive
the OGo Contact database and overwrites the local Address Book. It can also do a slow sync.
Warning: Although the vCardReceiver is fully implemented and uses fully
SyncML compliant messages, there is still a lot of code missing.
Therefore it will probably not work with any other SyncML products,
produce strange results, or might even crash.
Howto get/build/install it?
The instructions below are outdated. The versitSaxDriver is now the standard
iCal/vCard driver in SOPE 4.5. All the sourcecode lives in Subversion, not
in CVS.
-
check out the syncml module from opengroupwares cvs:
CVSROOT=:pserver:anonymous@cvs.opengroupware.org:/cvs cvs checkout syncml
-
build libsyncml:
cd syncml/libSyncML;make -s debug=yes install; cd ../..
-
build versitSaxDriver:
cd syncml/versitSaxDriver; make -s debug=yes install; cd ../..
-
build the ZideStore plugin:
cd syncml/SyncMLZSAdapter;make -s debug=yes install ; cd ../..
- (re)start ZideStore
-
You may now acces the SyncML plugin at http://[yourserver]:23000/zidestore/SyncML
-
If you have Mac OS X you can use the vCardReceiver XCode project. You
Currently need: Mac OS 10.2 with Safari 1.0, MacOS 10.2.7 or higher and
XCode. You also need some of the Frameworks (Foundation, DOM, SaxObjC, NGExtensions) in a place where OS X finds them. Last, but not least you have manually copy SyncMLSaxMap.xmap to you
~/Library/SaxMappings directory.
-
If you don't have MAC OS X you can use the vCardReceiver command line
tool:
cd syncml/vCardRecevier;make -s debug=yes install; cd ../..
- The correct way to call it is
vCardReceiver -u [username] -p [password] http://[youserver]:23000/zidestore/SyncML
-
If you have Mac OS X you can also try out the AddressBookSync
Application. You need 10.3 and XCode. It will receive your
contacts and overwrite your local AddressBook.
Warning: Currently only basic authentication is implemented! This means you password is sent unencrypted through the line and anyone might be able to read it. You have been warned!
If you like to see whats going on try this:
Defaults write NSGlobalDomain OGoDebugSyncMLConnectionLogStream 1 (or 0 to turn it off again)
Howto does it work?
The basic architecture of the library is working with callbacks, providing a framework for synchronization
Related Links
SyncML
Max Bergers paper on SyncML (online, pdf)
Some "Semi" FAQ on SyncML...
Questions asked by Helge and answered by Max ;-)
Q: Is a SyncML transaction bound to a single URL? (eg all requests
on /SyncML like in XML-RPC where all requests go to /RPC2)
A: Yes.
Q: Is a SyncML transaction bound to a single "data store", like a
calendar or an addressbook, or does a single SyncML transaction
involve all "folders" at the same time?
A: Could involve all data stores.
Q: Do you need a session / is SyncML stateful?
A: Yes. And even worse: I need data stored between Sessions.
Q: Can it use HTTP basic-authentication for authentication?
A: Yes - but It should not. It includes its own authentication.
Q: If you need a session, how is the SID transferred, can we change
the URL? Or do we use a Cookie?
A: Its inside the SyncML message.
Q: can you summarize the kinds of actions a client may trigger?
A: delete (soft delete or hard delete), add, copy, replace, search
Q: In what kind of format is the data (eg a contact) transferred -
does it really use XML for everything or is the XML just for the
SyncML envelope - if so, how do you transfer contacts, using vCard?
A: Yes. The SyncML is a container which includes other formats, such as vCard. If an Application supports syncing:
Contacts: It must be able to produce vCard 2.1 and optionaly vCard 3.0 data.
Calendar: It must be able to produce vCalendar 1.0 and optionally iCalendar 2.0.
Memos: It must support text/plain.
Tasks: It must support vTodo 1.0.
Email: It must support message/rfc822, message/rfc2822 and message/rfc2045.
Q: Could you please give an example of a very simple and basic SyncML
HTTP transaction (HTTP methods, headers, body)?
A: A SyncML Transaction, tunneled via HTTP always uses a POST to the same URL: ...
Look at the complete example.