phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] [18640] * Refactored syncml_message.


From: Johan Gunnarsson
Subject: [Phpgroupware-cvs] [18640] * Refactored syncml_message.
Date: Sat, 05 Jul 2008 21:09:57 +0000

Revision: 18640
          
http://svn.sv.gnu.org/viewvc/?view=rev&root=phpgroupware&revision=18640
Author:   johang
Date:     2008-07-05 21:09:56 +0000 (Sat, 05 Jul 2008)

Log Message:
-----------
* Refactored syncml_message.
* Hopefully solved the CDATA issue; some data items should be wrapped with 
CDATA tags.
* Rewrote some stuff in syncml_response.
* Something about WBXML and devinf is broken.
* Better logging.

Modified Paths:
--------------
    trunk/syncml/inc/class.syncml_auth_basic.inc.php
    trunk/syncml/inc/class.syncml_auth_md5.inc.php
    trunk/syncml/inc/class.syncml_command_get.inc.php
    trunk/syncml/inc/class.syncml_command_replace.inc.php
    trunk/syncml/inc/class.syncml_command_synchdr.inc.php
    trunk/syncml/inc/class.syncml_database.inc.php
    trunk/syncml/inc/class.syncml_database_devinf.inc.php
    trunk/syncml/inc/class.syncml_logger.inc.php
    trunk/syncml/inc/class.syncml_message.inc.php
    trunk/syncml/inc/class.syncml_response.inc.php
    trunk/syncml/inc/functions.inc.php
    trunk/syncml/syncml.php

Modified: trunk/syncml/inc/class.syncml_auth_basic.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_auth_basic.inc.php    2008-07-04 16:41:50 UTC 
(rev 18639)
+++ trunk/syncml/inc/class.syncml_auth_basic.inc.php    2008-07-05 21:09:56 UTC 
(rev 18640)
@@ -27,8 +27,12 @@
                        // $data is in the form username:password.
                        // neither username nor password should contain colon.
                        @list($username, $passwd) = explode(':', $data, 2);
+                       
+                       syncml_logger::get_instance()->log_data("Processing 
credentials (basic)",
+                               array($username, $passwd));
 
-                       return $GLOBALS['phpgw']->session->create($username, 
$passwd);
+                       return $GLOBALS['phpgw']->session->create(
+                               $username, md5($passwd), 'md5');
                }
        }
 ?>

Modified: trunk/syncml/inc/class.syncml_auth_md5.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_auth_md5.inc.php      2008-07-04 16:41:50 UTC 
(rev 18639)
+++ trunk/syncml/inc/class.syncml_auth_md5.inc.php      2008-07-05 21:09:56 UTC 
(rev 18640)
@@ -58,6 +58,9 @@
                        $passwd = $GLOBALS['phpgw']->db->f('account_pwd');
                        $username = $GLOBALS['phpgw']->db->f('account_lid');
 
+                       syncml_logger::get_instance()->log_data("Processing 
credentials (md5)",
+                               array($username, $passwd));
+
                        return $GLOBALS['phpgw']->session->create($username, 
$passwd, true);
                }
        }

Modified: trunk/syncml/inc/class.syncml_command_get.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_command_get.inc.php   2008-07-04 16:41:50 UTC 
(rev 18639)
+++ trunk/syncml/inc/class.syncml_command_get.inc.php   2008-07-05 21:09:56 UTC 
(rev 18640)
@@ -42,7 +42,7 @@
                        if(!$database)
                        {
                                // No database or source is given. Try getting 
one by type.
-                               
+
                                switch($this->meta['type'])
                                {
                                        case 
'application/vnd.syncml-devinf+xml':

Modified: trunk/syncml/inc/class.syncml_command_replace.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_command_replace.inc.php       2008-07-04 
16:41:50 UTC (rev 18639)
+++ trunk/syncml/inc/class.syncml_command_replace.inc.php       2008-07-05 
21:09:56 UTC (rev 18640)
@@ -96,6 +96,8 @@
                        }
                        else
                        {
+                               // @todo send some kind of error code instead 
of OK
+                               
                                $response->add_status(
                                        $this->cmdid, $session->msgid, 
'Replace',
                                        NULL, NULL,

Modified: trunk/syncml/inc/class.syncml_command_synchdr.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_command_synchdr.inc.php       2008-07-04 
16:41:50 UTC (rev 18639)
+++ trunk/syncml/inc/class.syncml_command_synchdr.inc.php       2008-07-05 
21:09:56 UTC (rev 18640)
@@ -142,15 +142,11 @@
 
                                if(is_string($tmp))
                                {
-                                       syncml_logger::get_instance()->log(
-                                               "credentials was OK");
                                        $sosession->set_session_mapping($id, 
$tmp);
                                        $this->handle_success($response, 
$session);
                                }
                                else
                                {
-                                       syncml_logger::get_instance()->log(
-                                               "bad credentials");
                                        $this->handle_failure($tmp, $response, 
$session);
                                }
                        }
@@ -161,6 +157,8 @@
 
                function handle_success(&$response, &$session)
                {
+                       syncml_logger::get_instance()->log("auth success");
+
                        $session->account_id = 
$GLOBALS['phpgw']->session->account_id;
 
                        $session->session_data = 
$GLOBALS['phpgw']->session->appsession(
@@ -182,6 +180,8 @@
                 */
                function handle_failure($code, &$response, &$session)
                {
+                       syncml_logger::get_instance()->log("auth failure");
+
                        switch($code)
                        {
                                case SYNCML_STATUS_PROTOCOLVERSIONNOTSUPPORTED:

Modified: trunk/syncml/inc/class.syncml_database.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_database.inc.php      2008-07-04 16:41:50 UTC 
(rev 18639)
+++ trunk/syncml/inc/class.syncml_database.inc.php      2008-07-05 21:09:56 UTC 
(rev 18640)
@@ -91,9 +91,9 @@
                                        d.source_id = s.source_id',
                                $channel_id),
                                __LINE__, __FILE__);
-                               
+
                        $GLOBALS['phpgw']->db->next_record();
-                       
+
                        return array(
                                $GLOBALS['phpgw']->db->f('modulename'),
                                $GLOBALS['phpgw']->db->f('mimetype'),
@@ -129,31 +129,30 @@
                 */
                function merge_changes($except_list = array())
                {
-                               
syncml_logger::get_instance()->log_data("merge_changes : ipc set  ", 
is_object($this->ipc)? 'true' : 'false');
-                       if(!$this->ipc)
-                       {
-                               return 0;
-                       }
+                       syncml_logger::get_instance()->log('Begin merge 
changes');
 
                        $sochannel = new syncml_sochannel();
 
                        list(, , , $last_merge) = 
$sochannel->get_channel($this->channel_id);
-                       syncml_logger::get_instance()->log_data("merge_changes 
last_merge : ", $last_merge);
 
+                       syncml_logger::get_instance()->log_data('Last merge', 
$last_merge);
+
                        $changed_guids = array_diff(
                                $this->ipc->getIdList($last_merge), 
$except_list);
-                       syncml_logger::get_instance()->log_data("merge_changes 
changed_guids : ", $changed_guids);
 
+                       syncml_logger::get_instance()->log_data(
+                               'Changed GUIDs', $changed_guids);
+
                        foreach($changed_guids as $guid)
                        {
-                       syncml_logger::get_instance()->log_data("merge_changes 
guid : ", $guid);
                                $this->somappings->update_mapping(
                                        $this->channel_id, NULL, $guid, 1);
-                       syncml_logger::get_instance()->log_data("merge_changes 
update_mapping done  for guids : ", $guid);
                        }
 
                        $sochannel->update_last_merge($this->channel_id);
-                       syncml_logger::get_instance()->log("merge_changes 
update_last_merge done for ".$this->channel_id);
+
+                       syncml_logger::get_instance()->log(sprintf(
+                               'Merge changes for channel ID %d done', 
$this->channel_id));
                }
 
                /**
@@ -164,7 +163,7 @@
                 */
                function get_item_by_guid($uri, $type)
                {
-                       return $this->ipc->getdata($uri, $type);
+                       return syncml_wrap_data($this->ipc->getdata($uri, 
$type), $type);
                }
 
                /**
@@ -203,18 +202,30 @@
                 */
                function replace_item($luid, $data, $type, $override = FALSE)
                {
+                       syncml_logger::get_instance()->log(sprintf(
+                               'Replace item %s (%s)', $luid, $type));
+
                        $mappings = $this->somappings->get_mapping(
                                $this->channel_id, $luid, NULL, NULL);
 
+                       syncml_logger::get_instance()->log_data('Got mappings', 
$mappings);
+
                        $dirty = FALSE;
+                       $guid = NULL;
 
                        if(count($mappings) > 0)
                        {
                                list(list(,, $guid, $dirty)) = $mappings;
                        }
 
+                       syncml_logger::get_instance()->log_data('Override is', 
$override);
+                       syncml_logger::get_instance()->log_data('GUID is', 
$guid);
+                       syncml_logger::get_instance()->log_data('Dirty is', 
$dirty);
+
                        if(!$override && $dirty)
                        {
+                               syncml_logger::get_instance()->log('Conflict, 
duplicate it');
+
                                $new_guid = $this->ipc->adddata($data, $type);
 
                                // we want to add the old item to our client, by
@@ -231,6 +242,8 @@
                        }
                        else if(count($mappings) > 0)
                        {
+                               syncml_logger::get_instance()->log('Replace 
it');
+
                                $this->ipc->replacedata($guid, $data, $type);
 
                                $this->somappings->update_mapping(
@@ -240,6 +253,8 @@
                        }
                        else
                        {
+                               syncml_logger::get_instance()->log('Add it');
+
                                $guid = $this->ipc->adddata($data, $type);
 
                                $this->somappings->insert_mapping(

Modified: trunk/syncml/inc/class.syncml_database_devinf.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_database_devinf.inc.php       2008-07-04 
16:41:50 UTC (rev 18639)
+++ trunk/syncml/inc/class.syncml_database_devinf.inc.php       2008-07-05 
21:09:56 UTC (rev 18640)
@@ -12,6 +12,8 @@
 
        require_once 'inc/functions.inc.php';
 
+       require_once 'inc/class.xml_parser.inc.php';
+
        /**
         * A device information database.
         */
@@ -36,11 +38,13 @@
                        switch($uri)
                        {
                                case './devinf10':
-                                       return $this->_encode(
-                                               $this->_get_devinf_10(), $type, 
'1.0');
+                                       return syncml_wrap_data(
+                                               
$this->_encode($this->_get_devinf_10(), $type, '1.0'),
+                                               $type);
                                case './devinf11':
-                                       return $this->_encode(
-                                               $this->_get_devinf_11(), $type, 
'1.1');
+                                       return syncml_wrap_data(
+                                               
$this->_encode($this->_get_devinf_11(), $type, '1.1'),
+                                               $type);
                                default:
                                        return NULL;
                        }
@@ -75,9 +79,24 @@
                 */
                function _encode($data, $type, $dtd_version)
                {
+                       syncml_logger::get_instance()->log("Encoding $type, 
$dtd_version");
+
                        switch($type)
                        {
                                case 'application/vnd.syncml-devinf+wbxml':
+                                       switch($dtd_version)
+                                       {
+                                               case '1.1':
+                                                       $doctype = '<!DOCTYPE 
SyncML PUBLIC "-//SYNCML//DTD SyncML 1.1//EN" 
"http://www.syncml.org/docs/syncml_represent_v11_20020213.dtd";>';
+                                                       break;
+                                               case '1.0':
+                                               default:
+                                                       $doctype = '<!DOCTYPE 
SyncML PUBLIC "-//SYNCML//DTD SyncML 1.0//EN" 
"http://www.syncml.org/docs/syncml_represent_v10_20001207.dtd";>';
+                                       }
+
+                                       return wbxml_encode(
+                                               '<?xml version="1.0" 
encoding="UTF-8"?>' . $doctype .
+                                               $data, 0x02, FALSE, FALSE);
                                case 'application/vnd.syncml-devinf+xml':
                                        return $data;
                                default:
@@ -90,7 +109,7 @@
                 *
                 * @param $data        Data to decode.
                 * @param $type        Type of input data.
-                * @param $dtd_version 
+                * @param $dtd_version
                 * @return string Decoded data in XML array format.
                 */
                function _decode($data, $type)
@@ -98,7 +117,7 @@
                        switch($type)
                        {
                                case 'application/vnd.syncml-devinf+wbxml':
-                                       $parser = new wbxml_parser();
+                                       $parser = new xml_parser();
                                        return $parser->parse(
                                                wbxml_decode($data), new 
xml_mapper());
                                case 'application/vnd.syncml-devinf+xml':

Modified: trunk/syncml/inc/class.syncml_logger.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_logger.inc.php        2008-07-04 16:41:50 UTC 
(rev 18639)
+++ trunk/syncml/inc/class.syncml_logger.inc.php        2008-07-05 21:09:56 UTC 
(rev 18640)
@@ -22,9 +22,9 @@
                function syncml_logger()
                {
                        $this->handle = fopen(SYNCML_DEBUG_FILE, 'a');
-                       $this->log_run = substr(md5(microtime()), 0, 4);
 
-                       if(SYNCML_DEBUG_MODE) {
+                       if(SYNCML_DEBUG_MODE)
+                       {
                                fwrite($this->handle, sprintf("== new run (%s) 
==\n",
                                        date('H:i:s')));
                        }
@@ -32,7 +32,8 @@
 
                static function get_instance()
                {
-                       if(is_null(self::$instance)) {
+                       if(is_null(self::$instance))
+                       {
                                self::$instance = new syncml_logger();
                        }
 
@@ -41,26 +42,39 @@
 
                function log_data($message, $data)
                {
-                       if(SYNCML_DEBUG_MODE) {
-                               fwrite($this->handle, sprintf("%s, %s, %s, 
%s\n",
-                                       $this->log_run, date('H:i:s'), $message,
+                       if(SYNCML_DEBUG_MODE)
+                       {
+                               $trace = debug_backtrace();
+                               $frame = $trace[1];
+                               
+                               fwrite($this->handle, sprintf("%s::%s(), %s, 
%s\n",
+                                       isset($frame['class']) ? 
$frame['class'] : '',
+                                       isset($frame['function']) ? 
$frame['function'] : '',
+                                       $message,
                                        var_export($data, true)));
                        }
                }
 
-               function log_error($errno, $errstr, $errfile, $errline) {
-                       if(SYNCML_DEBUG_MODE) {
-                               fwrite(
-                                       $this->handle,
-                                       sprintf("%s, error: %s\n", 
$this->log_run, $errstr));
+               function log_error($errno, $errstr, $errfile, $errline)
+               {
+                       if(SYNCML_DEBUG_MODE)
+                       {
+                               fwrite($this->handle, sprintf("%s (%s:%d)\n",
+                                       $errstr, $errfile, $errline));
                        }
                }
 
                function log($message)
                {
-                       if(SYNCML_DEBUG_MODE) {
-                               fwrite($this->handle, sprintf("%s, %s, %s\n",
-                                       $this->log_run, date('H:i:s'), 
$message));
+                       if(SYNCML_DEBUG_MODE)
+                       {
+                               $trace = debug_backtrace();
+                               $frame = $trace[1];
+                               
+                               fwrite($this->handle, sprintf("%s::%s(), %s\n",
+                                       isset($frame['class']) ? 
$frame['class'] : '',
+                                       isset($frame['function']) ? 
$frame['function'] : '',
+                                       $message));
                        }
                }
        }

Modified: trunk/syncml/inc/class.syncml_message.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_message.inc.php       2008-07-04 16:41:50 UTC 
(rev 18639)
+++ trunk/syncml/inc/class.syncml_message.inc.php       2008-07-05 21:09:56 UTC 
(rev 18640)
@@ -81,100 +81,101 @@
 
                        if($session->get_var(SYNCML_NOMOREMODIFICATIONS))
                        {
-                               $open_channels = $session->get_open_channels();
-                               
-                               $response->set_final(TRUE);
+                               $this->send_modifications_in_each_channel(
+                                       $session->get_open_channels(), 
$session, $response);
+                       }
 
-                               foreach($open_channels as $open_channel)
-                               {
-                                       $database = new syncml_database(
-                                               $open_channel['channel_id']);
-                                       
-                                       
if(!$open_channel['server_modifications_sent'])
-                                       {
-                                               /*
-                                                       This code is run 
*after* all modifications from
-                                                       client are sent and 
*before* any modfifications
-                                                       are sent by the server.
-                                               */
+                       // do we have to send a ALERT for more messages?
 
-                                               // LUIDs modified by the 
*client* during this session
-                                               $all_modified_luids = 
$session->get_all_modified_luids(
-                                                       
$open_channel['channel_id']);
+                       if($response->status_commands_only() && 
!$response->is_final())
+                       {
+                               $response->add_alert(SYNCML_ALERT_NEXTMESSAGE, 
array());
+                       }
 
-                                               // GUIDs modified by the 
*client* during this session
-                                               $all_modified_guids = 
$session->get_all_modified_guids(
-                                                       
$open_channel['channel_id']);
+                       // save the anchors if this is last message in session
 
-                                               // Bring all changed items from 
phpgw
-                                               
$database->merge_changes($all_modified_guids);
+                       if($response->status_commands_only())
+                       {
+                               $session->commit_anchors();
+                       }
 
-                                               switch($open_channel['type'])
-                                               {
-                                                       case 
SYNCML_ALERT_SLOWSYNC:
-                                                               
$this->prepare_slowsync(
-                                                                       
$open_channel['channel_id'],
-                                                                       
$all_modified_luids);
-                                                               break;
-                                                       case 
SYNCML_ALERT_REFRESHFROMSERVER:
-                                                       case 
SYNCML_ALERT_REFRESHFROMSERVERBYSERVER:
-                                                               
$somappings->delete_mapping(
-                                                                       
$open_channel['channel_id'], NULL, NULL,
-                                                                       NULL);
-                                                               break;
-                                                       case 
SYNCML_ALERT_REFRESHFROMCLIENT:
-                                                       case 
SYNCML_ALERT_REFRESHFROMCLIENTBYSERVER:
-                                                               
$this->finish_client_refresh(
-                                                                       
$open_channel['channel_id'],
-                                                                       
$all_client_modified_luids, $database);
-                                                               break;
-                                               }
-                                       }
+                       $session->commit();
+               }
 
-                                       
if(!$open_channel['all_server_modifications_sent'])
+               function send_modifications_in_each_channel($open_channels, 
&$session,
+                       &$response)
+               {
+                       $response->set_final(TRUE);
+
+                       foreach($open_channels as $open_channel)
+                       {
+                               $database = new 
syncml_database($open_channel['channel_id']);
+
+                               // is this the first time we send something?
+
+                               if(!$open_channel['server_modifications_sent'])
+                               {
+                                       
$this->prepare_to_send_modifications($open_channel,
+                                               $session, $database);
+                               }
+
+                               // is there more to send later?
+
+                               
if(!$open_channel['all_server_modifications_sent'])
+                               {
+                                       if($this->send_modifications($response, 
$session,
+                                               $open_channel, $database))
                                        {
-                                               $more_to_send = 
$this->_send_modifications(
-                                                       $response, $session, 
$open_channel, $database);
+                                               // there is more to send, 
continue with that in next
+                                               // message.
 
+                                               $response->set_final(FALSE);
+                                               return;
+                                       }
+                                       else
+                                       {
                                                
$session->set_open_channel_property(
                                                        
$open_channel['source'], $open_channel['target'],
-                                                       
'server_modifications_sent', TRUE);
-
-                                               if($more_to_send)
-                                               {
-                                                       // there's more to send 
from this channel. we
-                                                       // continue with that 
in next message.
-                                                       
-                                                       
$response->set_final(FALSE);
-                                                       break;
-                                               }
-                                               else
-                                               {
-                                                       
$session->set_open_channel_property(
-                                                               
$open_channel['source'],
-                                                               
$open_channel['target'],
-                                                               
'all_server_modifications_sent', TRUE);
-                                               }
+                                                       
'all_server_modifications_sent', TRUE);
                                        }
                                }
                        }
+               }
 
-                       // do we have to send a ALERT for more messages?
+               /**
+                * This code is run *after* all modifications from client are 
sent and
+                * *before* any modfifications are sent by the server.
+                */
+               function prepare_to_send_modifications($open_channel, &$session,
+                       &$database)
+               {
+                       // LUIDs modified by the *client* during this session
+                       $all_modified_luids = $session->get_all_modified_luids(
+                               $open_channel['channel_id']);
 
-                       if($response->status_commands_only() && 
!$response->is_final())
-                       {
-                               $cmdid = 
$response->add_alert(SYNCML_ALERT_NEXTMESSAGE,
-                                       array());
-                       }
+                       // GUIDs modified by the *client* during this session
+                       $all_modified_guids = $session->get_all_modified_guids(
+                               $open_channel['channel_id']);
 
-                       // save the anchors if this is last message in session
+                       // Bring all changed items from phpgw
+                       $database->merge_changes($all_modified_guids);
 
-                       if($response->status_commands_only())
+                       switch($open_channel['type'])
                        {
-                               $session->commit_anchors();
+                               case SYNCML_ALERT_SLOWSYNC:
+                                       
$this->prepare_slowsync($open_channel['channel_id'],
+                                               $all_modified_luids);
+                                       break;
+                               case SYNCML_ALERT_REFRESHFROMSERVER:
+                               case SYNCML_ALERT_REFRESHFROMSERVERBYSERVER:
+                                       
$this->prepare_server_refresh($open_channel['channel_id']);
+                                       break;
+                               case SYNCML_ALERT_REFRESHFROMCLIENT:
+                               case SYNCML_ALERT_REFRESHFROMCLIENTBYSERVER:
+                                       
$this->finish_client_refresh($open_channel['channel_id'],
+                                               $all_client_modified_luids, 
$database);
+                                       break;
                        }
-
-                       $session->commit();
                }
 
                /**
@@ -184,9 +185,13 @@
                 * @return bool Returns true if there are more modifications to 
send
                 *              that didn't fit in this message.
                 */
-               function _send_modifications(&$response, &$session, 
$open_channel,
+               function send_modifications(&$response, &$session, 
$open_channel,
                        $database)
                {
+                       $session->set_open_channel_property(
+                               $open_channel['source'], 
$open_channel['target'],
+                               'server_modifications_sent', TRUE);
+
                        switch($open_channel['type'])
                        {
                                case SYNCML_ALERT_SLOWSYNC:
@@ -196,8 +201,8 @@
                                case SYNCML_ALERT_ONEWAYFROMSERVERBYSERVER:
                                case SYNCML_ALERT_REFRESHFROMSERVER:
                                case SYNCML_ALERT_REFRESHFROMSERVERBYSERVER:
-                                       return $this->_send_sync(&$response, 
&$session, $database,
-                                               $open_channel);
+                                       return $this->add_sync(&$response, 
&$session,
+                                               $database, $open_channel);
                                case SYNCML_ALERT_REFRESHFROMCLIENT:
                                case SYNCML_ALERT_REFRESHFROMCLIENTBYSERVER:
                                case SYNCML_ALERT_ONEWAYFROMCLIENT:
@@ -233,9 +238,9 @@
 
                /**
                 * Remove items not touched by the client.
-                * 
-                * @param $channel_id                ID of channel to prepare 
the slow
-                *                                   sync for.
+                *
+                * @param $channel_id                ID of channel to prepare 
the
+                *                                   refresh for.
                 * @param $all_client_modified_luids All LUIDs client modified.
                 * @param $database                  Database involved in this
                 *                                   session.
@@ -257,14 +262,26 @@
                }
 
                /**
+                * Prepare a refresh from server.
+                *
+                * @param $channel_id ID of channel to prepare the refresh for.
+                */
+               function prepare_server_refresh($channel_id)
+               {
+                       $somappings = new syncml_somappings();
+
+                       $somappings->delete_mapping($channel_id, NULL, NULL, 
NULL);
+               }
+
+               /**
                 * Fetch modifications and insert a SYNC command.
-                * 
+                *
                 * @param $response     Response object to write SYNC command 
to.
                 * @param $session      Session object.
                 * @param $database     Database object to pull changes from.
                 * @param $open_channel Channel involved in this SYNC command.
                 */
-               function _send_sync(&$response, &$session, $database, 
$open_channel)
+               function add_sync(&$response, &$session, $database, 
$open_channel)
                {
                        $commands = array();
 

Modified: trunk/syncml/inc/class.syncml_response.inc.php
===================================================================
--- trunk/syncml/inc/class.syncml_response.inc.php      2008-07-04 16:41:50 UTC 
(rev 18639)
+++ trunk/syncml/inc/class.syncml_response.inc.php      2008-07-05 21:09:56 UTC 
(rev 18640)
@@ -12,12 +12,6 @@
 
        define('METINF', 'xmlns="syncml:metinf"');
 
-       function ec($cond, $name, $cdata, $attrs = '')
-       {
-               return $cond ? ("<$name" . ($attrs ? ' ' . $attrs : '') .
-                       ($cdata === '' ? '/>' : ">$cdata</$name>")) : '';
-       }
-
        class syncml_response
        {
                var $next_cmdid = 0;
@@ -37,12 +31,18 @@
 
                function syncml_response()
                {
-                       $this->root_namespace = 'SYNCML:SYNCML1.1';
                }
 
+               static function e($name, $cdata, $attrs = '')
+               {
+                       return "<$name" . ($attrs ? ' ' . $attrs : '') .
+                               ($cdata === '' ? '/>' : ">$cdata</$name>");
+               }
+
                function print_response()
                {
                        echo '<?xml version="1.0" encoding="UTF-8"?>';
+                       echo $this->doctype;
                        echo '<SyncML xmlns="', $this->root_namespace, '">';
                        echo '<SyncHdr>', $this->header, $this->header_cred, 
'</SyncHdr>';
                        echo '<SyncBody>', implode('', $this->commands);
@@ -129,8 +129,8 @@
                                        '<CmdID>' . $this->get_next_cmdid() . 
'</CmdID>' .
                                        '<MsgRef>' . $msgref . '</MsgRef>' .
                                        '<CmdRef>' . $cmdref . '</CmdRef>' .
-                                       ec((bool)$srcref, 'SourceRef', $srcref) 
.
-                                       ec((bool)$trgref, 'TargetRef', $trgref) 
.
+                                       ((bool)$srcref ? self::e('SourceRef', 
$srcref) : '') .
+                                       ((bool)$trgref ? self::e('TargetRef', 
$trgref) : '') .
                                        '<Meta>' .
                                                $this->get_meta(array('type' => 
$type)) .
                                        '</Meta>' .
@@ -150,15 +150,26 @@
                                '<Alert>' .
                                        '<CmdID>' . $this->get_next_cmdid() . 
'</CmdID>' .
                                        '<Data>' . $code . '</Data>' .
-                                       ec(is_array($item), 'Item',
-                                               $this->get_item($item, 
$supportlargeobj)) .
+                                       (is_array($item) ? self::e('Item',
+                                               $this->get_item($item, 
$supportlargeobj)) : '') .
                                '</Alert>'
                        );
                }
-               
+
                function set_syncml_namespace_version($version)
                {
-                       $this->root_namespace = 'SYNCML:SYNCML' . $version;
+                       switch($version)
+                       {
+                               case '1.1':
+                                       $this->doctype = '<!DOCTYPE SyncML 
PUBLIC "-//SYNCML//DTD SyncML 1.1//EN" "http://www.syncml.org/
+docs/syncml_represent_v11_20020213.dtd">';
+                                       $this->root_namespace = 
'SYNCML:SYNCML1.1';
+                                       break;
+                               case '1.0':
+                               default:
+                                       $this->doctype = '<!DOCTYPE SyncML 
PUBLIC "-//SYNCML//DTD SyncML 1.0//EN" 
"http://www.syncml.org/docs/syncml_represent_v10_20001207.dtd";>';
+                                       $this->root_namespace = 
'SYNCML:SYNCML1.0';
+                       }
                }
 
                function set_header($verdtd, $verproto, $sessionid, $msgid,
@@ -171,17 +182,17 @@
                                '<MsgID>' . $msgid . '</MsgID>' .
                                '<Target>' .
                                        '<LocURI>' . $trg_lu . '</LocURI>' .
-                                       ec((bool)$trg_ln, "LocName", $trg_ln) .
+                                       ((bool)$trg_ln ? self::e('LocName', 
$trg_ln) : '') .
                                '</Target>' .
                                '<Source>' .
                                        '<LocURI>' . $src_lu . '</LocURI>' .
-                                       ec((bool)$src_ln, "LocName", $src_ln) .
+                                       ((bool)$src_ln ? self::e('LocName', 
$src_ln) : '') .
                                '</Source>';
                }
 
                function set_header_cred($format, $type, $data)
                {
-                       $this->header_cred = 
+                       $this->header_cred =
                                '<Cred>' .
                                        '<Meta>' .
                                                '<Format 
xmlns="syncml:metinf">' .
@@ -204,48 +215,53 @@
                                        '<CmdRef>' . $cmdref . '</CmdRef>' .
                                        '<Cmd>' . $cmd . '</Cmd>' .
                                        '<MsgRef>' . $msgref . '</MsgRef>' .
-                                       ec((bool)$srcref, 'SourceRef', $srcref) 
.
-                                       ec((bool)$trgref, 'TargetRef', $trgref) 
.
+                                       ((bool)$srcref ? self::e('SourceRef', 
$srcref) : '') .
+                                       ((bool)$trgref ? self::e('TargetRef', 
$trgref) : '') .
                                        '<Data>' . $data . '</Data>' .
-                                       ec(is_array($item), "Item", 
$this->get_item($item)) .
+                                       (is_array($item) ? self::e('Item',
+                                               $this->get_item($item)) : '') .
                                '</Status>'
                        );
                }
 
+               /**
+                * Build "item" XML node.
+                *
+                * @param $item array Array of elements in the node.
+                * @return string     The item XML node.
+                */
                function get_item($item)
                {
                        return
-                               ec(isset($item['trg_uri']), "Target",
-                                       '<LocURI>' . @$item['trg_uri'] . 
'</LocURI>' .
-                                       ec(isset($item['trg_name']), "LocName",
-                                               @$item['trg_name'])) .
-                               ec(isset($item['src_uri']), "Source",
+                               (isset($item['trg_uri']) ? self::e('Target',
+                                       '<LocURI>' . $item['trg_uri'] . 
'</LocURI>' .
+                                       (isset($item['trg_name']) ? 
self::e('LocName',
+                                               $item['trg_name']) : '')) : '') 
.
+                               (isset($item['src_uri']) ? self::e('Source',
                                        '<LocURI>' . @$item['src_uri'] . 
'</LocURI>' .
-                                       ec(isset($item['src_name']), "LocName",
-                                               @$item['src_name'])) .
-                               ec(isset($item['meta']), 'Meta',
-                                       @$this->get_meta($item['meta'])) .
-                               ec(isset($item['data']), 'Data',
-                                       /* '<![CDATA[' . */ @$item['data'] /* . 
']]>' */) .
-                               ec(isset($item['moredata']) && 
$item['moredata'],
-                                       'MoreData', '');
+                                       (isset($item['src_name']) ? 
self::e('LocName',
+                                               $item['src_name']) : '')) : '') 
.
+                               (isset($item['meta']) ? self::e('Meta',
+                                       $this->get_meta($item['meta'])) : '') .
+                               (isset($item['data']) ? self::e('Data',
+                                       /* '<![CDATA[' . */ @$item['data'] /* . 
']]>' */) : '') .
+                               ((isset($item['moredata']) && 
$item['moredata']) ?
+                                       self::e('MoreData', '') : '');
                }
 
                function get_meta($meta)
                {
                        return
-                               ec(isset($meta['type']), 'Type', 
@$meta['type'], METINF) .
-                               ec(
-                                       isset($meta['next']),
-                                       'Anchor',
+                               (isset($meta['type']) ?
+                                       self::e('Type', $meta['type'], METINF) 
: '') .
+                               (isset($meta['next']) ? self::e('Anchor',
                                        '<Next>' . @$meta['next'] . '</Next>' .
-                                               ec(isset($meta['last']), 
'Last', @$meta['last']),
-                                       METINF
-                               ) .
-                               ec(isset($meta['maxobjsize']), 'MaxObjSize',
-                                       @$meta['maxobjsize'], METINF) .
-                               ec(isset($meta['size']) && $meta['size'], 
'Size',
-                                       @$meta['size'], METINF);
+                                       (isset($meta['last']) ? self::e('Last', 
$meta['last'],
+                                               METINF) : ''), METINF) : '') .
+                               (isset($meta['maxobjsize']) ?
+                                       self::e('MaxObjSize', 
$meta['maxobjsize'], METINF) : '') .
+                               (isset($meta['size']) ?
+                                       self::e('Size', $meta['size'], METINF) 
: '');
                }
 
                function add_status_with_chal($cmdref, $msgref, $cmd, $trgref,
@@ -259,8 +275,8 @@
                                        '<CmdRef>' . $cmdref . '</CmdRef>' .
                                        '<Cmd>' . $cmd . '</Cmd>' .
                                        '<MsgRef>' . $msgref . '</MsgRef>' .
-                                       ec($srcref, 'SourceRef', $srcref) .
-                                       ec($trgref, 'TargetRef', $trgref) .
+                                       ((bool)$srcref ? self::e('SourceRef', 
$srcref) : '') .
+                                       ((bool)$trgref ? self::e('TargetRef', 
$trgref) : '') .
                                        '<Data>' . $data . '</Data>' .
                                        '<Chal>' .
                                                '<Meta>' .
@@ -268,8 +284,8 @@
                                                                $type .
                                                        '</Type>' .
                                                        '<Format 
xmlns="syncml:metinf">b64</Format>' .
-                                                       ec($nonce, 'NextNonce', 
base64_encode($nonce),
-                                                               METINF) .
+                                                       ($nonce ? 
self::e('NextNonce',
+                                                               
base64_encode($nonce), METINF) : '') .
                                                '</Meta>' .
                                        '</Chal>' .
                                '</Status>'
@@ -287,8 +303,8 @@
                                        '<CmdRef>' . $cmdref . '</CmdRef>' .
                                        '<Cmd>' . $cmd . '</Cmd>' .
                                        '<MsgRef>' . $msgref . '</MsgRef>' .
-                                       ec($srcref, 'SourceRef', $srcref) .
-                                       ec($trgref, 'TargetRef', $trgref) .
+                                       ((bool)$srcref ? self::e('SourceRef', 
$srcref) : '') .
+                                       ((bool)$trgref ? self::e('TargetRef', 
$trgref) : '') .
                                        '<Data>' . $data . '</Data>' .
                                        '<Item>' .
                                                '<Data>' .
@@ -309,7 +325,7 @@
                                        '<Meta>' . $this->get_meta($meta) . 
'</Meta>' .
                                        '<Item>' .
                                                $this->get_item($item) .
-                                               ec(!$last_chunk, 'MoreData', 
'') .
+                                               (!$last_chunk ? 
self::e('MoreData', '') : '') .
                                        '</Item>' .
                                '</Add>';
                }
@@ -331,7 +347,7 @@
                                        '<Meta>' . $this->get_meta($meta) . 
'</Meta>' .
                                        '<Item>' .
                                                $this->get_item($item) .
-                                               ec(!$last_chunk, 'MoreData', 
'') .
+                                               (!$last_chunk ? 
self::e('MoreData', '') : '') .
                                        '</Item>' .
                                '</Replace>';
                }
@@ -348,8 +364,8 @@
                                        '<Source>' .
                                                '<LocURI>' . $src_uri . 
'</LocURI>' .
                                        '</Source>' .
-                                       ec($supportnbrofchanges, 
'NumberOfChanges',
-                                               $nbrofchanges) .
+                                       ($supportnbrofchanges ? 
self::e('NumberOfChanges',
+                                               $nbrofchanges) : '') .
                                        implode('', $commands) .
                                '</Sync>'
                        );

Modified: trunk/syncml/inc/functions.inc.php
===================================================================
--- trunk/syncml/inc/functions.inc.php  2008-07-04 16:41:50 UTC (rev 18639)
+++ trunk/syncml/inc/functions.inc.php  2008-07-05 21:09:56 UTC (rev 18640)
@@ -56,7 +56,7 @@
         * Parse the XML definition and look for encoding attribute.
         *
         * @param $data   XML string.
-        * @return string Found encoding or NULL of no encoding found. 
+        * @return string Found encoding or NULL of no encoding found.
         */
        function syncml_parse_encoding($data)
        {
@@ -64,7 +64,31 @@
                {
                        return strtoupper($m[1]);
                }
-               
+
                return NULL;
        }
+
+       /**
+        * Wrap data with CDATA tags if necessary.
+        *
+        * @param $data
+        * @param $type
+        * @return string
+        */
+       function syncml_wrap_data($data, $type)
+       {
+               $types = array
+               (
+                       'text/calendar'                       => TRUE,
+                       'text/x-vcalendar'                    => TRUE,
+                       'text/plain'                          => TRUE,
+                       'text/x-vcard'                        => TRUE,
+                       'text/vcard'                          => TRUE,
+                       'application/vnd.syncml-devinf+wbxml' => TRUE,
+                       'application/vnd.syncml-devinf+xml'   => FALSE
+               );
+
+               return (isset($types[$type]) && $types[$type]) ?
+                       '<![CDATA[' . $data . ']]>' : $data;
+       }
 ?>

Modified: trunk/syncml/syncml.php
===================================================================
--- trunk/syncml/syncml.php     2008-07-04 16:41:50 UTC (rev 18639)
+++ trunk/syncml/syncml.php     2008-07-05 21:09:56 UTC (rev 18640)
@@ -28,16 +28,13 @@
        require_once 'inc/class.xml_parser.inc.php';
        require_once 'inc/class.xml_offset_mapper.inc.php';
 
-       require_once 'inc/class.syncml_wbxml_parser.inc.php';
-       require_once 'inc/class.syncml_wbxml_response.inc.php';
-
        require_once 'inc/class.syncml_response.inc.php';
        require_once 'inc/class.syncml_message.inc.php';
 
        $file_date = gettimeofday(true);
 
        // this is a ugly, ugly hack
-       //$GLOBALS['phpgw']->db->query('TRUNCATE phpgw_access_log');
+       $GLOBALS['phpgw']->db->query('TRUNCATE phpgw_access_log');
 
        set_error_handler(array(syncml_logger::get_instance(), 'log_error'), 
E_ALL);
 
@@ -51,13 +48,13 @@
 
        $post_input = implode("\r\n", file('php://input'));
 
-       file_put_contents(
-               sprintf("%s/%s-input.xml", SYNCML_LOG_DIR, $file_date),
-               $post_input . "\n");
-
        switch($_SERVER['CONTENT_TYPE'])
        {
                case 'application/vnd.syncml+wbxml':
+                       file_put_contents(
+                               sprintf("%s/%s-input.wbxml", SYNCML_LOG_DIR, 
$file_date),
+                               $post_input . "\n");
+
                        $post_input = wbxml_decode($post_input);
                case 'application/vnd.syncml+xml':
                        $parser = new xml_parser();
@@ -67,6 +64,10 @@
                        exit('I\'m a SyncML server (2)');
        }
 
+       file_put_contents(
+               sprintf("%s/%s-input.xml", SYNCML_LOG_DIR, $file_date),
+               $post_input . "\n");
+
        $message = new syncml_message();
 
        // the header
@@ -96,13 +97,17 @@
 
        if($_SERVER['CONTENT_TYPE'] == 'application/vnd.syncml+wbxml')
        {
+               /*
                // remove the xml declaration tag
                $xml = substr(ob_get_clean(), 38);
+               */
 
-               ob_start();
+               // replace some bogus FPI values
+               /*
+               I don't remember why this hack was needed. It appears to work 
without
+               it.
 
-               // replace some bogus FPI values
-               echo str_replace(
+               $wbxml = str_replace(
                        array(
                                chr(0x02) . chr(0xA4) . chr(0x01) . chr(0x6A),
                                chr(0x02) . chr(0xA4) . chr(0x02) . chr(0x6A)),
@@ -111,6 +116,17 @@
                                chr(0x02) . chr(0x9F) . chr(0x52) . chr(0x6A)),
                        wbxml_encode($xml, 0x02, FALSE, FALSE)
                );
+               */
+
+               $wbxml = wbxml_encode(ob_get_clean(), 0x02, FALSE, FALSE);
+
+               ob_start();
+
+               file_put_contents(
+                       sprintf("%s/%s-output.wbxml", SYNCML_LOG_DIR, 
$file_date),
+                       $wbxml);
+
+               echo $wbxml;
        }
 
        header('Content-Type: ' . $_SERVER['CONTENT_TYPE']);






reply via email to

[Prev in Thread] Current Thread [Next in Thread]