1 /* 2 * IAutomaticUpdates implementation 3 * 4 * Copyright 2008 Hans Leidekker 5 * Copyright 2011 Bernhard Loos 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 20 */ 21 22 #define COBJMACROS 23 24 #include <stdarg.h> 25 26 #include "windef.h" 27 #include "winbase.h" 28 #include "winuser.h" 29 #include "ole2.h" 30 #include "wuapi.h" 31 #include "wuapi_private.h" 32 33 #include "wine/debug.h" 34 35 WINE_DEFAULT_DEBUG_CHANNEL(wuapi); 36 37 typedef struct _systeminfo 38 { 39 ISystemInformation ISystemInformation_iface; 40 LONG refs; 41 } systeminfo; 42 43 static inline systeminfo *impl_from_ISystemInformation(ISystemInformation *iface) 44 { 45 return CONTAINING_RECORD(iface, systeminfo, ISystemInformation_iface); 46 } 47 48 static ULONG WINAPI systeminfo_AddRef(ISystemInformation *iface) 49 { 50 systeminfo *This = impl_from_ISystemInformation(iface); 51 return InterlockedIncrement(&This->refs); 52 } 53 54 static ULONG WINAPI systeminfo_Release(ISystemInformation *iface) 55 { 56 systeminfo *This = impl_from_ISystemInformation(iface); 57 LONG refs = InterlockedDecrement(&This->refs); 58 if (!refs) 59 { 60 TRACE("destroying %p\n", This); 61 HeapFree(GetProcessHeap(), 0, This); 62 } 63 return refs; 64 } 65 66 static HRESULT WINAPI systeminfo_QueryInterface(ISystemInformation *iface, 67 REFIID riid, void **ppvObject) 68 { 69 systeminfo *This = impl_from_ISystemInformation(iface); 70 71 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); 72 73 if (IsEqualGUID(riid, &IID_ISystemInformation) || 74 IsEqualGUID(riid, &IID_IDispatch) || 75 IsEqualGUID(riid, &IID_IUnknown)) 76 { 77 *ppvObject = iface; 78 } 79 else 80 { 81 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 82 return E_NOINTERFACE; 83 } 84 ISystemInformation_AddRef(iface); 85 return S_OK; 86 } 87 88 static HRESULT WINAPI systeminfo_GetTypeInfoCount(ISystemInformation *iface, 89 UINT *pctinfo ) 90 { 91 FIXME("\n"); 92 return E_NOTIMPL; 93 } 94 95 static HRESULT WINAPI systeminfo_GetTypeInfo(ISystemInformation *iface, 96 UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) 97 { 98 FIXME("\n"); 99 return E_NOTIMPL; 100 } 101 102 static HRESULT WINAPI systeminfo_GetIDsOfNames(ISystemInformation *iface, 103 REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, 104 DISPID *rgDispId) 105 { 106 FIXME("\n"); 107 return E_NOTIMPL; 108 } 109 110 static HRESULT WINAPI systeminfo_Invoke(ISystemInformation *iface, 111 DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, 112 DISPPARAMS *pDispParams, VARIANT *pVarResult, 113 EXCEPINFO *pExcepInfo, UINT *puArgErr ) 114 { 115 FIXME("\n"); 116 return E_NOTIMPL; 117 } 118 119 static HRESULT WINAPI systeminfo_get_OemHardwareSupportLink(ISystemInformation *iface, 120 BSTR *retval) 121 { 122 FIXME("\n"); 123 return E_NOTIMPL; 124 } 125 126 static HRESULT WINAPI systeminfo_get_RebootRequired(ISystemInformation *iface, 127 VARIANT_BOOL *retval) 128 { 129 *retval = VARIANT_FALSE; 130 return S_OK; 131 } 132 133 static const struct ISystemInformationVtbl systeminfo_vtbl = 134 { 135 systeminfo_QueryInterface, 136 systeminfo_AddRef, 137 systeminfo_Release, 138 systeminfo_GetTypeInfoCount, 139 systeminfo_GetTypeInfo, 140 systeminfo_GetIDsOfNames, 141 systeminfo_Invoke, 142 systeminfo_get_OemHardwareSupportLink, 143 systeminfo_get_RebootRequired 144 }; 145 146 HRESULT SystemInformation_create(LPVOID *ppObj) 147 { 148 systeminfo *info; 149 150 TRACE("(%p)\n", ppObj); 151 152 info = HeapAlloc(GetProcessHeap(), 0, sizeof(*info)); 153 if (!info) 154 return E_OUTOFMEMORY; 155 156 info->ISystemInformation_iface.lpVtbl = &systeminfo_vtbl; 157 info->refs = 1; 158 159 *ppObj = &info->ISystemInformation_iface; 160 161 TRACE("returning iface %p\n", *ppObj); 162 return S_OK; 163 } 164