/** * Download a published monograph publication format file. * @param $args array * @param $request PKPRequest * @param $view boolean True iff inline viewer should be used, if available */ function download($args, $request, $view = false) { $dispatcher = $request->getDispatcher(); $publishedMonograph = $this->getAuthorizedContextObject(ASSOC_TYPE_PUBLISHED_MONOGRAPH); $this->setupTemplate($request, $publishedMonograph); $press = $request->getPress(); $monographId = array_shift($args); // Validated thru auth $representationId = array_shift($args); $bestFileId = array_shift($args); $publicationFormatDao = DAORegistry::getDAO('PublicationFormatDAO'); $publicationFormat = $publicationFormatDao->getByBestId($representationId, $publishedMonograph->getId()); if (!$publicationFormat || !$publicationFormat->getIsApproved() || !$publicationFormat->getIsAvailable() || ($remoteURL = $publicationFormat->getRemoteURL())) { fatalError('Invalid publication format specified.'); } $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); import('lib.pkp.classes.submission.SubmissionFile'); // File constants $submissionFile = $submissionFileDao->getByBestId($bestFileId, $publishedMonograph->getId()); if (!$submissionFile) { $dispatcher->handle404(); } $fileIdAndRevision = $submissionFile->getFileIdAndRevision(); list($fileId, $revision) = array_map(create_function('$a', 'return (int) $a;'), preg_split('/-/', $fileIdAndRevision)); import('lib.pkp.classes.file.SubmissionFileManager'); $monographFileManager = new SubmissionFileManager($publishedMonograph->getContextId(), $publishedMonograph->getId()); switch ($submissionFile->getAssocType()) { case ASSOC_TYPE_PUBLICATION_FORMAT: // Publication format file if ($submissionFile->getAssocId() != $publicationFormat->getId() || $submissionFile->getDirectSalesPrice() === null) { fatalError('Invalid monograph file specified!'); } break; case ASSOC_TYPE_SUBMISSION_FILE: // Dependent file $genreDao = DAORegistry::getDAO('GenreDAO'); $genre = $genreDao->getById($submissionFile->getGenreId()); if (!$genre->getDependent()) { fatalError('Invalid monograph file specified!'); } return $monographFileManager->downloadFile($fileId, $revision); break; default: fatalError('Invalid monograph file specified!'); } $ompCompletedPaymentDao = DAORegistry::getDAO('OMPCompletedPaymentDAO'); $user = $request->getUser(); if ($submissionFile->getDirectSalesPrice() === '0' || $user && $ompCompletedPaymentDao->hasPaidPurchaseFile($user->getId(), $fileIdAndRevision)) { // Paid purchase or open access. if (!$user && $press->getSetting('restrictMonographAccess')) { // User needs to register first. Validation::redirectLogin(); } // If inline viewing is requested, permit plugins to // handle the document. PluginRegistry::loadCategory('viewableFiles', true); if ($view) { if (HookRegistry::call('CatalogBookHandler::view', array(&$this, &$publishedMonograph, &$publicationFormat, &$submissionFile))) { // If the plugin handled the hook, prevent further default activity. exit; } } // Inline viewer not available, or viewing not wanted. // Download or show the file. $inline = $request->getUserVar('inline') ? true : false; if (!HookRegistry::call('CatalogBookHandler::download', array(&$this, &$publishedMonograph, &$publicationFormat, &$submissionFile, &$inline))) { return $monographFileManager->downloadFile($fileId, $revision, $inline); } } // Fall-through: user needs to pay for purchase. // Users that are not logged in need to register/login first. if (!$user) { return $request->redirect(null, 'login', null, null, array('source' => $request->url(null, null, null, array($monographId, $representationId, $bestFileId)))); } // They're logged in but need to pay to view. import('classes.payment.omp.OMPPaymentManager'); $ompPaymentManager = new OMPPaymentManager($request); if (!$ompPaymentManager->isConfigured()) { $request->redirect(null, 'catalog'); } $queuedPayment = $ompPaymentManager->createQueuedPayment($press->getId(), PAYMENT_TYPE_PURCHASE_FILE, $user->getId(), $fileIdAndRevision, $submissionFile->getDirectSalesPrice(), $press->getSetting('currency')); $ompPaymentManager->displayPaymentForm($ompPaymentManager->queuePayment($queuedPayment), $queuedPayment); }