1 /* 2 * Copyright 2009 Hans Leidekker for CodeWeavers 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17 */ 18 19 #define COBJMACROS 20 21 #include <stdarg.h> 22 #include <stdio.h> 23 24 #include "windef.h" 25 #include "winbase.h" 26 #include "ole2.h" 27 #include "wbemcli.h" 28 29 #include "wine/debug.h" 30 #include "wmiutils_private.h" 31 32 WINE_DEFAULT_DEBUG_CHANNEL(wmiutils); 33 34 typedef struct status_code 35 { 36 IWbemStatusCodeText IWbemStatusCodeText_iface; 37 LONG refs; 38 } status_code; 39 40 static inline status_code *impl_from_IWbemStatusCodeText( IWbemStatusCodeText *iface ) 41 { 42 return CONTAINING_RECORD(iface, status_code, IWbemStatusCodeText_iface); 43 } 44 45 static ULONG WINAPI status_code_AddRef( 46 IWbemStatusCodeText *iface ) 47 { 48 status_code *status_code = impl_from_IWbemStatusCodeText( iface ); 49 return InterlockedIncrement( &status_code->refs ); 50 } 51 52 static ULONG WINAPI status_code_Release( 53 IWbemStatusCodeText *iface ) 54 { 55 status_code *status_code = impl_from_IWbemStatusCodeText( iface ); 56 LONG refs = InterlockedDecrement( &status_code->refs ); 57 if (!refs) 58 { 59 TRACE("destroying %p\n", status_code); 60 heap_free( status_code ); 61 } 62 return refs; 63 } 64 65 static HRESULT WINAPI status_code_QueryInterface( 66 IWbemStatusCodeText *iface, 67 REFIID riid, 68 void **ppvObject ) 69 { 70 status_code *This = impl_from_IWbemStatusCodeText( iface ); 71 72 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject ); 73 74 if ( IsEqualGUID( riid, &IID_IWbemStatusCodeText ) || 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 IWbemStatusCodeText_AddRef( iface ); 85 return S_OK; 86 } 87 88 static HRESULT WINAPI status_code_GetErrorCodeText( 89 IWbemStatusCodeText *iface, 90 HRESULT res, 91 LCID lcid, 92 LONG flags, 93 BSTR *text ) 94 { 95 static const WCHAR fmt[] = 96 {'E','r','r','o','r',' ','c','o','d','e',':',' ','0','x','%','0','8','x',0}; 97 WCHAR msg[32]; 98 99 FIXME("%p, 0x%08x, 0x%04x, 0x%08x, %p\n", iface, res, lcid, flags, text); 100 101 swprintf(msg, fmt, res); 102 *text = SysAllocString(msg); 103 return WBEM_S_NO_ERROR; 104 } 105 106 static HRESULT WINAPI status_code_GetFacilityCodeText( 107 IWbemStatusCodeText *iface, 108 HRESULT res, 109 LCID lcid, 110 LONG flags, 111 BSTR *text ) 112 { 113 static const WCHAR fmt[] = 114 {'F','a','c','i','l','i','t','y',' ','c','o','d','e',':',' ','0','x','%','0','8','x',0}; 115 WCHAR msg[32]; 116 117 FIXME("%p, 0x%08x, 0x%04x, 0x%08x, %p\n", iface, res, lcid, flags, text); 118 119 swprintf(msg, fmt, res); 120 *text = SysAllocString(msg); 121 return WBEM_S_NO_ERROR; 122 } 123 124 static const struct IWbemStatusCodeTextVtbl status_code_vtbl = 125 { 126 status_code_QueryInterface, 127 status_code_AddRef, 128 status_code_Release, 129 status_code_GetErrorCodeText, 130 status_code_GetFacilityCodeText 131 }; 132 133 HRESULT WbemStatusCodeText_create( LPVOID *ppObj ) 134 { 135 status_code *sc; 136 137 TRACE("(%p)\n", ppObj); 138 139 if (!(sc = heap_alloc( sizeof(*sc) ))) return E_OUTOFMEMORY; 140 141 sc->IWbemStatusCodeText_iface.lpVtbl = &status_code_vtbl; 142 sc->refs = 1; 143 144 *ppObj = &sc->IWbemStatusCodeText_iface; 145 146 TRACE("returning iface %p\n", *ppObj); 147 return S_OK; 148 } 149