3
3
* $RCSfile: ThumbnailHelper.class,v $
5
5
* Gallery - a web based photo album viewer and editor
6
* Copyright (C) 2000-2005 Bharat Mediratta
6
* Copyright (C) 2000-2006 Bharat Mediratta
8
8
* This program is free software; you can redistribute it and/or modify
9
9
* it under the terms of the GNU General Public License as published by
20
20
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
23
* @version $Revision: 1.17 $ $Date: 2005/08/23 03:49:56 $
23
* @version $Revision: 1.21 $ $Date: 2006/02/06 20:41:20 $
24
24
* @package Thumbnail
25
25
* @author Alan Harder <alan.harder@sun.com>
69
69
list ($ret, $searchResults) =
70
70
$gallery->search($query, $data,
71
array('limit' => array('count' => $count,
72
'offset' => $offset)));
73
if ($ret->isError()) {
71
array('limit' => array('count' => (int)$count,
72
'offset' => (int)$offset)));
74
74
return array($ret->wrap(__FILE__, __LINE__), null);
78
78
while ($result = $searchResults->nextResult()) {
79
$items[$result[0]] = $result[1];
79
$items[(int)$result[0]] = $result[1];
82
return array(GalleryStatus::success(), $items);
82
return array(null, $items);
96
96
list ($ret, $searchResults) = $gallery->search(
97
97
'SELECT [ThumbnailImage::id] FROM [ThumbnailImage], [ChildEntity]
98
98
WHERE [ThumbnailImage::id] = [ChildEntity::id] AND [ChildEntity::parentId] = ?',
100
if ($ret->isError()) {
101
101
return array($ret->wrap(__FILE__, __LINE__), null);
104
104
$thumbnailImage = null;
105
105
if ($result = $searchResults->nextResult()) {
106
106
list ($ret, $thumbnailImage) = GalleryCoreApi::loadEntitiesById((int)$result[0]);
107
if ($ret->isError()) {
108
108
return array($ret->wrap(__FILE__, __LINE__), null);
112
return array(GalleryStatus::success(), $thumbnailImage);
112
return array(null, $thumbnailImage);
124
124
list ($ret, $searchResults) = $gallery->search(
125
125
'SELECT [ThumbnailImage::id], [ThumbnailImage::itemMimeTypes]
126
126
FROM [ThumbnailImage] WHERE [ThumbnailImage::itemMimeTypes] IS NOT NULL');
127
if ($ret->isError()) {
128
128
return array($ret->wrap(__FILE__, __LINE__), null);
131
131
while ($result = $searchResults->nextResult()) {
132
132
foreach (explode('|', $result[1]) as $mimeType) {
133
$data[$mimeType] = $result[0];
133
$data[$mimeType] = (int)$result[0];
136
return array(GalleryStatus::success(), $data);
136
return array(null, $data);
150
150
function fetchToolkitSupport($byMimeType=true) {
151
151
list ($ret, $tList) = GalleryCoreApi::getToolkitOperationMimeTypes('thumbnail');
152
if ($ret->isError()) {
153
153
return array($ret->wrap(__FILE__, __LINE__), null, null);
155
155
list ($ret, $cList) = GalleryCoreApi::getToolkitOperationMimeTypes('convert-to-image/jpeg');
156
if ($ret->isError()) {
157
157
return array($ret->wrap(__FILE__, __LINE__), null, null);
159
159
$data = array_merge_recursive($tList, $cList);
160
160
if ($byMimeType) {
161
return array(GalleryStatus::success(), $data, null);
161
return array(null, $data, null);
163
163
$badMime = array();
164
164
$toolkitMime = array();
202
202
$fileMimeType == 'application/unknown' || empty($mimeExtensions)) {
203
203
$extension = GalleryUtilities::getFileExtension($filename);
204
204
list ($ret, $fileMimeType) = GalleryCoreApi::convertExtensionToMime($extension);
205
if ($ret->isError()) {
206
206
$fileMimeType = 'application/unknown';
209
209
if ($fileMimeType != 'image/jpeg') {
210
return array(GalleryStatus::error(ERROR_UNSUPPORTED_FILE_TYPE, __FILE__, __LINE__),
210
return array(GalleryCoreApi::error(ERROR_UNSUPPORTED_FILE_TYPE, __FILE__, __LINE__),
214
214
if (!isset($item)) {
215
215
list ($ret, $item) =
216
216
GalleryCoreApi::newFactoryInstance('GalleryEntity', 'ThumbnailImage');
217
if ($ret->isError()) {
218
218
return array($ret->wrap(__FILE__, __LINE__), null);
220
220
if (!isset($item)) {
221
return array(GalleryStatus::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__), null);
221
return array(GalleryCoreApi::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__), null);
225
225
$ret = $item->create($tmpfile, $fileMimeType, $filename);
226
if ($ret->isError()) {
227
227
return array($ret->wrap(__FILE__, __LINE__), null);
229
229
if (isset($mimeType)) {
238
238
$item->setHeight($knownSize['height']);
240
240
$ret = $item->save();
241
if ($ret->isError()) {
242
242
return array($ret->wrap(__FILE__, __LINE__), null);
245
245
list ($ret, $adminGroupId) =
246
246
GalleryCoreApi::getPluginParameter('module', 'core', 'id.adminGroup');
247
if ($ret->isError()) {
248
248
return array($ret->wrap(__FILE__, __LINE__), null);
250
250
$ret = GalleryCoreApi::addGroupPermission($item->getId(), $adminGroupId, 'core.viewSource');
251
if ($ret->isError()) {
252
252
return array($ret->wrap(__FILE__, __LINE__), null);
256
256
$ret = GalleryCoreApi::registerToolkitOperation('Thumbnail',
257
257
array($mimeType), 'convert-to-image/jpeg', array(),
258
258
$gallery->i18n('Convert to a JPEG'), 'image/jpeg', 50);
259
if ($ret->isError()) {
260
260
return array($ret->wrap(__FILE__, __LINE__), null);
264
return array(GalleryStatus::success(), $item->getId());
264
return array(null, $item->getId());
276
276
function updateItem($itemId, $mimeType, $isAdd=true) {
277
277
list ($ret, $item) = GalleryCoreApi::loadEntitiesById($itemId);
278
if ($ret->isError()) {
279
279
return $ret->wrap(__FILE__, __LINE__);
281
281
list ($ret, $lockId) = GalleryCoreApi::acquireWriteLock($itemId);
282
if ($ret->isError()) {
283
283
return $ret->wrap(__FILE__, __LINE__);
285
285
$mimeTypes = $item->getItemMimeTypesList();
296
296
$item->setItemMimeTypesList($newList);
298
298
$ret = $item->save();
299
if ($ret->isError()) {
300
300
GalleryCoreApi::releaseLocks($lockId);
301
301
return $ret->wrap(__FILE__, __LINE__);
303
303
$ret = GalleryCoreApi::releaseLocks($lockId);
304
if ($ret->isError()) {
305
305
return $ret->wrap(__FILE__, __LINE__);
309
309
$ret = GalleryCoreApi::registerToolkitOperation('Thumbnail',
310
310
array($mimeType), 'convert-to-image/jpeg', array(),
311
311
$gallery->i18n('Convert to a JPEG'), 'image/jpeg', 50);
312
if ($ret->isError()) {
313
313
return $ret->wrap(__FILE__, __LINE__);
316
316
$ret = GalleryCoreApi::unregisterToolkitOperation('Thumbnail',
317
317
'convert-to-image/jpeg', array($mimeType));
318
if ($ret->isError()) {
319
319
return $ret->wrap(__FILE__, __LINE__);
322
return GalleryStatus::success();
333
333
function applyThumbnail(&$item, $thumbnailId) {
334
334
list ($ret, $derivative) = GalleryCoreApi::fetchThumbnailsByItemIds(array($item->getId()));
335
if ($ret->isError()) {
336
336
return $ret->wrap(__FILE__, __LINE__);
338
338
if (!empty($derivative)) {
339
339
$derivative = array_shift($derivative);
340
340
list ($ret, $lockId) = GalleryCoreApi::acquireWriteLock($derivative->getId());
341
if ($ret->isError()) {
342
342
return $ret->wrap(__FILE__, __LINE__);
344
/* Make sure operations just contains thumbnail|{size} */
344
/* Make sure operations contains only thumbnail and composite */
345
345
$derivative->setDerivativeOperations(
346
preg_replace('/^(?:.*;)?(thumbnail\|\d+)(?:;.*)?$/', '$1',
347
$derivative->getDerivativeOperations()));
346
rtrim(preg_replace('/(^|;)((?!thumbnail\||composite\|).*?(;|$))+/', '$1',
347
$derivative->getDerivativeOperations()), ';'));
349
349
list ($ret, $derivative) =
350
350
GalleryCoreApi::newFactoryInstanceByHint('GalleryDerivative', 'ThumbnailImage');
351
if ($ret->isError()) {
352
352
return $ret->wrap(__FILE__, __LINE__);
354
354
if (!isset($derivative)) {
355
return GalleryStatus::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__);
355
return GalleryCoreApi::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__);
357
357
$ret = $derivative->create($item->getId(), DERIVATIVE_TYPE_IMAGE_THUMBNAIL);
358
if ($ret->isError()) {
359
359
return $ret->wrap(__FILE__, __LINE__);
361
361
list ($ret, $prefs) =
362
362
GalleryCoreApi::fetchDerivativePreferencesForItem($item->getParentId());
363
if ($ret->isError()) {
364
364
return $ret->wrap(__FILE__, __LINE__);
366
366
$op = 'thumbnail|150';
373
373
$derivative->setDerivativeOperations($op);
376
list ($ret, $mimeList) = GalleryCoreApi::getToolkitOperationMimeTypes('thumbnail');
378
return $ret->wrap(__FILE__, __LINE__);
380
if (!isset($mimeList['image/jpeg'])) {
382
* No toolkit for jpeg thumbnails.
383
* Omit thumbnail operation to just use custom thumbnail in its original size.
385
$derivative->setDerivativeOperations(
386
rtrim(preg_replace('/(^|;)thumbnail\|.*?(;|$)/', '$1',
387
$derivative->getDerivativeOperations()), ';'));
376
390
$derivative->setDerivativeSourceId($thumbnailId);
377
391
$derivative->setMimeType('image/jpeg');
378
392
$ret = $derivative->save();
379
if ($ret->isError()) {
380
394
if (isset($lockId)) {
381
395
GalleryCoreApi::releaseLocks($lockId);
403
417
function restoreThumbnail(&$item) {
404
418
list ($ret, $derivative) = GalleryCoreApi::fetchThumbnailsByItemIds(array($item->getId()));
405
if ($ret->isError()) {
406
420
return $ret->wrap(__FILE__, __LINE__);
408
422
if (empty($derivative)) {
409
return GalleryStatus::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__);
423
return GalleryCoreApi::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__);
411
425
$derivative = array_shift($derivative);
413
427
if (GalleryUtilities::isA($item, 'GalleryAlbumItem')) {
414
428
list ($ret, $success) = GalleryCoreApi::guaranteeAlbumHasThumbnail($item->getId());
415
if ($ret->isError()) {
416
430
return $ret->wrap(__FILE__, __LINE__);
418
return GalleryStatus::success();
421
/* Make sure operations just contains thumbnail|{size} */
422
$operations = preg_replace('/^(?:.*;)?(thumbnail\|\d+)(?:;.*)?$/', '$1',
423
$derivative->getDerivativeOperations());
435
/* Make sure operations contains only thumbnail and composite */
436
$operations = rtrim(preg_replace('/(^|;)((?!thumbnail\||composite\|).*?(;|$))+/', '$1',
437
$derivative->getDerivativeOperations()), ';');
425
439
list ($ret, $source) = GalleryCoreApi::fetchPreferredSource($item);
426
if ($ret->isError()) {
427
441
return $ret->wrap(__FILE__, __LINE__);
430
444
list ($ret, $operations, $outputMimeType) =
431
445
GalleryCoreApi::makeSupportedViewableOperationSequence(
432
446
$source->getMimeType(), $operations, true);
433
if ($ret->isError()) {
434
448
return $ret->wrap(__FILE__, __LINE__);
437
451
if (empty($operations)) {
438
452
/* Operations not supported.. remove the thumbnail */
439
453
$ret = GalleryCoreApi::deleteEntityById($derivative->getId());
440
if ($ret->isError()) {
441
455
return $ret->wrap(__FILE__, __LINE__);
444
458
list ($ret, $lockId) = GalleryCoreApi::acquireWriteLock($derivative->getId());
445
if ($ret->isError()) {
446
460
return $ret->wrap(__FILE__, __LINE__);
451
465
$derivative->setDerivativeSourceId($source->getId());
453
467
$ret = $derivative->save();
454
if ($ret->isError()) {
455
469
return $ret->wrap(__FILE__, __LINE__);
458
472
$ret = GalleryCoreApi::releaseLocks($lockId);
459
if ($ret->isError()) {
460
474
return $ret->wrap(__FILE__, __LINE__);
464
return GalleryStatus::success();
480
494
ORDER BY [GalleryMimeTypeMap::mimeType]
482
496
list ($ret, $searchResults) = $gallery->search($query);
483
if ($ret->isError()) {
484
498
return array($ret->wrap(__FILE__, __LINE__), null);
486
500
while ($result = $searchResults->nextResult()) {
490
504
foreach(array_keys($typeMap) as $mimeType) {
491
505
$typeMap[$mimeType] = implode(' ', $typeMap[$mimeType]);
493
return array(GalleryStatus::success(), $typeMap);
507
return array(null, $typeMap);