Separate struct git_data from Windows-specific definitions
[git-cheetah/kirill.git] / factory.c
blob4ab5bea13e5dae0bfc0340410b230cbbbe857681
1 #include <shlobj.h>
2 #include "menuengine.h"
3 #include "factory.h"
4 #include "ext.h"
5 #include "menu.h"
7 /*
8 * Since COM objects cannot be constructed like your traditional object (i.e.
9 * with a proper constructor), they have to be constructed by another object,
10 * the class factory.
12 * The class factory is an object which exists exactly once, and it cannot
13 * be constructed or destroyed. Its sole purpose is to construct objects
14 * given an interface.
17 STDMETHODIMP class_factory_query_interface(IClassFactory *this,
18 REFIID guid, void **pointer)
20 if (!IsEqualIID(guid, &IID_IUnknown) &&
21 !IsEqualIID(guid, &IID_IClassFactory)) {
22 *pointer = 0;
23 return E_NOINTERFACE;
26 *pointer = this;
27 return NOERROR;
30 static ULONG STDMETHODCALLTYPE return_one(IClassFactory *this)
32 return(1);
35 static STDMETHODIMP create_instance(IClassFactory *this_,
36 IUnknown *outer, REFIID guid, void **pointer)
38 HRESULT result;
39 struct git_data *data;
41 *pointer = 0;
43 if (outer)
44 return CLASS_E_NOAGGREGATION;
46 if (!(data = GlobalAlloc(GMEM_FIXED, sizeof(struct git_data))))
47 return E_OUTOFMEMORY;
48 memset(data, 0, sizeof(struct git_data));
50 data->shell_ext.virtual_table = &git_shell_ext_virtual_table;
51 data->menu.virtual_table = &git_menu_virtual_table;
52 data->shell_ext.git_data = data->menu.git_data = data;
54 result = query_interface_git_data(data, guid, pointer);
55 if (!result)
56 InterlockedIncrement(&object_count);
57 return result;
60 static STDMETHODIMP lock_server(IClassFactory *this, BOOL lock)
62 if (lock)
63 InterlockedIncrement(&lock_count);
64 else
65 InterlockedDecrement(&lock_count);
67 return NOERROR;
70 IClassFactoryVtbl factory_virtual_table = {
71 class_factory_query_interface,
72 return_one,
73 return_one,
74 create_instance,
75 lock_server
78 IClassFactory factory = {
79 &factory_virtual_table