You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
6.6 KiB

<?php
// Project: Web Reference Database (refbase) <http://www.refbase.net>
// Copyright: Matthias Steffens <mailto:refbase@extracts.de> and the file's
// original author(s).
//
// This code is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY. Please see the GNU General Public
// License for more details.
//
// File: ./includes/execute.inc.php
// Repository: $HeadURL: file:///svn/p/refbase/code/branches/bleeding-edge/includes/execute.inc.php $
// Author(s): Richard Karnesky <mailto:karnesky@gmail.com> and
// Matthias Steffens <mailto:refbase@extracts.de>
//
// Created: 16-Dec-05, 18:00
// Modified: $Date: 2012-11-12 22:43:32 +0000 (Mon, 12 Nov 2012) $
// $Author: karnesky $
// $Revision: 1366 $
// This file contains functions that deal with execution of shell commands and provides
// fixes for 'exec()' on certain win32 systems (based on rivera at spamjoy dot unr dot edu's
// 'wind_exec()' function <http://php.net/function.exec>).
// Note: Since the 'exec()' function is used, some things may not work if
//'safe_mode' is set to 'On' in your 'php.ini' file. If you need or want to
// keep 'safe_mode=ON' then you'll need to put the programs within the
// directory that's specified in 'safe_mode_exec_dir'.
// --------------------------------------------------------------------
// Import records using the bibutils program given in '$program'
function importBibutils($sourceText, $program)
{
global $contentTypeCharset; // defined in 'ini.inc.php'
// Get the absolute path for the bibutils package:
// (function 'getExternalUtilityPath()' is defined in 'include.inc.php')
$bibutilsPath = getExternalUtilityPath("bibutils");
// Write the source data to a temporary file:
$tempFile = writeToTempFile($sourceText);
// Set input and output encoding:
if ($contentTypeCharset != "UTF-8")
{
$inputEncodingArg = " -i iso8859_1";
$outputEncodingArg = " -o iso8859_1";
}
else
{
$inputEncodingArg = " -i utf8";
$outputEncodingArg = " -o utf8";
}
// Pass this temp file to the bibutils utility for conversion:
$outputFile = convertBibutils($bibutilsPath, $tempFile, $program, $inputEncodingArg, $outputEncodingArg);
unlink($tempFile);
// Read the resulting output file and return the converted data:
$resultString = readFromFile($outputFile);
unlink($outputFile);
return $resultString;
}
// --------------------------------------------------------------------
// Export records using the bibutils program given in '$program'
function exportBibutils($result, $program)
{
global $contentTypeCharset; // these variables are defined in 'ini.inc.php'
global $convertExportDataToUTF8;
// Get the absolute path for the bibutils package:
// (function 'getExternalUtilityPath()' is defined in 'include.inc.php')
$bibutilsPath = getExternalUtilityPath("bibutils");
// Generate and serve a MODS XML file of ALL records:
// (function 'modsCollection()' is defined in 'modsxml.inc.php')
$recordCollection = modsCollection($result);
// Write the MODS XML data to a temporary file:
$tempFile = writeToTempFile($recordCollection);
// Set input and output encoding:
if (($convertExportDataToUTF8 == "no") AND ($contentTypeCharset != "UTF-8"))
{
$inputEncodingArg = " -i iso8859_1";
$outputEncodingArg = " -o iso8859_1";
}
else
{
$inputEncodingArg = " -i utf8";
$outputEncodingArg = " -o utf8";
}
// Pass this temp file to the bibutils utility for conversion:
$outputFile = convertBibutils($bibutilsPath, $tempFile, $program, $inputEncodingArg, $outputEncodingArg);
unlink($tempFile);
// Read the resulting output file and return the converted data:
$resultString = readFromFile($outputFile);
unlink($outputFile);
return $resultString;
}
// --------------------------------------------------------------------
// Convert file contents using the bibutils program given in '$program'
function convertBibutils($bibutilsPath, $tempFile, $program, $inputEncodingArg, $outputEncodingArg)
{
global $sessionTempDir; // defined in 'ini.inc.php'
$outputFile = tempnam($sessionTempDir, "refbase-");
$cmd = $bibutilsPath . $program . $inputEncodingArg . $outputEncodingArg . " " . $tempFile;
execute($cmd, $outputFile);
return $outputFile;
}
// --------------------------------------------------------------------
// Execute shell command
function execute($cmd, $outputFile)
{
if (getenv("OS") == "Windows_NT")
executeWin32($cmd . " > " . $outputFile);
else
{
exec($cmd, $output);
arrayToFile($output, $outputFile);
}
}
// --------------------------------------------------------------------
// Execute shell command on win32 systems
function executeWin32($cmd)
{
$cmdline = "cmd /C ". $cmd;
// Make a new instance of the COM object
$WshShell = new COM("WScript.Shell");
// Make the command window but dont show it
$oExec = $WshShell->Run($cmdline, 0, true);
}
// --------------------------------------------------------------------
// Write data to a temporary file
function writeToTempFile($sourceText)
{
global $sessionTempDir; // defined in 'ini.inc.php'
$tempFile = tempnam($sessionTempDir, "refbase-");
$tempFileHandle = fopen($tempFile, "w"); // open temp file with write permission
fwrite($tempFileHandle, $sourceText); // save data to temp file
fclose($tempFileHandle); // close temp file
return $tempFile;
}
// --------------------------------------------------------------------
// Get file contents
function readFromFile($file)
{
// Enable PHP to detect Mac (CR) EOL conventions:
// (see <http://www.php.net/manual/en/ref.filesystem.php#ini.auto-detect-line-endings>)
ini_set('auto_detect_line_endings', true);
$fileContents = file_get_contents($file);
// Remove UTF-8 BOM if present
$bom = "\xef\xbb\xbf";
if (0 == strncmp($fileContents, $bom, 3)) {
$fileContents = substr($fileContents, 3);
}
return $fileContents;
}
// --------------------------------------------------------------------
// Write an array (as from $return argument in exec) to a file
function arrayToFile($array, $outputFile)
{
return (stringToFile(implode("\n", $array), $outputFile));
}
function stringToFile($string, $outputFile)
{
$rc = false;
do
{
if (!($f = fopen($outputFile, "wa+")))
{
$rc = 1;
break;
}
if (!fwrite($f, $string))
{
$rc = 2;
break;
}
$rc = true;
}
while (0);
if ($f)
fclose($f);
return ($rc);
}
// --------------------------------------------------------------------
?>