CVSROOT: /sources/phpgroupware Module name: syncml Changes by: Johan Gunnarsson <johang> 07/08/05 17:15:41
Modified files: . : syncml.php inc : class.sochannel.inc.php class.sodatabase.inc.php class.somappings.inc.php class.sosession.inc.php class.syncml_auth_md5.inc.php class.syncml_command_add.inc.php class.syncml_command_alert.inc.php class.syncml_command_delete.inc.php class.syncml_command_map.inc.php class.syncml_command_replace.inc.php class.syncml_command_status.inc.php class.syncml_database.inc.php class.syncml_message.inc.php class.syncml_session.inc.php functions.inc.php setup : setup.inc.php tables_current.inc.php Added files: inc : class.syncml_xml_parser.inc.php setup : tables_baseline.inc.php tables_update.php Removed files: inc : xml_functions.inc.php Log message: * Changes in table structure. * Changes made from PHPGW UI are now noticed by sync code. * Version bump to .002. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/syncml/syncml.php?cvsroot=phpgroupware&r1=1.2&r2=1.3 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.sochannel.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.sodatabase.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.somappings.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.sosession.inc.php?cvsroot=phpgroupware&r1=1.2&r2=1.3 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_auth_md5.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_command_add.inc.php?cvsroot=phpgroupware&r1=1.2&r2=1.3 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_command_alert.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_command_delete.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_command_map.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_command_replace.inc.php?cvsroot=phpgroupware&r1=1.2&r2=1.3 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_command_status.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_database.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_message.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_session.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/functions.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/class.syncml_xml_parser.inc.php?cvsroot=phpgroupware&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/syncml/inc/xml_functions.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=0 http://cvs.savannah.gnu.org/viewcvs/syncml/setup/setup.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/setup/tables_current.inc.php?cvsroot=phpgroupware&r1=1.1.1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/syncml/setup/tables_baseline.inc.php?cvsroot=phpgroupware&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/syncml/setup/tables_update.php?cvsroot=phpgroupware&rev=1.1 Patches: Index: syncml.php =================================================================== RCS file: /sources/phpgroupware/syncml/syncml.php,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- syncml.php 30 Jul 2007 21:07:49 -0000 1.2 +++ syncml.php 5 Aug 2007 17:15:39 -0000 1.3 @@ -7,12 +7,13 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: syncml.php,v 1.2 2007/07/30 21:07:49 johang Exp $ + * @version $Id: syncml.php,v 1.3 2007/08/05 17:15:39 johang Exp $ */ ob_start(); error_reporting(E_ALL); + // error_reporting(0); $phpgw_info = array(); @@ -25,65 +26,62 @@ require('../header.inc.php'); - // this is a ugly, ugly hack - //$GLOBALS['phpgw']->db->query('TRUNCATE phpgw_access_log'); + require_once 'inc/class.syncml_xml_parser.inc.php'; + require_once 'inc/class.xml_offset_mapper.inc.php'; - require 'inc/xml_functions.inc.php'; - require 'inc/class.xml_offset_mapper.inc.php'; + require_once 'inc/class.syncml_response.inc.php'; + require_once 'inc/class.syncml_message.inc.php'; - require 'inc/class.syncml_message.inc.php'; + // this is a ugly, ugly hack + $GLOBALS['phpgw']->db->query('TRUNCATE phpgw_access_log'); if(!isset($_SERVER['CONTENT_TYPE']) || $_SERVER['REQUEST_METHOD'] != 'POST') { exit('I\'m a SyncML server (1)'); - //$_SERVER['CONTENT_TYPE'] = ''; } + $GLOBALS['HTTP_RAW_POST_DATA'] = implode("\r\n", file('php://input')); + switch($_SERVER['CONTENT_TYPE']) { case 'application/vnd.syncml+xml': - $GLOBALS['HTTP_RAW_POST_DATA'] = - implode("\r\n", file('php://input')); + $parser = new syncml_xml_parser(); + $response = new syncml_response(); break; + /* case 'application/vnd.syncml+wbxml': - $GLOBALS['HTTP_RAW_POST_DATA'] = wbxml_decode( - implode("\r\n", file('php://input'))); + $parser = new syncml_wbxml_parser(); + $response = new syncml_wbxml_response(); break; + */ default: exit('I\'m a SyncML server (2)'); - //$GLOBALS['HTTP_RAW_POST_DATA'] = ''; } $message = new syncml_message(); // the header - $header = parse_xml($GLOBALS['HTTP_RAW_POST_DATA'], + $header = $parser->parse($GLOBALS['HTTP_RAW_POST_DATA'], new xml_offset_mapper(array('SYNCML', 'SYNCHDR'))); $message->process_header($header); unset($header); // the body - $body = parse_xml($GLOBALS['HTTP_RAW_POST_DATA'], + $body = $parser->parse($GLOBALS['HTTP_RAW_POST_DATA'], new xml_offset_mapper(array('SYNCML', 'SYNCBODY'))); $message->process_body($body); unset($body, $GLOBALS['HTTP_RAW_POST_DATA']); // execute everything - $response = $message->execute(); + $message->execute($response); + + // print response $response->print_response(); - switch($_SERVER['CONTENT_TYPE']) - { - case 'application/vnd.syncml+wbxml': - echo wbxml_encode(ob_get_clean()); - ob_start(); - case 'application/vnd.syncml+xml': header('Content-Type: ' . $_SERVER['CONTENT_TYPE']); - } - header('Content-Length: ' . ob_get_length()); ob_end_flush(); Index: inc/class.sochannel.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.sochannel.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.sochannel.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.sochannel.inc.php 5 Aug 2007 17:15:39 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.sochannel.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.sochannel.inc.php,v 1.2 2007/08/05 17:15:39 johang Exp $ */ class syncml_sochannel @@ -15,7 +15,7 @@ function insert_channel($database_id, $device_uri) { $GLOBALS['phpgw']->db->query(sprintf(' - INSERT phpgw_syncml_channel( + INSERT phpgw_syncml_channels( database_id, device_uri) VALUES( \'%d\', \'%s\')', @@ -26,10 +26,20 @@ 'phpgw_syncml_channel', 'channel_id'); } + function update_last_merge($channel_id) + { + $GLOBALS['phpgw']->db->query(sprintf(' + UPDATE phpgw_syncml_channels + SET last_merge = %d + WHERE channel_id = %d', + time(), $channel_id), + __LINE__, __FILE__); + } + function update_anchors($channel_id, $device_next, $phpgw_next) { $GLOBALS['phpgw']->db->query(' - UPDATE phpgw_syncml_channel + UPDATE phpgw_syncml_channels SET' . (is_null($device_next) ? 'device_anchor_last = \'' . $device_next . '\',' : '') . @@ -48,8 +58,9 @@ SELECT c.device_anchor_last, c.phpgw_anchor_last, - c.database_id - FROM phpgw_syncml_channel c + c.database_id, + c.last_merge + FROM phpgw_syncml_channels c WHERE c.channel_id = %d', $channel_id), @@ -61,6 +72,7 @@ $GLOBALS['phpgw']->db->f('database_id'), $GLOBALS['phpgw']->db->f('device_anchor_last'), $GLOBALS['phpgw']->db->f('phpgw_anchor_last'), + $GLOBALS['phpgw']->db->f('last_merge') ); } @@ -71,8 +83,8 @@ c.channel_id, c.device_anchor_last, c.phpgw_anchor_last - FROM phpgw_syncml_channel c - JOIN phpgw_syncml_database d ON + FROM phpgw_syncml_channels c + JOIN phpgw_syncml_databases d ON d.database_id = c.database_id AND d.database_uri = '%s' WHERE c.device_uri = '%s'", @@ -92,7 +104,7 @@ function set_anchors($channel_id, $device_next, $phpgw_next) { $GLOBALS['phpgw']->db->query(" - UPDATE phpgw_syncml_channel + UPDATE phpgw_syncml_channels SET " . ($device_next ? "device_anchor_last = '" . $device_next . "'," : "") . Index: inc/class.sodatabase.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.sodatabase.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.sodatabase.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.sodatabase.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.sodatabase.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.sodatabase.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ /** @@ -18,7 +18,7 @@ function remove_database($database_id, $database_uri) { $GLOBALS['phpgw']->db->query(" - DELETE FROM phpgw_syncml_database + DELETE FROM phpgw_syncml_databases WHERE ' . (!is_null($database_id) ? 'database_id = \'' . $database_id . '\' AND ' : '') . @@ -31,7 +31,7 @@ function insert_database($database_id, $database_uri) { $GLOBALS['phpgw']->db->query(sprintf(" - INSERT INTO phpgw_syncml_database( + INSERT INTO phpgw_syncml_databases( database_uri, source_id, credential_required, credential_hash, account_id) VALUES('%s', '%d', '%d', '%s', '%d')", @@ -40,16 +40,18 @@ __LINE__, __FILE__); } - function get_database($database_id, $account_id) + function get_database($database_id, $account_id, $database_uri) { $GLOBALS['phpgw']->db->query(' SELECT * - FROM phpgw_syncml_database m + FROM phpgw_syncml_databases m WHERE ' . (!is_null($database_id) ? 'database_id = \'' . $database_id . '\' AND ' : '') . (!is_null($account_id) ? 'account_id = \'' . $account_id . '\' AND ' : '') . + (!is_null($database_uri) ? + 'database_uri = \'' . $database_uri . '\' AND ' : '') . '1 = 1', __LINE__, __FILE__); Index: inc/class.somappings.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.somappings.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.somappings.inc.php 30 Jul 2007 13:04:38 -0000 1.1.1.1 +++ inc/class.somappings.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.somappings.inc.php,v 1.1.1.1 2007/07/30 13:04:38 johang Exp $ + * @version $Id: class.somappings.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ /** @@ -16,24 +16,9 @@ class syncml_somappings { /** - * Replace a mapping. Deletes any current mapping before inserting - * new. - * - * @param $channel_id Channel ID of mapping. NULL to include all. - * @param $luid LUID of mapping. NULL to include all. - * @param $guid GUID of mapping. NULL to include all. - * @param $flag Flag of mapping. Optional. Defaults to 0. - */ - function replace_mapping($channel_id, $luid, $guid, $flag = 0) - { - $this->delete_mapping($channel_id, NULL, $guid, NULL); - $this->insert_mapping($channel_id, $luid, $guid, $flag); - } - - /** * Get a mapping. * - * @param $channel_id Channel ID of mapping. NULL to include all. + * @param $ch_id Channel ID of mapping. NULL to include all. * @param $luid LUID of mapping. NULL to include all. * @param $guid GUID of mapping. NULL to include all. * @param $flag Flag of mapping. NULL to include all. @@ -75,12 +60,12 @@ /** * Get all mapped LUIDs in this database. * + * @param $ch_id Channel ID. NULL to include all. * @return array List of LUID numbers of mappings to this channel. */ - function get_all_mapped_luids($channel_id) + function get_all_mapped_luids($ch_id) { - $mappings = $this->get_mapping( - $channel_id, NULL, NULL, NULL); + $mappings = $this->get_mapping($ch_id, NULL, NULL, NULL); $all_mapped_luids = array(); @@ -95,7 +80,7 @@ /** * Delete a mapping. * - * @param $channel_id Channel ID of mapping. NULL to include all. + * @param $ch_id Channel ID of mapping. NULL to include all. * @param $luid LUID of mapping. NULL to include all. * @param $guid GUID of mapping. NULL to include all. * @param $flag Flag of mapping. NULL to include all. @@ -114,36 +99,31 @@ '1 = 1', __LINE__, __FILE__); - // return $GLOBALS['phpgw']->db->affected_rows(); - } - - function delete_all_mappings() - { - return $this->delete_mapping(NULL, NULL, NULL, NULL); + return $GLOBALS['phpgw']->db->affected_rows(); } /** * Insert a mapping. * - * @param $channel_id Channel ID of mapping. NULL to include all. + * @param $ch_id Channel ID of mapping. NULL to include all. * @param $luid LUID of mapping. NULL to include all. * @param $guid GUID of mapping. NULL to include all. * @param $flag Flag of mapping. Optional. Defaults to 0. */ - function insert_mapping($channel_id, $luid, $guid, $flag = 0) + function insert_mapping($ch_id, $luid, $guid, $flag = 0) { $GLOBALS['phpgw']->db->query(sprintf(" INSERT INTO phpgw_syncml_mappings( channel_id, luid, guid, dirty) VALUES('%d', '%s', '%s', '%d')", - $channel_id, $luid, $guid, $flag), + $ch_id, $luid, $guid, $flag), __LINE__, __FILE__); } /** - * Updates a mapping. + * Update a mapping. * - * @param $channel_id Channel ID of mapping. NULL to include all. + * @param $ch_id Channel ID of mapping. NULL to include all. * @param $luid LUID of mapping. NULL to include all. * @param $guid GUID of mapping. NULL to include all. * @return int Number of mappings updated. @@ -161,6 +141,6 @@ '1 = 1', __LINE__, __FILE__); - // return $GLOBALS['phpgw']->db->affected_rows(); + return $GLOBALS['phpgw']->db->affected_rows(); } } Index: inc/class.sosession.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.sosession.inc.php,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- inc/class.sosession.inc.php 30 Jul 2007 21:07:50 -0000 1.2 +++ inc/class.sosession.inc.php 5 Aug 2007 17:15:40 -0000 1.3 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.sosession.inc.php,v 1.2 2007/07/30 21:07:50 johang Exp $ + * @version $Id: class.sosession.inc.php,v 1.3 2007/08/05 17:15:40 johang Exp $ */ /** @@ -21,7 +21,7 @@ function clean_session_mappings() { $GLOBALS['phpgw']->db->query(sprintf(' - DELETE FROM phpgw_syncml_session + DELETE FROM phpgw_syncml_sessions WHERE session_dla < %d', time() - 10), @@ -57,7 +57,7 @@ $this->clean_session_mappings(); $GLOBALS['phpgw']->db->query(sprintf(' - UPDATE phpgw_syncml_session + UPDATE phpgw_syncml_sessions SET session_dla = %d WHERE syncml_hash = \'%s\'', time(), $syncml_hash), @@ -65,7 +65,7 @@ $GLOBALS['phpgw']->db->query(sprintf(" SELECT phpgw_sid - FROM phpgw_syncml_session + FROM phpgw_syncml_sessions WHERE syncml_hash = '%s'", $GLOBALS["phpgw"]->db->db_addslashes($syncml_hash)), @@ -95,7 +95,7 @@ $syncml_hash = $this->generate_session_hash($header); $GLOBALS['phpgw']->db->query(sprintf(" - DELETE FROM phpgw_syncml_session + DELETE FROM phpgw_syncml_sessions WHERE syncml_hash = '%s'", $GLOBALS["phpgw"]->db->db_addslashes($syncml_hash)), @@ -114,14 +114,14 @@ $syncml_hash = $this->generate_session_hash($header); $GLOBALS['phpgw']->db->query(sprintf(" - DELETE FROM phpgw_syncml_session + DELETE FROM phpgw_syncml_sessions WHERE syncml_hash = '%s'", $GLOBALS["phpgw"]->db->db_addslashes($syncml_hash)), __LINE__, __FILE__); $GLOBALS['phpgw']->db->query(sprintf(" - INSERT INTO phpgw_syncml_session( + INSERT INTO phpgw_syncml_sessions( syncml_hash, phpgw_sid, session_dla) VALUES('%s', '%s', '%d')", $GLOBALS["phpgw"]->db->db_addslashes($syncml_hash), Index: inc/class.syncml_auth_md5.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_auth_md5.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_auth_md5.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_auth_md5.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_auth_md5.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_auth_md5.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ /** @@ -37,7 +37,7 @@ SELECT a.account_pwd, a.account_lid - FROM phpgw_syncml_hash h + FROM phpgw_syncml_hashes h JOIN phpgw_accounts a ON a.account_id = h.account_id WHERE Index: inc/class.syncml_command_add.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_command_add.inc.php,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- inc/class.syncml_command_add.inc.php 30 Jul 2007 21:07:50 -0000 1.2 +++ inc/class.syncml_command_add.inc.php 5 Aug 2007 17:15:40 -0000 1.3 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_command_add.inc.php,v 1.2 2007/07/30 21:07:50 johang Exp $ + * @version $Id: class.syncml_command_add.inc.php,v 1.3 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/constants.inc.php'; @@ -74,13 +74,16 @@ $data = $session->get_var(SYNCML_ITEMBUFFER); $type = $session->get_var(SYNCML_ITEMTYPE); - $code = $database->add_item( + list($code, $guid) = $database->add_item( $item['source']['locuri'], $data, $type); $session->save_modified_luid( $database->channel_id, $item['source']['locuri']); + $session->save_modified_guid( + $database->channel_id, $guid); + // reset all chunking stuff when we're done $this->reset_chunking($session); } Index: inc/class.syncml_command_alert.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_command_alert.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_command_alert.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_command_alert.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_command_alert.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_command_alert.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/class.sochannel.inc.php'; @@ -107,6 +107,10 @@ $database_id, $session->get_var('device_uri')); } + $database = new syncml_database($channel_id); + $database->merge_changes(); + unset($database); + // todo: make iso 8601 instead. $phpgw_next = time(); Index: inc/class.syncml_command_delete.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_command_delete.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_command_delete.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_command_delete.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_command_delete.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_command_delete.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/class.syncml_command.inc.php'; @@ -40,7 +40,9 @@ { foreach($this->item as $item) { - if($database->delete_item($item['source']['locuri'])) + $h = $database->delete_item($item['source']['locuri']); + + if($h[0]) { $response->add_status( $this->cmdid, $session->msgid, 'Delete', Index: inc/class.syncml_command_map.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_command_map.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_command_map.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_command_map.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_command_map.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_command_map.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/class.syncml_command.inc.php'; @@ -46,10 +46,13 @@ foreach($this->mapitem as $item) { - $somappings->replace_mapping( + $somappings->delete_mapping( $open_channel['channel_id'], - $item['source']['locuri'], - $item['target']['locuri']); + NULL, $item['target']['locuri'], NULL); + + $somappings->insert_mapping( + $open_channel['channel_id'], + $item['source']['locuri'], $item['target']['locuri'], 0); } if(isset($this->noresp) && $this->noresp) Index: inc/class.syncml_command_replace.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_command_replace.inc.php,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- inc/class.syncml_command_replace.inc.php 30 Jul 2007 21:07:50 -0000 1.2 +++ inc/class.syncml_command_replace.inc.php 5 Aug 2007 17:15:40 -0000 1.3 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_command_replace.inc.php,v 1.2 2007/07/30 21:07:50 johang Exp $ + * @version $Id: class.syncml_command_replace.inc.php,v 1.3 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/constants.inc.php'; @@ -74,13 +74,16 @@ $data = $session->get_var(SYNCML_ITEMBUFFER); $type = $session->get_var(SYNCML_ITEMTYPE); - $code = $database->replace_item( + list($code, $guid) = $database->replace_item( $item['source']['locuri'], $data, $type); $session->save_modified_luid( $database->channel_id, $item['source']['locuri']); + $session->save_modified_guid( + $database->channel_id, $guid); + // reset all chunking stuff when we're done $this->reset_chunking($session); } Index: inc/class.syncml_command_status.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_command_status.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_command_status.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_command_status.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_command_status.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_command_status.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/class.syncml_command.inc.php'; @@ -48,7 +48,7 @@ switch($this->data) { case SYNCML_STATUS_OK: - // insert a temp mapping so we don't sent this item + // insert a temp mapping so we don't send this item // again if client caches the MAP commands $somappings->insert_mapping( $channel_id, NULL, $this->sourceref, 0); Index: inc/class.syncml_database.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_database.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_database.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_database.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,11 +7,13 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_database.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_database.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/class.somappings.inc.php'; + require_once 'inc/class.sochannel.inc.php'; + /** * Represents a SyncML database. This class wraps calls to the IPC classes * in each source/app. @@ -81,8 +83,8 @@ s.mimeversion as mineversion FROM phpgw_syncml_sources s, - phpgw_syncml_channel c, - phpgw_syncml_database d + phpgw_syncml_channels c, + phpgw_syncml_databases d WHERE c.channel_id = %d AND c.database_id = d.database_id AND @@ -120,6 +122,35 @@ } /** + * Merge information about changes from phpgw to the mappings table. + * + * @param $except_list Array of GUIDs not to merge. + * @return int Number of changes merged. + */ + function merge_changes($except_list = array()) + { + if(!$this->ipc) + { + return 0; + } + + $sochannel = new syncml_sochannel(); + + list(, , , $last_merge) = $sochannel->get_channel($this->channel_id); + + $changed_guids = array_diff( + $this->ipc->getIdList($last_merge), $except_list); + + foreach($changed_guids as $guid) + { + $this->somappings->update_mapping( + $this->channel_id, NULL, $guid, 1); + } + + $sochannel->update_last_merge($this->channel_id); + } + + /** * Get item from database. * * @param string GUID of item to get. @@ -141,13 +172,16 @@ */ function add_item($luid, $data, $type, $override = FALSE) { - switch($this->replace_item($luid, $data, $type, $override)) + $h = $this->replace_item($luid, $data, $type, $override); + + switch($h[0]) { case SYNCML_STATUS_OK: case SYNCML_STATUS_ITEMADDED: - return SYNCML_STATUS_ITEMADDED; + return array(SYNCML_STATUS_ITEMADDED, $h[1]); case SYNCML_STATUS_CONFLICTRESOLVEDWITHDUPLICATE: - return SYNCML_STATUS_CONFLICTRESOLVEDWITHDUPLICATE; + return array( + SYNCML_STATUS_CONFLICTRESOLVEDWITHDUPLICATE, $h[1]); } } @@ -182,9 +216,6 @@ if($dirty) { - // conflict. solve by duplication. - - // add this new item. $new_guid = $this->ipc->adddata($data, $type); // we want to add the old item to our client, by @@ -196,29 +227,26 @@ $this->somappings->insert_mapping( $this->channel_id, $luid, $new_guid, 0); - return SYNCML_STATUS_CONFLICTRESOLVEDWITHDUPLICATE; + return array(SYNCML_STATUS_CONFLICTRESOLVEDWITHDUPLICATE, + $guid); } else if($guid) { - // regular REPLACE - $this->ipc->replacedata($guid, $data, $type); $this->somappings->update_mapping( - $this->channel_id, $guid, NULL, 1); + $this->channel_id, $guid, NULL, 0); - return SYNCML_STATUS_OK; + return array(SYNCML_STATUS_OK, $guid); } else { - // this REPLACE behaves like ADD - $guid = $this->ipc->adddata($data, $type); $this->somappings->insert_mapping( $this->channel_id, $luid, $guid, 0); - return SYNCML_STATUS_ITEMADDED; + return array(SYNCML_STATUS_ITEMADDED, $guid); } } @@ -246,10 +274,10 @@ $this->somappings->delete_mapping( $this->channel_id, $luid, NULL, NULL); - return $deletes > 0; + return array($deletes > 0, $guid); } - return FALSE; + return array(0, NULL); } /** @@ -266,8 +294,6 @@ $mappings = $this->somappings->get_mapping( $this->channel_id, NULL, NULL, NULL); - // replace luid-guid-dirty array with guid only - $mapped_guids = array(); foreach($mappings as $m) @@ -471,17 +497,15 @@ * @param $data Data to chunk. * @param $session Session object. * @param $maxchunksize Max size of this chunk. - * @return string A chunk of data. + * @return array The chunk of data (string), weather this is + * first chunk (bool), weather this is last + * chunk (bool). */ function get_chunk($data, &$session, $maxchunksize) { if(!$session->get_var(SYNCML_SUPPORTLARGEOBJS)) { - return array( - $data, - true, - true - ); + return array($data, true, true); } // offset is start of this chunk @@ -497,16 +521,14 @@ { return array( substr($data, $offset, $maxchunksize), - $offset == 0, - $next_offset == 0 + $offset == 0, $next_offset == 0 ); } else { return array( substr($data, $offset), - $offset == 0, - $next_offset == 0 + $offset == 0, $next_offset == 0 ); } } Index: inc/class.syncml_message.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_message.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_message.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_message.inc.php 5 Aug 2007 17:15:40 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_message.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_message.inc.php,v 1.2 2007/08/05 17:15:40 johang Exp $ */ require_once 'inc/class.syncml_command_final.inc.php'; @@ -29,6 +29,11 @@ $this->commands[] = new syncml_command_synchdr($header); } + /** + * Build and save command objects from XML array. + * + * @param $body XML array of BODY element. + */ function process_body($body) { if(isset($body['FINAL'][0])) @@ -60,9 +65,8 @@ } } - function execute() + function execute($response) { - $response = new syncml_response(); $session = new syncml_session(); // process every command in message @@ -83,12 +87,28 @@ 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. + */ + // LUIDs modified by the *client* during this session $all_modified_luids = $session->get_all_modified_luids( $open_channel['channel_id']); + // GUIDs modified by the *client* during this session + $all_modified_guids = $session->get_all_modified_guids( + $open_channel['channel_id']); + + // Bring all changed items from phpgw + $database->merge_changes($all_modified_guids); + switch($open_channel['type']) { case SYNCML_ALERT_SLOWSYNC: @@ -114,7 +134,7 @@ if(!$open_channel['all_server_modifications_sent']) { $more_to_send = $this->_send_modifications( - $response, $session, $open_channel); + $response, $session, $open_channel, $database); $session->set_open_channel_property( $open_channel['source'], $open_channel['target'], @@ -122,6 +142,9 @@ if($more_to_send) { + // there's more to send from this channel. we + // continue with that in next message. + $response->set_final(FALSE); break; } @@ -163,10 +186,9 @@ * @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) { - $database = new syncml_database($open_channel['channel_id']); - switch($open_channel['type']) { case SYNCML_ALERT_SLOWSYNC: @@ -188,7 +210,12 @@ } /** - * Do some work before we can finish the slow sync. + * Remove mappings for items not touched by the client so they can + * be sent like regular ADDs during next phase of the session. + * + * @param $channel_id ID of channel to prepare the slow + * sync for. + * @param $all_client_modified_luids All LUIDs client modified. */ function prepare_slowsync($channel_id, $all_client_modified_luids) { @@ -202,11 +229,19 @@ // remove mappings not modified by client foreach($luids_to_kill as $luid) { - $somappings->delete_mapping( - $channel_id, $luid, NULL, NULL); + $somappings->delete_mapping($channel_id, $luid, NULL, NULL); } } + /** + * Remove items not touched by the client. + * + * @param $channel_id ID of channel to prepare the slow + * sync for. + * @param $all_client_modified_luids All LUIDs client modified. + * @param $database Database involved in this + * session. + */ function finish_client_refresh($channel_id, $all_client_modified_luids, $database) { @@ -223,6 +258,14 @@ } } + /** + * 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) { $commands = array(); Index: inc/class.syncml_session.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/class.syncml_session.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/class.syncml_session.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/class.syncml_session.inc.php 5 Aug 2007 17:15:41 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: class.syncml_session.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: class.syncml_session.inc.php,v 1.2 2007/08/05 17:15:41 johang Exp $ */ require_once 'inc/constants.inc.php'; @@ -131,6 +131,26 @@ return $this->session_data['modified_luids'][$channel_id]; } + function save_modified_guid($channel_id, $guid) + { + if(!isset($this->session_data['modified_guids'])) + { + $this->session_data['modified_guids'] = array(); + } + + $this->session_data['modified_guids'][$channel_id][] = $guid; + } + + function get_all_modified_guids($channel_id) + { + if(!isset($this->session_data['modified_guids'][$channel_id])) + { + return array(); + } + + return $this->session_data['modified_guids'][$channel_id]; + } + /** * Returns array with open channels and their channel ID, sync type, * source database and target database. Index: inc/functions.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/inc/functions.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- inc/functions.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ inc/functions.inc.php 5 Aug 2007 17:15:41 -0000 1.2 @@ -7,7 +7,7 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License 3 or later * @package syncml - * @version $Id: functions.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ + * @version $Id: functions.inc.php,v 1.2 2007/08/05 17:15:41 johang Exp $ */ /** @@ -20,14 +20,14 @@ function syncml_update_hash($account_id, $account_lid, $password) { $GLOBALS["phpgw"]->db->query(sprintf(" - DELETE FROM phpgw_syncml_hash + DELETE FROM phpgw_syncml_hashes WHERE account_id = '%d'", $account_id )); $GLOBALS["phpgw"]->db->query(sprintf(" - INSERT INTO phpgw_syncml_hash( + INSERT INTO phpgw_syncml_hashes( account_id, hash) VALUES('%d', '%s')", $account_id, @@ -49,4 +49,20 @@ base64_encode(md5($username . ':' . $password, true)). ':' . $nonce )); } + + /** + * Parse the XML definition and look for encoding attribute. + * + * @param $data XML string. + * @return string Found encoding or NULL of no encoding found. + */ + function syncml_parse_encoding($data) + { + if(preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $data, $m)) + { + return strtoupper($m[1]); + } + + return NULL; + } ?> Index: setup/setup.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/setup/setup.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- setup/setup.inc.php 30 Jul 2007 13:04:38 -0000 1.1.1.1 +++ setup/setup.inc.php 5 Aug 2007 17:15:41 -0000 1.2 @@ -7,12 +7,12 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License * @package syncml - * @version $Id: setup.inc.php,v 1.1.1.1 2007/07/30 13:04:38 johang Exp $ + * @version $Id: setup.inc.php,v 1.2 2007/08/05 17:15:41 johang Exp $ */ $setup_info['syncml']['name'] = 'syncml'; $setup_info['syncml']['title'] = 'SyncML Synchronization'; - $setup_info['syncml']['version'] = '0.9.17.001'; + $setup_info['syncml']['version'] = '0.9.17.002'; $setup_info['syncml']['license'] = 'GNU General Public License'; $setup_info['syncml']['app_order'] = 10; @@ -20,12 +20,12 @@ $setup_info['syncml']['tables'] = array ( - 'phpgw_syncml_session', - 'phpgw_syncml_hash', + 'phpgw_syncml_sessions', + 'phpgw_syncml_hashes', 'phpgw_syncml_sources', 'phpgw_syncml_mappings', - 'phpgw_syncml_channel', - 'phpgw_syncml_database' + 'phpgw_syncml_channels', + 'phpgw_syncml_databases' ); $setup_info['syncml']['hooks'] = array Index: setup/tables_current.inc.php =================================================================== RCS file: /sources/phpgroupware/syncml/setup/tables_current.inc.php,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -b -r1.1.1.1 -r1.2 --- setup/tables_current.inc.php 30 Jul 2007 13:04:38 -0000 1.1.1.1 +++ setup/tables_current.inc.php 5 Aug 2007 17:15:41 -0000 1.2 @@ -7,16 +7,14 @@ * @copyright Copyright (c) 2007 Free Software Foundation, Inc. * @license GNU General Public License * @package syncml - * @version $Id: tables_current.inc.php,v 1.1.1.1 2007/07/30 13:04:38 johang Exp $ + * @version $Id: tables_current.inc.php,v 1.2 2007/08/05 17:15:41 johang Exp $ */ - // todo: table names should be plural. - $phpgw_baseline = array( /** - * syncml session <-> phpgw sessions. + * Maps SyncML sessions to phpgw sessions. */ - 'phpgw_syncml_session' => array( + 'phpgw_syncml_sessions' => array( 'fd' => array( 'phpgw_sid' => array( 'type' => 'varchar', 'precision' => '32', @@ -37,7 +35,7 @@ * Just a way to keep precalculated hashes of users' names and * passwords. */ - 'phpgw_syncml_hash' => array( + 'phpgw_syncml_hashes' => array( 'fd' => array( 'account_id' => array( 'type' => 'int', 'precision' => 4), @@ -51,9 +49,9 @@ 'uc' => array() ), /** - * Every device has one channel to each database to sync. + * Every device has one channel to each database. */ - 'phpgw_syncml_channel' => array( + 'phpgw_syncml_channels' => array( 'fd' => array( 'channel_id' => array( 'type' => 'auto', 'nullable' => False), @@ -67,7 +65,9 @@ 'device_anchor_last' => array( 'type' => 'varchar', 'precision' => '16'), 'devinf_cache' => array( - 'type' => 'text', 'default' => '') + 'type' => 'text', 'default' => ''), + 'last_merge' => array( + 'type' => 'int', 'precision' => '8', 'nullable' => False) ), 'pk' => array('channel_id'), 'fk' => array(), @@ -75,11 +75,9 @@ 'uc' => array() ), /** - * Each user has databases that are synchable. - * - * database_uri + account_id is unique. + * Each user has synchable databases. */ - 'phpgw_syncml_database' => array( + 'phpgw_syncml_databases' => array( 'fd' => array( 'database_id' => array( 'type' => 'auto', 'nullable' => False), @@ -104,7 +102,7 @@ 'uc' => array() ), /** - * meh + * Maps ID numbers on client devices to ID numbers in phpgw. */ 'phpgw_syncml_mappings' => array( 'fd' => array( @@ -129,7 +127,7 @@ 'uc' => array() ), /** - * meh + * Data sources that databases can use. */ 'phpgw_syncml_sources' => array( 'fd' => array( Index: inc/class.syncml_xml_parser.inc.php =================================================================== RCS file: inc/class.syncml_xml_parser.inc.php diff -N inc/class.syncml_xml_parser.inc.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ inc/class.syncml_xml_parser.inc.php 5 Aug 2007 17:15:41 -0000 1.1 @@ -0,0 +1,44 @@ +<?php + /** + * phpGroupWare (http://phpgroupware.org/) + * SyncML interface + * + * @author Johan Gunnarsson <[EMAIL PROTECTED]> + * @copyright Copyright (c) 2007 Free Software Foundation, Inc. + * @license GNU General Public License + * @package syncml + * @version $ $ + */ + + require_once 'inc/functions.inc.php'; + + class syncml_xml_parser + { + function parse($data, $mapper) + { + $encoding = syncml_parse_encoding($data); + + if($encoding) + { + $parser = xml_parser_create($encoding); + } + else + { + $parser = xml_parser_create(); + } + + xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 1); + + xml_set_object($parser, $mapper); + + xml_set_element_handler($parser, 'start_tag', 'end_tag'); + xml_set_character_data_handler($parser, 'data'); + + xml_parse($parser, $data); + xml_parser_free($parser); + + return $mapper->structure; + } + } +?> Index: setup/tables_baseline.inc.php =================================================================== RCS file: setup/tables_baseline.inc.php diff -N setup/tables_baseline.inc.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ setup/tables_baseline.inc.php 5 Aug 2007 17:15:41 -0000 1.1 @@ -0,0 +1,134 @@ +<?php + /** + * phpGroupWare (http://phpgroupware.org/) + * SyncML interface + * + * @author Johan Gunnarsson <[EMAIL PROTECTED]> + * @copyright Copyright (c) 2007 Free Software Foundation, Inc. + * @license GNU General Public License + * @package syncml + * @version $Id: tables_baseline.inc.php,v 1.1 2007/08/05 17:15:41 johang Exp $ + */ + + $phpgw_baseline = array( + 'phpgw_syncml_session' => array( + 'fd' => array( + 'phpgw_sid' => array( + 'type' => 'varchar', 'precision' => '32', + 'nullable' => False), + 'syncml_hash' => array( + 'type' => 'varchar', 'precision' => '32', + 'nullable' => False), + 'session_dla' => array( + 'type' => 'int', 'precision' => '8', + 'nullable' => False) + ), + 'pk' => array('syncml_hash'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ), + 'phpgw_syncml_hash' => array( + 'fd' => array( + 'account_id' => array( + 'type' => 'int', 'precision' => 4), + 'hash' => array( + 'type' => 'varchar', 'precision' => 32, + 'nullable' => False) + ), + 'pk' => array('account_id'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ), + 'phpgw_syncml_channel' => array( + 'fd' => array( + 'channel_id' => array( + 'type' => 'auto', 'nullable' => False), + 'device_uri' => array( + 'type' => 'varchar', 'precision' => '255', + 'nullable' => False), + 'database_id' => array( + 'type' => 'int', 'precision' => '4', 'nullable' => False), + 'phpgw_anchor_last' => array( + 'type' => 'varchar', 'precision' => '16'), + 'device_anchor_last' => array( + 'type' => 'varchar', 'precision' => '16'), + 'devinf_cache' => array( + 'type' => 'text', 'default' => '') + ), + 'pk' => array('channel_id'), + 'fk' => array(), + 'ix' => array('device_uri', 'database_id'), + 'uc' => array() + ), + 'phpgw_syncml_database' => array( + 'fd' => array( + 'database_id' => array( + 'type' => 'auto', 'nullable' => False), + 'database_uri' => array( + 'type' => 'varchar', 'precision' => '255', + 'nullable' => False), + 'source_id' => array( + 'type' => 'int', 'precision' => '4', + 'nullable' => False), + 'credential_required' => array( + 'type' => 'int', 'precision' => '2', + 'nullable' => False), + 'credential_hash' => array( + 'type' => 'varchar', 'precision' => '32', + 'nullable' => False), + 'account_id' => array( + 'type' => 'int', 'precision' => '4', 'nullable' => False) + ), + 'pk' => array('database_id'), + 'fk' => array(), + 'ix' => array('database_uri'), + 'uc' => array() + ), + 'phpgw_syncml_mappings' => array( + 'fd' => array( + 'mapping_id' => array( + 'type' => 'auto', 'nullable' => False), + 'channel_id' => array( + 'type' => 'int', 'precision' => '4', + 'nullable' => False), + 'luid' => array( + 'type' => 'varchar', 'precision' => '255', + 'nullable' => True), + 'guid' => array( + 'type' => 'varchar', 'precision' => '255', + 'nullable' => True), + 'dirty' => array( + 'type' => 'int', 'precision' => '2', + 'nullable' => False) + ), + 'pk' => array('mapping_id'), + 'fk' => array(), + 'ix' => array('channel_id'), + 'uc' => array() + ), + 'phpgw_syncml_sources' => array( + 'fd' => array( + 'source_id' => array( + 'type' => 'auto', 'nullable' => False), + 'name' => array( + 'type' => 'varchar', 'precision' => '50', + 'nullable' => False), + 'modulename' => array( + 'type' => 'varchar', 'precision' => '25', + 'nullable' => False), + 'mimetype' => array( + 'type' => 'varchar', 'precision' => '255', + 'nullable' => False), + 'mimeversion' => array( + 'type' => 'varchar', 'precision' => '8', + 'nullable' => False) + ), + 'pk' => array('source_id'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ), + ); +?> Index: setup/tables_update.php =================================================================== RCS file: setup/tables_update.php diff -N setup/tables_update.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ setup/tables_update.php 5 Aug 2007 17:15:41 -0000 1.1 @@ -0,0 +1,41 @@ +<?php + /** + * phpGroupWare (http://phpgroupware.org/) + * SyncML interface + * + * @author Johan Gunnarsson <[EMAIL PROTECTED]> + * @copyright Copyright (c) 2007 Free Software Foundation, Inc. + * @license GNU General Public License + * @package syncml + * @version $ $ + */ + + $test[] = '0.9.17.001'; + + function notes_upgrade0.9.17.001() + { + $GLOBALS['phpgw_setup']->oProc->RenameTable( + 'phpgw_syncml_channel', 'phpgw_syncml_channels' + ); + + $GLOBALS['phpgw_setup']->oProc->RenameTable( + 'phpgw_syncml_database', 'phpgw_syncml_databases' + ); + + $GLOBALS['phpgw_setup']->oProc->RenameTable( + 'phpgw_syncml_hash', 'phpgw_syncml_hashes' + ); + + $GLOBALS['phpgw_setup']->oProc->RenameTable( + 'phpgw_syncml_session', 'phpgw_syncml_sessions' + ); + + $GLOBALS['phpgw_setup']->oProc->AddColumn( + 'phpgw_syncml_channels', 'last_merge', array( + 'type' => 'int', 'precision' => 8, 'nullable' => False) + ); + + $GLOBALS['setup_info']['syncml']['currentver'] = '0.9.17.002'; + return $GLOBALS['setup_info']['syncml']['currentver']; + } +?> Index: inc/xml_functions.inc.php =================================================================== RCS file: inc/xml_functions.inc.php diff -N inc/xml_functions.inc.php --- inc/xml_functions.inc.php 30 Jul 2007 13:04:39 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,51 +0,0 @@ -<?php - /** - * phpGroupWare (http://phpgroupware.org/) - * SyncML interface - * - * @author Johan Gunnarsson <[EMAIL PROTECTED]> - * @copyright Copyright (c) 2007 Free Software Foundation, Inc. - * @license GNU General Public License - * @package syncml - * @version $Id: xml_functions.inc.php,v 1.1.1.1 2007/07/30 13:04:39 johang Exp $ - */ - - function parse_encoding($data) - { - if(preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $data, $m)) - { - return strtoupper($m[1]); - } - return NULL; - } - - function parse_xml($data, $mapper = null) - { - if(!is_null($encoding = parse_encoding($data))) - { - $parser = xml_parser_create($encoding); - } - else - { - $parser = xml_parser_create(); - } - - if(is_null($mapper)) - { - $mapper = new xml_mapper(); - } - - xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 1); - - xml_set_object($parser, $mapper); - - xml_set_element_handler($parser, 'start_tag', 'end_tag'); - xml_set_character_data_handler($parser, 'data'); - - xml_parse($parser, $data); - xml_parser_free($parser); - - return $mapper->structure; - } -?> _______________________________________________ phpGroupWare-cvs mailing list phpGroupWare-cvs@gnu.org http://lists.gnu.org/mailman/listinfo/phpgroupware-cvs