| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | <?php/** * @file * Extends the update parser to work with releases * * The update parser uses version tag to index releases. We will use 'language' and 'tag' * * @todo Parse languages too * * @todo Update the server side and get rid of this */module_load_include('inc', 'l10n_update');/** * Get server information */function l10n_update_get_server($server) {  // Fetch up to date information if available  if (!empty($server['server_url']) && ($fetch = l10n_update_fetch_server($server['server_url']))) {    $server = array_merge($server, $fetch);  }  // If we have an update url this is ok, otherwise we return none  if (!empty($server['update_url'])) {    return $server;  }  else {    return FALSE;  }}/** * Fetch remote server metadata from a server URL * * @param unknown_type $server_url * @return unknown_type */function l10n_update_fetch_server($url) {  $xml = l10n_update_http_request($url);  if (isset($xml->data)) {    $data[] = $xml->data;    $parser = new l10n_update_xml_parser;    return $parser->parse($xml->data);  }  else {    return FALSE;  }}/** * Parser for server metadata */class l10n_update_xml_parser {  var $current_language;  var $current_server;  var $current_languages;  var $servers;  /**   * Parse an XML data file.   *   * It can contain information for one or more l10n_servers   *   * Example data, http://ftp.drupal.org/files/translations/l10n_server.xml   */  function parse($data) {    $parser = xml_parser_create();    xml_set_object($parser, $this);    xml_set_element_handler($parser, 'start', 'end');    xml_set_character_data_handler($parser, "data");    xml_parse($parser, $data);    xml_parser_free($parser);    //return $this->servers;    return $this->current_server;  }  function start($parser, $name, $attr) {    $this->current_tag = $name;    switch ($name) {      case 'L10N_SERVER':        unset($this->current_object);        $this->current_server = array();        $this->current_object = &$this->current_server;        break;      case 'LANGUAGES':        unset($this->current_object);        $this->current_languages = array();        $this->current_object = &$this->current_languages;        //$this->current_object = &$this->current_release;        break;      case 'LANGUAGE':        unset($this->current_object);        $this->current_language = array();        $this->current_object = &$this->current_language;        break;    }  }  function end($parser, $name) {    switch ($name) {      case 'L10N_SERVER':        unset($this->current_object);        $this->servers[$this->current_server['name']] = $this->current_server;        //$this->current_server = array();        break;      case 'LANGUAGE':        unset($this->current_object);        $this->current_languages[$this->current_language['code']] = $this->current_language;        $this->current_language = array();        break;      case 'LANGUAGES':        $this->current_server['languages'] = $this->current_languages;        break;      default:        $this->current_object[strtolower($this->current_tag)] = trim($this->current_object[strtolower($this->current_tag)]);        $this->current_tag = '';    }  }  function data($parser, $data) {    if ($this->current_tag && !in_array($this->current_tag, array('L10N_SERVER', 'LANGUAGES', 'LANGUAGE'))) {      $tag = strtolower($this->current_tag);      if (isset($this->current_object[$tag])) {        $this->current_object[$tag] .= $data;      }      else {        $this->current_object[$tag] = $data;      }    }  }}
 |