function getPackageInfo($gzfilename) { global $boarddir; // Extract package-info.xml from downloaded file. (*/ is used because it could be in any directory.) if (strpos($gzfilename, 'http://') !== false) { $packageInfo = read_tgz_data(fetch_web_data($gzfilename, '', true), '*/package-info.xml', true); } else { if (!file_exists($boarddir . '/Packages/' . $gzfilename)) { return 'package_get_error_not_found'; } if (is_file($boarddir . '/Packages/' . $gzfilename)) { $packageInfo = read_tgz_file($boarddir . '/Packages/' . $gzfilename, '*/package-info.xml', true); } elseif (file_exists($boarddir . '/Packages/' . $gzfilename . '/package-info.xml')) { $packageInfo = file_get_contents($boarddir . '/Packages/' . $gzfilename . '/package-info.xml'); } else { return 'package_get_error_missing_xml'; } } // Nothing? if (empty($packageInfo)) { return 'package_get_error_is_zero'; } // Parse package-info.xml into an xmlArray. loadClassFile('Class-Package.php'); $packageInfo = new xmlArray($packageInfo); // !!! Error message of some sort? if (!$packageInfo->exists('package-info[0]')) { return 'package_get_error_packageinfo_corrupt'; } $packageInfo = $packageInfo->path('package-info[0]'); $package = $packageInfo->to_array(); $package['xml'] = $packageInfo; $package['filename'] = $gzfilename; if (!isset($package['type'])) { $package['type'] = 'modification'; } return $package; }
function gameCacheInsertGames($games, $return = false) { global $scripturl, $txt, $db_prefix, $modSettings, $context, $sourcedir, $smcFunc, $boarddir; $filesAvailable = array(); $filesKeys = array(); foreach ($games as $id => $game) { if ($game['type'] == 'game') { if (!empty($game['directory'])) { $game_directory = $modSettings['gamesDirectory'] . '/' . $game['directory']; $game_file = $modSettings['gamesDirectory'] . '/' . $game['directory'] . '/' . $game['filename']; } else { $game_directory = $modSettings['gamesDirectory']; $game_file = $modSettings['gamesDirectory'] . '/' . $game['filename']; } $filesAvailable[$game_file] = $id; $filesKeys[$game_file] = $id; // Move gamedata file for IBP arcade games if (file_exists($game_directory . '/gamedata')) { $from = $game_directory . '/gamedata'; $to = $boarddir . '/arcade/gamedata'; if (!file_exists($boarddir . '/arcade/')) { if (!mkdir($boarddir . '/arcade/', 0755)) { fatal_lang_error('unable_to_make', false, array($boarddir . '/arcade/')); } } if (!file_exists($to)) { if (!mkdir($to, 0755)) { fatal_lang_error('unable_to_make', false, array($to)); } } elseif (!is_dir($to)) { fatal_lang_error('unable_to_make', false, array($to)); } if (!is_writable($to)) { fatal_lang_error('unable_to_chmod', false, array($to)); } /* Changed rename to copy */ $dir = opendir($from); $success = true; while ($fileFrom = readdir($dir)) { if ($fileFrom == '.' || $fileFrom == '..') { continue; } copy_arcade_directory($from, $to); deleteArcadeArchives($from); /* $success &= rename($from . '/' . $fileFrom, $to . '/' . $fileFrom); */ } closedir($dir); if (!file_exists($to)) { fatal_lang_error('unable_to_move', false, array($from, $to)); } /* if (!$success) fatal_lang_error('unable_to_move', false, array($from, $to)); */ } } } // Installed games $request = $smcFunc['db_query']('', ' SELECT id_game, game_name, internal_name, game_file, game_directory FROM {db_prefix}arcade_games'); while ($row = $smcFunc['db_fetch_assoc']($request)) { if (!empty($row['game_directory'])) { $game_file = $modSettings['gamesDirectory'] . '/' . $row['game_directory'] . '/' . $row['game_file']; } else { $game_file = $modSettings['gamesDirectory'] . '/' . $row['game_file']; } if (isset($filesKeys[$game_file])) { $games[$filesKeys[$game_file]] += array('type' => 'game', 'id' => $row['id_game'], 'name' => $row['game_name'], 'directory' => $row['game_directory'], 'filename' => $row['game_file'], 'internal_name' => $row['internal_name'], 'installed' => true); } else { $fileKeys[$game_file] = count($games); $games[] = array('type' => 'game', 'id' => $row['id_game'], 'name' => $row['game_name'], 'directory' => $row['game_directory'], 'filename' => $row['game_file'], 'internal_name' => $row['internal_name'], 'missing_files' => true); } } $smcFunc['db_free_result']($request); $rows = array(); // Last step foreach ($games as $id => $game) { if (!empty($game['directory'])) { $game_directory = $modSettings['gamesDirectory'] . '/' . $game['directory']; $game_file = $modSettings['gamesDirectory'] . '/' . $game['directory'] . '/' . $game['filename']; } else { $game_directory = $modSettings['gamesDirectory']; $game_file = $modSettings['gamesDirectory'] . '/' . $game['filename']; } // Regular game? if ($game['type'] == 'game') { // Use game info if possible if (file_exists($game_directory . '/game-info.xml') && !isset($game['gameinfo'])) { $gameinfo = readGameInfo($game_directory . '/game-info.xml'); } } elseif ($game['type'] == 'gamepackage') { $gameinfo = read_tgz_data(file_get_contents($game_file), 'game-info.xml', true); $gameinfo = new xmlArray($gameinfo); $gameinfo = $gameinfo->path('game-info[0]'); $gameinfo = $gameinfo->to_array(); } elseif ($game['type'] == 'gamepackage-multi') { $game['name'] = 'GamePack ' . substr($game['filename'], 0, strrpos($game['filename'], '.')); } if (isset($gameinfo) && !isset($game['name'])) { $game['name'] = $gameinfo['name']; } elseif (!isset($game['name'])) { $game['name'] = getGameName(getInternalName($game['filename'], $game_directory)); } // Status of game $status = 10; if (!empty($game['missing_files'])) { $status = 2; } elseif (!empty($game['installed'])) { $status = 1; } if (!isset($game['id'])) { $game['id'] = 0; } if (!isset($game['directory'])) { $game['directory'] = ''; } if (!isset($game['filename'])) { $game['filename'] = ''; } // Escape data to be inserted into database $rows[] = array($game['id'], $game['type'], $game['name'], $status, $game['filename'], $game['directory']); unset($gameinfo); } if (!empty($rows)) { $smcFunc['db_insert']('insert', '{db_prefix}arcade_files', array('id_game' => 'int', 'file_type' => 'string-30', 'game_name' => 'string-255', 'status' => 'int', 'game_file' => 'string-255', 'game_directory' => 'string-255'), $rows, array('internal_name')); } if ($return) { return $rows; } }
/** * Loads a package's information and returns a representative array. * * - Expects the file to be a package in packages/. * - Returns a error string if the package-info is invalid. * - Otherwise returns a basic array of id, version, filename, and similar information. * - An Xml_Array is available in 'xml'. * * @package Packages * @param string $gzfilename */ function getPackageInfo($gzfilename) { $gzfilename = trim($gzfilename); // Extract package-info.xml from downloaded file. (*/ is used because it could be in any directory.) if (preg_match('~^https?://~i', $gzfilename) === 1) { $packageInfo = read_tgz_data(fetch_web_data($gzfilename, '', true), '*/package-info.xml', true); } else { // It must be in the package directory then if (!file_exists(BOARDDIR . '/packages/' . $gzfilename)) { return 'package_get_error_not_found'; } // Make sure an package.xml file is available if (is_file(BOARDDIR . '/packages/' . $gzfilename)) { $packageInfo = read_tgz_file(BOARDDIR . '/packages/' . $gzfilename, '*/package-info.xml', true); } elseif (file_exists(BOARDDIR . '/packages/' . $gzfilename . '/package-info.xml')) { $packageInfo = file_get_contents(BOARDDIR . '/packages/' . $gzfilename . '/package-info.xml'); } else { return 'package_get_error_missing_xml'; } } // Nothing? if (empty($packageInfo)) { // Perhaps they are trying to install a theme, lets tell them nicely this is the wrong function $packageInfo = read_tgz_file(BOARDDIR . '/packages/' . $gzfilename, '*/theme_info.xml', true); if (!empty($packageInfo)) { return 'package_get_error_is_theme'; } else { return 'package_get_error_is_zero'; } } // Parse package-info.xml into an Xml_Array. require_once SUBSDIR . '/XmlArray.class.php'; $packageInfo = new Xml_Array($packageInfo); // @todo Error message of some sort? if (!$packageInfo->exists('package-info[0]')) { return 'package_get_error_packageinfo_corrupt'; } $packageInfo = $packageInfo->path('package-info[0]'); // Convert packageInfo to an array for use $package = htmlspecialchars__recursive($packageInfo->to_array()); $package['xml'] = $packageInfo; $package['filename'] = $gzfilename; // Set a default type if none was supplied in the package if (!isset($package['type'])) { $package['type'] = 'modification'; } return $package; }
/** * Loads a package's information and returns a representative array. * - expects the file to be a package in Packages/. * - returns a error string if the package-info is invalid. * - otherwise returns a basic array of id, version, filename, and similar information. * - an xmlArray is available in 'xml'. * * @param string $filename * @return array */ function getPackageInfo($gzfilename) { global $boarddir, $sourcedir, $smcFunc; // Extract package-info.xml from downloaded file. (*/ is used because it could be in any directory.) if (strpos($gzfilename, 'http://') !== false) { $packageInfo = read_tgz_data(fetch_web_data($gzfilename, '', true), '*/package-info.xml', true); } else { if (!file_exists($boarddir . '/Packages/' . $gzfilename)) { return 'package_get_error_not_found'; } if (is_file($boarddir . '/Packages/' . $gzfilename)) { $packageInfo = read_tgz_file($boarddir . '/Packages/' . $gzfilename, '*/package-info.xml', true); } elseif (file_exists($boarddir . '/Packages/' . $gzfilename . '/package-info.xml')) { $packageInfo = file_get_contents($boarddir . '/Packages/' . $gzfilename . '/package-info.xml'); } else { return 'package_get_error_missing_xml'; } } // Nothing? if (empty($packageInfo)) { // Perhaps they are trying to install a theme, lets tell them nicely this is the wrong function $packageInfo = read_tgz_file($boarddir . '/Packages/' . $gzfilename, '*/theme_info.xml', true); if (!empty($packageInfo)) { return 'package_get_error_is_theme'; } else { return 'package_get_error_is_zero'; } } // Parse package-info.xml into an xmlArray. require_once $sourcedir . '/Class-Package.php'; $packageInfo = new xmlArray($packageInfo); // @todo Error message of some sort? if (!$packageInfo->exists('package-info[0]')) { return 'package_get_error_packageinfo_corrupt'; } $packageInfo = $packageInfo->path('package-info[0]'); $package = $packageInfo->to_array(); $package['xml'] = $packageInfo; $package['filename'] = $gzfilename; $package['name'] = $smcFunc['htmlspecialchars']($package['name']); if (!isset($package['type'])) { $package['type'] = 'modification'; } return $package; }