Reactos
at master 148 lines 3.9 kB view raw
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 32WINE_DEFAULT_DEBUG_CHANNEL(wmiutils); 33 34typedef struct status_code 35{ 36 IWbemStatusCodeText IWbemStatusCodeText_iface; 37 LONG refs; 38} status_code; 39 40static inline status_code *impl_from_IWbemStatusCodeText( IWbemStatusCodeText *iface ) 41{ 42 return CONTAINING_RECORD(iface, status_code, IWbemStatusCodeText_iface); 43} 44 45static 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 52static 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 65static 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 88static 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 106static 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 124static 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 133HRESULT 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}