[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/jobqueue/jobs/ -> AssembleUploadChunksJob.php (source)

   1  <?php
   2  /**
   3   * Assemble the segments of a chunked upload.
   4   *
   5   * This program is free software; you can redistribute it and/or modify
   6   * it under the terms of the GNU General Public License as published by
   7   * the Free Software Foundation; either version 2 of the License, or
   8   * (at your option) any later version.
   9   *
  10   * This program is distributed in the hope that it will be useful,
  11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13   * GNU General Public License for more details.
  14   *
  15   * You should have received a copy of the GNU General Public License along
  16   * with this program; if not, write to the Free Software Foundation, Inc.,
  17   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18   * http://www.gnu.org/copyleft/gpl.html
  19   *
  20   * @file
  21   * @ingroup Upload
  22   */
  23  
  24  /**
  25   * Assemble the segments of a chunked upload.
  26   *
  27   * @ingroup Upload
  28   */
  29  class AssembleUploadChunksJob extends Job {
  30  	public function __construct( $title, $params ) {
  31          parent::__construct( 'AssembleUploadChunks', $title, $params );
  32          $this->removeDuplicates = true;
  33      }
  34  
  35  	public function run() {
  36          $scope = RequestContext::importScopedSession( $this->params['session'] );
  37          $context = RequestContext::getMain();
  38          try {
  39              $user = $context->getUser();
  40              if ( !$user->isLoggedIn() ) {
  41                  $this->setLastError( "Could not load the author user from session." );
  42  
  43                  return false;
  44              }
  45  
  46              if ( count( $_SESSION ) === 0 ) {
  47                  // Empty session probably indicates that we didn't associate
  48                  // with the session correctly. Note that being able to load
  49                  // the user does not necessarily mean the session was loaded.
  50                  // Most likely cause by suhosin.session.encrypt = On.
  51                  $this->setLastError( "Error associating with user session. " .
  52                      "Try setting suhosin.session.encrypt = Off" );
  53  
  54                  return false;
  55              }
  56  
  57              UploadBase::setSessionStatus(
  58                  $this->params['filekey'],
  59                  array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
  60              );
  61  
  62              $upload = new UploadFromChunks( $user );
  63              $upload->continueChunks(
  64                  $this->params['filename'],
  65                  $this->params['filekey'],
  66                  $context->getRequest()
  67              );
  68  
  69              // Combine all of the chunks into a local file and upload that to a new stash file
  70              $status = $upload->concatenateChunks();
  71              if ( !$status->isGood() ) {
  72                  UploadBase::setSessionStatus(
  73                      $this->params['filekey'],
  74                      array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
  75                  );
  76                  $this->setLastError( $status->getWikiText() );
  77  
  78                  return false;
  79              }
  80  
  81              // We have a new filekey for the fully concatenated file
  82              $newFileKey = $upload->getLocalFile()->getFileKey();
  83  
  84              // Remove the old stash file row and first chunk file
  85              $upload->stash->removeFileNoAuth( $this->params['filekey'] );
  86  
  87              // Build the image info array while we have the local reference handy
  88              $apiMain = new ApiMain(); // dummy object (XXX)
  89              $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
  90  
  91              // Cleanup any temporary local file
  92              $upload->cleanupTempFile();
  93  
  94              // Cache the info so the user doesn't have to wait forever to get the final info
  95              UploadBase::setSessionStatus(
  96                  $this->params['filekey'],
  97                  array(
  98                      'result' => 'Success',
  99                      'stage' => 'assembling',
 100                      'filekey' => $newFileKey,
 101                      'imageinfo' => $imageInfo,
 102                      'status' => Status::newGood()
 103                  )
 104              );
 105          } catch ( MWException $e ) {
 106              UploadBase::setSessionStatus(
 107                  $this->params['filekey'],
 108                  array(
 109                      'result' => 'Failure',
 110                      'stage' => 'assembling',
 111                      'status' => Status::newFatal( 'api-error-stashfailed' )
 112                  )
 113              );
 114              $this->setLastError( get_class( $e ) . ": " . $e->getText() );
 115              // To be extra robust.
 116              MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 117  
 118              return false;
 119          }
 120  
 121          return true;
 122      }
 123  
 124  	public function getDeduplicationInfo() {
 125          $info = parent::getDeduplicationInfo();
 126          if ( is_array( $info['params'] ) ) {
 127              $info['params'] = array( 'filekey' => $info['params']['filekey'] );
 128          }
 129  
 130          return $info;
 131      }
 132  
 133  	public function allowRetries() {
 134          return false;
 135      }
 136  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1