Download.php 18.7 KB
Newer Older
Carsten  Rose's avatar
Carsten Rose committed
1
2
3
4
5
6
<?php
/**
 * Created by PhpStorm.
 * User: crose
 * Date: 4/17/17
 * Time: 11:32 AM
Carsten  Rose's avatar
Carsten Rose committed
7
8
 *
 * Check: CODING.md > Download
Carsten  Rose's avatar
Carsten Rose committed
9
10
11
12
 */

namespace qfq;

13
//use TYPO3\CMS\Core\Resource\Exception\FileDoesNotExistException;
Carsten  Rose's avatar
Carsten Rose committed
14
15
16
17

require_once(__DIR__ . '/../Constants.php');
require_once(__DIR__ . '/../store/Session.php');
require_once(__DIR__ . '/../store/Store.php');
18
require_once(__DIR__ . '/../store/Sip.php');
Carsten  Rose's avatar
Carsten Rose committed
19
require_once(__DIR__ . '/../helper/OnArray.php');
20
require_once(__DIR__ . '/../helper/OnString.php');
21
require_once(__DIR__ . '/../helper/Logger.php');
22
require_once(__DIR__ . '/../helper/Sanitize.php');
23
require_once(__DIR__ . '/../helper/HelperFile.php');
Carsten  Rose's avatar
Carsten Rose committed
24
require_once(__DIR__ . '/../report/Html2Pdf.php');
25
require_once(__DIR__ . '/Thumbnail.php');
Carsten  Rose's avatar
Carsten Rose committed
26
require_once(__DIR__ . '/Monitor.php');
Carsten  Rose's avatar
Carsten Rose committed
27
require_once(__DIR__ . '/../exceptions/DownloadException.php');
28
29
require_once(__DIR__ . '/Excel.php');
require_once(__DIR__ . '/../helper/DownloadPage.php');
30
require_once(__DIR__ . '/../QuickFormQuery.php');
31

Carsten  Rose's avatar
Carsten Rose committed
32
33
34
35
36
37
38
//require_once(__DIR__ . '/../Evaluate.php');
//require_once(__DIR__ . '/../helper/KeyValueStringParser.php');
//

/**
 * Class Download
 *
39
40
 * Documentation: PROTOCOL.md >> Download
 *
Carsten  Rose's avatar
Carsten Rose committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 * Param: i=1..n
 *   <i>_mode=direct | html2pdf
 *   <i>_id=<pageId>
 *   <i>_<key i>=<value i>
 *
 * @package qfq
 */
class Download {

    /**
     * @var Store
     */
    private $store = null;

    /**
     * @var Session
     */
    private $session = null;

    /**
     * @var Database
     */
    private $db = null;

    /**
     * @var Html2Pdf
     */
    private $html2pdf = null;

70
71
72
73
74
    /**
     * @var string Filename where to write download Information
     */
    private $downloadDebugLog = '';

75
76
77
78
79
    /**
     * @var string DOWNLOAD_OUTPUT_FORMAT_RAW | DOWNLOAD_OUTPUT_FORMAT_JSON
     */
    private $outputFormat = DOWNLOAD_OUTPUT_FORMAT_RAW;

Carsten  Rose's avatar
Carsten Rose committed
80
81
    /**
     * @param bool|false $phpUnit
82
     * @throws CodeException
83
     * @throws DbException
84
     * @throws UserFormException
Carsten  Rose's avatar
Carsten Rose committed
85
     * @throws UserReportException
Carsten  Rose's avatar
Carsten Rose committed
86
87
88
89
90
91
     */
    public function __construct($phpUnit = false) {

        $this->session = Session::getInstance($phpUnit);
        $this->store = Store::getInstance('', $phpUnit);
        $this->db = new Database();
92
        $this->html2pdf = new Html2Pdf($this->store->getStore(STORE_SYSTEM), $phpUnit);
93

94
        if (Support::findInSet(SYSTEM_SHOW_DEBUG_INFO_DOWNLOAD, $this->store->getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM))) {
95
96
            $this->downloadDebugLog = $this->store->getVar(SYSTEM_SQL_LOG, STORE_SYSTEM);
        }
Carsten  Rose's avatar
Carsten Rose committed
97
98
99
100
101
102
    }

    /**
     * Concatenate all named files to one PDF file. Return name of new full PDF.
     *
     * @param array $files
Carsten  Rose's avatar
Carsten Rose committed
103
     *
Carsten  Rose's avatar
Carsten Rose committed
104
     * @return string  - fileName of concatenated file
105
106
     * @throws UserFormException
     * @throws downloadException
Carsten  Rose's avatar
Carsten Rose committed
107
108
109
     */
    private function concatPdfFiles(array $files) {

110
111
112
        // Remove empty entries. Might happen if there was no upload
        $files = OnArray::removeEmptyElementsFromArray($files);

Carsten  Rose's avatar
Carsten Rose committed
113
        // Check that all files exist and are readable
114
        foreach ($files AS $filename) {
115
            if (!is_readable($filename)) {
116
117
118
119
                throw new downloadException("Error reading file $filename. Not found or no permission", ERROR_DOWNLOAD_FILE_NOT_READABLE);
            }
        }

Carsten  Rose's avatar
Carsten Rose committed
120
121
122
        if (count($files) === 0) {
            return '';
        }
123

Carsten  Rose's avatar
Carsten Rose committed
124
125
126
127
        // Check that all files are of type 'application/pdf'
        foreach ($files AS $filename) {
            $mimetype = mime_content_type($filename);
            if ($mimetype != 'application/pdf') {
128
                throw new DownloadException("Error concat file $filename. Mimetype 'application/pdf' expected, got: $mimetype", ERROR_DOWNLOAD_UNEXPECTED_MIME_TYPE);
Carsten  Rose's avatar
Carsten Rose committed
129
130
131
            }
        }

Carsten  Rose's avatar
Carsten Rose committed
132
133
134
        if (count($files) == 1) {
            return $files[0];
        }
Carsten  Rose's avatar
Carsten Rose committed
135

Carsten  Rose's avatar
Carsten Rose committed
136
        $files = OnArray::arrayEscapeshellarg($files);
Carsten  Rose's avatar
Carsten Rose committed
137
138
139
140
141
        $inputFiles = implode(' ', $files);
        if (trim($inputFiles) == '') {
            throw new DownloadException('No files to concatenate.', ERROR_DOWNLOAD_NO_FILES);
        }

Carsten  Rose's avatar
Carsten Rose committed
142
143
144
145
146
147
        // Need to create a separate result file, even if it is just a single file (#6929)
        $concatFile = HelperFile::tempnam();
        if (false === $concatFile) {
            throw new DownloadException('Error creating output file.', ERROR_DOWNLOAD_CREATE_NEW_FILE);
        }

Carsten  Rose's avatar
Carsten Rose committed
148
149
        $cmd = "pdftk $inputFiles cat output $concatFile";

150
151
152
153
        if ($this->downloadDebugLog != '') {
            Logger::logMessage("Download: $cmd", $this->downloadDebugLog);
        }

Carsten  Rose's avatar
Carsten Rose committed
154
155
156
157
158
159
160
161
162
163
        exec($cmd, $output, $rc);

        if ($rc != 0) {
            throw new DownloadException ("<p>Failed: RC=$rc   $cmd</p>" . implode("<br>", $output));
        }

        return $concatFile;
    }

    /**
164
165
     * Get the mimetype of $filename and store them in $rcMimetype.
     * Checks if the extension of $outputFilename fit's to the mimetype. If not, append the mimetype extension.
Carsten  Rose's avatar
Carsten Rose committed
166
     *
167
168
169
     * @param string $filename
     * @param string $outputFilename
     * @param string $rcMimetype
Carsten  Rose's avatar
Carsten Rose committed
170
     *
171
     * @return string possible updated $outputFilename, according the mimetype.
Carsten  Rose's avatar
Carsten Rose committed
172
     */
173
    private function targetFilenameExtension($filename, $outputFilename, &$rcMimetype) {
Carsten  Rose's avatar
Carsten Rose committed
174

175
        $rcMimetype = mime_content_type($filename);
176

177
178
179
180
181
182
        return $outputFilename;
    }

    /**
     * Set header type and output $filename. Be careful not to send any additional characters.
     *
183
     * @param $file
184
185
     * @param $outputFilename
     */
186
    private function outputFile($file, $outputFilename) {
187

188
        $length = filesize($file);
189

190
191
        $outputFilename = $this->targetFilenameExtension($file, $outputFilename, $mimetype);
        $outputFilename = Sanitize::safeFilename($outputFilename); // be sure that there are no problematic chars in the filename. E.g. MacOS X don't like spaces for downloads.
192

Carsten  Rose's avatar
Carsten Rose committed
193
194
        header("Content-type: $mimetype");
        header("Content-Length: $length");
195
196
        // If defined as 'attachment': PDFs are not shown inside the browser (if user configured that). Instead, always a 'save as'-dialog appears (Chrome, FF)
        // header("Content-Disposition: attachment; filename=$outputFilename");
197
        header("Content-Disposition: inline; filename=\"$outputFilename\"; name=\"$outputFilename\"");
Carsten  Rose's avatar
Carsten Rose committed
198
199
        header("Pragma: no-cache");
        header("Expires: 0");
Carsten  Rose's avatar
Carsten Rose committed
200

201
202
203
        if ($this->getOutputFormat() === DOWNLOAD_OUTPUT_FORMAT_JSON) {
            print json_encode([JSON_TEXT => file_get_contents($file)]);
        } else {
204
            readfile($file);
205
        }
Carsten  Rose's avatar
Carsten Rose committed
206
207
208
    }

    /**
209
     * Interprets $element and fetches corresponding content, either as a file or the content in a variable.
Carsten  Rose's avatar
Carsten Rose committed
210
211
     *
     * @param string $element - U:id=myExport&r=12, u:http://www.nzz.ch/issue?nr=21, f:fileadmin/sample.pdf
Carsten  Rose's avatar
Carsten Rose committed
212
     *
213
     * @param string $downloadMode - DOWNLOAD_MODE_EXCEL | ....
214
     * @param string $rcData - With $downloadMode=DOWNLOAD_MODE_EXCEL, this contains the rendered code from the given T3 page.
Carsten  Rose's avatar
Carsten Rose committed
215
     * @return string filename - already ready or fresh exported. Fresh exported needs to be deleted later.
216
     * @throws CodeException
217
     * @throws DbException
Carsten  Rose's avatar
Carsten Rose committed
218
     * @throws DownloadException
219
     * @throws UserFormException
220
     * @throws UserReportException
221
222
223
     * @throws \PhpOffice\PhpSpreadsheet\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
Carsten  Rose's avatar
Carsten Rose committed
224
     */
225
    private function getElement($element, $downloadMode, &$rcData) {
Carsten  Rose's avatar
Carsten Rose committed
226

227
228
229
230
        $filename = '';
        $rcArgs = array();
        $rcSipEncode = false;

Carsten  Rose's avatar
Carsten Rose committed
231
232
        $arr = explode(':', $element, 2);
        if (count($arr) != 2) {
233
234
            $possibleReason = ($element === '') ? 'If this is a download link, did you forget to include s:1?' : '';
            throw new DownloadException("Missing parameter for '$element'. $possibleReason", ERROR_MISSING_REQUIRED_PARAMETER);
Carsten  Rose's avatar
Carsten Rose committed
235
        }
Carsten  Rose's avatar
Carsten Rose committed
236

Carsten  Rose's avatar
Carsten Rose committed
237
238
        $token = $arr[0];
        $value = $arr[1];
239
240
241
242
243
        if ($token === TOKEN_UID) { // extract uid
            $uidParamsArr = explode('&', $value, 2);
            $uid = $uidParamsArr[0];
            $value = $uidParamsArr[1] ?? ''; // additional params
        }
Carsten  Rose's avatar
Carsten Rose committed
244

Carsten  Rose's avatar
Carsten Rose committed
245
246
247
        switch ($token) {
            case TOKEN_URL:
            case TOKEN_URL_PARAM:
248
            case TOKEN_PAGE:
249
            case TOKEN_UID:
250
251
252
253
254
255
                $urlParam = OnString::splitParam($value, $rcArgs, $rcSipEncode);
                $urlParamString = KeyValueStringParser::unparse($urlParam, '=', '&');
                if ($rcSipEncode) {
                    $sip = new Sip();
                    $urlParamString = $sip->queryStringToSip($urlParamString, RETURN_URL);
                }
256

257
                if ($downloadMode == DOWNLOAD_MODE_EXCEL) {
258
                    if ($token === TOKEN_UID) {
259
                        $rcData = $this->getEvaluatedBodytext($uid, $urlParam);
260
261
262
263
                    } else {
                        $baseUrl = $this->store->getVar(SYSTEM_BASE_URL, STORE_SYSTEM);
                        $rcData = DownloadPage::getContent($urlParamString, $baseUrl);
                    }
264
                } else {
265
266
267
268
269
270
271
272
273
274
275
                    if ($token === TOKEN_UID) {
                        // create tmp html document with bodytext
                        $htmlText = $this->getEvaluatedBodytext($uid, $urlParam);
                        $tmpFilename = HelperFile::tempnam() . '.html';

                        $tmpFile = fopen($tmpFilename, "w") or die('Cannot create file:  '.$tmpFilename);
                        fwrite($tmpFile, $htmlText);
                        fclose($tmpFile);

                        $rcArgsString = KeyValueStringParser::unparse($rcArgs, '=', '&');
                        $url = Support::mergeUrlComponents('', $tmpFilename, $rcArgsString);
276
277
278
                        $filename = $this->html2pdf->page2pdf($token, $url);
                        HelperFile::cleanTempFiles([$tmpFilename]);

279
                    } else {
280
                        $filename = $this->html2pdf->page2pdf($token, $value);
281
                    }
282
                }
Carsten  Rose's avatar
Carsten Rose committed
283
                break;
Carsten  Rose's avatar
Carsten Rose committed
284

Carsten  Rose's avatar
Carsten Rose committed
285
            case TOKEN_FILE:
286
            case TOKEN_FILE_DEPRECATED:
Carsten  Rose's avatar
Carsten Rose committed
287
288
289
290
291
                $filename = $value;
                break;
            default:
                throw new DownloadException('Unknown token: "' . $token . '"', ERROR_UNKNOWN_TOKEN);
                break;
Carsten  Rose's avatar
Carsten Rose committed
292
293
294
295
296
        }

        return $filename;
    }

297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
    /**
     * @param $uid
     * @param array $urlParam
     *
     * @return string
     * @throws CodeException
     * @throws DbException
     * @throws DownloadException
     * @throws UserFormException
     * @throws UserReportException
     * @throws \PhpOffice\PhpSpreadsheet\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
     */
    private function getEvaluatedBodyText($uid, $urlParam) {
        foreach($urlParam as $key => $paramValue) {
            $this->store->setVar($key, $paramValue, STORE_SIP);
        }

316
        $dbT3 = $this->store->getVar(SYSTEM_DB_NAME_T3,STORE_SYSTEM);
317
318
319
320
321
322
323
324
        $sql = "SELECT bodytext FROM $dbT3.tt_content WHERE uid = ?";
        $tt_content = $this->db->sql($sql, ROW_EXPECT_1, [$uid]);

        $qfq = new QuickFormQuery([T3DATA_BODYTEXT => $tt_content[T3DATA_BODYTEXT]], false,false);
        return $qfq->process();

    }

Carsten  Rose's avatar
Carsten Rose committed
325
326
327
328
329

    /**
     * Creates a ZIP Files of all given $files
     *
     * @param array $files
Carsten  Rose's avatar
Carsten Rose committed
330
     *
Carsten  Rose's avatar
Carsten Rose committed
331
332
333
334
335
     * @return string ZIP filename - has to be deleted later.
     * @throws DownloadException
     */
    private function zipFiles(array $files) {

336
        $zipFile = HelperFile::tempnam();
Carsten  Rose's avatar
Carsten Rose committed
337
338
339
340
341
342
        if (false === $zipFile) {
            throw new DownloadException("Error creating output file.", ERROR_DOWNLOAD_CREATE_NEW_FILE);
        }

        $zip = new \ZipArchive();

Carsten  Rose's avatar
Carsten Rose committed
343
        if ($zip->open($zipFile, \ZipArchive::CREATE) !== true) {
Carsten  Rose's avatar
Carsten Rose committed
344
345
346
            throw new DownloadException("Error creating/opening new empty zip file: $zipFile", ERROR_IO_OPEN);
        }

347
        $len = strlen(TMP_FILE_PREFIX);
348
        $ii = 1;
Carsten  Rose's avatar
Carsten Rose committed
349
        foreach ($files AS $filename) {
350
            $localName = substr($filename, strrpos($filename, '/') + 1);
351

352
353
            if (substr($localName, 0, $len) == TMP_FILE_PREFIX) {
                $localName = 'file-' . $ii;
354
355
356
                $ii++;
            }

357
            $zip->addFile($filename, $localName);
Carsten  Rose's avatar
Carsten Rose committed
358
359
360
361
362
363
        }
        $zip->close();

        return $zipFile;
    }

Carsten  Rose's avatar
Carsten Rose committed
364
    /**
365
366
     * $vars[DOWNLOAD_EXPORT_FILENAME] - Optional. '<new filename>'
     * $vars[DOWNLOAD_MODE] - Optional.  file | pdf | excel | thumbnail | monitor - default is a) 'file' in case of only one or b) 'pdf' in case of multiple sources.
Carsten  Rose's avatar
Carsten Rose committed
367
368
369
370
     * HTML to PDF | Excel
     *   <i>_id=<Typo3 pageId>
     *   <i>_<key>=<value i>
     * Direct
371
     *   <i>_file=<filename>
Carsten  Rose's avatar
Carsten Rose committed
372
     *
Carsten  Rose's avatar
Carsten Rose committed
373
     * @param array $vars [ DOWNLOAD_EXPORT_FILENAME, DOWNLOAD_MODE, SIP_DOWNLOAD_PARAMETER ]
Carsten  Rose's avatar
Carsten Rose committed
374
     *
Carsten  Rose's avatar
Carsten Rose committed
375
376
     * @param string $outputMode OUTPUT_MODE_DIRECT | OUTPUT_MODE_FILE | OUTPUT_MODE_COPY_TO_FILE
     * @return string            Filename of the generated file. The filename only points to a real existing filename with  $outputMode=OUTPUT_MODE_FILE | OUTPUT_MODE_COPY_TO_FILE
377
     * @throws CodeException
378
     * @throws DbException
Carsten  Rose's avatar
Carsten Rose committed
379
     * @throws DownloadException
380
381
     * @throws UserFormException
     * @throws UserReportException
382
383
384
     * @throws \PhpOffice\PhpSpreadsheet\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
Carsten  Rose's avatar
Carsten Rose committed
385
     */
386
    private function doElements(array $vars, $outputMode) {
Carsten  Rose's avatar
Carsten Rose committed
387
388
389
390

        $tmpFiles = array();

        $workDir = $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM);
391
        HelperFile::chdir($workDir);
Carsten  Rose's avatar
Carsten Rose committed
392

Carsten  Rose's avatar
Carsten Rose committed
393
        $downloadMode = $vars[DOWNLOAD_MODE];
394

395
        if ($downloadMode == DOWNLOAD_MODE_MONITOR) {
396
            $monitor = new Monitor();
Carsten  Rose's avatar
Carsten Rose committed
397
398

            return $monitor->dump($vars[TOKEN_L_FILE], $vars[TOKEN_L_TAIL], $vars[TOKEN_L_APPEND]);
399
400
        }

401
402
403
404
405
406
407
        if ($downloadMode == DOWNLOAD_MODE_THUMBNAIL) {
            // Fake $vars control array.
            $pathFilenameThumbnail = $this->doThumbnail($vars[SIP_DOWNLOAD_PARAMETER]);
            $downloadMode = DOWNLOAD_MODE_FILE;
            $vars[SIP_DOWNLOAD_PARAMETER] = TOKEN_FILE . ':' . $pathFilenameThumbnail;
        }

Carsten  Rose's avatar
Carsten Rose committed
408
        $elements = explode(PARAM_DELIMITER, $vars[SIP_DOWNLOAD_PARAMETER]);
Carsten  Rose's avatar
Carsten Rose committed
409

410
        // Get all files / content
411
        $tmpData = array();
Carsten  Rose's avatar
Carsten Rose committed
412
        foreach ($elements as $element) {
413
            $data = '';
414
            $tmpFiles[] = $this->getElement($element, $downloadMode, $data);
415
416
            if (!empty($data)) {
                $tmpData[] = $data;
417
            }
Carsten  Rose's avatar
Carsten Rose committed
418
419
        }

Carsten  Rose's avatar
Carsten Rose committed
420
421
422
423
        // Export, Concat File(s)
        switch ($downloadMode) {
            case DOWNLOAD_MODE_ZIP:
                $filename = $this->zipFiles($tmpFiles);
424
425
426
                if (empty($vars[DOWNLOAD_EXPORT_FILENAME])) {
                    $vars[DOWNLOAD_EXPORT_FILENAME] = basename($filename);
                }
Carsten  Rose's avatar
Carsten Rose committed
427
428
429
                break;

            case DOWNLOAD_MODE_EXCEL:
430
431
432
433
434
435
436
437
438
                $excel = new Excel();
                $filename = $excel->process($tmpFiles, $tmpData);
                if (empty($vars[DOWNLOAD_EXPORT_FILENAME])) {
                    if (HelperFile::isQfqTemp($filename)) {
                        $vars[DOWNLOAD_EXPORT_FILENAME] = DOWNLOAD_OUTPUT_FILENAME . ".xlsx";
                    } else {
                        $vars[DOWNLOAD_EXPORT_FILENAME] = basename($filename);
                    }
                }
Carsten  Rose's avatar
Carsten Rose committed
439
440
                break;

Carsten  Rose's avatar
Carsten Rose committed
441
            case DOWNLOAD_MODE_FILE:
Carsten  Rose's avatar
Carsten Rose committed
442
                $filename = $tmpFiles[0];
443
                if (empty($vars[DOWNLOAD_EXPORT_FILENAME])) {
444
                    $vars[DOWNLOAD_EXPORT_FILENAME] = basename($filename);
445
                }
Carsten  Rose's avatar
Carsten Rose committed
446
                break;
Carsten  Rose's avatar
Carsten Rose committed
447
448

            case DOWNLOAD_MODE_PDF:
449

Carsten  Rose's avatar
Carsten Rose committed
450
                $filename = $this->concatPdfFiles($tmpFiles);
451

452
453
454
455
456
457
458
459
460
461
462
463
                // try to find a meaningful filename
                if (empty($vars[DOWNLOAD_EXPORT_FILENAME])) {
                    if (count($tmpFiles) > 1) {
                        $vars[DOWNLOAD_EXPORT_FILENAME] = DOWNLOAD_OUTPUT_FILENAME . ".pdf";
                    } else {
                        if (HelperFile::isQfqTemp($filename)) {
                            $vars[DOWNLOAD_EXPORT_FILENAME] = DOWNLOAD_OUTPUT_FILENAME . ".pdf";
                        } else {
                            $vars[DOWNLOAD_EXPORT_FILENAME] = basename($filename);
                        }
                    }
                }
Carsten  Rose's avatar
Carsten Rose committed
464
465
466
467
                break;

            default:
                throw new DownloadException("Unknown downloadMode: $downloadMode", ERROR_UNKNOWN_MODE);
Carsten  Rose's avatar
Carsten Rose committed
468
469
470
                break;
        }

471
472
473
474
475
        switch ($outputMode) {

            case OUTPUT_MODE_FILE:
                break;

Carsten  Rose's avatar
Carsten Rose committed
476
477
478
479
480
            case OUTPUT_MODE_COPY_TO_FILE:
                HelperFile::copy($filename, $vars[DOWNLOAD_EXPORT_FILENAME]);
                HelperFile::cleanTempFiles([$filename]);
                break;

481
            case OUTPUT_MODE_DIRECT:
482
                $this->outputFile($filename, $vars[DOWNLOAD_EXPORT_FILENAME]);
483
                HelperFile::cleanTempFiles([$filename]);
484
                $filename = '';
485
                break;
Carsten  Rose's avatar
Carsten Rose committed
486

487
488
489
490
491
            default:
                throw new CodeException('Unkown mode: ' . $outputMode, ERROR_UNKNOWN_MODE);
        }

        return $filename;
Carsten  Rose's avatar
Carsten Rose committed
492
493
    }

494
495
496
    /**
     * @param string $urlParam
     * @return string
Carsten  Rose's avatar
Carsten Rose committed
497
     * @throws CodeException
498
     * @throws UserFormException
499
500
501
502
503
504
505
506
507
508
     * @throws UserReportException
     */
    private function doThumbnail($urlParam) {

        $thumbnail = new Thumbnail();
        $pathFilenameThumbnail = $thumbnail->process($urlParam, THUMBNAIL_VIA_DOWNLOAD);

        return $pathFilenameThumbnail;
    }

Carsten  Rose's avatar
Carsten Rose committed
509
    /**
510
511
     * Process download as requested in $vars. Output is either directly send to the browser, or a file which has to be deleted later.
     *
512
     * @param string|array $vars - If $config is an array, take it, else get values from STORE_SIP
513
514
     * @param string $outputMode OUTPUT_MODE_DIRECT | OUTPUT_MODE_FILE
     *
Carsten  Rose's avatar
Carsten Rose committed
515
516
     * @return string
     * @throws CodeException
517
     * @throws DbException
518
     * @throws DownloadException
Carsten  Rose's avatar
Carsten Rose committed
519
     * @throws UserFormException
Carsten  Rose's avatar
Carsten Rose committed
520
     * @throws UserReportException
521
522
523
     * @throws \PhpOffice\PhpSpreadsheet\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
Carsten  Rose's avatar
Carsten Rose committed
524
     */
525
    public function process($vars, $outputMode = OUTPUT_MODE_DIRECT) {
Carsten  Rose's avatar
Carsten Rose committed
526

527
528
529
        if (!is_array($vars)) {
            $vars = $this->store->getStore(STORE_SIP);
        }
530

531
532
        $this->setOutputFormat(empty($vars[DOWNLOAD_OUTPUT_FORMAT]) ? DOWNLOAD_OUTPUT_FORMAT_RAW : $vars[DOWNLOAD_OUTPUT_FORMAT]);

533
        return $this->doElements($vars, $outputMode);
Carsten  Rose's avatar
Carsten Rose committed
534
535
    }

536
537
538
539
540
541
542
543
544
545
546
547
548
    /**
     * @param $outputFormat
     */
    private function setOutputFormat($outputFormat) {
        $this->outputFormat = $outputFormat;
    }

    /**
     * @return string - DOWNLOAD_OUTPUT_FORMAT_RAW | DOWNLOAD_OUTPUT_FORMAT_JSON
     */
    public function getOutputFormat() {
        return $this->outputFormat;
    }
549
}
Carsten  Rose's avatar
Carsten Rose committed
550