<?php
/**
- * Implements uploading from chunks
+ * Backend for uploading files from chunks.
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup upload
- * @author Michael Dale
+ * @ingroup Upload
*/
+/**
+ * Implements uploading from chunks
+ *
+ * @ingroup Upload
+ * @author Michael Dale
+ */
class UploadFromChunks extends UploadFromFile {
protected $mOffset, $mChunkIndex, $mFileKey, $mVirtualTempPath;
-
+
/**
* Setup local pointers to stash, repo and user ( similar to UploadFromStash )
- *
+ *
* @param $user User
* @param $stash UploadStash
* @param $repo FileRepo
// Output a copy of this first to chunk 0 location:
$status = $this->outputChunk( $this->mLocalFile->getPath() );
-
+
// Update db table to reflect initial "chunk" state
$this->updateChunkStatus();
return $this->mLocalFile;
}
-
+
/**
* Continue chunk uploading
*/
$this->mUpload = $webRequestUpload;
// Get the chunk status form the db:
$this->getChunkStatus();
-
+
$metadata = $this->stash->getMetadata( $key );
$this->initializePathInfo( $name,
$this->getRealPath( $metadata['us_path'] ),
false
);
}
-
+
/**
* Append the final chunk and ready file for parent::performUpload()
- * @return void
+ * @return FileRepoStatus
*/
public function concatenateChunks() {
wfDebug( __METHOD__ . " concatenate {$this->mChunkIndex} chunks:" .
if( !$status->isOk() ){
return $status;
}
- // Update the mTempPath variable ( for FileUpload or normal Stash to take over )
+ // Update the mTempPath and mLocalFile
+ // ( for FileUpload or normal Stash to take over )
$this->mTempPath = $tmpPath; // file system path
+ $this->mLocalFile = parent::stashFile();
+
return $status;
}
/**
* Returns the virtual chunk location:
- * @param unknown_type $index
+ * @param $index
+ * @return string
*/
function getVirtualChunkLocation( $index ){
return $this->repo->getVirtualUrl( 'temp' ) .
) .
$this->getChunkFileKey( $index );
}
+
/**
* Add a chunk to the temporary directory
*
- * @param $chunkPath path to temporary chunk file
- * @param $chunkSize size of the current chunk
- * @param $offset offset of current chunk ( mutch match database chunk offset )
+ * @param $chunkPath string path to temporary chunk file
+ * @param $chunkSize int size of the current chunk
+ * @param $offset int offset of current chunk ( mutch match database chunk offset )
* @return Status
*/
public function addChunk( $chunkPath, $chunkSize, $offset ) {
}
return $status;
}
-
+
/**
* Update the chunk db table with the current status:
*/
private function updateChunkStatus(){
wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" .
$this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
-
+
$dbw = $this->repo->getMasterDb();
$dbw->update(
'uploadstash',
__METHOD__
);
}
+
/**
* Get the chunk db state and populate update relevant local values
*/
$this->mVirtualTempPath = $row->us_path;
}
}
+
/**
* Get the current Chunk index
* @return Integer index of the current chunk
}
return 0;
}
-
+
/**
* Gets the current offset in fromt the stashedupload table
* @return Integer current byte offset of the chunk file set
}
return 0;
}
-
+
/**
* Output the chunk to disk
- *
- * @param $chunk
- * @param unknown_type $path
+ *
+ * @param $chunkPath string
+ * @throws UploadChunkFileException
+ * @return FileRepoStatus
*/
private function outputChunk( $chunkPath ){
// Key is fileKey + chunk index
$fileKey = $this->getChunkFileKey();
// Store the chunk per its indexed fileKey:
- $hashPath = $this->repo->getHashPath( $fileKey );
+ $hashPath = $this->repo->getHashPath( $fileKey );
$storeStatus = $this->repo->store( $chunkPath, 'temp', "$hashPath$fileKey" );
// Check for error in stashing the chunk:
$error = array( 'unknown', 'no error recorded' );
}
}
- throw new UploadChunkFileException( "error storing file in '$path': " . implode( '; ', $error ) );
+ throw new UploadChunkFileException( "error storing file in '$chunkPath': " . implode( '; ', $error ) );
}
return $storeStatus;
}
+
private function getChunkFileKey( $index = null ){
if( $index === null ){
$index = $this->getChunkIndex();