Reactos
at master 259 lines 8.5 kB view raw
1/* 2 * Copyright 2012 Jacek Caban 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#include "mshtml_private.h" 20 21typedef struct { 22 HTMLElement element; 23 24 IHTMLMetaElement IHTMLMetaElement_iface; 25} HTMLMetaElement; 26 27static inline HTMLMetaElement *impl_from_IHTMLMetaElement(IHTMLMetaElement *iface) 28{ 29 return CONTAINING_RECORD(iface, HTMLMetaElement, IHTMLMetaElement_iface); 30} 31 32static HRESULT WINAPI HTMLMetaElement_QueryInterface(IHTMLMetaElement *iface, REFIID riid, void **ppv) 33{ 34 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 35 36 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); 37} 38 39static ULONG WINAPI HTMLMetaElement_AddRef(IHTMLMetaElement *iface) 40{ 41 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 42 43 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); 44} 45 46static ULONG WINAPI HTMLMetaElement_Release(IHTMLMetaElement *iface) 47{ 48 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 49 50 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); 51} 52 53static HRESULT WINAPI HTMLMetaElement_GetTypeInfoCount(IHTMLMetaElement *iface, UINT *pctinfo) 54{ 55 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 56 return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo); 57} 58 59static HRESULT WINAPI HTMLMetaElement_GetTypeInfo(IHTMLMetaElement *iface, UINT iTInfo, 60 LCID lcid, ITypeInfo **ppTInfo) 61{ 62 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 63 return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid, 64 ppTInfo); 65} 66 67static HRESULT WINAPI HTMLMetaElement_GetIDsOfNames(IHTMLMetaElement *iface, REFIID riid, 68 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) 69{ 70 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 71 return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames, 72 cNames, lcid, rgDispId); 73} 74 75static HRESULT WINAPI HTMLMetaElement_Invoke(IHTMLMetaElement *iface, DISPID dispIdMember, REFIID riid, 76 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, 77 UINT *puArgErr) 78{ 79 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 80 return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid, 81 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 82} 83 84static HRESULT WINAPI HTMLMetaElement_put_httpEquiv(IHTMLMetaElement *iface, BSTR v) 85{ 86 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 87 FIXME("(%p)->(%s)\n", This, debugstr_w(v)); 88 return E_NOTIMPL; 89} 90 91static HRESULT WINAPI HTMLMetaElement_get_httpEquiv(IHTMLMetaElement *iface, BSTR *p) 92{ 93 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 94 static const PRUnichar httpEquivW[] = {'h','t','t','p','-','e','q','u','i','v',0}; 95 96 TRACE("(%p)->(%p)\n", This, p); 97 98 return elem_string_attr_getter(&This->element, httpEquivW, TRUE, p); 99} 100 101static HRESULT WINAPI HTMLMetaElement_put_content(IHTMLMetaElement *iface, BSTR v) 102{ 103 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 104 FIXME("(%p)->(%s)\n", This, debugstr_w(v)); 105 return E_NOTIMPL; 106} 107 108static HRESULT WINAPI HTMLMetaElement_get_content(IHTMLMetaElement *iface, BSTR *p) 109{ 110 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 111 static const PRUnichar contentW[] = {'c','o','n','t','e','n','t',0}; 112 113 TRACE("(%p)->(%p)\n", This, p); 114 115 return elem_string_attr_getter(&This->element, contentW, TRUE, p); 116} 117 118static HRESULT WINAPI HTMLMetaElement_put_name(IHTMLMetaElement *iface, BSTR v) 119{ 120 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 121 FIXME("(%p)->(%s)\n", This, debugstr_w(v)); 122 return E_NOTIMPL; 123} 124 125static HRESULT WINAPI HTMLMetaElement_get_name(IHTMLMetaElement *iface, BSTR *p) 126{ 127 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 128 static const PRUnichar nameW[] = {'n','a','m','e',0}; 129 130 TRACE("(%p)->(%p)\n", This, p); 131 132 return elem_string_attr_getter(&This->element, nameW, TRUE, p); 133} 134 135static HRESULT WINAPI HTMLMetaElement_put_url(IHTMLMetaElement *iface, BSTR v) 136{ 137 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 138 FIXME("(%p)->(%s)\n", This, debugstr_w(v)); 139 return E_NOTIMPL; 140} 141 142static HRESULT WINAPI HTMLMetaElement_get_url(IHTMLMetaElement *iface, BSTR *p) 143{ 144 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 145 FIXME("(%p)->(%p)\n", This, p); 146 return E_NOTIMPL; 147} 148 149static const WCHAR charsetW[] = {'c','h','a','r','s','e','t',0}; 150 151static HRESULT WINAPI HTMLMetaElement_put_charset(IHTMLMetaElement *iface, BSTR v) 152{ 153 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 154 155 TRACE("(%p)->(%s)\n", This, debugstr_w(v)); 156 157 return elem_string_attr_setter(&This->element, charsetW, v); 158} 159 160static HRESULT WINAPI HTMLMetaElement_get_charset(IHTMLMetaElement *iface, BSTR *p) 161{ 162 HTMLMetaElement *This = impl_from_IHTMLMetaElement(iface); 163 164 TRACE("(%p)->(%p)\n", This, p); 165 166 return elem_string_attr_getter(&This->element, charsetW, TRUE, p); 167} 168 169static const IHTMLMetaElementVtbl HTMLMetaElementVtbl = { 170 HTMLMetaElement_QueryInterface, 171 HTMLMetaElement_AddRef, 172 HTMLMetaElement_Release, 173 HTMLMetaElement_GetTypeInfoCount, 174 HTMLMetaElement_GetTypeInfo, 175 HTMLMetaElement_GetIDsOfNames, 176 HTMLMetaElement_Invoke, 177 HTMLMetaElement_put_httpEquiv, 178 HTMLMetaElement_get_httpEquiv, 179 HTMLMetaElement_put_content, 180 HTMLMetaElement_get_content, 181 HTMLMetaElement_put_name, 182 HTMLMetaElement_get_name, 183 HTMLMetaElement_put_url, 184 HTMLMetaElement_get_url, 185 HTMLMetaElement_put_charset, 186 HTMLMetaElement_get_charset 187}; 188 189static inline HTMLMetaElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) 190{ 191 return CONTAINING_RECORD(iface, HTMLMetaElement, element.node); 192} 193 194static HRESULT HTMLMetaElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) 195{ 196 HTMLMetaElement *This = impl_from_HTMLDOMNode(iface); 197 198 if(IsEqualGUID(&IID_IUnknown, riid)) { 199 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); 200 *ppv = &This->IHTMLMetaElement_iface; 201 }else if(IsEqualGUID(&IID_IDispatch, riid)) { 202 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); 203 *ppv = &This->IHTMLMetaElement_iface; 204 }else if(IsEqualGUID(&IID_IHTMLMetaElement, riid)) { 205 TRACE("(%p)->(IID_IHTMLMetaElement %p)\n", This, ppv); 206 *ppv = &This->IHTMLMetaElement_iface; 207 }else { 208 return HTMLElement_QI(&This->element.node, riid, ppv); 209 } 210 211 IUnknown_AddRef((IUnknown*)*ppv); 212 return S_OK; 213} 214 215static void HTMLMetaElement_destructor(HTMLDOMNode *iface) 216{ 217 HTMLMetaElement *This = impl_from_HTMLDOMNode(iface); 218 219 HTMLElement_destructor(&This->element.node); 220} 221 222static const NodeImplVtbl HTMLMetaElementImplVtbl = { 223 HTMLMetaElement_QI, 224 HTMLMetaElement_destructor, 225 HTMLElement_cpc, 226 HTMLElement_clone, 227 HTMLElement_handle_event, 228 HTMLElement_get_attr_col 229}; 230 231static const tid_t HTMLMetaElement_iface_tids[] = { 232 HTMLELEMENT_TIDS, 233 IHTMLMetaElement_tid, 234 0 235}; 236 237static dispex_static_data_t HTMLMetaElement_dispex = { 238 NULL, 239 DispHTMLMetaElement_tid, 240 NULL, 241 HTMLMetaElement_iface_tids 242}; 243 244HRESULT HTMLMetaElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem) 245{ 246 HTMLMetaElement *ret; 247 248 ret = heap_alloc_zero(sizeof(*ret)); 249 if(!ret) 250 return E_OUTOFMEMORY; 251 252 ret->IHTMLMetaElement_iface.lpVtbl = &HTMLMetaElementVtbl; 253 ret->element.node.vtbl = &HTMLMetaElementImplVtbl; 254 255 HTMLElement_Init(&ret->element, doc, nselem, &HTMLMetaElement_dispex); 256 257 *elem = &ret->element; 258 return S_OK; 259}