1 /* 2 * ITfDisplayAttributeMgr implementation 3 * 4 * Copyright 2010 CodeWeavers, Aric Stewart 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21 #define COBJMACROS 22 23 #include "wine/debug.h" 24 #include "winbase.h" 25 #include "winreg.h" 26 #include "shlwapi.h" 27 28 #include "msctf.h" 29 #include "msctf_internal.h" 30 31 WINE_DEFAULT_DEBUG_CHANNEL(msctf); 32 33 typedef struct tagDisplayAttributeMgr { 34 ITfDisplayAttributeMgr ITfDisplayAttributeMgr_iface; 35 36 LONG refCount; 37 38 } DisplayAttributeMgr; 39 40 static inline DisplayAttributeMgr *impl_from_ITfDisplayAttributeMgr(ITfDisplayAttributeMgr *iface) 41 { 42 return CONTAINING_RECORD(iface, DisplayAttributeMgr, ITfDisplayAttributeMgr_iface); 43 } 44 45 static void DisplayAttributeMgr_Destructor(DisplayAttributeMgr *This) 46 { 47 TRACE("destroying %p\n", This); 48 49 HeapFree(GetProcessHeap(),0,This); 50 } 51 52 static HRESULT WINAPI DisplayAttributeMgr_QueryInterface(ITfDisplayAttributeMgr *iface, REFIID iid, LPVOID *ppvOut) 53 { 54 DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); 55 *ppvOut = NULL; 56 57 if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfDisplayAttributeMgr)) 58 { 59 *ppvOut = &This->ITfDisplayAttributeMgr_iface; 60 } 61 62 if (*ppvOut) 63 { 64 ITfDisplayAttributeMgr_AddRef(iface); 65 return S_OK; 66 } 67 68 WARN("unsupported interface: %s\n", debugstr_guid(iid)); 69 return E_NOINTERFACE; 70 } 71 72 static ULONG WINAPI DisplayAttributeMgr_AddRef(ITfDisplayAttributeMgr *iface) 73 { 74 DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); 75 return InterlockedIncrement(&This->refCount); 76 } 77 78 static ULONG WINAPI DisplayAttributeMgr_Release(ITfDisplayAttributeMgr *iface) 79 { 80 DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); 81 ULONG ret; 82 83 ret = InterlockedDecrement(&This->refCount); 84 if (ret == 0) 85 DisplayAttributeMgr_Destructor(This); 86 return ret; 87 } 88 89 /***************************************************** 90 * ITfDisplayAttributeMgr functions 91 *****************************************************/ 92 93 static HRESULT WINAPI DisplayAttributeMgr_OnUpdateInfo(ITfDisplayAttributeMgr *iface) 94 { 95 DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); 96 97 FIXME("STUB:(%p)\n",This); 98 return E_NOTIMPL; 99 } 100 101 static HRESULT WINAPI DisplayAttributeMgr_EnumDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, IEnumTfDisplayAttributeInfo **ppEnum) 102 { 103 DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); 104 105 FIXME("STUB:(%p)\n",This); 106 return E_NOTIMPL; 107 } 108 109 static HRESULT WINAPI DisplayAttributeMgr_GetDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, REFGUID guid, ITfDisplayAttributeInfo **ppInfo, CLSID *pclsidOwner) 110 { 111 DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); 112 113 FIXME("STUB:(%p)\n",This); 114 return E_NOTIMPL; 115 } 116 117 static const ITfDisplayAttributeMgrVtbl DisplayAttributeMgrVtbl = 118 { 119 DisplayAttributeMgr_QueryInterface, 120 DisplayAttributeMgr_AddRef, 121 DisplayAttributeMgr_Release, 122 DisplayAttributeMgr_OnUpdateInfo, 123 DisplayAttributeMgr_EnumDisplayAttributeInfo, 124 DisplayAttributeMgr_GetDisplayAttributeInfo 125 }; 126 127 HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) 128 { 129 DisplayAttributeMgr *This; 130 if (pUnkOuter) 131 return CLASS_E_NOAGGREGATION; 132 133 This = HeapAlloc(GetProcessHeap(),0,sizeof(DisplayAttributeMgr)); 134 if (This == NULL) 135 return E_OUTOFMEMORY; 136 137 This->ITfDisplayAttributeMgr_iface.lpVtbl = &DisplayAttributeMgrVtbl; 138 This->refCount = 1; 139 140 *ppOut = (IUnknown *)&This->ITfDisplayAttributeMgr_iface; 141 TRACE("returning %p\n", *ppOut); 142 return S_OK; 143 } 144