00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00038 class SC_mod_tools_em_xmlhandler {
00045 var $emObj;
00046 var $extXMLResult = array();
00047 var $extensionsXML = array();
00048 var $reviewStates = null;
00049 var $useUnsupported = false;
00050 var $useObsolete = false;
00051
00059 function searchExtensionsXML($search, $owner='') {
00060 if(!count($this->extensionsXML)) $this->loadExtensionsXML();
00061
00062 reset($this->extensionsXML);
00063 while (list($extkey, $data) = each($this->extensionsXML)) {
00064
00065
00066 if(isset($this->emObj->inst_keys[$extkey])) unset($this->emObj->inst_keys[$extkey]);
00067
00068 if(strlen($search) && !stristr($extkey,$search)) {
00069 unset($this->extensionsXML[$extkey]);
00070 continue;
00071 }
00072
00073 if(strlen($owner) && !$this->checkOwner($extkey, $owner)) {
00074 unset($this->extensionsXML[$extkey]);
00075 continue;
00076 }
00077
00078 if(!strlen($owner)) {
00079 $this->checkReviewState($this->extensionsXML[$extkey]['versions']);
00080 }
00081 $this->removeObsolete($this->extensionsXML[$extkey]['versions']);
00082
00083 uksort($data['versions'], array($this->emObj, 'versionDifference'));
00084
00085 if(!count($this->extensionsXML[$extkey]['versions'])) {
00086 unset($this->extensionsXML[$extkey]);
00087 }
00088 }
00089 }
00090
00098 function checkOwner($extkey, $owner) {
00099 foreach($this->extensionsXML[$extkey]['versions'] as $ext) {
00100 if($ext['ownerusername'] == $owner) return true;
00101 }
00102 return false;
00103 }
00104
00110 function loadExtensionsXML() {
00111 if(is_file(PATH_site.'typo3temp/extensions.bin')) {
00112 $this->extensionsXML = unserialize(gzuncompress(t3lib_div::getURL(PATH_site.'typo3temp/extensions.bin')));
00113 return true;
00114 } else {
00115 $this->extensionsXML = array();
00116 return false;
00117 }
00118 }
00119
00125 function loadReviewStates() {
00126 if(is_file(PATH_site.'typo3temp/reviewstates.bin')) {
00127 $this->reviewStates = unserialize(gzuncompress(t3lib_div::getURL(PATH_site.'typo3temp/reviewstates.bin')));
00128 return true;
00129 } else {
00130 $this->reviewStates = array();
00131 return false;
00132 }
00133 }
00134
00140 function saveExtensionsXML() {
00141 t3lib_div::writeFile(PATH_site.'typo3temp/extensions.bin',gzcompress(serialize($this->extXMLResult)));
00142 t3lib_div::writeFile(PATH_site.'typo3temp/reviewstates.bin',gzcompress(serialize($this->reviewStates)));
00143 }
00144
00150 function freeExtensionsXML() {
00151 unset($this->extensionsXML);
00152 $this->extensionsXML = array();
00153 }
00154
00161 function removeObsolete(&$extensions) {
00162 if($this->useObsolete) return;
00163
00164 reset($extensions);
00165 while (list($version, $data) = each($extensions)) {
00166 if($data['state']=='obsolete')
00167 unset($extensions[$version]);
00168 }
00169 }
00170
00178 function getReviewState($extKey, $version) {
00179 if(!is_array($this->reviewStates)) $this->loadReviewStates();
00180
00181 if(isset($this->reviewStates[$extKey])) {
00182 return (int)$this->reviewStates[$extKey][$version];
00183 } else {
00184 return 0;
00185 }
00186 }
00187
00194 function checkReviewState(&$extensions) {
00195 if($this->useUnsupported) return;
00196
00197 reset($extensions);
00198 while (list($version, $data) = each($extensions)) {
00199 if($data['reviewstate']<1)
00200 unset($extensions[$version]);
00201 }
00202 }
00203
00209 function checkReviewStateGlobal() {
00210 if($this->useUnsupported) return;
00211
00212 reset($this->extensionsXML);
00213 while (list($extkey, $data) = each($this->extensionsXML)) {
00214 while (list($version, $vdata) = each($data['versions'])) {
00215 if($vdata['reviewstate']<1) unset($this->extensionsXML[$extkey]['versions'][$version]);
00216 }
00217 if(!count($this->extensionsXML[$extkey]['versions'])) unset($this->extensionsXML[$extkey]);
00218 }
00219 }
00220
00221
00233 function startElement($parser, $name, $attrs) {
00234 switch($name) {
00235 case 'extensions':
00236 break;
00237 case 'extension':
00238 $this->currentExt = $attrs['extensionkey'];
00239 break;
00240 case 'version':
00241 $this->currentVersion = $attrs['version'];
00242 $this->extXMLResult[$this->currentExt]['versions'][$this->currentVersion] = array();
00243 break;
00244 default:
00245 $this->currentTag = $name;
00246 }
00247 }
00248
00256 function endElement($parser, $name) {
00257 switch($name) {
00258 case 'extension':
00259 unset($this->currentExt);
00260 break;
00261 case 'version':
00262 unset($this->currentVersion);
00263 break;
00264 default:
00265 unset($this->currentTag);
00266 }
00267 }
00268
00276 function characterData($parser, $data) {
00277 if(isset($this->currentTag)) {
00278 if(!isset($this->currentVersion) && $this->currentTag == 'downloadcounter') {
00279 $this->extXMLResult[$this->currentExt]['downloadcounter'] = trim($data);
00280 } elseif($this->currentTag == 'dependencies') {
00281 $data = @unserialize($data);
00282 if(is_array($data)) {
00283 $dep = array();
00284 foreach($data as $v) {
00285 $dep[$v['kind']][$v['extensionKey']] = $v['versionRange'];
00286 }
00287 $this->extXMLResult[$this->currentExt]['versions'][$this->currentVersion]['dependencies'] = $dep;
00288 }
00289 } elseif($this->currentTag == 'reviewstate') {
00290 $this->reviewStates[$this->currentExt][$this->currentVersion] = (int)trim($data);
00291 $this->extXMLResult[$this->currentExt]['versions'][$this->currentVersion]['reviewstate'] = (int)trim($data);
00292 } else {
00293 $this->extXMLResult[$this->currentExt]['versions'][$this->currentVersion][$this->currentTag] .= trim($data);
00294 }
00295 }
00296 }
00297
00304 function parseExtensionsXML($string) {
00305 global $TYPO3_CONF_VARS;
00306
00307 $parser = xml_parser_create();
00308 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
00309 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
00310 xml_set_element_handler($parser, array(&$this,'startElement'), array(&$this,'endElement'));
00311 xml_set_character_data_handler($parser, array(&$this,'characterData'));
00312
00313 if ((double)phpversion()>=5) {
00314 $preg_result = array();
00315 preg_match('/^[[:space:]]*<\?xml[^>]*encoding[[:space:]]*=[[:space:]]*"([^"]*)"/',substr($string,0,200),$preg_result);
00316 $theCharset = $preg_result[1] ? $preg_result[1] : ($TYPO3_CONF_VARS['BE']['forceCharset'] ? $TYPO3_CONF_VARS['BE']['forceCharset'] : 'iso-8859-1');
00317 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $theCharset); // us-ascii / utf-8 / iso-8859-1
00318 }
00319
00320 // Parse content:
00321 if (!xml_parse($parser, $string)) {
00322 $content.= 'Error in XML parser while decoding extensions XML file. Line '.xml_get_current_line_number($parser).': '.xml_error_string(xml_get_error_code($parser));
00323 $error = true;
00324 }
00325 xml_parser_free($parser);
00326
00327 if(!$error) {
00328 $content.= '<p>The extensions list has been updated and now contains '.count($this->extXMLResult).' extension entries.</p>';
00329 }
00330
00331 return $content;
00332 }
00333
00340 function parseMirrorsXML($string) {
00341 global $TYPO3_CONF_VARS;
00342
00343 // Create parser:
00344 $parser = xml_parser_create();
00345 $vals = array();
00346 $index = array();
00347
00348 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
00349 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
00350
00351 if ((double)phpversion()>=5) {
00352 $preg_result = array();
00353 preg_match('/^[[:space:]]*<\?xml[^>]*encoding[[:space:]]*=[[:space:]]*"([^"]*)"/',substr($string,0,200),$preg_result);
00354 $theCharset = $preg_result[1] ? $preg_result[1] : ($TYPO3_CONF_VARS['BE']['forceCharset'] ? $TYPO3_CONF_VARS['BE']['forceCharset'] : 'iso-8859-1');
00355 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $theCharset);
00356 }
00357
00358
00359 xml_parse_into_struct($parser, $string, $vals, $index);
00360
00361
00362 if (xml_get_error_code($parser)) {
00363 $line = xml_get_current_line_number($parser);
00364 $error = xml_error_string(xml_get_error_code($parser));
00365 xml_parser_free($parser);
00366 return 'Error in XML parser while decoding mirrors XML file. Line '.$line.': '.$error;
00367 } else {
00368
00369 $stack = array(array());
00370 $stacktop = 0;
00371 $mirrornumber = 0;
00372 $current=array();
00373 $tagName = '';
00374 $documentTag = '';
00375
00376
00377 foreach($vals as $val) {
00378
00379
00380 $tagName = ($val['tag']=='mirror' && $val['type']=='open') ? '__plh' : $val['tag'];
00381 if (!$documentTag) $documentTag = $tagName;
00382
00383
00384 switch($val['type']) {
00385 case 'open':
00386 $current[$tagName] = array();
00387 $stack[$stacktop++] = $current;
00388 $current = array();
00389 break;
00390 case 'close':
00391 $oldCurrent = $current;
00392 $current = $stack[--$stacktop];
00393 end($current);
00394 if($tagName=='mirror') {
00395 unset($current['__plh']);
00396 $current[$oldCurrent['host']] = $oldCurrent;
00397 } else {
00398 $current[key($current)] = $oldCurrent;
00399 }
00400 unset($oldCurrent);
00401 break;
00402 case 'complete':
00403 $current[$tagName] = (string)$val['value'];
00404 break;
00405 }
00406 }
00407 return $current[$tagName];
00408 }
00409 }
00410
00417 function parseL10nXML($string) {
00418
00419 $parser = xml_parser_create();
00420 $vals = array();
00421 $index = array();
00422
00423 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
00424 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
00425
00426
00427 xml_parse_into_struct($parser, $string, $vals, $index);
00428
00429
00430 if (xml_get_error_code($parser)) {
00431 $line = xml_get_current_line_number($parser);
00432 $error = xml_error_string(xml_get_error_code($parser));
00433 debug($error);
00434 xml_parser_free($parser);
00435 return 'Error in XML parser while decoding l10n XML file. Line '.$line.': '.$error;
00436 } else {
00437
00438 $stack = array(array());
00439 $stacktop = 0;
00440 $mirrornumber = 0;
00441 $current=array();
00442 $tagName = '';
00443 $documentTag = '';
00444
00445
00446 foreach($vals as $val) {
00447
00448
00449 $tagName = ($val['tag']=='languagepack' && $val['type']=='open') ? $val['attributes']['language'] : $val['tag'];
00450 if (!$documentTag) $documentTag = $tagName;
00451
00452
00453 switch($val['type']) {
00454 case 'open':
00455 $current[$tagName] = array();
00456 $stack[$stacktop++] = $current;
00457 $current = array();
00458 break;
00459 case 'close':
00460 $oldCurrent = $current;
00461 $current = $stack[--$stacktop];
00462 end($current);
00463 $current[key($current)] = $oldCurrent;
00464 unset($oldCurrent);
00465 break;
00466 case 'complete':
00467 $current[$tagName] = (string)$val['value'];
00468 break;
00469 }
00470 }
00471 return $current[$tagName];
00472 }
00473 }
00474 }
00475 ?>