diff options
| author | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-03-28 22:51:46 +0000 |
|---|---|---|
| committer | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-03-28 22:51:46 +0000 |
| commit | ebfb89de00860bbdbb6e9a72ed18a358acc7c056 (patch) | |
| tree | d7c44382653ca1eb04db6876277edac4e6993a68 /macosx/Pcsxr-QL | |
| parent | a92f831335493c2ed789a3f746861af49ef5e4c8 (diff) | |
OS X: Begin work on a QuickLook plug-in for freeze states.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@89709 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'macosx/Pcsxr-QL')
| -rw-r--r-- | macosx/Pcsxr-QL/GeneratePreviewForURL.c | 21 | ||||
| -rw-r--r-- | macosx/Pcsxr-QL/GenerateThumbnailForURL.c | 21 | ||||
| -rw-r--r-- | macosx/Pcsxr-QL/MyQuickLook.h | 25 | ||||
| -rw-r--r-- | macosx/Pcsxr-QL/Pcsxr-QL-Info.plist | 140 | ||||
| -rw-r--r-- | macosx/Pcsxr-QL/Pcsxr-QL-Prefix.pch | 10 | ||||
| -rw-r--r-- | macosx/Pcsxr-QL/en.lproj/InfoPlist.strings | 2 | ||||
| -rw-r--r-- | macosx/Pcsxr-QL/main.c | 202 |
7 files changed, 421 insertions, 0 deletions
diff --git a/macosx/Pcsxr-QL/GeneratePreviewForURL.c b/macosx/Pcsxr-QL/GeneratePreviewForURL.c new file mode 100644 index 00000000..a57f116f --- /dev/null +++ b/macosx/Pcsxr-QL/GeneratePreviewForURL.c @@ -0,0 +1,21 @@ +#include <CoreFoundation/CoreFoundation.h> +#include <CoreServices/CoreServices.h> +#include <QuickLook/QuickLook.h> +#include "MyQuickLook.h" + +/* ----------------------------------------------------------------------------- + Generate a preview for file + + This function's job is to create preview for designated file + ----------------------------------------------------------------------------- */ + +OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) +{ + // To complete your generator please implement the function GeneratePreviewForURL in GeneratePreviewForURL.c + return noErr; +} + +void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview) +{ + // Implement only if supported +} diff --git a/macosx/Pcsxr-QL/GenerateThumbnailForURL.c b/macosx/Pcsxr-QL/GenerateThumbnailForURL.c new file mode 100644 index 00000000..60211658 --- /dev/null +++ b/macosx/Pcsxr-QL/GenerateThumbnailForURL.c @@ -0,0 +1,21 @@ +#include <CoreFoundation/CoreFoundation.h> +#include <CoreServices/CoreServices.h> +#include <QuickLook/QuickLook.h> +#include "MyQuickLook.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) +{ + // To complete your generator please implement the function GenerateThumbnailForURL in GenerateThumbnailForURL.c + return noErr; +} + +void CancelThumbnailGeneration(void *thisInterface, QLThumbnailRequestRef thumbnail) +{ + // Implement only if supported +} diff --git a/macosx/Pcsxr-QL/MyQuickLook.h b/macosx/Pcsxr-QL/MyQuickLook.h new file mode 100644 index 00000000..9f1c6778 --- /dev/null +++ b/macosx/Pcsxr-QL/MyQuickLook.h @@ -0,0 +1,25 @@ +// +// MyQuickLook.h +// Pcsxr +// +// Created by C.W. Betts on 3/28/14. +// +// + +#ifndef Pcsxr_MyQuickLook_h +#define Pcsxr_MyQuickLook_h + +#include <CoreFoundation/CoreFoundation.h> +#include <CoreFoundation/CFPlugInCOM.h> +#include <CoreServices/CoreServices.h> +#include <QuickLook/QuickLook.h> + +// The thumbnail generation function to be implemented in GenerateThumbnailForURL.c +__private_extern__ OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize); +__private_extern__ void CancelThumbnailGeneration(void* thisInterface, QLThumbnailRequestRef thumbnail); + +// The preview generation function to be implemented in GeneratePreviewForURL.c +__private_extern__ OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); +__private_extern__ void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview); + +#endif diff --git a/macosx/Pcsxr-QL/Pcsxr-QL-Info.plist b/macosx/Pcsxr-QL/Pcsxr-QL-Info.plist new file mode 100644 index 00000000..3646ec14 --- /dev/null +++ b/macosx/Pcsxr-QL/Pcsxr-QL-Info.plist @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeRole</key> + <string>QLGenerator</string> + <key>LSItemContentTypes</key> + <array> + <string>com.codeplex.pcsxr.freeze</string> + </array> + </dict> + </array> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.github.maddthesane.${PRODUCT_NAME:rfc1034identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundleShortVersionString</key> + <string>1</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>CFPlugInDynamicRegisterFunction</key> + <string></string> + <key>CFPlugInDynamicRegistration</key> + <string>NO</string> + <key>CFPlugInFactories</key> + <dict> + <key>8C4B8FFE-72CC-436C-8D8A-034152616D03</key> + <string>QuickLookGeneratorPluginFactory</string> + </dict> + <key>CFPlugInTypes</key> + <dict> + <key>5E2D9680-5022-40FA-B806-43349622E5B9</key> + <array> + <string>8C4B8FFE-72CC-436C-8D8A-034152616D03</string> + </array> + </dict> + <key>CFPlugInUnloadFunction</key> + <string></string> + <key>QLNeedsToBeRunInMainThread</key> + <false/> + <key>QLPreviewHeight</key> + <real>600</real> + <key>QLPreviewWidth</key> + <real>800</real> + <key>QLSupportsConcurrentRequests</key> + <false/> + <key>QLThumbnailMinimumSize</key> + <real>17</real> + <key>UTImportedTypeDeclarations</key> + <array> + <dict> + <key>UTTypeConformsTo</key> + <array> + <string>public.data</string> + <string>public.content</string> + </array> + <key>UTTypeDescription</key> + <string>PCSXR Memory Card</string> + <key>UTTypeIconFile</key> + <string>pcsxrmemcard</string> + <key>UTTypeIdentifier</key> + <string>com.codeplex.pcsxr.memcard</string> + <key>UTTypeReferenceURL</key> + <string>http://pcsxr.codeplex.com/</string> + <key>UTTypeTagSpecification</key> + <dict> + <key>com.apple.ostype</key> + <array> + <string>Pmcr</string> + </array> + <key>public.filename-extension</key> + <array> + <string>mcr</string> + <string>mc</string> + <string>mem</string> + <string>vgs</string> + <string>mcd</string> + <string>gme</string> + <string>ddf</string> + </array> + </dict> + </dict> + <dict> + <key>UTTypeConformsTo</key> + <array> + <string>public.data</string> + <string>public.content</string> + </array> + <key>UTTypeDescription</key> + <string>PCSXR Freeze State</string> + <key>UTTypeIconFile</key> + <string>pcsxrfreeze</string> + <key>UTTypeIdentifier</key> + <string>com.codeplex.pcsxr.freeze</string> + <key>UTTypeReferenceURL</key> + <string>http://pcsxr.codeplex.com/</string> + <key>UTTypeTagSpecification</key> + <dict> + <key>com.apple.ostype</key> + <array> + <string>Pfrz</string> + </array> + <key>public.filename-extension</key> + <array> + <string>pcsxrstate</string> + </array> + </dict> + </dict> + <dict> + <key>UTTypeConformsTo</key> + <array> + <string>public.text</string> + <string>public.data</string> + </array> + <key>UTTypeDescription</key> + <string>PCSXR Cheat</string> + <key>UTTypeIdentifier</key> + <string>com.codeplex.pcsxr.cheat</string> + <key>UTTypeTagSpecification</key> + <dict> + <key>public.filename-extension</key> + <array> + <string>cht</string> + </array> + </dict> + </dict> + </array> +</dict> +</plist> diff --git a/macosx/Pcsxr-QL/Pcsxr-QL-Prefix.pch b/macosx/Pcsxr-QL/Pcsxr-QL-Prefix.pch new file mode 100644 index 00000000..ccf35331 --- /dev/null +++ b/macosx/Pcsxr-QL/Pcsxr-QL-Prefix.pch @@ -0,0 +1,10 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#include <CoreFoundation/CoreFoundation.h> +#include <CoreFoundation/CFPlugInCOM.h> +#include <CoreServices/CoreServices.h> +#include <QuickLook/QuickLook.h> diff --git a/macosx/Pcsxr-QL/en.lproj/InfoPlist.strings b/macosx/Pcsxr-QL/en.lproj/InfoPlist.strings new file mode 100644 index 00000000..477b28ff --- /dev/null +++ b/macosx/Pcsxr-QL/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/macosx/Pcsxr-QL/main.c b/macosx/Pcsxr-QL/main.c new file mode 100644 index 00000000..1ca582ce --- /dev/null +++ b/macosx/Pcsxr-QL/main.c @@ -0,0 +1,202 @@ +//============================================================================== +// +// DO NO MODIFY THE CONTENT OF THIS FILE +// +// This file contains the generic CFPlug-in code necessary for your generator +// To complete your generator implement the function in GenerateThumbnailForURL/GeneratePreviewForURL.c +// +//============================================================================== + +#include <CoreFoundation/CoreFoundation.h> +#include <CoreFoundation/CFPlugInCOM.h> +#include <CoreServices/CoreServices.h> +#include <QuickLook/QuickLook.h> +#include "MyQuickLook.h" + +// ----------------------------------------------------------------------------- +// constants +// ----------------------------------------------------------------------------- + +// Don't modify this line +#define PLUGIN_ID "8C4B8FFE-72CC-436C-8D8A-034152616D03" + +// +// Below is the generic glue code for all plug-ins. +// +// You should not have to modify this code aside from changing +// names if you decide to change the names defined in the Info.plist +// + +// ----------------------------------------------------------------------------- +// typedefs +// ----------------------------------------------------------------------------- + +// The layout for an instance of QuickLookGeneratorPlugIn +typedef struct __QuickLookGeneratorPluginType +{ + void *conduitInterface; + CFUUIDRef factoryID; + UInt32 refCount; +} PcsxrQLPlug; + +// ----------------------------------------------------------------------------- +// prototypes +// ----------------------------------------------------------------------------- +// Forward declaration for the IUnknown implementation. +// + +static PcsxrQLPlug *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID); +static void DeallocQuickLookGeneratorPluginType(PcsxrQLPlug *thisInstance); +static HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv); +extern void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID); +static ULONG QuickLookGeneratorPluginAddRef(void *thisInstance); +static ULONG QuickLookGeneratorPluginRelease(void *thisInstance); + +// ----------------------------------------------------------------------------- +// myInterfaceFtbl definition +// ----------------------------------------------------------------------------- +// The QLGeneratorInterfaceStruct function table. +// +static QLGeneratorInterfaceStruct myInterfaceFtbl = { + NULL, + QuickLookGeneratorQueryInterface, + QuickLookGeneratorPluginAddRef, + QuickLookGeneratorPluginRelease, + NULL, + NULL, + NULL, + NULL +}; + + +// ----------------------------------------------------------------------------- +// AllocQuickLookGeneratorPluginType +// ----------------------------------------------------------------------------- +// Utility function that allocates a new instance. +// You can do some initial setup for the generator here if you wish +// like allocating globals etc... +// +PcsxrQLPlug *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID) +{ + PcsxrQLPlug *theNewInstance; + + theNewInstance = (PcsxrQLPlug *)calloc(sizeof(PcsxrQLPlug), 1); + + /* Point to the function table Malloc enough to store the stuff and copy the filler from myInterfaceFtbl over */ + theNewInstance->conduitInterface = malloc(sizeof(QLGeneratorInterfaceStruct)); + memcpy(theNewInstance->conduitInterface, &myInterfaceFtbl, sizeof(QLGeneratorInterfaceStruct)); + + /* Retain and keep an open instance refcount for each factory. */ + theNewInstance->factoryID = CFRetain(inFactoryID); + CFPlugInAddInstanceForFactory(inFactoryID); + + /* This function returns the IUnknown interface so set the refCount to one. */ + theNewInstance->refCount = 1; + return theNewInstance; +} + +// ----------------------------------------------------------------------------- +// DeallocQuickLookGeneratorPluginType +// ----------------------------------------------------------------------------- +// Utility function that deallocates the instance when +// the refCount goes to zero. +// In the current implementation generator interfaces are never deallocated +// but implement this as this might change in the future +// +void DeallocQuickLookGeneratorPluginType(PcsxrQLPlug *thisInstance) +{ + CFUUIDRef theFactoryID; + + theFactoryID = thisInstance->factoryID; + /* Free the conduitInterface table up */ + free(thisInstance->conduitInterface); + + /* Free the instance structure */ + free(thisInstance); + if (theFactoryID){ + CFPlugInRemoveInstanceForFactory(theFactoryID); + CFRelease(theFactoryID); + } +} + +// ----------------------------------------------------------------------------- +// QuickLookGeneratorQueryInterface +// ----------------------------------------------------------------------------- +// Implementation of the IUnknown QueryInterface function. +// +HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv) +{ + CFUUIDRef interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault,iid); + + if (CFEqual(interfaceID,kQLGeneratorCallbacksInterfaceID)){ + /* If the Right interface was requested, bump the ref count, + * set the ppv parameter equal to the instance, and + * return good status. + */ + ((QLGeneratorInterfaceStruct *)((PcsxrQLPlug *)thisInstance)->conduitInterface)->GenerateThumbnailForURL = GenerateThumbnailForURL; + ((QLGeneratorInterfaceStruct *)((PcsxrQLPlug *)thisInstance)->conduitInterface)->CancelThumbnailGeneration = CancelThumbnailGeneration; + ((QLGeneratorInterfaceStruct *)((PcsxrQLPlug *)thisInstance)->conduitInterface)->GeneratePreviewForURL = GeneratePreviewForURL; + ((QLGeneratorInterfaceStruct *)((PcsxrQLPlug *)thisInstance)->conduitInterface)->CancelPreviewGeneration = CancelPreviewGeneration; + ((QLGeneratorInterfaceStruct *)((PcsxrQLPlug*)thisInstance)->conduitInterface)->AddRef(thisInstance); + *ppv = thisInstance; + CFRelease(interfaceID); + return S_OK; + } else { + /* Requested interface unknown, bail with error. */ + *ppv = NULL; + CFRelease(interfaceID); + return E_NOINTERFACE; + } +} + +// ----------------------------------------------------------------------------- +// QuickLookGeneratorPluginAddRef +// ----------------------------------------------------------------------------- +// Implementation of reference counting for this type. Whenever an interface +// is requested, bump the refCount for the instance. NOTE: returning the +// refcount is a convention but is not required so don't rely on it. +// +ULONG QuickLookGeneratorPluginAddRef(void *thisInstance) +{ + ((PcsxrQLPlug *)thisInstance )->refCount += 1; + return ((PcsxrQLPlug*) thisInstance)->refCount; +} + +// ----------------------------------------------------------------------------- +// QuickLookGeneratorPluginRelease +// ----------------------------------------------------------------------------- +// When an interface is released, decrement the refCount. +// If the refCount goes to zero, deallocate the instance. +// +ULONG QuickLookGeneratorPluginRelease(void *thisInstance) +{ + ((PcsxrQLPlug*)thisInstance)->refCount -= 1; + if (((PcsxrQLPlug*)thisInstance)->refCount == 0) { + DeallocQuickLookGeneratorPluginType((PcsxrQLPlug*)thisInstance); + return 0; + } else { + return ((PcsxrQLPlug*) thisInstance )->refCount; + } +} + +// ----------------------------------------------------------------------------- +// QuickLookGeneratorPluginFactory +// ----------------------------------------------------------------------------- +void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID) +{ + PcsxrQLPlug *result; + CFUUIDRef uuid; + + /* If correct type is being requested, allocate an + * instance of kQLGeneratorTypeID and return the IUnknown interface. + */ + if (CFEqual(typeID, kQLGeneratorTypeID)){ + uuid = CFUUIDCreateFromString(kCFAllocatorDefault, CFSTR(PLUGIN_ID)); + result = AllocQuickLookGeneratorPluginType(uuid); + CFRelease(uuid); + return result; + } + /* If the requested type is incorrect, return NULL. */ + return NULL; +} + |
