├── examples ├── readme.txt ├── AYL-BUR.NFO ├── AYL-SWE.NFO ├── CPN-BP.NFO ├── CPN-LGC.NFO ├── preview.png ├── ACME-NFO.NFO └── thumbnails.png ├── QuickNFO.qlgenerator.zip ├── English.lproj └── InfoPlist.strings ├── .gitignore ├── quicklooknfo.h ├── README.md ├── GeneratePreviewForURL.c ├── GenerateThumbnailForURL.m ├── Info.plist ├── quicklooknfo.c ├── main.c └── QuickNFO.xcodeproj └── project.pbxproj /examples/readme.txt: -------------------------------------------------------------------------------- 1 | Examples taken from http://www.roysac.com/otherascii.asp -------------------------------------------------------------------------------- /examples/AYL-BUR.NFO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/examples/AYL-BUR.NFO -------------------------------------------------------------------------------- /examples/AYL-SWE.NFO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/examples/AYL-SWE.NFO -------------------------------------------------------------------------------- /examples/CPN-BP.NFO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/examples/CPN-BP.NFO -------------------------------------------------------------------------------- /examples/CPN-LGC.NFO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/examples/CPN-LGC.NFO -------------------------------------------------------------------------------- /examples/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/examples/preview.png -------------------------------------------------------------------------------- /examples/ACME-NFO.NFO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/examples/ACME-NFO.NFO -------------------------------------------------------------------------------- /QuickNFO.qlgenerator.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/QuickNFO.qlgenerator.zip -------------------------------------------------------------------------------- /examples/thumbnails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/examples/thumbnails.png -------------------------------------------------------------------------------- /English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planbnet/QuickNFO/HEAD/English.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | .DS_Store 3 | *.mode1v3 4 | *.pbxuser 5 | QuickNFO.xcodeproj/xcuserdata 6 | QuickNFO.xcodeproj/project.xcworkspace -------------------------------------------------------------------------------- /quicklooknfo.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | CFDataRef createHTMLPreview( CFURLRef url) CF_RETURNS_RETAINED; 5 | CFDataRef createDataFromURL( CFURLRef url) CF_RETURNS_RETAINED; 6 | CFDataRef createConvertedString( CFDataRef text, char* srcEncoding, char* dstEncoding ) CF_RETURNS_RETAINED; 7 | CFDataRef createHTMLData( CFDataRef nfoString) CF_RETURNS_RETAINED; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | QuickNFO 2 | ================== 3 | 4 | Mac OSX QuickLook Plugin for previewing NFO files 5 | 6 | Uses libiconv to convert the nfo text to utf8 and then lets WebKit render the output. Seems to work well (at least for the few cases I have tested). 7 | 8 | The current version supports preview and thumbnail generation. Rendering with HiDPI, like on retina displays, is also supported. 9 | 10 | Installation 11 | ================== 12 | 13 | Build the xcode project or download the [compiled plugin][download]. Then copy the file `QuickNFO.qlgenerator` to the path `Library/QuickLook` inside your home directory. 14 | 15 | [download]:https://github.com/planbnet/QuickNFO/raw/master/QuickNFO.qlgenerator.zip 16 | 17 | Examples 18 | ================== 19 | ### Thumbnails 20 | QuickLook Thumbnails 21 | 22 | ### Preview 23 | QuickLook Preview 24 | -------------------------------------------------------------------------------- /GeneratePreviewForURL.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "quicklooknfo.h" 5 | 6 | OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) 7 | { 8 | if (QLPreviewRequestIsCancelled(preview)) 9 | return noErr; 10 | 11 | CFDataRef data = createHTMLPreview( url ); 12 | 13 | if (!data || QLPreviewRequestIsCancelled(preview)) { 14 | if (data) 15 | CFRelease(data); 16 | return noErr; 17 | } 18 | 19 | CFStringRef keys[1]; 20 | CFStringRef values[1]; 21 | values[0] = CFStringCreateWithCString(NULL, "UTF-8", kCFStringEncodingUTF8); 22 | keys[0] = kQLPreviewPropertyTextEncodingNameKey; 23 | CFDictionaryRef properties = CFDictionaryCreate(NULL, (const void **) &keys, (const void **) &values, 1, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 24 | QLPreviewRequestSetDataRepresentation(preview, (CFDataRef)data, 25 | kUTTypeHTML, 26 | properties); 27 | 28 | CFRelease(data); 29 | CFRelease(values[0]); 30 | CFRelease(properties); 31 | 32 | return noErr; 33 | } 34 | 35 | void CancelPreviewGeneration(void* thisInterface, QLPreviewRequestRef preview) 36 | { 37 | 38 | } 39 | -------------------------------------------------------------------------------- /GenerateThumbnailForURL.m: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #include "quicklooknfo.h" 7 | 8 | #define minSize 32 9 | #define thumbnailWidth 490.0 10 | #define thumbnailHeight 800.0 11 | 12 | OSStatus 13 | GenerateThumbnailForURL(void *thisInterface, 14 | QLThumbnailRequestRef thumbnail, 15 | CFURLRef url, 16 | CFStringRef contentTypeUTI, 17 | CFDictionaryRef options, 18 | CGSize maxSize) 19 | { 20 | 21 | if (maxSize.width < minSize || maxSize.height < minSize) 22 | return noErr; 23 | 24 | NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 25 | 26 | NSRect renderRect = NSMakeRect(0.0, 0.0, thumbnailWidth, thumbnailHeight); 27 | float scale = maxSize.height/thumbnailHeight; 28 | NSSize scaleSize = NSMakeSize(scale, scale); 29 | CGSize thumbSize = NSSizeToCGSize( 30 | NSMakeSize((maxSize.width * (thumbnailWidth/thumbnailHeight)), 31 | maxSize.height)); 32 | 33 | CFDataRef dataRef = createHTMLPreview( url ); 34 | NSData *data = (id)dataRef; 35 | 36 | WebView* webView = [[WebView alloc] initWithFrame:renderRect]; 37 | [webView scaleUnitSquareToSize:scaleSize]; 38 | [[[webView mainFrame] frameView] setAllowsScrolling:NO]; 39 | 40 | [[webView mainFrame] loadData:data MIMEType:@"text/html" 41 | textEncodingName:@"UTF-8" baseURL:nil]; 42 | 43 | while([webView isLoading]) { 44 | CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true); 45 | } 46 | 47 | // Get a context to render into 48 | CGContextRef context = 49 | QLThumbnailRequestCreateContext(thumbnail, thumbSize, false, NULL); 50 | 51 | if(context != NULL) { 52 | NSGraphicsContext* nsContext = 53 | [NSGraphicsContext 54 | graphicsContextWithGraphicsPort:(void *)context 55 | flipped:[webView isFlipped]]; 56 | 57 | [webView displayRectIgnoringOpacity:[webView bounds] 58 | inContext:nsContext]; 59 | 60 | QLThumbnailRequestFlushContext(thumbnail, context); 61 | 62 | CFRelease(context); 63 | } 64 | 65 | CFRelease(data); 66 | [webView release]; 67 | 68 | [pool release]; 69 | 70 | return noErr; 71 | } 72 | 73 | void CancelThumbnailGeneration(void* thisInterface, QLThumbnailRequestRef thumbnail) 74 | { 75 | 76 | } 77 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDocumentTypes 8 | 9 | 10 | CFBundleTypeExtensions 11 | 12 | nfo 13 | 14 | CFBundleTypeRole 15 | QLGenerator 16 | LSItemContentTypes 17 | 18 | org.planbnet.nfo 19 | 20 | 21 | 22 | CFBundleExecutable 23 | QuickNFO 24 | CFBundleIdentifier 25 | org.planbnet.quicknfo 26 | CFBundleInfoDictionaryVersion 27 | 6.0 28 | CFBundleName 29 | QuickNFO 30 | CFBundleShortVersionString 31 | 1 32 | CFBundleVersion 33 | 1.0 34 | CFPlugInDynamicRegisterFunction 35 | 36 | CFPlugInDynamicRegistration 37 | NO 38 | CFPlugInFactories 39 | 40 | 2BD13CD5-0672-40C3-AAA6-EC996596815C 41 | QuickLookGeneratorPluginFactory 42 | 43 | CFPlugInTypes 44 | 45 | 5E2D9680-5022-40FA-B806-43349622E5B9 46 | 47 | 2BD13CD5-0672-40C3-AAA6-EC996596815C 48 | 49 | 50 | CFPlugInUnloadFunction 51 | 52 | QLNeedsToBeRunInMainThread 53 | 54 | QLPreviewHeight 55 | 800 56 | QLPreviewWidth 57 | 490 58 | QLSupportsConcurrentRequests 59 | 60 | QLThumbnailMinimumSize 61 | 32 62 | UTExportedTypeDeclarations 63 | 64 | 65 | UTTypeConformsTo 66 | 67 | public.text 68 | public.plain-text 69 | 70 | UTTypeDescription 71 | NFO File 72 | UTTypeIdentifier 73 | org.planbnet.nfo 74 | UTTypeTagSpecification 75 | 76 | com.apple.ostype 77 | TEXT 78 | public.filename-extension 79 | 80 | nfo 81 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /quicklooknfo.c: -------------------------------------------------------------------------------- 1 | #include "quicklooknfo.h" 2 | #include 3 | #include 4 | 5 | #define BUFFERSIZE 1024 * 16 6 | 7 | #define PRE_NFO_HTML "
"
  8 | #define POST_NFO_HTML "
" 9 | 10 | #define PRE_BLOCK_HTML "" 11 | #define POST_BLOCK_HTML "" 12 | 13 | int main(int argc, char* argv[]) { 14 | if (argc < 2) { 15 | printf("Specify nfo file"); 16 | return 1; 17 | } 18 | CFStringRef path = CFStringCreateWithCString(NULL, argv[1], kCFStringEncodingUTF8); 19 | CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, false); 20 | CFRelease(path); 21 | CFDataRef text = createDataFromURL(url); 22 | CFRelease(url); 23 | if (!text) { 24 | printf("File does not exist"); 25 | return 2; 26 | } 27 | CFDataRef result = createConvertedString(text, "437", "UTF8"); 28 | CFRelease(text); 29 | printf("%s", CFDataGetBytePtr(result)); 30 | CFRelease(result); 31 | return 0; 32 | } 33 | 34 | CFDataRef createHTMLPreview( CFURLRef url ) 35 | { 36 | CFDataRef text = createDataFromURL(url); 37 | if (!text) return NULL; 38 | 39 | CFDataRef ucs2 = createConvertedString(text, "437", "UCS-2-INTERNAL"); 40 | CFRelease(text); 41 | if (!ucs2) return NULL; 42 | 43 | CFDataRef page2 = createHTMLData(ucs2); 44 | CFRelease(ucs2); 45 | if (!page2) return NULL; 46 | 47 | CFDataRef result = createConvertedString(page2, "UCS-2-INTERNAL", "UTF8"); 48 | CFRelease(page2); 49 | 50 | return result; 51 | } 52 | 53 | CFDataRef createDataFromURL( CFURLRef url ) 54 | { 55 | CFMutableDataRef fileContent = CFDataCreateMutable(kCFAllocatorDefault, 0); 56 | CFReadStreamRef stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url); 57 | 58 | if (stream) { 59 | if (CFReadStreamOpen(stream)) { 60 | UInt8 buffer[BUFFERSIZE]; 61 | CFIndex bytesRead; 62 | do { 63 | bytesRead = CFReadStreamRead(stream, buffer, sizeof(buffer)); 64 | if (bytesRead > 0) { 65 | CFDataAppendBytes(fileContent, buffer, bytesRead); 66 | } 67 | } while (bytesRead > 0); 68 | CFReadStreamClose(stream); 69 | } 70 | CFRelease(stream); 71 | } 72 | 73 | return fileContent; 74 | } 75 | 76 | CFDataRef createConvertedString( CFDataRef text, char* srcEncoding, char* dstEncoding ) 77 | { 78 | iconv_t cd; 79 | cd = iconv_open (dstEncoding, srcEncoding); 80 | if (cd == (iconv_t) -1) 81 | return NULL; 82 | 83 | CFMutableDataRef result = CFDataCreateMutable(NULL, 0); 84 | 85 | char *inPtr = (char*) CFDataGetBytePtr(text); 86 | size_t inBytesLeft = CFDataGetLength(text); 87 | 88 | char buffer[BUFFERSIZE]; 89 | do { 90 | size_t outBytesLeft = BUFFERSIZE; 91 | char *outPtr = (char*)buffer; 92 | iconv(cd, &inPtr, &inBytesLeft, &outPtr , &outBytesLeft); 93 | CFIndex converted = BUFFERSIZE - outBytesLeft; 94 | CFDataAppendBytes(result, (UInt8*) &buffer, converted); 95 | } while (inBytesLeft > 0); 96 | 97 | iconv_close( cd ); 98 | 99 | return result; 100 | } 101 | 102 | CFDataRef createUCS2FromConst(char * ptr, size_t length) { 103 | CFDataRef tmp = CFDataCreate(NULL, (UInt8*)ptr, length); 104 | CFDataRef result = createConvertedString(tmp, "C99", "UCS-2-INTERNAL"); 105 | CFRelease(tmp); 106 | 107 | return result; 108 | } 109 | 110 | void appendCFData(CFMutableDataRef dst, CFDataRef src) { 111 | CFDataAppendBytes(dst, CFDataGetBytePtr(src), CFDataGetLength(src)); 112 | } 113 | 114 | #define ISBLOCKORBOX(wchar) ((wchar >= 0x2500) && (wchar <= 0x25A9)) 115 | #define ISWHITESPACE(wchar) ((wchar <= 0x0020)) 116 | 117 | CFDataRef createHTMLData(CFDataRef nfo) { 118 | // Load HTML constants (UCS2) 119 | CFDataRef preNfo = createUCS2FromConst(PRE_NFO_HTML, sizeof(PRE_NFO_HTML)); 120 | CFDataRef postNfo = createUCS2FromConst(POST_NFO_HTML, sizeof(POST_NFO_HTML)); 121 | CFDataRef preBlock = createUCS2FromConst(PRE_BLOCK_HTML, sizeof(PRE_BLOCK_HTML)); 122 | CFDataRef postBlock = createUCS2FromConst(POST_BLOCK_HTML, sizeof(POST_BLOCK_HTML)); 123 | 124 | 125 | CFMutableDataRef result = CFDataCreateMutable(NULL, 0); 126 | 127 | appendCFData(result, preNfo); 128 | CFRelease(preNfo); 129 | 130 | const UInt8* inPtr = CFDataGetBytePtr(nfo); 131 | size_t inCharsLeft = CFDataGetLength(nfo) / sizeof(UInt16); 132 | 133 | const UInt8* bsPtr = inPtr; 134 | bool inRun = false; 135 | 136 | while (inCharsLeft-- > 0) { 137 | UInt16 chr = *((const UInt16*)inPtr); 138 | 139 | // Look ahead for new state 140 | bool newState = inRun; 141 | 142 | if(!inRun) { 143 | if(ISBLOCKORBOX(chr)) { 144 | newState = true; 145 | } 146 | } else { 147 | if(!ISBLOCKORBOX(chr) && !ISWHITESPACE(chr)) { 148 | newState = false; 149 | } 150 | } 151 | 152 | // Process change of state, append data 153 | if(inRun != newState) { 154 | if(inPtr != bsPtr) { 155 | if(inRun) { 156 | appendCFData(result, preBlock); 157 | CFDataAppendBytes(result, (const UInt8*)bsPtr, (inPtr - bsPtr)); 158 | appendCFData(result, postBlock); 159 | } else { 160 | CFDataAppendBytes(result, (const UInt8*)bsPtr, (inPtr - bsPtr)); 161 | } 162 | 163 | bsPtr = inPtr; 164 | } 165 | 166 | inRun = newState; 167 | } 168 | 169 | inPtr += sizeof(UInt16); 170 | } 171 | 172 | // Append trailing data 173 | if(inPtr > bsPtr) { 174 | if(inRun) { 175 | appendCFData(result, preBlock); 176 | CFDataAppendBytes(result, (const UInt8*)bsPtr, (inPtr - bsPtr)); 177 | appendCFData(result, postBlock); 178 | } else { 179 | CFDataAppendBytes(result, (const UInt8*)bsPtr, (inPtr - bsPtr)); 180 | } 181 | } 182 | 183 | CFRelease(preBlock); 184 | CFRelease(postBlock); 185 | 186 | appendCFData(result, postNfo); 187 | CFRelease(postNfo); 188 | 189 | return result; 190 | } -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | //============================================================================== 2 | // 3 | // DO NO MODIFY THE CONTENT OF THIS FILE 4 | // 5 | // This file contains the generic CFPlug-in code necessary for your generator 6 | // To complete your generator implement the function in GenerateThumbnailForURL/GeneratePreviewForURL.c 7 | // 8 | //============================================================================== 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | // ----------------------------------------------------------------------------- 16 | // constants 17 | // ----------------------------------------------------------------------------- 18 | 19 | // Don't modify this line 20 | #define PLUGIN_ID "2BD13CD5-0672-40C3-AAA6-EC996596815C" 21 | 22 | // 23 | // Below is the generic glue code for all plug-ins. 24 | // 25 | // You should not have to modify this code aside from changing 26 | // names if you decide to change the names defined in the Info.plist 27 | // 28 | 29 | 30 | // ----------------------------------------------------------------------------- 31 | // typedefs 32 | // ----------------------------------------------------------------------------- 33 | 34 | // The thumbnail generation function to be implemented in GenerateThumbnailForURL.c 35 | OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize); 36 | void CancelThumbnailGeneration(void* thisInterface, QLThumbnailRequestRef thumbnail); 37 | 38 | // The preview generation function to be implemented in GeneratePreviewForURL.c 39 | OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); 40 | void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview); 41 | 42 | // The layout for an instance of QuickLookGeneratorPlugIn 43 | typedef struct __QuickLookGeneratorPluginType 44 | { 45 | void *conduitInterface; 46 | CFUUIDRef factoryID; 47 | UInt32 refCount; 48 | } QuickLookGeneratorPluginType; 49 | 50 | // ----------------------------------------------------------------------------- 51 | // prototypes 52 | // ----------------------------------------------------------------------------- 53 | // Forward declaration for the IUnknown implementation. 54 | // 55 | 56 | QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID); 57 | void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance); 58 | HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv); 59 | void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID); 60 | ULONG QuickLookGeneratorPluginAddRef(void *thisInstance); 61 | ULONG QuickLookGeneratorPluginRelease(void *thisInstance); 62 | 63 | // ----------------------------------------------------------------------------- 64 | // myInterfaceFtbl definition 65 | // ----------------------------------------------------------------------------- 66 | // The QLGeneratorInterfaceStruct function table. 67 | // 68 | static QLGeneratorInterfaceStruct myInterfaceFtbl = { 69 | NULL, 70 | QuickLookGeneratorQueryInterface, 71 | QuickLookGeneratorPluginAddRef, 72 | QuickLookGeneratorPluginRelease, 73 | NULL, 74 | NULL, 75 | NULL, 76 | NULL 77 | }; 78 | 79 | 80 | // ----------------------------------------------------------------------------- 81 | // AllocQuickLookGeneratorPluginType 82 | // ----------------------------------------------------------------------------- 83 | // Utility function that allocates a new instance. 84 | // You can do some initial setup for the generator here if you wish 85 | // like allocating globals etc... 86 | // 87 | QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID) 88 | { 89 | QuickLookGeneratorPluginType *theNewInstance; 90 | 91 | theNewInstance = (QuickLookGeneratorPluginType *)malloc(sizeof(QuickLookGeneratorPluginType)); 92 | memset(theNewInstance,0,sizeof(QuickLookGeneratorPluginType)); 93 | 94 | /* Point to the function table Malloc enough to store the stuff and copy the filler from myInterfaceFtbl over */ 95 | theNewInstance->conduitInterface = malloc(sizeof(QLGeneratorInterfaceStruct)); 96 | memcpy(theNewInstance->conduitInterface,&myInterfaceFtbl,sizeof(QLGeneratorInterfaceStruct)); 97 | 98 | /* Retain and keep an open instance refcount for each factory. */ 99 | theNewInstance->factoryID = CFRetain(inFactoryID); 100 | CFPlugInAddInstanceForFactory(inFactoryID); 101 | 102 | /* This function returns the IUnknown interface so set the refCount to one. */ 103 | theNewInstance->refCount = 1; 104 | return theNewInstance; 105 | } 106 | 107 | // ----------------------------------------------------------------------------- 108 | // DeallocQuickLookGeneratorPluginType 109 | // ----------------------------------------------------------------------------- 110 | // Utility function that deallocates the instance when 111 | // the refCount goes to zero. 112 | // In the current implementation generator interfaces are never deallocated 113 | // but implement this as this might change in the future 114 | // 115 | void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance) 116 | { 117 | CFUUIDRef theFactoryID; 118 | 119 | theFactoryID = thisInstance->factoryID; 120 | /* Free the conduitInterface table up */ 121 | free(thisInstance->conduitInterface); 122 | 123 | /* Free the instance structure */ 124 | free(thisInstance); 125 | if (theFactoryID){ 126 | CFPlugInRemoveInstanceForFactory(theFactoryID); 127 | CFRelease(theFactoryID); 128 | } 129 | } 130 | 131 | // ----------------------------------------------------------------------------- 132 | // QuickLookGeneratorQueryInterface 133 | // ----------------------------------------------------------------------------- 134 | // Implementation of the IUnknown QueryInterface function. 135 | // 136 | HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv) 137 | { 138 | CFUUIDRef interfaceID; 139 | 140 | interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault,iid); 141 | 142 | if (CFEqual(interfaceID,kQLGeneratorCallbacksInterfaceID)){ 143 | /* If the Right interface was requested, bump the ref count, 144 | * set the ppv parameter equal to the instance, and 145 | * return good status. 146 | */ 147 | ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GenerateThumbnailForURL = GenerateThumbnailForURL; 148 | ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelThumbnailGeneration = CancelThumbnailGeneration; 149 | ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GeneratePreviewForURL = GeneratePreviewForURL; 150 | ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelPreviewGeneration = CancelPreviewGeneration; 151 | ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType*)thisInstance)->conduitInterface)->AddRef(thisInstance); 152 | *ppv = thisInstance; 153 | CFRelease(interfaceID); 154 | return S_OK; 155 | }else{ 156 | /* Requested interface unknown, bail with error. */ 157 | *ppv = NULL; 158 | CFRelease(interfaceID); 159 | return E_NOINTERFACE; 160 | } 161 | } 162 | 163 | // ----------------------------------------------------------------------------- 164 | // QuickLookGeneratorPluginAddRef 165 | // ----------------------------------------------------------------------------- 166 | // Implementation of reference counting for this type. Whenever an interface 167 | // is requested, bump the refCount for the instance. NOTE: returning the 168 | // refcount is a convention but is not required so don't rely on it. 169 | // 170 | ULONG QuickLookGeneratorPluginAddRef(void *thisInstance) 171 | { 172 | ((QuickLookGeneratorPluginType *)thisInstance )->refCount += 1; 173 | return ((QuickLookGeneratorPluginType*) thisInstance)->refCount; 174 | } 175 | 176 | // ----------------------------------------------------------------------------- 177 | // QuickLookGeneratorPluginRelease 178 | // ----------------------------------------------------------------------------- 179 | // When an interface is released, decrement the refCount. 180 | // If the refCount goes to zero, deallocate the instance. 181 | // 182 | ULONG QuickLookGeneratorPluginRelease(void *thisInstance) 183 | { 184 | ((QuickLookGeneratorPluginType*)thisInstance)->refCount -= 1; 185 | if (((QuickLookGeneratorPluginType*)thisInstance)->refCount == 0){ 186 | DeallocQuickLookGeneratorPluginType((QuickLookGeneratorPluginType*)thisInstance ); 187 | return 0; 188 | }else{ 189 | return ((QuickLookGeneratorPluginType*) thisInstance )->refCount; 190 | } 191 | } 192 | 193 | // ----------------------------------------------------------------------------- 194 | // QuickLookGeneratorPluginFactory 195 | // ----------------------------------------------------------------------------- 196 | void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID) 197 | { 198 | QuickLookGeneratorPluginType *result; 199 | CFUUIDRef uuid; 200 | 201 | /* If correct type is being requested, allocate an 202 | * instance of kQLGeneratorTypeID and return the IUnknown interface. 203 | */ 204 | if (CFEqual(typeID,kQLGeneratorTypeID)){ 205 | uuid = CFUUIDCreateFromString(kCFAllocatorDefault,CFSTR(PLUGIN_ID)); 206 | result = AllocQuickLookGeneratorPluginType(uuid); 207 | CFRelease(uuid); 208 | return result; 209 | } 210 | /* If the requested type is incorrect, return NULL. */ 211 | return NULL; 212 | } 213 | 214 | -------------------------------------------------------------------------------- /QuickNFO.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2C05A19C06CAA52B00D84F6F /* GeneratePreviewForURL.c in Sources */ = {isa = PBXBuildFile; fileRef = 2C05A19B06CAA52B00D84F6F /* GeneratePreviewForURL.c */; }; 11 | 5A7C95BA124A79C50056DCAE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A7C95B9124A79C50056DCAE /* Cocoa.framework */; }; 12 | 5A7C95BE124A79DD0056DCAE /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A7C95BD124A79DD0056DCAE /* WebKit.framework */; }; 13 | 5A938943120C54DD00202A3D /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A938942120C54DD00202A3D /* libiconv.2.dylib */; }; 14 | 5A93894A120C555E00202A3D /* quicklooknfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 5A938948120C555E00202A3D /* quicklooknfo.c */; }; 15 | 5A938E0B120C65B400202A3D /* quicklooknfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A938E0A120C65B400202A3D /* quicklooknfo.h */; }; 16 | 5AF76572120C7F94009444C5 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AF76571120C7F94009444C5 /* CoreFoundation.framework */; }; 17 | 5AF76574120C7F9C009444C5 /* libiconv.2.4.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AF76573120C7F9C009444C5 /* libiconv.2.4.0.dylib */; }; 18 | 5AF76580120C8005009444C5 /* quicklooknfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 5A938948120C555E00202A3D /* quicklooknfo.c */; }; 19 | 5AF76586120C8034009444C5 /* quicklooknfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A938E0A120C65B400202A3D /* quicklooknfo.h */; }; 20 | 61E3BCFB0870B4F2002186A0 /* GenerateThumbnailForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 61E3BCFA0870B4F2002186A0 /* GenerateThumbnailForURL.m */; }; 21 | 8D576312048677EA00EA77CD /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 08FB77B6FE84183AC02AAC07 /* main.c */; settings = {ATTRIBUTES = (); }; }; 22 | 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; }; 23 | 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; }; 24 | C86B05270671AA6E00DD9006 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C86B05260671AA6E00DD9006 /* CoreServices.framework */; }; 25 | F28CFBFD0A3EC0AF000ABFF5 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F28CFBFC0A3EC0AF000ABFF5 /* ApplicationServices.framework */; }; 26 | F28CFC030A3EC0C6000ABFF5 /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F28CFC020A3EC0C6000ABFF5 /* QuickLook.framework */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 31 | 08FB77B6FE84183AC02AAC07 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; 32 | 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; 33 | 2C05A19B06CAA52B00D84F6F /* GeneratePreviewForURL.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = GeneratePreviewForURL.c; sourceTree = ""; }; 34 | 5A7C95B9124A79C50056DCAE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 35 | 5A7C95BD124A79DD0056DCAE /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 36 | 5A938942120C54DD00202A3D /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = /usr/lib/libiconv.2.dylib; sourceTree = ""; }; 37 | 5A938948120C555E00202A3D /* quicklooknfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quicklooknfo.c; sourceTree = ""; }; 38 | 5A938E0A120C65B400202A3D /* quicklooknfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quicklooknfo.h; sourceTree = ""; }; 39 | 5ACCE91D120CA1350064B603 /* NFOConvert */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NFOConvert; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | 5AF76571120C7F94009444C5 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 41 | 5AF76573120C7F9C009444C5 /* libiconv.2.4.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.4.0.dylib; path = usr/lib/libiconv.2.4.0.dylib; sourceTree = SDKROOT; }; 42 | 61E3BCFA0870B4F2002186A0 /* GenerateThumbnailForURL.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = GenerateThumbnailForURL.m; sourceTree = ""; }; 43 | 8D576316048677EA00EA77CD /* QuickNFO.qlgenerator */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuickNFO.qlgenerator; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 45 | C86B05260671AA6E00DD9006 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; }; 46 | F28CFBFC0A3EC0AF000ABFF5 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; }; 47 | F28CFC020A3EC0C6000ABFF5 /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = /System/Library/Frameworks/QuickLook.framework; sourceTree = ""; }; 48 | /* End PBXFileReference section */ 49 | 50 | /* Begin PBXFrameworksBuildPhase section */ 51 | 5AF7653E120C7F6D009444C5 /* Frameworks */ = { 52 | isa = PBXFrameworksBuildPhase; 53 | buildActionMask = 2147483647; 54 | files = ( 55 | 5AF76572120C7F94009444C5 /* CoreFoundation.framework in Frameworks */, 56 | 5AF76574120C7F9C009444C5 /* libiconv.2.4.0.dylib in Frameworks */, 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | 8D576313048677EA00EA77CD /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */, 65 | C86B05270671AA6E00DD9006 /* CoreServices.framework in Frameworks */, 66 | F28CFBFD0A3EC0AF000ABFF5 /* ApplicationServices.framework in Frameworks */, 67 | F28CFC030A3EC0C6000ABFF5 /* QuickLook.framework in Frameworks */, 68 | 5A938943120C54DD00202A3D /* libiconv.2.dylib in Frameworks */, 69 | 5A7C95BA124A79C50056DCAE /* Cocoa.framework in Frameworks */, 70 | 5A7C95BE124A79DD0056DCAE /* WebKit.framework in Frameworks */, 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | /* End PBXFrameworksBuildPhase section */ 75 | 76 | /* Begin PBXGroup section */ 77 | 089C166AFE841209C02AAC07 /* QuickNFO */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 08FB77AFFE84173DC02AAC07 /* Source */, 81 | 089C167CFE841241C02AAC07 /* Resources */, 82 | 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */, 83 | 19C28FB6FE9D52B211CA2CBB /* Products */, 84 | 5AF76571120C7F94009444C5 /* CoreFoundation.framework */, 85 | 5AF76573120C7F9C009444C5 /* libiconv.2.4.0.dylib */, 86 | ); 87 | name = QuickNFO; 88 | sourceTree = ""; 89 | }; 90 | 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 5A938942120C54DD00202A3D /* libiconv.2.dylib */, 94 | F28CFC020A3EC0C6000ABFF5 /* QuickLook.framework */, 95 | F28CFBFC0A3EC0AF000ABFF5 /* ApplicationServices.framework */, 96 | C86B05260671AA6E00DD9006 /* CoreServices.framework */, 97 | 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */, 98 | 5A7C95B9124A79C50056DCAE /* Cocoa.framework */, 99 | 5A7C95BD124A79DD0056DCAE /* WebKit.framework */, 100 | ); 101 | name = "External Frameworks and Libraries"; 102 | sourceTree = ""; 103 | }; 104 | 089C167CFE841241C02AAC07 /* Resources */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 8D576317048677EA00EA77CD /* Info.plist */, 108 | 8D5B49A704867FD3000E48DA /* InfoPlist.strings */, 109 | ); 110 | name = Resources; 111 | sourceTree = ""; 112 | }; 113 | 08FB77AFFE84173DC02AAC07 /* Source */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 61E3BCFA0870B4F2002186A0 /* GenerateThumbnailForURL.m */, 117 | 2C05A19B06CAA52B00D84F6F /* GeneratePreviewForURL.c */, 118 | 08FB77B6FE84183AC02AAC07 /* main.c */, 119 | 5A938948120C555E00202A3D /* quicklooknfo.c */, 120 | 5A938E0A120C65B400202A3D /* quicklooknfo.h */, 121 | ); 122 | name = Source; 123 | sourceTree = ""; 124 | }; 125 | 19C28FB6FE9D52B211CA2CBB /* Products */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 8D576316048677EA00EA77CD /* QuickNFO.qlgenerator */, 129 | 5ACCE91D120CA1350064B603 /* NFOConvert */, 130 | ); 131 | name = Products; 132 | sourceTree = ""; 133 | }; 134 | /* End PBXGroup section */ 135 | 136 | /* Begin PBXHeadersBuildPhase section */ 137 | 5AF76589120C805D009444C5 /* Headers */ = { 138 | isa = PBXHeadersBuildPhase; 139 | buildActionMask = 2147483647; 140 | files = ( 141 | 5AF76586120C8034009444C5 /* quicklooknfo.h in Headers */, 142 | ); 143 | runOnlyForDeploymentPostprocessing = 0; 144 | }; 145 | 8D57630E048677EA00EA77CD /* Headers */ = { 146 | isa = PBXHeadersBuildPhase; 147 | buildActionMask = 2147483647; 148 | files = ( 149 | 5A938E0B120C65B400202A3D /* quicklooknfo.h in Headers */, 150 | ); 151 | runOnlyForDeploymentPostprocessing = 0; 152 | }; 153 | /* End PBXHeadersBuildPhase section */ 154 | 155 | /* Begin PBXNativeTarget section */ 156 | 5AF7653F120C7F6D009444C5 /* NFOConvert */ = { 157 | isa = PBXNativeTarget; 158 | buildConfigurationList = 5AF76544120C7F8B009444C5 /* Build configuration list for PBXNativeTarget "NFOConvert" */; 159 | buildPhases = ( 160 | 5AF76589120C805D009444C5 /* Headers */, 161 | 5AF7653D120C7F6D009444C5 /* Sources */, 162 | 5AF7653E120C7F6D009444C5 /* Frameworks */, 163 | ); 164 | buildRules = ( 165 | ); 166 | dependencies = ( 167 | ); 168 | name = NFOConvert; 169 | productName = Test; 170 | productReference = 5ACCE91D120CA1350064B603 /* NFOConvert */; 171 | productType = "com.apple.product-type.tool"; 172 | }; 173 | 8D57630D048677EA00EA77CD /* QuickNFO */ = { 174 | isa = PBXNativeTarget; 175 | buildConfigurationList = 2CA3261E0896AD4900168862 /* Build configuration list for PBXNativeTarget "QuickNFO" */; 176 | buildPhases = ( 177 | 8D57630E048677EA00EA77CD /* Headers */, 178 | 8D57630F048677EA00EA77CD /* Resources */, 179 | 8D576311048677EA00EA77CD /* Sources */, 180 | 8D576313048677EA00EA77CD /* Frameworks */, 181 | 8D576315048677EA00EA77CD /* Rez */, 182 | ); 183 | buildRules = ( 184 | ); 185 | dependencies = ( 186 | ); 187 | name = QuickNFO; 188 | productInstallPath = /Library/QuickLook; 189 | productName = QuickNFO; 190 | productReference = 8D576316048677EA00EA77CD /* QuickNFO.qlgenerator */; 191 | productType = "com.apple.product-type.bundle"; 192 | }; 193 | /* End PBXNativeTarget section */ 194 | 195 | /* Begin PBXProject section */ 196 | 089C1669FE841209C02AAC07 /* Project object */ = { 197 | isa = PBXProject; 198 | attributes = { 199 | LastUpgradeCheck = 0610; 200 | }; 201 | buildConfigurationList = 2CA326220896AD4900168862 /* Build configuration list for PBXProject "QuickNFO" */; 202 | compatibilityVersion = "Xcode 3.2"; 203 | developmentRegion = English; 204 | hasScannedForEncodings = 1; 205 | knownRegions = ( 206 | en, 207 | ); 208 | mainGroup = 089C166AFE841209C02AAC07 /* QuickNFO */; 209 | projectDirPath = ""; 210 | projectRoot = ""; 211 | targets = ( 212 | 8D57630D048677EA00EA77CD /* QuickNFO */, 213 | 5AF7653F120C7F6D009444C5 /* NFOConvert */, 214 | ); 215 | }; 216 | /* End PBXProject section */ 217 | 218 | /* Begin PBXResourcesBuildPhase section */ 219 | 8D57630F048677EA00EA77CD /* Resources */ = { 220 | isa = PBXResourcesBuildPhase; 221 | buildActionMask = 2147483647; 222 | files = ( 223 | 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */, 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | }; 227 | /* End PBXResourcesBuildPhase section */ 228 | 229 | /* Begin PBXRezBuildPhase section */ 230 | 8D576315048677EA00EA77CD /* Rez */ = { 231 | isa = PBXRezBuildPhase; 232 | buildActionMask = 2147483647; 233 | files = ( 234 | ); 235 | runOnlyForDeploymentPostprocessing = 0; 236 | }; 237 | /* End PBXRezBuildPhase section */ 238 | 239 | /* Begin PBXSourcesBuildPhase section */ 240 | 5AF7653D120C7F6D009444C5 /* Sources */ = { 241 | isa = PBXSourcesBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | 5AF76580120C8005009444C5 /* quicklooknfo.c in Sources */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | 8D576311048677EA00EA77CD /* Sources */ = { 249 | isa = PBXSourcesBuildPhase; 250 | buildActionMask = 2147483647; 251 | files = ( 252 | 8D576312048677EA00EA77CD /* main.c in Sources */, 253 | 2C05A19C06CAA52B00D84F6F /* GeneratePreviewForURL.c in Sources */, 254 | 61E3BCFB0870B4F2002186A0 /* GenerateThumbnailForURL.m in Sources */, 255 | 5A93894A120C555E00202A3D /* quicklooknfo.c in Sources */, 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | /* End PBXSourcesBuildPhase section */ 260 | 261 | /* Begin PBXVariantGroup section */ 262 | 8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = { 263 | isa = PBXVariantGroup; 264 | children = ( 265 | 089C167EFE841241C02AAC07 /* English */, 266 | ); 267 | name = InfoPlist.strings; 268 | sourceTree = ""; 269 | }; 270 | /* End PBXVariantGroup section */ 271 | 272 | /* Begin XCBuildConfiguration section */ 273 | 2CA3261F0896AD4900168862 /* Debug */ = { 274 | isa = XCBuildConfiguration; 275 | buildSettings = { 276 | COMBINE_HIDPI_IMAGES = YES; 277 | COPY_PHASE_STRIP = NO; 278 | GCC_DYNAMIC_NO_PIC = NO; 279 | GCC_OPTIMIZATION_LEVEL = 0; 280 | GCC_PRECOMPILE_PREFIX_HEADER = NO; 281 | GCC_VERSION = ""; 282 | INFOPLIST_FILE = Info.plist; 283 | INSTALL_PATH = /Library/QuickLook; 284 | PRODUCT_NAME = QuickNFO; 285 | RUN_CLANG_STATIC_ANALYZER = YES; 286 | STRIP_INSTALLED_PRODUCT = NO; 287 | WRAPPER_EXTENSION = qlgenerator; 288 | }; 289 | name = Debug; 290 | }; 291 | 2CA326200896AD4900168862 /* Release */ = { 292 | isa = XCBuildConfiguration; 293 | buildSettings = { 294 | COMBINE_HIDPI_IMAGES = YES; 295 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 296 | GCC_DYNAMIC_NO_PIC = NO; 297 | GCC_PRECOMPILE_PREFIX_HEADER = NO; 298 | INFOPLIST_FILE = Info.plist; 299 | INSTALL_PATH = /Library/QuickLook; 300 | PRODUCT_NAME = QuickNFO; 301 | STRIP_INSTALLED_PRODUCT = YES; 302 | WRAPPER_EXTENSION = qlgenerator; 303 | }; 304 | name = Release; 305 | }; 306 | 2CA326230896AD4900168862 /* Debug */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | GCC_C_LANGUAGE_STANDARD = gnu99; 310 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 311 | GCC_WARN_UNUSED_VARIABLE = YES; 312 | MACOSX_DEPLOYMENT_TARGET = 10.8; 313 | ONLY_ACTIVE_ARCH = YES; 314 | SDKROOT = macosx; 315 | }; 316 | name = Debug; 317 | }; 318 | 2CA326240896AD4900168862 /* Release */ = { 319 | isa = XCBuildConfiguration; 320 | buildSettings = { 321 | GCC_C_LANGUAGE_STANDARD = gnu99; 322 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 323 | GCC_WARN_UNUSED_VARIABLE = YES; 324 | MACOSX_DEPLOYMENT_TARGET = 10.8; 325 | SDKROOT = macosx; 326 | }; 327 | name = Release; 328 | }; 329 | 5AF76542120C7F6D009444C5 /* Debug */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | ALWAYS_SEARCH_USER_PATHS = NO; 333 | COPY_PHASE_STRIP = NO; 334 | GCC_DYNAMIC_NO_PIC = NO; 335 | GCC_OPTIMIZATION_LEVEL = 0; 336 | GCC_PRECOMPILE_PREFIX_HEADER = NO; 337 | GCC_PREFIX_HEADER = ""; 338 | GCC_VERSION = ""; 339 | INSTALL_PATH = /usr/local/bin; 340 | OTHER_LDFLAGS = ""; 341 | PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; 342 | PRODUCT_NAME = NFOConvert; 343 | RUN_CLANG_STATIC_ANALYZER = YES; 344 | }; 345 | name = Debug; 346 | }; 347 | 5AF76543120C7F6D009444C5 /* Release */ = { 348 | isa = XCBuildConfiguration; 349 | buildSettings = { 350 | ALWAYS_SEARCH_USER_PATHS = NO; 351 | COPY_PHASE_STRIP = YES; 352 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 353 | GCC_PRECOMPILE_PREFIX_HEADER = NO; 354 | GCC_PREFIX_HEADER = ""; 355 | GCC_VERSION = ""; 356 | INSTALL_PATH = /usr/local/bin; 357 | OTHER_LDFLAGS = ( 358 | "-framework", 359 | Foundation, 360 | "-framework", 361 | AppKit, 362 | ); 363 | PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; 364 | PRODUCT_NAME = NFOConvert; 365 | STRIP_INSTALLED_PRODUCT = YES; 366 | ZERO_LINK = NO; 367 | }; 368 | name = Release; 369 | }; 370 | /* End XCBuildConfiguration section */ 371 | 372 | /* Begin XCConfigurationList section */ 373 | 2CA3261E0896AD4900168862 /* Build configuration list for PBXNativeTarget "QuickNFO" */ = { 374 | isa = XCConfigurationList; 375 | buildConfigurations = ( 376 | 2CA3261F0896AD4900168862 /* Debug */, 377 | 2CA326200896AD4900168862 /* Release */, 378 | ); 379 | defaultConfigurationIsVisible = 0; 380 | defaultConfigurationName = Release; 381 | }; 382 | 2CA326220896AD4900168862 /* Build configuration list for PBXProject "QuickNFO" */ = { 383 | isa = XCConfigurationList; 384 | buildConfigurations = ( 385 | 2CA326230896AD4900168862 /* Debug */, 386 | 2CA326240896AD4900168862 /* Release */, 387 | ); 388 | defaultConfigurationIsVisible = 0; 389 | defaultConfigurationName = Release; 390 | }; 391 | 5AF76544120C7F8B009444C5 /* Build configuration list for PBXNativeTarget "NFOConvert" */ = { 392 | isa = XCConfigurationList; 393 | buildConfigurations = ( 394 | 5AF76542120C7F6D009444C5 /* Debug */, 395 | 5AF76543120C7F6D009444C5 /* Release */, 396 | ); 397 | defaultConfigurationIsVisible = 0; 398 | defaultConfigurationName = Release; 399 | }; 400 | /* End XCConfigurationList section */ 401 | }; 402 | rootObject = 089C1669FE841209C02AAC07 /* Project object */; 403 | } 404 | --------------------------------------------------------------------------------