Use case-insensitive search for explorer.exe and taskmgr.exe
[git-cheetah/kirill.git] / finder / plugin.c
blob7eeb90fc6b8df066e5d08654d7f26812c9c478af
1 /* plugin.c
3 * Implementation of a finder menu plugin for git-cheetah
5 * This implements the COM interface for the finder plugin
7 * Copyright (C) Heiko Voigt, 2009
9 * inspired by an example from Brent Simmons
10 * brent@ranchero.com, http://macte.ch/kmyXM
14 #include "../common/git-compat-util.h"
15 #include "../common/strbuf.h"
16 #include "../common/debug.h"
17 #include "../common/menuengine.h"
18 #include "../common/cheetahmenu.h"
19 #include "util.h"
20 #include "menu.h"
21 #include "plugin.h"
23 void *create_instance(CFAllocatorRef a, CFUUIDRef id);
24 static HRESULT query_interface(void *me, REFIID id, LPVOID *ret);
25 static ULONG retain(void *me);
26 static ULONG release(void *me);
28 static ContextualMenuInterfaceStruct plugin_virtual_table = {
29 NULL,
30 /* Standard COM */
31 query_interface,
32 retain,
33 release,
34 /* Context Menu Interface */
35 query_context_menu,
36 invoke_command,
37 cleanup_context_menu
40 void *create_instance(CFAllocatorRef a, CFUUIDRef id)
42 struct plugin_data *me;
44 if (!CFEqual(id, kContextualMenuTypeID))
45 return NULL;
47 CFPlugInAddInstanceForFactory(myUUID);
49 me = (struct plugin_data *) malloc(sizeof(struct plugin_data));
50 memset(me, 0, sizeof(struct plugin_data));
52 me->virtual_table = &plugin_virtual_table;
53 me->id = CFRetain(myUUID);
54 me->num_ref = 1;
56 return me;
59 static HRESULT query_interface(void *_me, REFIID id, LPVOID *ret)
61 struct plugin_data *me = _me;
62 Boolean interface_supported = false;
63 CFUUIDRef query_id = CFUUIDCreateFromUUIDBytes(NULL, id);
65 if (CFEqual(query_id, kContextualMenuInterfaceID))
66 interface_supported = true;
68 if (CFEqual(query_id, IUnknownUUID))
69 interface_supported = true;
71 CFRelease(query_id);
73 if (!interface_supported) {
74 *ret = NULL;
75 return E_NOINTERFACE;
78 retain(me);
79 *ret = me;
81 return S_OK;
84 static ULONG retain(void *_me)
86 struct plugin_data *me = _me;
87 return ++(me->num_ref);
90 static ULONG release(void *_me)
92 struct plugin_data *me = _me;
93 me->num_ref--;
95 if (me->num_ref > 0)
96 return me->num_ref;
98 if (me->id) {
99 CFPlugInRemoveInstanceForFactory(me->id);
100 CFRelease(me->id);
103 free(me);
104 return 0;