Ich habe das Problem auch, dass ich mein Samsung Wave S8500 nicht syncen kann. Auch nach einem Firmware-Update und dem Update auf die neueste Egroupware-Version nicht. Nachdem ich mein Nokia E71 langsam aber sicher in den wohlverdienten Ruhestand schicken will, habe ich mich des Problems angenommen und den Fehler gesucht, und dabei diesen leider “eingeschlafenen” Thread hier gefunden.
Ein Vergleich von Revision 31520 vs. 31521 ergab folgende Unterschiede:
diff -ruN phpgwapi-31520/inc/horde/Horde/SyncML/State.php phpgwapi-31521/inc/hor
de/Horde/SyncML/State.php
— phpgwapi-31520/inc/horde/Horde/SyncML/State.php 2011-11-05 09:51:43.1827
58168 +0100
+++ phpgwapi-31521/inc/horde/Horde/SyncML/State.php 2011-11-05 09:52:28.8338
82207 +0100
@@ -11,7 +11,7 @@
-
-
@version $Id: State.php 31115 2010-06-26 11:26:46Z jlehrke $
-
-
@version $Id: State.php 31521 2010-07-25 18:08:20Z jlehrke $
*/
define(‘ALERT_DISPLAY’, 100);
@@ -138,12 +138,12 @@
define(‘NAME_SPACE_URI_SYNCML_1_0’, ‘syncml:syncml1.0’);
define(‘NAME_SPACE_URI_SYNCML_1_1’, ‘syncml:syncml1.1’);
define(‘NAME_SPACE_URI_SYNCML_1_2’, ‘syncml:syncml1.2’);
-define(‘NAME_SPACE_URI_METINF_1_0’, ‘syncml:metinf1.0’);
-define(‘NAME_SPACE_URI_METINF_1_1’, ‘syncml:metinf1.1’);
-define(‘NAME_SPACE_URI_METINF_1_2’, ‘syncml:metinf1.2’);
-define(‘NAME_SPACE_URI_DEVINF_1_0’, ‘syncml:devinf1.0’);
-define(‘NAME_SPACE_URI_DEVINF_1_1’, ‘syncml:devinf1.1’);
-define(‘NAME_SPACE_URI_DEVINF_1_2’, ‘syncml:devinf1.2’);
+define(‘NAME_SPACE_URI_METINF_1_0’, ‘syncml:metinf’);
+define(‘NAME_SPACE_URI_METINF_1_1’, ‘syncml:metinf’);
+define(‘NAME_SPACE_URI_METINF_1_2’, ‘syncml:metinf’);
+define(‘NAME_SPACE_URI_DEVINF_1_0’, ‘syncml:devinf’);
+define(‘NAME_SPACE_URI_DEVINF_1_1’, ‘syncml:devinf’);
+define(‘NAME_SPACE_URI_DEVINF_1_2’, ‘syncml:devinf’);
define(‘CLIENT_SYNC_STARTED’, 1);
define(‘CLIENT_SYNC_FINNISHED’, 2);
@@ -176,7 +176,7 @@
-
-
@version $Revision: 31115 $
-
-
@version $Revision: 31521 $
-
@since Horde 3.0
-
@package Horde_SyncML
-
@modified Joerg Lehrke jlehrke@noc.de 2009/01/20, support all syn types
Macht man in der aktuellen egroupware 1.8.002 die Änderung der Benennung der Namespaces wieder rückgängig, dann funktioniert der Sync plötzlich auf dem Samsung Wave! Andererseits ist das wahrscheinlich kein guter Bugfix, weil dieser möglicherweise an anderer Stelle Probleme aufreißt, insbesondere bei Verwendung des normalen ASCII-XML-Formats statt des binären WBXML. Denn laut der Sync-ML-Beschreibung von openmobilealliance.org ist ja folgende Syntax richtig:
und nicht etwa:
Aber anscheinend erzeugt der WBXML-Encoder mit den Namespace-Bezeichnungen ohne die Versionsnummer eine Ausgabe, die das Samsung Wave verwirrt. Ein Vergleich der beiden Ausgaben (mit und ohne Rückanwendung des oben genannten Patches) zeigt, dass bei Verwendung der nicht detaillierten Namen (also nur syncml:metinf statt syncml:metinf1.2 usw.) in der encodierten WBXML-Ausgabe doppelte Umschaltungen der Code-Seite erfolgen, also beispielsweise 0x00 0x01 0x00 0x01 statt nur 0x00 0x01 steht. Die Bibliothek libwbxml (Download von libwbxml.opensync.org) dekodiert beide Versionen problemlos, das Samsung Wave anscheinend nicht.
Man kann sich streiten, ob so eine doppelte Umschaltung syntaktisch korrekt ist, und ob insofern der Bug der Egroupware oder dem Samsung Wave zuzurechnen ist. Nötig ist die doppelte Umschaltung auf jeden Fall nicht!
Das Problem scheint bereits Kreise gezogen zu haben, insbesondere führt eine Suche folgenden Code, der zunächst geändert und dann doch wieder rückgeändert wurde, in der Datei phpgwapi/inc/horde/XML/WBXML/DTD/SyncMLMetInf.php zu Tage:
$this->setURI(‘syncml:metinf1.1’);
//$this->setURI(‘syncml:metinf’); // for some funny reason, libwbxml produces no :metinf1.1 here
Man beachte den doppelten Kommentar in der zweiten Zeile!
Die Struktur des WBXML-Encoders scheint so zu sein, dass dieser die Versionsinformation braucht, weil er sonst falsche DTDs (Version 1.0 statt Version 1.2) in die Ausgabe schreibt. Um auch ohne Versionsnummer diese zu richten, gibt es einen Kludge in der Methode changecodepage() in Modul phpgwapi/inc/horde/XML/WBXML/Encoder.php, der die nötige Versionsnummer aus der Umgebung bezieht und die URI entsprechend ergänzt.
Der Fehler in changecodepage() besteht nun darin, die um die Versionsnummer erweiterte URI in $this->_currentURI zu speichern und nicht die original übergebene URI. Folglich wird beim nächsten Token abermals ein Mismatch zwischen der CodePage-URI (die ist ja ohne Versionsnummer) und der gespeicherten _currentURI (mit Versionsnummer) festgestellt, und abermals und unnötigerweise der Wechsel der Codepage ausgegeben. Das führt dann zu den oben genannten Duplikaten.
Der vorgeschlagene Bugfix besteht darin, in changecodepage zwei URI-Strings zu verwalten: Einen mit Versionsnummer für die Suche nach der richtigen Code-Page und einen mit der Original-URI für das Update des Feldes $this->_currentURI. Ich hänge den Fix unten an.
Der Patch sollte das Syncen mit anderen Geräten nicht negativ beeinflussen, auch dann nicht, wenn diese WBXML verwenden.
Neben allen Handys mit Samsungs Eigenbau-OS “bada” sind möglicherweise weitere native SyncML-Clients auf Samsung-Handys betroffen. Zwar kann man bei Android-Geräten einfacher auf alternative Sync-Apps ausweichen als bei Bada (wo das Software-Angebot doch recht überschaubar iist), aber es ist für den Nutzer meist besser, wenn es mit dem nativen Sync-Client läuft, als wenn man Apps nachinstallieren muss. Von daher bitte ich im Interesse aller Egroupware-Nutzer, den Patch unten aufzunehmen.
Mit freundlichen Grüßen
Kai Petzke
http://www.teltarif.de/
diff -u phpgwapi/inc/horde/XML/WBXML/Encoder.php.orig phpgwapi/inc/horde/XML/WBXML/Encoder.php
— phpgwapi/inc/horde/XML/WBXML/Encoder.php.orig 2011-11-05 14:22:03.000000000 +0100
+++ phpgwapi/inc/horde/XML/WBXML/Encoder.php 2011-11-05 14:23:25.000000000 +0100
@@ -385,19 +385,20 @@
function changecodepage($uri)
{