17/02/07 - 215000 Dr J A Gow
----------------------------

Initial implementation for synchronization of tasks
Needs work on PercentComplete and the priority code

18/02/07 - 182700 Dr J A Gow
----------------------------

Added code to allow partnership selection, new tool
select_partnership.py to select the current partnership
and allow it to be altered. The sync-engine now saves
the current partnership on the host and will always
use this one when set up.

The setting up of partnerships may take some fiddling
and the code is still a bit flakey, but once set up
the sync process seems quite solid.

18/02/07 - 192900 Dr J A Gow
----------------------------

Improved partnership selection processes by blocking
the autosync in the absence of a valid partership.


19/02/07 - 220600 Dr J A Gow
----------------------------

Changed the way the tasks are marked complete. Logic
now works as follows:

 AirSync -> vcal: If task is marked complete, both the
                  status COMPLETE field is set AND the
                  'PercentComplete field is emitted and
                  set to 100. If task is not marked
                  complete, then neither the status
                  COMPLETE field nor the PercentComplete
                  field are emitted.

 vcal -> AirSync: If PercentComplete is 100 OR status
                  COMPLETE field is set, then the task
                  is marked complete.

21/02/07 - 003900 Dr J A Gow
----------------------------

Added a fix to maintain the luid/guids when confronted with
a slow sync. This certainly prevents the hang in sync-engine
and also should ensure clean slow syncing. 

01/03/07 - 230000 Dr J A Gow
----------------------------

Added the code to allow notes attached to tasks, contacts and
events to be synced. This introduces the dependency on 
librtfcomp, which should be installed together with its
Python bindings before running this sync-engine.

02/03/07 - 190000 Dr J A Gow
----------------------------

Folded in patch provided by Robert Jarzmik in order to fix 
the following issues

 - AirSync error 800700E : memory error (causes by lack of 
   DtStamp from opensync/file-sync for example)
 - Engine error on alarm reminders of format : -PT1D3H33M 
   (from kde-pim)

17/03/07 - 213800 Dr J A Gow
----------------------------

Big, big changes in the RRA department. This release contains
a functional file sync system, and the sync-engine config
class is becoming more useful.

A dependency is now introduced on librra and pyrra. Make sure
you have both installed in order to use it. Now, take the
config.xml file from this sync-engine distribution, create a
.synce file in your home directory, and copy the config.xml
to this location. Then alter the path to point to the local
folder you would like to sync to the handheld. Then cross
fingers, and start sync-engine. File sync is totally automatic
and does not need prompting, or the running of any other 
programs.

The PIM syncing is totally unaffected by these changes: file
sync uses RRAC via librra, PIM syncing uses AirSync.

Bugs: 	Loads. Loads I know about, loads I don't know about.
	The ones I know about include:

	No error handling on file ops
	No disk space checking on local or handheld
	Others, but I can't think of them at the moment

The config file is re-read for each connection, so another 
app can be used to configure sync-engine, with the changes
being picked up on the next connection.


19/03/07 - 202300 Dr J A Gow
----------------------------

Corrected minor bug in the XML transforms that prevented
pictures attached to contacts being synced correctly.

20/03/07 - 194500 Dr J A Gow
----------------------------

Couple of important bug fixes in file sync code - these
are worth upgrading for!

 - File database is now saved in the correct place!
   This caused problems with multiple partnerships - the
   file was being saved in the sync-engine root rather than
   the .synce directory
 - Changed name of file database to include partnership ID
   to ensure syncing with multiple partnerships works. (still
   need to make sure this is deleted on deletion of partnership
   to avoid leaving cruft behind)
 - Items deleted on handheld while disconnected will now 
   be correctly deleted on the desktop upon reconnection.

21/03/07 - 213300 Dr J A Gow
----------------------------

Fixed deletion of directory trees in the file sync code - this should
help with the deletion of directory names with non-base ASCII characters
in them (i.e. unicode).

Cleaned up partnership storage. Now all partnership-specific
data is stored in a directory within the .synce hierarchy with a name of
the partnership ID. In this directory, the file database and the state file
reside. As partnerships are created and deleted, the directory is 
created/deleted.

Fixed deletion of current partnership. Made safe the operation of the
sync threads while no current partnership is available, including when
the current partnership is deleted. Now, all service threads apart from
the RAPI session are shut down prior to deletion of the current partnership,
and not restarted until a new one is created. Likewise, they are not
started if a device is connected with no valid partnership. This just makes
things safer in preparation for the following.

Made significant changes to the handling of slow sync: Now, slow sync is
correctly detected in opensync-plugin. When a slow sync is triggered, an
argument is passed to the sync-engine's Synchronize method. If this argument
is nonzero, the sync-engine will delete and recreate the partnership through a
new Refresh method in Partnerships (preserving the selected sync-items). This 
is not as slow as could be, and it successfully forces a slow sync.

HOWEVER:

1) Opensync does not seem to de-duplicate the items properly. Not sure yet
   whether this is an OpenSync problem, or whether there is some subtle difference
   in the entries from the evo2-plugin and those from AirSync that is preventing the
   de-duplication code in OpenSync from working.

2) Opensync allows selective slow-syncing on each object. We just can't be
   selective by refreshing the partnership - we end up resyncing the lot (all objects).
   So, when we do a slow-sync we need to do it on all object types.

It's not an ideal solution. There must be a way to find the sync state information on
the phone itself and use this to force a slow resync of individual object types. I
am working on this.

22/03/2007 - 131900 Dr J A Gow
------------------------------

Corrected programming error in util.deltree(). Directories should now be
correctly deleted when deleted from the handheld. There is a catch in 
util.deltree() to prevent commmon dangerous deletions e.g. root or home.

22/03/2007 - 223300 Dr J A Gow
------------------------------

Enhanced configuration system.

 - Slow sync using partnership refresh found to cause some problems in
   certain circumstances, so have made it configureable through the
   config.xml file and disabled it by default - functionality is now
   as was unless you manually turn it on.

 - Added the rudiments of an autosync system - this is also disabled
   by default, and still needs some work. If you want to try it, add
   the command to run on autosync to the config.xml file and set the
   Disable element to zero.

24/03/2007 - 190000 Dr J A Gow
------------------------------

Slow-sync:

 - At last, a working slow-sync method! Recreating partnerships problem-riddled
   and no un-hackish way to do it on the phone. So now we do it with a database.
   On first sync of a new partnership, we create a database of items, and
   maintain it on subsequent syncs. On a slow sync, we send all data back to OpenSync.
   The database contains AirSync data - although it could be coded easier if we
   saved OpenSync data, there is the danger of local changes that have elements 
   that are not transformed by the XML transforms becoming embedded in the database.
   This might be acceptable, but it seemed a cleaner solution to mirror data on the
   phone.
 - Now this data is stored in item-specific files in the partnership area. It is loaded
   on sync start and can be flushed by the plugin when all syncing is complete. This 
   way we do not hog memory by leaving the database in RAM when we are not syncing.
 - The database is saved at the end of each sync, but is only loaded if it needs to be,
   thereby limiting disk activity.
 - Only problem, OpenSync does not see the items as the 'same', only 'similar' so it 
   asks the user for interaction with every slow-synced item.

Syncing:

 - Externally-triggered syncing now works!
 - The original code could sync the handheld up to three times, especially on an 
   externally triggered sync. Now we preserve the results of the first AirSync
   sync (triggered by the autosync) and use this for the next Synchronize() request.
   This way we only ever sync twice.

 - BUG - sometimes, for a weird reason, the OpenSync plugin seems to hang in _do_sync()
   while calling the Synchronize() method in sync-engine. Under these circumstances
   The hang is in the call, not the sync-engine method. Something weird with d-bus? If
   you just close the msynctool process and restart it (leaving sync-engine running)
   a slow-sync is triggered due to the interrupted process, but everything then works0.
   This only seems to affect autosync, not the manual ones. Problem definitely seems to
   be on the plugin/dbus side as the sync-engine code is not even being called.

Config:

 - SlowSyncEnable changed to SlowSyncDisable in config file

25/03/2007 - 185200 Dr J A Gow
-------------------------------

Suspecting timing issue on starting the opensync-plugin's d-bus integration,
a 1-second delay has been added between connecting and the call to _do_sync(). This
seems to cure the hang issue! Not 100% sure why but suspect that call to _do_sync()
is occurring sufficiently quickly before the d-bus loop is established?

28/03/2007 - 212700 Dr J A Gow
------------------------------

Fix preventing spurious rtfcomp error message when translating notes with no content
Minimal error checking added to file sync object writer

15/04/2007 - 184500 Dr J A Gow
------------------------------

Big, big changes in the time/date conversion department. We now have seemingly
correct timezone and DST processing, although it could certainly do with
more testing. 

We now grab the 'Timezone' information from vcal, parse out the DST recurrences
and store the timezones for future use. The way this works in a sync session
is as follows.

AirSync-Opensync:

	This is OK. Since AirSync actually does something sensible for a change,
	and stores everything in UTC, we can just send these to vcal as UTC times.
	To correctly display the times on the desktop side, it is _essential_ that
	the desktop is set to the same timezone as the handheld, but not doing so
	will not result in corruption of event times.

Opensync-Airsync:

	Here's where the fun starts. Vcal spits out the timezone as an id and a 
	batch of recurrences for the start events for DST and standard time - and 
	then spits out the time in local time. UTC times can be distinguished 
	by the 'Z' suffix. So we process the timezone block to get the info,
	then convert the local time to UTC before throwing it at AirSync.

This has been implemented for tasks and events. Not sure yet if any of the
Contacts fields use timezones, but will add as I find them (should be simple to
do as the DST and timezone infrastructure is now in place).

Testing: Could anyone who lives in a different timezone please test for events
and tasks? Especially any timezones that have an irregular or no definition for
DST. Report any irregularities.

The code should not get upset by events that cross DST boundaries, however it
may be possible to create an event with zero duration at the end of DST.

Limitations:

	The code will choke on any DST recurrence that uses the SETPOS rule - 
	I haven't supported it yet. I don't think there are any, but......

Other fixes:

	Small fix in slow-sync code to correct an issue that could corrupt
	the internal XML database of objects. Has a positive side effect that
	a few less bytes per object need to be stored in the database.

16/04/2007 - 200100 Dr J A Gow
------------------------------

Attribute checking fix in file sync: this should eliminate some errors
when synchronizing directories with additional attributes.

22/04/2007 - 233600 Dr J A Gow
------------------------------

Fix to add encoding attribute to XML header used when running slow-sync.
This should prevent errors when used with non-ascii characters in the
XML.

27/04/2007 - 230000 Dr J A Gow
------------------------------

Significant fixes to the file sync code. It would appear that RRAC reports
no more than 32 unchanged oids at a time - and spaces the callbacks out. The
fixes in this release account for this and also make the file deletion system
considerably more robust:

 - Items scheduled for deletion now have their own queue. This queue is scanned
   for items to guard against rapid delete-recreate cycles from leaving an 
   object on one side only.
 - Timed checks are carried out to ensure that the initial object report is
   completed in its entirety before scheduling unreported OIDs for deletion.
 - New config element 'ObjectReportTimeout' available to configure the 
   initial object report timeout for different devices.

28/04/2007 - 194700 Dr J A Gow
------------------------------

1) Fix for recurrent events across DST transitions. This fix fills the
   AirSync <Timezone> element based upon the presented timezone information
   in the vcal data. This means that recurrent events spanning DST transitions
   should now be rendered correctly on the phone side.

Limitations:

   - It's crude. By that I mean that the conversion relies on the DST recurrence
     rules having a specific format (i.e. it must be a start date / BYDAY=
     / BYMONTH rule for the conversions to work. Basically the AirSync timezone
     structure is very limiting whereas the vcal timezone structure is universal.
     If there are any timezones out there with an oddball DST definition they
     may not (yet) convert correctly 

   - The conversion does not yet work both ways, it only works vcal->AirSync.
     Reports indicate that kdepim handles the DST transitions internally and has
     is unaffected in this direction. Evolution, however, does not sort it out
     and would probably need the timezone info in the event. However, going the
     other way is not as easy...

2) Minor fix in slow-sync database format. We still have an encoding issue but
   this seems to be a limitation of minidom's toxml() not being able to specify an
   encoding. Database entries with UTF-8 sequences may fall over during a 
   slow sync.

3) Renamed 'syncengine.py' to 'kernel.py'. Two 'syncengines' seems confusing.


29/04/2007 - 233300 Dr J A Gow
------------------------------

Fix for encoding: 'toxml()' now always has an encoding specified so we should
not have any more problems with UTF8 sequences in the events etc.

Added part of the infrastructure to allow vcal timezones to be constructed 
from AirSync timezones. This code is not yet called so its presence will not
affect functionality.

30/04/2007 - 222000 Dr J A Gow
------------------------------

Completed reverse timezone functionality, this is now implemented and working
(for events only at the moment). This code captures the AirSync timezone date
and if it specifies a valid DST set for the current year, generates a vcal 
timezone that matches it. This allows recurrent events set up across a DST
transition boundary to be correctly represented to Opensync. If the event is
subsequently modified on the Opensync side, the timezone is updated if
necessary, so everything seems to work.

This does, of course, rely on OpenSync correctly exporting vcal timezone
stanzas! 

The code now handles timezoned events in both directions.

03/05/2007 - 205200 Dr J A Gow
------------------------------

Odd problems with syncing events,tasks etc with non-English characters detected
and (potentially) sorted. Turns out that dbus-python has a particular dislike
of being able to efficiently send just unadulterated byte streams as part of
a method call/return. The synchronization mechanism conveniently provides 
UTF-8 encoded XML data preserving all characters > 0x7f. Dbus itself uses
UTF-8 natively, but versions of dbus-python < 0x80 can not handle this
natively without requiring the string to be decoded into Unicode, then recoded
the other side of the IPC. This is about as efficient as a pork pie salesman
in a kibbutz - the string is decoded from UTF-8 to Unicode, then (somewhere
in the binding) being recoded into UTF-8 before being sent to dbus, then the
whole shooting match is done in reverse upon receipt. Nasty.

Dbus-python 0.80 helps a bit as it can render byte-arrays as strings through
use of the byte_arrays keyword on the proxies - problem is a large number of 
distros (including SuSE 10.2) ship with dbus-python < 0.80. To get round
this we explicitly convert the array back to a string on receipt, preserving
the encoding and thus not requiring multiple encodes/decodes to get it across
the IPC.

So the key data streams are now switched to byte-arrays. Not only will this
make things easier if code other than Python has to communicate with
sync-engine, but also should solve problems with syncing items with
non-English characters in it.

07/05/2007 - 190500 Dr J A Gow
------------------------------

Fix to task times. Airsync tasks do not appear to use timezones, although
it would seem that they can under certain circumstances. They do provide
a StartDate and UtcStartDate. It is impossible to map these directly to 
a vcal timezone in the absence of an AirSync timezone, so we first check
for an AirSync timezone, in which case we convert to local time. If we do
not have this, we look for UtcxxxxDate and use this as UTC. If all else
fails we just send in local time

This works, but there seems to be a bug in Evolution. The start date 
converts OK, but the end time seems to be out by the UTC offset. Unknown
if this affects other sync targets - needs testing.

RRA thread now runs in the absence of a subscribed RRA object. This prevents
weird timeouts on the device, but at the penalty of a 'noise' message from
librra indicating that there are no subscribed items.

Couple of encoding fixes added.

Fixed silly bug in file sync code that attempted to delete files that had
just been downloaded during initial sync. Also corrected debug log message
that was not correctly constructed.

08/05/2007 - 000400 Dr J A Gow
------------------------------

Fixed timeouts on slow sync prefill by making the prefill call asynchronous
(similar to do_sync in synce-plugin). This should prevent timeout errors
when syncing any number of contacts/tasks/events.

08/05/2007 - 204300 Dr J A Gow
------------------------------

Added support for password-protected devices, and made the device connection/
removal more robust. The control for password protected devices is through the
new config.xml element <AuthMethod> in the Global section. 
AuthMethod may have the following values: INTERNAL_CLI, INTERNAL_GUI, or it
can be the path to a program. In all cases authorization is carried out
through an external program - this way we can trigger GUI sync without
sync-engine itself becoming dependent upon a GUI framework.

If set to INTERNAL_CLI, the authorization system calls the program 
'authcli.py' in sync-engine/tools. By default it will run in the same console
as sync-engine.

If set to INTERNAL_GUI, the authorization system calls the program
'authgui.py' in sync-engine/tools. This pops up a dialog permitting the
password to be entered. 'authgui.py' depends on gtk.

If set to a path to a user authorization program, the user program must take
a single argument on the command line - the dbus object path of the device.
It must return nonzero if authorized, zero if authorization failed.


28/10/2007 - 183000 Dr J A Gow
------------------------------

I was a bit slack in updating this changelog over the last few months. For
information about minor changes please refer to the SVN commit log.

A number of minor changes preceded this entry:

   - Fixed miscellaneous crashing in synce-plugin due to the lack of
     thread safety in the dbus-python event loop
   - Added OpenSync 0.3x plugin


Major changes: Now added infrastructure to support three different formats
at the OpenSync interface within sync-engine. The OpenSync 0.3x plugin
requires different XML schemas than the earlier version. The directory
SyncEngine/formats contains the 0.2x formats, while the directory
SyncEngine/formats30 contains the formatting code for OpenSync 0.3x.
Current state of this code is that events now sync well with OpenSync 0.3x
(except for the timezones which are still in OpenSync 0.2x format - this 
is on my todo list). Tasks, contacts and better timezone support will
follow shortly providing full sync support with OpenSync 0.3x

The approach does duplicate some code, but will make it a _lot_ easier
both to code the OS 0.3x support and to deprecate and subsequently 
'amputate' the OS 0.2x support once the OS people issue a new stable
release.

To change between the schemas, add the following line to the <Global>
section of the config.xml file in the ~/.synce directory

<OpensyncXMLFormat>OS20</OpensyncXMLFormat>

where the element content can be one of OS20, OS30 or NONE. This will
allow sync-engine to speak OpenSync 0.2x XML, OpenSync 0.3x XML, or 
raw AirSync XML at the OpenSync interface. For more information see
the comments in the sample config.xml file in the tree.

Todo: clean up the OS30 event formatting code (which is a bit
hack-ey at the moment, add OS30 timezone support along with
tasks and contacts support in OS30. Watch this space....


20/11/2007 - 190000 Dr J A Gow
------------------------------

tools/do_sync.py removed (not really necessary now)

Major changes in the format30 tree. We now have largely functional
support for Opensync 0.3x and later. In the formats30 conversion
code, the timezone handling has been completely overhauled and cleaned up.
XSLT extensions have been split off from conversions.py and implemented in 
four new files: taskconv.py, eventconv.py, contactconv.py and commonconv.py.
The functions have been renamed in a consistent manner. This is to make the
activation barrier easier for individuals to support new fields as they
become available and to move towards a format converter module that can
be easily split off from sync-engine and be implemented as a separate 
plugin.

There are still some known problems as we are currently chasing a moving
target while Opensync and its plugins update the XML schemas - so
expect the OS0.3x stuff to break regularly until Opensync finalize these
schemas.

To enable Opensync 0.3x conversion, insert:

<OpensyncXMLFormat>OS30</OpensyncXMLFormat> 

into your config.xml (see the above CHANGELOG entry)


20/11/2007 - 194900 Dr J A Gow
------------------------------

Removed nasty loop from synchandler and replaced it with a blocking event.

22/11/2007 - 191000 Dr J A Gow
------------------------------

Hitherto the pathway of synced objects was horrible:
text->dom->text->libxml2->xslt->text->dom->text. This was far from
efficient. Removed all airsync.py dependencies on DOM, so that now
all XML objects are processed by libxml2 from start to finish (a much
thinner layer than dom/minidom). There is no conversion back to text
anywhere in the sync path now except at the start when converting from
wbxml, at the end when going back to wbxml, and when storing an object
in the slow-sync database. This has a number of very positive side-effects in
terms of also getting rid of two convoluted levels of indirection: 
formatapi.py->event/task/contact.py->parser.py. Now the path is formatapi.py
straight to parser.py. Now only parser.py needs to actually make a decision
as to the stylesheet to use - so any future additions to syncable types only
require a new stylesheet and changes to parser.py.

We also get rid of event.py/task.py/contact.py.

Resulting code is much cleaner, less convoluted and easier to follow.

The speed increase when syncing big object lists is very, very
noticeable :)

Broken the characteristic class out of xmlutil prior to removing xmlutil.py
and placed it in its own 'characteristics.py'. Removed DOM dependence.

23/11/2007 - 183000 Dr J A Gow
------------------------------

Folded in GUID data for 'WorldMate' (bug 1729381) details thanks to Nils
Pickert.

23/11/2007 - 185000 Dr J A Gow
------------------------------

Removed exception in formats/event_exception_from_airsync() to clear
bug 1835339

TODO: Need to go through all XSLT extensions and remove exception 
generation except where serious enough to warrant non-syncing of the
item. (On my todo list for formats30 as well)

19/12/2007 - 231400 Dr J A Gow
------------------------------

IMPORTANT - IF USING AN EARLIER VERSION THAN THIS, EXCEPT FOR config.xml 
PLEASE DELETE THE CONTENTS OF YOUR ~/.synce DIRECTORY INCLUDING THE
partnerships SUBDIRECTORY . AND RECREATE YOUR PARTNERSHIPS.

What's changed? Lots. The partnership code has been considerably overhauled
with a view to getting rid of some serious flaws in the old code. The 
partnership concept is now split into two parts: the partnership on the phone
and the 'binding' on the host. Both must exist and match to create a
partnership. It is now possible to bind successfully with multiple devices
(although not at once). Syncing can only occur with a bound partnership.
This process is transparent to the user.

Unfortunately the bug with deletion of Exchange Server partnerships is still
present -the workaround is to create the partnership with sync-engine first.

We now have per-partnership configuration! - Look at configure_bindings.py
in the tools directory.

delete_partnership.py no longer needs the user to phaff about with running
list_partnerships.py and grabbing long hex numbers. It directly presents the
user with a list selectable by index.

select_partnership.py has gone, it is no longer needed with the new code.
Selection will occur automatically, properly, when the device is connected.

DTPT has now been fully implemented in sync-engine and should be turned on
by default, and should 'just work' for WM5 and WM6. It can be turned off
globally in config.xml, or on a per-partnership basis with
configure_bindings.py.

Some bugs fixed in the OpenSync 0.3x conversion code, but it continues
to be experimental at this time. Opensync 0.2x should be generally reliable.

The item data pathway has been de-convoluted and made a lot more obvious
and cleaner. Look at syncdb.py for more info. I will try and document
this a bit later.

22/12/2007 - 022600 Guido Diepen
--------------------------------

Updated kernel.py to make use of my previous patch from synce-gnome/test.py
and the routines I use in synce-kdm to check whether odccm is running or not.

A DBus callback is installed for events regarding "NameChangeOwner" indicating
that odccm just came online. If it did, the correct callbacks for device
connection and disconnection are set. 

22/12/2007 - 130900 Dr J A Gow
------------------------------

Changed the partnership scan code so we don't delete partnerships that are
'dangling'. This may not be necessary and it seems to kill Exchange server
partnerships, so it has been removed. No adverse effects have been detected
yet.

28/12/2007 - 215000 Dr J A Gow
------------------------------

Updated and cleaned up kernel.py and sync-engine. Added a whole bunch of
new command line options that change the behaviour of sync-engine.

Use sync-engine -h to display the usage

The sync-engine can be configured to run for just one connection with the
-o option, and it can run in the foreground or in the background using the
-d option. It can now log to a file and the loglevel can be specified.

A useful option is --config. It is now possible to have multiple
sync-engine configuration directories (including partnerships and itemDBs)
for debug or similar purposes and switch between them with the --config
option.

Made the d-bus main loop in sync-engine thread safe. This should mop up
the odd random segfault.


31/12/2007 - 120100 Dr J A Gow
------------------------------

Applied small patch by Scott Bronson to fix a couple of typos in the code.

07/12/2007 - 204100 Dr J A Gow
------------------------------

Changed plugin names to a more sensible scheme and moved them to a 
'plugins' directory from which they can be copied to the OpenSync working
directory. Had to use 'synce-opensync-plugin-2x' etc, as the OpenSync
plugin architecture can not handle periods in the filenames.
Removed dependency of file-sync code on absolute paths and modified 
the base config.xml file to include sensible defaults. Moved the config
file to a subdirectory 'config' as sync-engine root was getting cluttered.
Applied patch from Jonny Lamb including new synce-install-plugins. Modified
this script to move rather than copy (in case a user hoses their OpenSync
installation we then do not lose the plugin as well). Also corrected the
python plugins directory (appears as opensync-1.0/python-plugins not
opensync-1.0/plugins/python-plugins). The script can be re-run at
any time to refresh the plugins in the OpenSync directory.

Setup.py needs updating to reflect these changes.


21/01/2008 - 212100 Dr J A Gow
------------------------------

Fixed typo in config.py leading to an exception when config.xml is not
present. Note that this requires config.xml to be copied over by the
package manager and left in the same location relative to the 
sync-engine root.

31/01/2008 - 202100 Dr J A Gow
------------------------------

From this point, sync-engine no longer relies on libwbxml and pywbxml.
An internal wbxml converter has been implemented in 
SyncEngine/wbxml (thanks to Jonny Lamb for the low level wbxml stuff).
The user-facing API is unchanged.

Note that this has been tested successfully with the OS30 formats, but
has NOT YET BEEN FULLY TESTED with Opensync 0.2x. The only problem that
may be present here is incorrect namespace assignment within the converter
code. Libwbxml parses it out from the strings whereas the internal
implementation looks out for namespace assignments directly to the nodes
in the libxml2 structures.

The implementation of this uncovered a couple of subtle errors in the
general XML handling within sync-engine. These have been fixed, and the
entire pathway will be checked when airsync.py is cleaned up shortly.

Attribute processing is badly broken in the wbxml implementation - this
is not a problem for sync-engine as AirSync does not use attributes
in its XML code. However this should be fixed up (can be as a low priority
job) at some point for completeness and in case Microsoft go and change
things at a later date.

06/02/2008 - 1931 Dr J A Gow
----------------------------

Fixed exception caused by typo in commonconv.py (OS30) - unchanged
time handler in <until> tags in recurrence rules.

07/02/2008 - 200600 Dr J A Gow
------------------------------

Corrected namespace error in formats30 preventing contacts with notes being
correctly synced to the device.

08/02/2008 - 202500 Dr J A Gow
------------------------------

Fixed syncing of yearly recurrent events from Opensync to Airsync for both
Opensync formats. Also fixed up the test scripts event_air2os.py and
event_os2air.py - this is temporary as the format conversion test scripts
are to be overhauled completely soon.

24/02/2008 - 130700 Dr J A Gow
------------------------------

Fixed typo in _CheckDeviceConnected leading to confusing exceptions being
generated when tools are run without a device connected.

Considerably improved error handling in the tools. Errors such as
sync-engine not running, devices not connected and the like are handled
cleanly and generate informative error messages. Added usage string to
create_partnerships. This should prevent tracebacks being displayed to
the user unless there really is an error, as opposed to bad input or
configuration.

This will hopefully reduce the number of bug reports caused by issues
such as sync-engine not running, or a device not connected correctly.
Updates to errors.py augment the error handling structure.


05/03/2008 - 180700 Guido Diepen
------------------------------

Fixed some missing sys. prefixes before the exit statements in the
tools.
Using exit(0) will give the following error: 
    TypeError: 'str' object is not callable


15/03/2008 - 204500 Guido Diepen
------------------------------

Added D-Bus signals for notifying clients about the status of syncing.
These signals have the base 
org.synce.SyncEngine.Status
and notify possible clients about the updates during the ActiveSync
process that are shown on the screen of the device.

The signals are:
 * StatusSetMaxProgressValue(self, maxProgressValue):
 	The client must update the maximum value of the progress bar
 * StatusSetProgressValue(self, progressValue):
 	The client must update the value of the progress bar
 * StatusSetStatusString(self, statusString):
 	The client must update the string regarding what is done
 * StatusSyncStart(self):
 	A Sync just got started. The client should update such that
	it shows the sync is started.
 * StatusSyncEnd(self):
 	A sync just finished. The client should update such that
	it reverts to the state before the sync started (no progressbar etc)
 * StatusSyncStartPartner(self,partner):
 	Denotes the sync of the given partnership just started
 * StatusSyncEndPartner(self,partner):
 	Denotes the sync of the given partnership just finished
 * StatusSyncStartDatatype(self,partner,datatype):
 	Denotes the sync of the given type of sync item of the given partnership
	just started
 * StatusSyncEndDatatype(self,partner,datatype):
 	Denotes the sync of the given type of sync item of the given partnership 
	just finished

19/03/2008 - 001500 Guido Diepen
------------------------------

Added import of module "errors" to the pshipmgr and updated the raised 
error to be from that module. 
This solves the following error when trying to create more than 2 pships:
	CreateNewPartnership
	    raise NoFreeSlots("all slots are currently full")
	NameError: global name 'NoFreeSlots' is not defined


19/03/2008 - 174500 Guido Diepen
------------------------------

Added module prefix of errors. to the InvalidArgument raise in pshipsmgr.py
Without these prefix, you get NameErrors with InvalidArgument not defined.

23/03/2008 - 220000 Guido Diepen
------------------------------

Patched sync-engine to not segfault with thread-safe librapi2. This error
occurred because in another thread the rapi_session would be NULL due to
the Thread Local Storage.

Thanks Markus Niemistö for supplying the patch.

24/03/2008 - 160000 Guido Diepen
------------------------------

Added signal "PartnershipsChanged" that will be emitted the moment a 
partnership is created or a partnership is deleted through sync-engine.

With this signal other clients will be notified to update their listings.

25/03/2008 - 225000 Guido Diepen
------------------------------

Reverted yesterdays patch. For some reason the previous patch causes problems 
when other people use python 2.5.
I have tested everything locally with python 2.4 and I can't get it to 
cause problems. Therefore this patch is removed for the moment
UPDATE: AdamW thought problems occurred due to the 3337 patch. Turned out that
this patch did not patch cleanly to the 0.11 release. Sorry for all the 
fuss folks! :)  (If you want to blame somebody, pick AdamW :) )

29/03/2008 - 160700 Dr J A Gow
------------------------------

Fixed problem with contacts 'Rtf' field failing to sync to PDA (Opensync 0.2x)
- for some reason a namespace had got clobbered in the XSLT transform scripts.
Opensync 0.3x should not have been affected by this bug.

Added a per-partnership configuration for the location of the directory
in which files are to be synchronized. By default this is set to
~PDAFiles/<partnership name>. It can be changed in two ways.

Firstly it should be noted that the element <LocalFilePath> has been deleted
from the global config.xml. This has been superseded by a new element
<BaseFilePath> which provides a global base directory.

Each partnership now has an element <LocalFilePath> in the <General> section
of its per-partnership config.

The actual directory into which a given partnership will sync is given
by the intelligent concatenation of the <BaseFilePath> from the global config
and the <LocalFilePath> from the per-partnership config.

If <LocalFilePath> is absolute, or is prefixed by '~', it will take precedence
over <BaseFilePath> and the absolute path will be used. If it is a relative
path, the final directory will be formed by the concatenation of
<LocalFilePath> and <BaseFilePath> - this forms the most flexible way to do
this.

29/03/2008 - 164500 Dr J A Gow
------------------------------

Fixed errors in code causing strange 'socket errors' on deleting and then
recreating partnerships. These typos were stopping sessions being stopped -
hence the socket error!

29/03/2008 - 190700 Dr J A Gow
------------------------------

*** CAUTION: API CHANGE ***

This update has introduced the ability to manage Exchange Server partnerships
via the sync-engine API (to list and delete, but not yet create). This has
necessitated a change to the GetPartnerships API. The new d-bus signature
is a(ussssuau) and this reflects the following change to the exported data,
which is now an array of:

(id, guid, name, hostname, devicename, storetype, devicesyncitems)

Note the change is in the addition of the 'storetype' - an integer value
which can be one of PSHMGR_STORETYPE_EXCH (exchange server) or
PSHMGR_STORETYPE_AS (ActiveSync). The command line tools have been updated
to match. Exchange server partnerships can now be seen in the listing, and
can be deleted by both delete_partnership.py and clean_partnerships.py.
In the case of clean_partnerships.py, there will be an additional prompt
to delete server partnerships which will be displayed only if such
partnerships are present.

Currently we handle a maximum of 3 partnerships (2 AS, 1 server) - this
appears to be the maximum that WMx will handle - but with care this could
be increased easily.

Creation of server partnerships from the host is being looked at as 
a later addition.

Also now correctly handles dangling registry entries and partnerships
without clobbering server partnerships.

01/04/2008 - 115100 Dr J A Gow
------------------------------

Fixed minor problem with exceptions being generated in file sync code
when an item has been removed on both host and remote before syncing.

05/04/2008 - 130900 Dr J A Gow
------------------------------

Added new API to sync-engine: GetDeviceBindingState().
in_signature is none, out_signature is 'u'. It takes no arguments
and returns an integer, which can take on one of the three values
below (defined in constants.py).

BSTATE_DEVNOTCONNECTED (0): device not connected
BSTATE_DEVNOTBOUND     (1): device connected but no partnership binding
                            available
BSTATE_DEVBOUND        (2): device fully bound and ready to sync.

This function will not throw exceptions and is designed to be able
to cleanly query the state of the device as seen by sync-engine at any time.

This change was committed in r3363 but owing to an oversight this CHANGELOG
entry was omitted.

05/04/2008 - 143500 Dr J A Gow
------------------------------

Code cleanups in airsync.py, no functionality changes.

16/04/2008 - 170200 Mark Ellis
------------------------------

Added initialisation of self.partnerships, which was causing a traceback from
_ProcessAuth on connection of a locked device because the attribute did not
yet exist.

Added support for devices connected via synce-hal. Odccm support is unaffected,
no configuration is required.

23/04/2008 - 200000 Mark Ellis
------------------------------

Changes to auth procedure on locked devices for WM6.

06/05/2008 - 214500 Dr J A Gow
------------------------------

Folded in patches from Daniel Frickemeyer to correct the handling of categories
in tasks and events when using Opensync 0.3x.


07/05/2008 - 140000 Mark Ellis
------------------------------

Clarify handling of WM6 authorisation on device from user perspective, ie.
output a suitable message instead of 'auth failed'

16/05/2008 - 225000 Dr J A Gow
------------------------------

Removed hard defaults from config.xml, leaving them commented in. Checked and
updated the defaults in the code to match the current file defaults. Modifed
a line in CHANGELOG to have a length less than 80chrs.

23/05/2008 - 162100 Dr J A Gow
------------------------------

Applied patch from Mark Ellis to allow processing of config files in system
(etc), user (.synce) locations, after removing some redundancy.
Renamed config.xml to syncengine.conf.xml (including the template file in the
source tree).

29/05/2008 - 181900 Dr J A Gow
------------------------------

Fixed typo in _ProcessAuth preventing authorization from working correctly.

30/05/2008 - 113600 Dr J A Gow
------------------------------

Minor fix to debug messages in authorization code for clarity.

10/06/2008 - 193900 Dr J A Gow
------------------------------

Folded in patches from Daniel Frickermeyer to fix:

    - config file opening
    - config file in setup.py
    - XML handling in formats30

Also added code to release the sync event when the device is disconnected
while synchronizing - have discovered that under certain circumstances it
is possible for a device to get its state screwed up. This results in a 
sync-engine refusing to sync the device when it is replugged! This should
clear this problem but time will tell.

17/06/2008 - 200700 Dr J A Gow
------------------------------

Corrected serious bug in task conversion code preventing successful
synchronization of tasks with a start or due date from desktop to handheld. The
problem was down to an incorrect namespace assignment in the task handling of
formats20 causing an exception in the wbxml conversion. The formats30 should
not be affected.

23/06/2008 - 212900 Mark Ellis
------------------------------

Install example dbus activation config file in /usr/share/doc/sync-engine

05/07/2008 - 203400 Dr J A Gow
------------------------------

Applied patches from 'merKur' to enhance support in synchronization of 
contacts and resolve some timezone issues.

EVO->WM5:
- Note not being sync'ed,
  At least on my phone, the note should be in <C1:Body>, not in <C1:Rtf>
- If both "Business phone" and "Business fax" were defined, "Business
  phone" ended up in "Work Phone 2"
  This was due to usage of position() in the XSLT, while some elements
  were skipped. Instead filter by Type=WORK & Type=VOICE.
- PO Box was not being sync'ed
  It seems WM5 has no 'PostalBox' field. I appended this info in the
  'Street' field.
- Street in Evolution can be multi-line, but only 1st line was sync'ed.
  The rest of the lines appear in the 'ExtendedAddress' field.
  I appended this to the 'Street' field.

WM5->EVO:
- Photo was not being sync'ed.
  I added an 'Encoding' attribute which solves this.
- Phone updates were messed up.
  Added 'VOICE' Type attribute to the relevant ones.
- Timezone conversion problems.
  See my thread "SynCE AirSync->VCal Timezone conversion bug" in
  synce-users dated 1-Jul-2008. Patch attached here as well.


10/09/2008 - 163500 Mark Ellis
------------------------------

Add config setting to allow authorization to be handled by an external
process

Fix comment in syncengine.conf.xml, default is INTERNAL_GTK


22/10/2008 - 104500 Mark Ellis
------------------------------

Fixes to authorization framework, we were trying to connect while
authorization was pending.

25/10/2008 - 195000 Dr J A Gow
------------------------------

Fixed handling of birthdays in contacts for OS0.2x. Birthdays will now sync in
both directions (bug in XSLT transforms: 'Content' elements missing)

Also fixed anniversaries Opensync->Airsync. However anniversaries
Airsync->Opensymc still do not work. The XML is correct and a bug in Opensync
is suspected.

29/10/2008 - 165500 Mark Ellis
------------------------------
Minor update for change in pyrapi2.RAPIError

18/12/2008 - 172600 Mark Ellis
------------------------------
Make -c command line option work more as expected, not silently adding .synce.
Report useful errors from problems with config files.

10/01/2009 - 192200 Mark Ellis
------------------------------
0.13 release
