game/pma12111211/libraries/zip_extension.lib.php

189 lines
5.7 KiB
PHP

<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Interface for the zip extension
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/**
* Gets zip file contents
*
* @param string $file zip file
* @param string $specific_entry regular expression to match a file
*
* @return array ($error_message, $file_data); $error_message
* is empty if no error
*/
function PMA_getZipContents($file, $specific_entry = null)
{
$error_message = '';
$file_data = '';
$zip_handle = zip_open($file);
if (is_resource($zip_handle)) {
$first_zip_entry = zip_read($zip_handle);
if (false === $first_zip_entry) {
$error_message = __('No files found inside ZIP archive!');
} else {
/* Is the the zip really an ODS file? */
$read = zip_entry_read($first_zip_entry);
$ods_mime = 'application/vnd.oasis.opendocument.spreadsheet';
if (!strcmp($ods_mime, $read)) {
$specific_entry = '/^content\.xml$/';
}
if (isset($specific_entry)) {
/* Return the correct contents, not just the first entry */
for ( ; ; ) {
$entry = zip_read($zip_handle);
if (is_resource($entry)) {
if (preg_match($specific_entry, zip_entry_name($entry))) {
zip_entry_open($zip_handle, $entry, 'r');
$file_data = zip_entry_read(
$entry,
zip_entry_filesize($entry)
);
zip_entry_close($entry);
break;
}
} else {
/**
* Either we have reached the end of the zip and still
* haven't found $specific_entry or there was a parsing
* error that we must display
*/
if ($entry === false) {
$error_message = __('Error in ZIP archive:')
. ' Could not find "' . $specific_entry . '"';
} else {
$error_message = __('Error in ZIP archive:')
. ' ' . PMA_getZipError($zip_handle);
}
break;
}
}
} else {
zip_entry_open($zip_handle, $first_zip_entry, 'r');
/* File pointer has already been moved,
* so include what was read above */
$file_data = $read;
$file_data .= zip_entry_read(
$first_zip_entry,
zip_entry_filesize($first_zip_entry)
);
zip_entry_close($first_zip_entry);
}
}
} else {
$error_message = __('Error in ZIP archive:')
. ' ' . PMA_getZipError($zip_handle);
}
zip_close($zip_handle);
return (array('error' => $error_message, 'data' => $file_data));
}
/**
* Returns the file name of the first file that matches the given $file_regexp.
*
* @param string $file_regexp regular expression for the file name to match
* @param string $file zip archive
*
* @return string the file name of the first file that matches the given regexp
*/
function PMA_findFileFromZipArchive ($file_regexp, $file)
{
$zip_handle = zip_open($file);
if (is_resource($zip_handle)) {
$entry = zip_read($zip_handle);
while (is_resource($entry)) {
if (preg_match($file_regexp, zip_entry_name($entry))) {
$file_name = zip_entry_name($entry);
zip_close($zip_handle);
return $file_name;
}
$entry = zip_read($zip_handle);
}
}
zip_close($zip_handle);
return false;
}
/**
* Returns the number of files in the zip archive.
*
* @param string $file zip archive
*
* @return int the number of files in the zip archive
*/
function PMA_getNoOfFilesInZip($file)
{
$count = 0;
$zip_handle = zip_open($file);
if (is_resource($zip_handle)) {
$entry = zip_read($zip_handle);
while (is_resource($entry)) {
$count++;
$entry = zip_read($zip_handle);
}
}
zip_close($zip_handle);
return $count;
}
/**
* Extracts a set of files from the given zip archive to a given destinations.
*
* @param string $zip_path path to the zip archive
* @param string $destination destination to extract files
* @param array $entries files in archive that should be extracted
*
* @return bool true on sucess, false otherwise
*/
function PMA_zipExtract($zip_path, $destination, $entries)
{
$zip = new ZipArchive;
if ($zip->open($zip_path) === true) {
$zip->extractTo($destination, $entries);
$zip->close();
return true;
}
return false;
}
/**
* Gets zip error message
*
* @param integer $code error code
*
* @return string error message
*/
function PMA_getZipError($code)
{
// I don't think this needs translation
switch ($code) {
case ZIPARCHIVE::ER_MULTIDISK:
$message = 'Multi-disk zip archives not supported';
break;
case ZIPARCHIVE::ER_READ:
$message = 'Read error';
break;
case ZIPARCHIVE::ER_CRC:
$message = 'CRC error';
break;
case ZIPARCHIVE::ER_NOZIP:
$message = 'Not a zip archive';
break;
case ZIPARCHIVE::ER_INCONS:
$message = 'Zip archive inconsistent';
break;
default:
$message = $code;
}
return $message;
}
?>