Revision: 19041 http://svn.sv.gnu.org/viewvc/?view=rev&root=phpgroupware&revision=19041 Author: johang Date: 2009-01-21 23:22:34 +0000 (Wed, 21 Jan 2009)
Log Message: ----------- A bunch of changes. Add source_id to mappings for example. Modified Paths: -------------- modules/syncml/trunk/inc/class.somappings.inc.php modules/syncml/trunk/inc/class.syncml_database.inc.php modules/syncml/trunk/inc/class.syncml_message.inc.php modules/syncml/trunk/inc/class.syncml_response.inc.php modules/syncml/trunk/syncml.php Modified: modules/syncml/trunk/inc/class.somappings.inc.php =================================================================== --- modules/syncml/trunk/inc/class.somappings.inc.php 2009-01-21 23:20:52 UTC (rev 19040) +++ modules/syncml/trunk/inc/class.somappings.inc.php 2009-01-21 23:22:34 UTC (rev 19041) @@ -24,7 +24,7 @@ * @param $flag Flag of mapping. NULL to include all. * @return array Multidimensional array of mappings matched. */ - function get_mapping($source_id, $ch_id, $luid, $guid, $flag) + function get_mapping($ch_id, $luid, $guid, $flag) { $GLOBALS['phpgw']->db->query(' SELECT * @@ -65,7 +65,7 @@ */ function get_all_mapped_luids($ch_id) { - $mappings = $this->get_mapping(NULL, $ch_id, NULL, NULL, NULL); + $mappings = $this->get_mapping($ch_id, NULL, NULL, NULL); $all_mapped_luids = array(); @@ -86,7 +86,7 @@ * @param $flag Flag of mapping. NULL to include all. * @return int Number of mappings deleted. */ - function delete_mapping($source_id, $ch_id, $luid, $guid, $flag) + function delete_mapping($ch_id, $luid, $guid, $flag) { $GLOBALS['phpgw']->db->query(' DELETE FROM phpgw_syncml_mappings @@ -110,7 +110,7 @@ * @param $guid GUID of mapping. NULL to include all. * @param $flag Flag of mapping. Optional. Defaults to 0. */ - function insert_mapping($source_id, $ch_id, $luid, $guid, $flag = 0) + function insert_mapping($ch_id, $luid, $guid, $flag = 0) { $GLOBALS['phpgw']->db->query(sprintf(" INSERT INTO phpgw_syncml_mappings( @@ -129,7 +129,7 @@ * @param $flag New value of flag. * @return int Number of mappings updated. */ - function update_mapping($source_id, $ch_id, $luid, $guid, $flag) + function update_mapping($ch_id, $luid, $guid, $flag) { $query = 'UPDATE phpgw_syncml_mappings ' . @@ -149,4 +149,28 @@ return $GLOBALS['phpgw']->db->affected_rows(); } + + /** + * + */ + function remap($channel_id, $guid, $new_guid) + { + $query = sprintf(" + update + syncml_mappings m, + syncml_channels c1, + syncml_channels c2 + set + m.guid = '%s' + where + c1.channel_id = %d and + c2.source_id = c1.source_id and + m.channel_id = c2.channel_id and + m.guid = '%s'", + $new_guid, $channel_id, $new_guid); + + $GLOBALS['phpgw']->db->query($query, __LINE__, __FILE__); + + return $GLOBALS['phpgw']->db->affected_rows(); + } } Modified: modules/syncml/trunk/inc/class.syncml_database.inc.php =================================================================== --- modules/syncml/trunk/inc/class.syncml_database.inc.php 2009-01-21 23:20:52 UTC (rev 19040) +++ modules/syncml/trunk/inc/class.syncml_database.inc.php 2009-01-21 23:22:34 UTC (rev 19041) @@ -62,8 +62,8 @@ $ipc_manager = CreateObject('phpgwapi.ipc_manager'); $this->somappings = new syncml_somappings(); - list($module, $this->mime_type, $this->mime_version) = - $this->get_source_data($channel_id); + list($this->source_id, $module, $this->mime_type, + $this->mime_version) = $this->get_source_data($channel_id); $this->ipc = $ipc_manager->getipc($module); } @@ -78,6 +78,7 @@ { $GLOBALS['phpgw']->db->query(sprintf(' SELECT + s.source_id as source_id, s.modulename as modulename, s.mimetype as mimetype, s.mimeversion as mineversion @@ -95,6 +96,7 @@ $GLOBALS['phpgw']->db->next_record(); return array( + $GLOBALS['phpgw']->db->f('source_id'), $GLOBALS['phpgw']->db->f('modulename'), $GLOBALS['phpgw']->db->f('mimetype'), $GLOBALS['phpgw']->db->f('mimeversion') @@ -175,10 +177,10 @@ * @param string $override Override conflicts or not. * @return int Status code. */ - function add_item($luid, $data, $type, $override = FALSE) + function add_item($luid, $data, $type) { list($status_code, $guid) = - $this->replace_item($luid, $data, $type, $override); + $this->replace_item($luid, $data, $type); switch($status_code) { @@ -200,10 +202,10 @@ * @param $override bool Override any conflict. * @return int 0 if conflict, 1 if replace, 2 if add. */ - function replace_item($luid, $data, $type, $override = FALSE) + function replace_item($luid, $data, $type) { syncml_logger::get_instance()->log(sprintf( - 'Replace item %s (%s)', $luid, $type)); + 'Replace LUID %s (%s)', $luid, $type)); $mappings = $this->somappings->get_mapping( $this->channel_id, $luid, NULL, NULL); @@ -222,7 +224,7 @@ syncml_logger::get_instance()->log_data('GUID is', $guid); syncml_logger::get_instance()->log_data('Dirty is', $dirty); - if(!$override && $dirty) + if($dirty) { syncml_logger::get_instance()->log('Conflict, duplicate it'); @@ -238,18 +240,36 @@ $this->channel_id, $luid, $new_guid, 0); return array(SYNCML_STATUS_CONFLICTRESOLVEDWITHDUPLICATE, - $guid); + $new_guid); } - else if(count($mappings) > 0) + else if($guid) { syncml_logger::get_instance()->log('Replace it'); - $this->ipc->replacedata($guid, $data, $type); + $new_guid = $this->ipc->replacedata($guid, $data, $type); + $code = SYNCML_STATUS_OK; + + if($new_guid != $guid) + { + syncml_logger::get_instance()->log_data( + 'Item was actually added', $new_guid); + + // remap the item + + $this->somappings->remap( + $this->source_id, $guid, $new_guid); + + $code = SYNCML_STATUS_ITEMADDED; + } + $this->somappings->update_mapping( - $this->channel_id, $guid, NULL, 0); + NULL, $new_guid, NULL, 1); - return array(SYNCML_STATUS_OK, $guid); + $this->somappings->update_mapping( + $this->channel_id, $new_guid, NULL, 0); + + return array($code, $new_guid); } else { @@ -278,20 +298,20 @@ if(count($mappings) > 0) { - list(list(,, $guid, $dirty)) = $mappings; + $guid = $mappings[0][2]; + $dirty = $mappings[0][3]; - // here, we don't care about conflicts. delete even if there - // are changes on phpgw side. + // @todo take care of conflicts maybe? - $deletes = $this->ipc->removedata($guid); + $deleted = $this->ipc->removedata($guid); $this->somappings->delete_mapping( $this->channel_id, $luid, NULL, NULL); - return array($deletes > 0, $guid); + return array($deleted, $guid); } - return array(0, NULL); + return array(FALSE, NULL); } /** @@ -409,35 +429,34 @@ * * @return array Array containing the three types of modifications. */ - function get_modifications(&$response, &$session, &$commands, - $maxobjsize, $size_left) + function add_modifications(&$response, &$session, $maxobjsize) { foreach($this->get_added_items() as $guid) { - if($size_left <= 0) + if($response->get_size_left() <= 0) { return TRUE; } - + $data = $this->get_item_by_guid($guid, $this->mime_type); list($chunk, $is_first, $is_last) = $this->get_chunk( - $data, $session, min($maxobjsize, $size_left)); - - $commands[] = $last_command = $response->build_add( + $data, $session, + min($maxobjsize, $response->get_size_left()) + ); + + $response->add_add( array( 'type' => $this->mime_type, - 'size' => $is_first && !$is_last ? - strlen($data) : NULL), + 'size' => $is_first && !$is_last ? strlen($data) : NULL + ), array( 'data' => $chunk, - 'src_uri' => $guid - ), - $is_last + 'src_uri' => $guid, + 'moredata' => !$is_last + ) ); - $size_left -= strlen($last_command); - $session->set_channel_id_from_cmd( $response->get_cmdid(), $this->channel_id); @@ -449,26 +468,24 @@ foreach($this->get_deleted_items() as $luid) { - if($size_left <= 0) + if($response->get_size_left() <= 0) { return TRUE; } - - $commands[] = $last_command = $response->build_delete( + + $response->add_delete( array( 'trg_uri' => $luid ) ); - $size_left -= strlen($last_command); - $session->set_channel_id_from_cmd( $response->get_cmdid(), $this->channel_id); } foreach($this->get_changed_items() as $replace) { - if($size_left <= 0) + if($response->get_size_left() <= 0) { return TRUE; } @@ -477,22 +494,24 @@ $replace['guid'], $this->mime_type); list($chunk, $is_first, $is_last) = $this->get_chunk( - $data, $session, min($maxobjsize, $size_left)); + $data, $session, + min($maxobjsize, $response->get_size_left()) + ); - $commands[] = $last_command = $response->build_replace( + $response->add_replace( array( 'type' => $this->mime_type, 'size' => $is_first && !$is_last ? - strlen($data) : NULL), + strlen($data) : NULL + ), array( 'data' => $chunk, - 'trg_uri' => $replace['luid'] + 'trg_uri' => $replace['luid'], + 'moredata' => !$is_last ), $is_last ); - $size_left -= strlen($last_command); - $session->set_channel_id_from_cmd( $response->get_cmdid(), $this->channel_id); Modified: modules/syncml/trunk/inc/class.syncml_message.inc.php =================================================================== --- modules/syncml/trunk/inc/class.syncml_message.inc.php 2009-01-21 23:20:52 UTC (rev 19040) +++ modules/syncml/trunk/inc/class.syncml_message.inc.php 2009-01-21 23:22:34 UTC (rev 19041) @@ -69,11 +69,32 @@ { $session = new syncml_session(); - // process every command in message + // execute header - for($i = 0, $c = count($this->commands); $i < $c; $i++) + $this->commands[0]->execute($response, $session); + + // execute every command in message + + $response->enc->header(sprintf( + '-//SYNCML//DTD SyncML %s//EN', $response->header_verdtd)); + + $response->encode_start('SyncML', + 'SYNCML:SYNCML' . $response->header_verdtd); + + syncml_logger::get_instance()->log_data('Outgoing VerDTD', + 'SYNCML:SYNCML' . $response->header_verdtd); + + $response->encode_header(); + + $response->encode_start('SyncBody'); + $response->encode_pendning_status_commands(); + + for($i = 1, $c = count($this->commands); $i < $c; $i++) { + syncml_logger::get_instance()->log_data('Command', $i); + $this->commands[$i]->execute($response, $session); + } // output modifications in form of SYNC commands, but only when @@ -85,6 +106,9 @@ $session->get_open_channels(), $session, $response); } + syncml_logger::get_instance()->log_data('Command', + $session->get_open_channels()); + // do we have to send a ALERT for more messages? if($response->status_commands_only() && !$response->is_final()) @@ -92,6 +116,18 @@ $response->add_alert(SYNCML_ALERT_NEXTMESSAGE, array()); } + // close response + + if($response->is_final()) + { + $response->encode_start('Final'); + $response->encode_end(); + } + + $response->encode_end(); // SyncBody + + $response->encode_end(); // SyncML + // save the anchors if this is last message in session if($response->status_commands_only()) @@ -123,8 +159,10 @@ 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); + + if($more_to_send) { // there is more to send, continue with that in next // message. @@ -132,12 +170,10 @@ $response->set_final(FALSE); return; } - else - { - $session->set_open_channel_property( - $open_channel['source'], $open_channel['target'], - 'all_server_modifications_sent', TRUE); - } + + $session->set_open_channel_property( + $open_channel['source'], $open_channel['target'], + 'all_server_modifications_sent', TRUE); } } } @@ -232,6 +268,9 @@ // remove mappings not modified by client foreach($luids_to_kill as $luid) { + syncml_logger::get_instance()->log( + "Remove mapping for LUID $luid and channel $channel_id"); + $somappings->delete_mapping($channel_id, $luid, NULL, NULL); } } @@ -283,20 +322,17 @@ */ function add_sync(&$response, &$session, $database, $open_channel) { - $commands = array(); - - // get server modification - $more_to_send = $database->get_modifications( - $response, $session, $commands, $open_channel['maxobjsize'], - $response->get_size_left()); - - // send modifications, which means all items. - $response->add_sync( + $response->add_sync_start( $open_channel['source'], $open_channel['target'], - $commands, $session->get_var(SYNCML_SUPPORTNUMBEROFCHANGES), + $session->get_var(SYNCML_SUPPORTNUMBEROFCHANGES), $open_channel['server_modifications_sent'] ? NULL : $database->count_modifications()); + $more_to_send = $database->add_modifications( + $response, $session, $open_channel['maxobjsize']); + + $response->add_sync_end(); + return $more_to_send; } } Modified: modules/syncml/trunk/inc/class.syncml_response.inc.php =================================================================== --- modules/syncml/trunk/inc/class.syncml_response.inc.php 2009-01-21 23:20:52 UTC (rev 19040) +++ modules/syncml/trunk/inc/class.syncml_response.inc.php 2009-01-21 23:22:34 UTC (rev 19041) @@ -382,8 +382,10 @@ $this->enc->start('Item'); $this->encode_source_and_target( - $item['src_uri'], $item['src_name'], - $item['trg_uri'], $item['trg_name']); + isset($item['src_uri']) ? $item['src_uri'] : NULL, + isset($item['src_name']) ? $item['src_name'] : NULL, + isset($item['trg_uri']) ? $item['trg_uri'] : NULL, + isset($item['trg_name']) ? $item['trg_name'] : NULL); if(isset($item['meta'])) { Modified: modules/syncml/trunk/syncml.php =================================================================== --- modules/syncml/trunk/syncml.php 2009-01-21 23:20:52 UTC (rev 19040) +++ modules/syncml/trunk/syncml.php 2009-01-21 23:22:34 UTC (rev 19041) @@ -25,7 +25,11 @@ require_once 'inc/class.syncml_logger.inc.php'; - require_once 'inc/class.xml_parser.inc.php'; + require_once 'inc/class.syncml_xml_decoder.inc.php'; + require_once 'inc/class.syncml_xml_encoder.inc.php'; + require_once 'inc/class.syncml_wbxml_decoder.inc.php'; + require_once 'inc/class.syncml_wbxml_encoder.inc.php'; + require_once 'inc/class.xml_offset_mapper.inc.php'; require_once 'inc/class.syncml_response.inc.php'; @@ -36,13 +40,16 @@ // this is a ugly, ugly hack $GLOBALS['phpgw']->db->query('TRUNCATE phpgw_access_log'); - set_error_handler(array(syncml_logger::get_instance(), 'log_error'), E_ALL); + set_error_handler( + array(syncml_logger::get_instance(), 'log_error'), E_ALL); if(!isset($_SERVER['CONTENT_TYPE']) || $_SERVER['REQUEST_METHOD'] != 'POST') { syncml_logger::get_instance()->log_data( - "Unset content type or request method", $_SERVER['REQUEST_METHOD']); + 'Unset content type or invalid request method', + $_SERVER['REQUEST_METHOD']); + exit('I\'m a SyncML server (1)'); } @@ -51,84 +58,55 @@ 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); + $decoder = new syncml_wbxml_decoder(); + $response = new syncml_response(new syncml_wbxml_encoder()); + $type = 'wbxml'; + break; case 'application/vnd.syncml+xml': - $parser = new xml_parser(); - $response = new syncml_response(); + $decoder = new syncml_xml_decoder(); + $response = new syncml_response(new syncml_xml_encoder()); + $type = 'xml'; break; default: exit('I\'m a SyncML server (2)'); } file_put_contents( - sprintf("%s/%s-input.xml", SYNCML_LOG_DIR, $file_date), - $post_input . "\n"); + sprintf('%s/%s-input.%s', SYNCML_LOG_DIR, $file_date, $type), + $post_input); $message = new syncml_message(); - // the header + // process the header - $header = $parser->parse($post_input, + $header = $decoder->parse($post_input, new xml_offset_mapper(array('SYNCML', 'SYNCHDR'))); + $message->process_header($header); unset($header); - // the body + // process the body - $body = $parser->parse($post_input, + $body = $decoder->parse($post_input, new xml_offset_mapper(array('SYNCML', 'SYNCBODY'))); + $message->process_body($body); unset($body, $GLOBALS['HTTP_RAW_POST_DATA']); - // execute and print everything + // execute the message and print the response + ob_start(); + $message->execute($response); + $response->print_response(); file_put_contents( - sprintf("%s/%s-output.xml", SYNCML_LOG_DIR, $file_date), - ob_get_contents() . "\n"); + sprintf("%s/%s-output.%s", SYNCML_LOG_DIR, $file_date, $type), + ob_get_contents()); - if($_SERVER['CONTENT_TYPE'] == 'application/vnd.syncml+wbxml') - { - /* - // remove the xml declaration tag - $xml = substr(ob_get_clean(), 38); - */ - - // replace some bogus FPI values - /* - I don't remember why this hack was needed. It appears to work without - it. - - $wbxml = str_replace( - array( - chr(0x02) . chr(0xA4) . chr(0x01) . chr(0x6A), - chr(0x02) . chr(0xA4) . chr(0x02) . chr(0x6A)), - array( - chr(0x02) . chr(0x9F) . chr(0x51) . chr(0x6A), - 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']); header('Content-Length: ' . ob_get_length()); _______________________________________________ phpGroupWare-cvs mailing list phpGroupWare-cvs@gnu.org http://lists.gnu.org/mailman/listinfo/phpgroupware-cvs