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