stack, $name); $tag = $this->_getStackLocation(); // Reset the data if (isset($this->$tag)) { $this->$tag->_data = ""; } switch ($name) { case 'UPDATE': $this->current_update = JTable::getInstance('update'); $this->current_update->update_site_id = $this->updateSiteId; $this->current_update->detailsurl = $this->_url; $this->current_update->folder = ""; $this->current_update->client_id = 1; break; // Don't do anything case 'UPDATES': break; default: if (in_array($name, $this->updatecols)) { $name = strtolower($name); $this->current_update->$name = ''; } if ($name == 'TARGETPLATFORM') { $this->current_update->targetplatform = $attrs; } break; } } /** * Character Parser Function * * @param object $parser Parser object. * @param object $name The name of the element. * * @return void * * @since 11.1 */ protected function _endElement($parser, $name) { array_pop($this->stack); // @todo remove code: echo 'Closing: '. $name .'
'; switch ($name) { case 'UPDATE': $ver = new JVersion; // Lower case and remove the exclamation mark $product = strtolower(JFilterInput::getInstance()->clean($ver->PRODUCT, 'cmd')); // Check that the product matches and that the version matches (optionally a regexp) // Check for optional min_dev_level and max_dev_level attributes to further specify targetplatform (e.g., 3.0.1) if ($product == $this->current_update->targetplatform['NAME'] && preg_match('/' . $this->currentUpdate->targetplatform->version . '/', $ver->RELEASE) && ((!isset($this->currentUpdate->targetplatform->min_dev_level)) || $ver->DEV_LEVEL >= $this->currentUpdate->targetplatform->min_dev_level) && ((!isset($this->currentUpdate->targetplatform->max_dev_level)) || $ver->DEV_LEVEL <= $this->currentUpdate->targetplatform->max_dev_level)) { // Target platform isn't a valid field in the update table so unset it to prevent J! from trying to store it unset($this->current_update->targetplatform); if (isset($this->latest)) { if (version_compare($this->current_update->version, $this->latest->version, '>') == 1) { $this->latest = $this->current_update; } } else { $this->latest = $this->current_update; } } break; case 'UPDATES': // :D break; } } /** * Character Parser Function * * @param object $parser Parser object. * @param object $data The data. * * @return void * * @note This is public because its called externally. * @since 11.1 */ protected function _characterData($parser, $data) { $tag = $this->_getLastTag(); /** * @todo remove code * if(!isset($this->$tag->_data)) $this->$tag->_data = ''; * $this->$tag->_data .= $data; */ if (in_array($tag, $this->updatecols)) { $tag = strtolower($tag); $this->current_update->$tag .= $data; } } /** * Finds an update. * * @param array $options Update options. * * @return array Array containing the array of update sites and array of updates * * @since 11.1 */ public function findUpdate($options) { $url = $options['location']; $this->_url = &$url; $this->updateSiteId = $options['update_site_id']; if (substr($url, -4) != '.xml') { if (substr($url, -1) != '/') { $url .= '/'; } $url .= 'extension.xml'; } $db = $this->parent->getDBO(); $http = JHttpFactory::getHttp(); $response = $http->get($url); if (!empty($response->code) && 200 != $response->code) { $query = $db->getQuery(true) ->update('#__update_sites') ->set('enabled = 0') ->where('update_site_id = ' . $this->updateSiteId); $db->setQuery($query); $db->execute(); JLog::add("Error opening url: " . $url, JLog::WARNING, 'updater'); $app = JFactory::getApplication(); $app->enqueueMessage(JText::sprintf('JLIB_UPDATER_ERROR_EXTENSION_OPEN_URL', $url), 'warning'); return false; } $this->xmlParser = xml_parser_create(''); xml_set_object($this->xmlParser, $this); xml_set_element_handler($this->xmlParser, '_startElement', '_endElement'); xml_set_character_data_handler($this->xmlParser, '_characterData'); if (!xml_parse($this->xmlParser, $response->body)) { JLog::add("Error parsing url: " . $url, JLog::WARNING, 'updater'); $app = JFactory::getApplication(); $app->enqueueMessage(JText::sprintf('JLIB_UPDATER_ERROR_EXTENSION_PARSE_URL', $url), 'warning'); return false; } xml_parser_free($this->xmlParser); if (isset($this->latest)) { if (isset($this->latest->client) && strlen($this->latest->client)) { if (is_numeric($this->latest->client)) { $byName = false; // has to be 'administrator' or 'site', numeric values are depreceated. See http://docs.joomla.org/Design_of_JUpdate JLog::add( 'Using numeric values for in the updater xml is deprecated. Use \'administrator\' or \'site\' instead.', JLog::WARNING, 'deprecated' ); } else { $byName = true; } $this->latest->client_id = JApplicationHelper::getClientInfo($this->latest->client, $byName)->id; unset($this->latest->client); } $updates = array($this->latest); } else { $updates = array(); } return array('update_sites' => array(), 'updates' => $updates); } }