.@home.nl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * http://www.gnu.org/copyleft/gpl.html */ if (!defined('MEDIAWIKI')) { // Eclipse helper - will be ignored in production require_once ('ApiBase.php'); } /** * API module that imports an XML file like Special:Import does * * @ingroup API */ class ApiImport extends ApiBase { public function __construct($main, $action) { parent :: __construct($main, $action); } public function execute() { global $wgUser; if(!$wgUser->isAllowed('import')) $this->dieUsageMsg(array('cantimport')); $params = $this->extractRequestParams(); if(!isset($params['token'])) $this->dieUsageMsg(array('missingparam', 'token')); if(!$wgUser->matchEditToken($params['token'])) $this->dieUsageMsg(array('sessionfailure')); $source = null; $isUpload = false; if(isset($params['interwikisource'])) { if(!isset($params['interwikipage'])) $this->dieUsageMsg(array('missingparam', 'interwikipage')); $source = ImportStreamSource::newFromInterwiki( $params['interwikisource'], $params['interwikipage'], $params['fullhistory'], $params['templates']); } else { $isUpload = true; if(!$wgUser->isAllowed('importupload')) $this->dieUsageMsg(array('cantimport-upload')); $source = ImportStreamSource::newFromUpload('xml'); } if($source instanceof WikiErrorMsg) $this->dieUsageMsg(array_merge( array($source->getMessageKey()), $source->getMessageArgs())); else if(WikiError::isError($source)) // This shouldn't happen $this->dieUsageMsg(array('import-unknownerror', $source->getMessage())); $importer = new WikiImporter($source); if(isset($params['namespace'])) $importer->setTargetNamespace($params['namespace']); $reporter = new ApiImportReporter($importer, $isUpload, $params['interwikisource'], $params['summary']); $result = $importer->doImport(); if($result instanceof WikiXmlError) $this->dieUsageMsg(array('import-xml-error', $result->mLine, $result->mColumn, $result->mByte . $result->mContext, xml_error_string($result->mXmlError))); else if(WikiError::isError($result)) // This shouldn't happen $this->dieUsageMsg(array('import-unknownerror', $result->getMessage())); $resultData = $reporter->getData(); $this->getResult()->setIndexedTagName($resultData, 'page'); $this->getResult()->addValue(null, $this->getModuleName(), $resultData); } public function mustBePosted() { return true; } public function isWriteMode() { return true; } public function getAllowedParams() { global $wgImportSources; return array ( 'token' => null, 'summary' => null, 'xml' => null, 'interwikisource' => array( ApiBase :: PARAM_TYPE => $wgImportSources ), 'interwikipage' => null, 'fullhistory' => false, 'templates' => false, 'namespace' => array( ApiBase :: PARAM_TYPE => 'namespace' ) ); } public function getParamDescription() { return array ( 'token' => 'Import token obtained through prop=info', 'summary' => 'Import summary', 'xml' => 'Uploaded XML file', 'interwikisource' => 'For interwiki imports: wiki to import from', 'interwikipage' => 'For interwiki imports: page to import', 'fullhistory' => 'For interwiki imports: import the full history, not just the current version', 'templates' => 'For interwiki imports: import all included templates as well', 'namespace' => 'For interwiki imports: import to this namespace', ); } public function getDescription() { return array ( 'Import a page from another wiki, or an XML file' ); } protected function getExamples() { return array( 'Import [[meta:Help:Parserfunctions]] to namespace 100 with full history:', ' api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory&token=123ABC', ); } public function getVersion() { return __CLASS__ . ': $Id: ApiImport.php 48091 2009-03-06 13:49:44Z catrope $'; } } /** * Import reporter for the API * @ingroup API */ class ApiImportReporter extends ImportReporter { private $mResultArr = array(); function reportPage($title, $origTitle, $revisionCount, $successCount) { // Add a result entry $r = array(); ApiQueryBase::addTitleInfo($r, $title); $r['revisions'] = intval($successCount); $this->mResultArr[] = $r; // Piggyback on the parent to do the logging parent::reportPage($title, $origTitle, $revisionCount, $successCount); } function getData() { return $this->mResultArr; } }