Blame macosx/quicklookdjvu/GenerateThumbnailForURL.m

Packit df99a1
#include <CoreFoundation/CoreFoundation.h>
Packit df99a1
#include <CoreServices/CoreServices.h>
Packit df99a1
#include <QuickLook/QuickLook.h>
Packit df99a1
#import <Cocoa/Cocoa.h>
Packit df99a1
#include <ApplicationServices/ApplicationServices.h>
Packit df99a1
Packit df99a1
#include "ddjvuRef.h"
Packit df99a1
Packit df99a1
/* -----------------------------------------------------------------------------
Packit df99a1
    Generate a thumbnail for file
Packit df99a1
Packit df99a1
   This function's job is to create thumbnail for designated file as fast as possible
Packit df99a1
   ----------------------------------------------------------------------------- */
Packit df99a1
Packit df99a1
OSStatus
Packit df99a1
GenerateThumbnailForURL(void *thisInterface,
Packit df99a1
						QLThumbnailRequestRef thumbnail,
Packit df99a1
						CFURLRef url,
Packit df99a1
						CFStringRef contentTypeUTI,
Packit df99a1
						CFDictionaryRef options,
Packit df99a1
						CGSize maxSize)
Packit df99a1
{
Packit df99a1
	char *ddjvu = ddjvuPath(QLThumbnailRequestGetGeneratorBundle(thumbnail));
Packit df99a1
	if (ddjvu != NULL) {
Packit df99a1
		NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
Packit df99a1
		NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
Packit df99a1
		NSDictionary *domain = [defaults persistentDomainForName:@"org.djvu.qlgenerator"];
Packit df99a1
		CFUUIDRef uuid;
Packit df99a1
		CFStringRef uuidString;
Packit df99a1
		NSString *tmpPath = nil;
Packit df99a1
		BOOL debug = FALSE;
Packit df99a1
		
Packit df99a1
		if (domain && [domain objectForKey:@"debug"]) {
Packit df99a1
			debug = [[domain objectForKey:@"debug"] boolValue];
Packit df99a1
		}
Packit df99a1
		if (domain && [domain objectForKey:@"thumbnail"] &&
Packit df99a1
			([[domain objectForKey:@"thumbnail"] boolValue] == FALSE))
Packit df99a1
		{
Packit df99a1
			if (debug)
Packit df99a1
				NSLog(@"skip thumbnail for %@", url);
Packit df99a1
			CFStringRef ext = CFURLCopyPathExtension(url);
Packit df99a1
			if (ext) {
Packit df99a1
				NSImage *img = [[NSWorkspace sharedWorkspace] iconForFileType:(NSString*)ext];
Packit df99a1
				if (img) {
Packit df99a1
					NSData *data = [img TIFFRepresentation];
Packit df99a1
					QLThumbnailRequestSetImageWithData(thumbnail, (CFDataRef)data, NULL);
Packit df99a1
				}
Packit df99a1
				CFRelease(ext);
Packit df99a1
			}
Packit df99a1
		} else {
Packit df99a1
			if (debug) {
Packit df99a1
				CFShow(contentTypeUTI);
Packit df99a1
				CFShow(options);			
Packit df99a1
			}
Packit df99a1
			
Packit df99a1
			uuid = CFUUIDCreate(kCFAllocatorDefault);
Packit df99a1
			if (uuid) {
Packit df99a1
				uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuid);
Packit df99a1
				if (uuidString) {
Packit df99a1
					tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:
Packit df99a1
							   [NSString stringWithFormat:@"djvuql-%@", uuidString]];
Packit df99a1
					CFRelease(uuidString);
Packit df99a1
				}
Packit df99a1
				CFRelease(uuid);
Packit df99a1
			}
Packit df99a1
			if (tmpPath) {
Packit df99a1
				NSFileManager *fmgr = [NSFileManager defaultManager];
Packit df99a1
				const char *cmd = NULL;
Packit df99a1
				CFStringRef cmdRef;
Packit df99a1
				int page = 1;
Packit df99a1
				NSString *source = (NSString *)CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
Packit df99a1
				NSString *dest = [tmpPath stringByAppendingPathComponent:[[source lastPathComponent] stringByAppendingFormat:@"_t_p%d.tiff", page]];
Packit df99a1
				[fmgr createDirectoryAtPath:tmpPath attributes:nil];			
Packit df99a1
				cmdRef = CFStringCreateWithFormat(NULL, NULL, CFSTR("\"%s\" -format=tiff -page=%d -size=%dx%d \"%s\" \"%s\""), ddjvu, page, (int)maxSize.width, (int)maxSize.height, [source fileSystemRepresentation], [dest fileSystemRepresentation]);
Packit df99a1
				cmd = CFStringGetCStringPtr(cmdRef, CFStringGetSystemEncoding());
Packit df99a1
				if (cmd != NULL) {
Packit df99a1
					if (debug)
Packit df99a1
						NSLog(@"ddjvu: %s", cmd);
Packit df99a1
					if (system(cmd) == 0) {
Packit df99a1
						NSURL *durl = [NSURL fileURLWithPath:dest];
Packit df99a1
						CGImageRef imageRef = NULL;
Packit df99a1
						CGImageSourceRef  sourceRef;
Packit df99a1
						
Packit df99a1
						sourceRef = CGImageSourceCreateWithURL((CFURLRef)durl, NULL);
Packit df99a1
						if(sourceRef) {
Packit df99a1
							imageRef = CGImageSourceCreateImageAtIndex(sourceRef, 0, NULL);
Packit df99a1
							if (imageRef)
Packit df99a1
								QLThumbnailRequestSetImage(thumbnail, imageRef, NULL);
Packit df99a1
							CFRelease(sourceRef);
Packit df99a1
						}
Packit df99a1
					}
Packit df99a1
				}
Packit df99a1
				[fmgr removeFileAtPath:tmpPath handler:nil];
Packit df99a1
				CFRelease(cmdRef);
Packit df99a1
				[source release];
Packit df99a1
			}
Packit df99a1
		}
Packit df99a1
		[pool release];
Packit df99a1
	}
Packit df99a1
    return noErr;
Packit df99a1
}
Packit df99a1
Packit df99a1
void CancelThumbnailGeneration(void* thisInterface, QLThumbnailRequestRef thumbnail)
Packit df99a1
{
Packit df99a1
    // implement only if supported
Packit df99a1
}