/**
  * Get extensions that have category plugin or category fe
  *
  * @param boolean $onlyKeys If true, only the extension keys are returned.
  *
  * @return array Array of frontend extension keys
  */
 public static function getFrontendExtensions($onlyKeys = TRUE)
 {
     $extensions = array();
     if (t3lib_div::int_from_ver(TYPO3_version) < 6001000) {
         $list = array();
         /** @var $extensionList tx_em_Extensions_List */
         $extensionList = t3lib_div::makeInstance('tx_em_Extensions_List');
         $cat = tx_em_Tools::getDefaultCategory();
         $path = PATH_typo3conf . 'ext/';
         $extensionList->getInstExtList($path, $list, $cat, 'L');
     } else {
         $list = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getLoadedExtensionListArray();
     }
     foreach ($list as $extensionName => $extensionData) {
         if (isset($extensionData['EM_CONF']['category'])) {
             if (trim($extensionData['EM_CONF']['category']) === 'plugin' || trim($extensionData['EM_CONF']['category']) === 'fe') {
                 if ((bool) $onlyKeys) {
                     array_push($extensions, $extensionName);
                 } else {
                     $extensions[$extensionName] = $extensionData;
                 }
             }
         }
     }
     return $extensions;
 }
 /**
  * Parses content of mirrors.xml into a suitable array
  *
  * @param	string		XML data file to parse
  * @return	string		HTLML output informing about result
  */
 function parseExtensionsXML($filename)
 {
     $parser = xml_parser_create();
     xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
     xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
     xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'utf-8');
     xml_set_element_handler($parser, array(&$this, 'startElement'), array(&$this, 'endElement'));
     xml_set_character_data_handler($parser, array(&$this, 'characterData'));
     $fp = gzopen($filename, 'rb');
     if (!$fp) {
         return 'Error opening XML extension file "' . $filename . '"';
     }
     $string = gzread($fp, 0xffff);
     // Read 64KB
     $idx = 0;
     $defaultCategories = tx_em_Tools::getDefaultCategory();
     foreach ($defaultCategories as $catKey => $tmp) {
         $this->revCatArr[$catKey] = $idx++;
     }
     $idx = 0;
     $states = tx_em_Tools::getStates();
     foreach ($states as $state => $tmp) {
         $this->revStateArr[$state] = $idx++;
     }
     $GLOBALS['TYPO3_DB']->exec_TRUNCATEquery('cache_extensions');
     $extcount = 0;
     $content = '';
     @ini_set('pcre.backtrack_limit', 500000);
     do {
         if (preg_match('/.*(<extension\\s+extensionkey="[^"]+">.*<\\/extension>)/suU', $string, $match)) {
             // Parse content:
             if (!xml_parse($parser, $match[0], 0)) {
                 $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));
                 $error = TRUE;
                 break;
             }
             $this->storeXMLResult();
             $this->extXMLResult = array();
             $extcount++;
             $string = substr($string, strlen($match[0]));
         } elseif (function_exists('preg_last_error') && preg_last_error()) {
             $errorcodes = array(0 => 'PREG_NO_ERROR', 1 => 'PREG_INTERNAL_ERROR', 2 => 'PREG_BACKTRACK_LIMIT_ERROR', 3 => 'PREG_RECURSION_LIMIT_ERROR', 4 => 'PREG_BAD_UTF8_ERROR');
             $content .= 'Error in regular expression matching, code: ' . $errorcodes[preg_last_error()] . '<br />See <a href="http://www.php.net/manual/en/function.preg-last-error.php" target="_blank">http://www.php.net/manual/en/function.preg-last-error.php</a>';
             $error = TRUE;
             break;
         } else {
             if (gzeof($fp)) {
                 break;
             }
             // Nothing more can be read
             $string .= gzread($fp, 0xffff);
             // Read another 64KB
         }
     } while (TRUE);
     xml_parser_free($parser);
     gzclose($fp);
     if (!$error) {
         /** @var $flashMessage t3lib_FlashMessage */
         $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_extlist_updated'), $extcount), $GLOBALS['LANG']->getLL('ext_import_extlist_updated_header'));
         $content .= $flashMessage->render();
     }
     return $content;
 }
 /**
  * Method collects and stores extension version details into the database.
  *
  * @access  protected
  * @param   SplSubject  $subject  a subject notifying this observer
  * @return  void
  */
 protected function loadIntoDB(SplSubject &$subject)
 {
     // flush every 50 rows to database
     if ($this->sumRecords !== 0 && $this->sumRecords % 50 === 0) {
         $GLOBALS['TYPO3_DB']->exec_INSERTmultipleRows('cache_extensions', self::$fieldNames, $this->arrRows, self::$fieldIndicesNoQuote);
         $this->arrRows = array();
     }
     // order must match that of self::$fieldNamses!
     $this->arrRows[] = array($subject->getExtkey(), $subject->getVersion(), tx_em_Tools::makeVersion($subject->getVersion(), 'int'), intval($subject->getAlldownloadcounter()), intval($subject->getDownloadcounter()), !is_null($subject->getTitle()) ? $subject->getTitle() : '', $subject->getOwnerusername(), !is_null($subject->getAuthorname()) ? $subject->getAuthorname() : '', !is_null($subject->getAuthoremail()) ? $subject->getAuthoremail() : '', !is_null($subject->getAuthorcompany()) ? $subject->getAuthorcompany() : '', intval($subject->getLastuploaddate()), $subject->getT3xfilemd5(), $this->repositoryUID, tx_em_Tools::getDefaultState($subject->getState() ? $subject->getState() : ''), intval($subject->getReviewstate()), tx_em_Tools::getDefaultCategory($subject->getCategory() ? $subject->getCategory() : ''), $subject->getDescription() ? $subject->getDescription() : '', $subject->getDependencies() ? $subject->getDependencies() : '', $subject->getUploadcomment() ? $subject->getUploadcomment() : '');
     ++$this->sumRecords;
 }
 /**
  * Maps remote extensions information into $cat/$list arrays for listing
  *
  * @param	boolean		If set the info in the internal extensionsXML array will be unset before returning the result.
  * @return	array		List array and category index as key 0 / 1 in an array.
  */
 function prepareImportExtList($unsetProc = false)
 {
     $list = array();
     $cat = tx_em_Tools::getDefaultCategory();
     $filepath = $this->parentObject->getMirrorURL();
     foreach ($this->parentObject->xmlHandler->extensionsXML as $extKey => $data) {
         $GLOBALS['LANG']->csConvObj->convarray($data, 'utf-8', $GLOBALS['LANG']->charSet);
         // is there a better place for conversion?
         $list[$extKey]['type'] = '_';
         $version = array_keys($data['versions']);
         $extPath = t3lib_div::strtolower($extKey);
         $list[$extKey]['_ICON'] = '<img alt="" src="' . $filepath . $extPath[0] . '/' . $extPath[1] . '/' . $extPath . '_' . end($version) . '.gif" />';
         $list[$extKey]['downloadcounter'] = $data['downloadcounter'];
         foreach (array_keys($data['versions']) as $version) {
             $list[$extKey]['versions'][$version]['downloadcounter'] = $data['versions'][$version]['downloadcounter'];
             $list[$extKey]['versions'][$version]['EM_CONF'] = array('version' => $version, 'title' => $data['versions'][$version]['title'], 'description' => $data['versions'][$version]['description'], 'category' => $data['versions'][$version]['category'], 'constraints' => $data['versions'][$version]['dependencies'], 'state' => $data['versions'][$version]['state'], 'reviewstate' => $data['versions'][$version]['reviewstate'], 'lastuploaddate' => $data['versions'][$version]['lastuploaddate'], 'author' => $data['versions'][$version]['authorname'], 'author_email' => $data['versions'][$version]['authoremail'], 'author_company' => $data['versions'][$version]['authorcompany']);
         }
         tx_em_Tools::setCat($cat, $list[$extKey]['versions'][$version], $extKey);
         if ($unsetProc) {
             unset($this->parentObject->xmlHandler->extensionsXML[$extKey]);
         }
     }
     return array($list, $cat);
 }