Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenxmldoc.c
Go to the documentation of this file.
00001 /* 00002 * XML Document implementation 00003 * 00004 * Copyright 2007 James Hawkins 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #define COBJMACROS 00022 00023 #include "config.h" 00024 00025 #include <stdarg.h> 00026 #include "windef.h" 00027 #include "winbase.h" 00028 #include "winuser.h" 00029 #include "ole2.h" 00030 #include "msxml2.h" 00031 #include "wininet.h" 00032 #include "winreg.h" 00033 #include "shlwapi.h" 00034 #include "ocidl.h" 00035 00036 #include "wine/debug.h" 00037 00038 #include "msxml_private.h" 00039 00040 WINE_DEFAULT_DEBUG_CHANNEL(msxml); 00041 00042 #ifdef HAVE_LIBXML2 00043 00044 /* FIXME: IXMLDocument needs to implement 00045 * - IXMLError 00046 * - IPersistMoniker 00047 */ 00048 00049 typedef struct _xmldoc 00050 { 00051 const IXMLDocumentVtbl *lpVtbl; 00052 const IPersistStreamInitVtbl *lpvtblIPersistStreamInit; 00053 LONG ref; 00054 HRESULT error; 00055 00056 /* IXMLDocument */ 00057 xmlDocPtr xmldoc; 00058 00059 /* IPersistStream */ 00060 IStream *stream; 00061 } xmldoc; 00062 00063 static inline xmldoc *impl_from_IXMLDocument(IXMLDocument *iface) 00064 { 00065 return (xmldoc *)((char*)iface - FIELD_OFFSET(xmldoc, lpVtbl)); 00066 } 00067 00068 static inline xmldoc *impl_from_IPersistStreamInit(IPersistStreamInit *iface) 00069 { 00070 return (xmldoc *)((char*)iface - FIELD_OFFSET(xmldoc, lpvtblIPersistStreamInit)); 00071 } 00072 00073 static HRESULT WINAPI xmldoc_QueryInterface(IXMLDocument *iface, REFIID riid, void** ppvObject) 00074 { 00075 xmldoc *This = impl_from_IXMLDocument(iface); 00076 00077 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); 00078 00079 if (IsEqualGUID(riid, &IID_IUnknown) || 00080 IsEqualGUID(riid, &IID_IXMLDocument) || 00081 IsEqualGUID(riid, &IID_IXMLDOMDocument)) 00082 { 00083 *ppvObject = iface; 00084 } 00085 else if (IsEqualGUID(&IID_IPersistStreamInit, riid) || 00086 IsEqualGUID(&IID_IPersistStream, riid)) 00087 { 00088 *ppvObject = &(This->lpvtblIPersistStreamInit); 00089 } 00090 else 00091 { 00092 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 00093 return E_NOINTERFACE; 00094 } 00095 00096 IXMLDocument_AddRef(iface); 00097 00098 return S_OK; 00099 } 00100 00101 static ULONG WINAPI xmldoc_AddRef(IXMLDocument *iface) 00102 { 00103 xmldoc *This = impl_from_IXMLDocument(iface); 00104 TRACE("%p\n", This); 00105 return InterlockedIncrement(&This->ref); 00106 } 00107 00108 static ULONG WINAPI xmldoc_Release(IXMLDocument *iface) 00109 { 00110 xmldoc *This = impl_from_IXMLDocument(iface); 00111 LONG ref; 00112 00113 TRACE("%p\n", This); 00114 00115 ref = InterlockedDecrement(&This->ref); 00116 if (ref == 0) 00117 { 00118 xmlFreeDoc(This->xmldoc); 00119 if (This->stream) IStream_Release(This->stream); 00120 heap_free(This); 00121 } 00122 00123 return ref; 00124 } 00125 00126 static HRESULT WINAPI xmldoc_GetTypeInfoCount(IXMLDocument *iface, UINT* pctinfo) 00127 { 00128 xmldoc *This = impl_from_IXMLDocument(iface); 00129 00130 TRACE("(%p)->(%p)\n", This, pctinfo); 00131 00132 *pctinfo = 1; 00133 00134 return S_OK; 00135 } 00136 00137 static HRESULT WINAPI xmldoc_GetTypeInfo(IXMLDocument *iface, UINT iTInfo, 00138 LCID lcid, ITypeInfo** ppTInfo) 00139 { 00140 xmldoc *This = impl_from_IXMLDocument(iface); 00141 HRESULT hr; 00142 00143 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); 00144 00145 hr = get_typeinfo(IXMLDocument_tid, ppTInfo); 00146 00147 return hr; 00148 } 00149 00150 static HRESULT WINAPI xmldoc_GetIDsOfNames(IXMLDocument *iface, REFIID riid, 00151 LPOLESTR* rgszNames, UINT cNames, 00152 LCID lcid, DISPID* rgDispId) 00153 { 00154 xmldoc *This = impl_from_IXMLDocument(iface); 00155 ITypeInfo *typeinfo; 00156 HRESULT hr; 00157 00158 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, 00159 lcid, rgDispId); 00160 00161 if(!rgszNames || cNames == 0 || !rgDispId) 00162 return E_INVALIDARG; 00163 00164 hr = get_typeinfo(IXMLDocument_tid, &typeinfo); 00165 if(SUCCEEDED(hr)) 00166 { 00167 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); 00168 ITypeInfo_Release(typeinfo); 00169 } 00170 00171 return hr; 00172 } 00173 00174 static HRESULT WINAPI xmldoc_Invoke(IXMLDocument *iface, DISPID dispIdMember, 00175 REFIID riid, LCID lcid, WORD wFlags, 00176 DISPPARAMS* pDispParams, VARIANT* pVarResult, 00177 EXCEPINFO* pExcepInfo, UINT* puArgErr) 00178 { 00179 xmldoc *This = impl_from_IXMLDocument(iface); 00180 ITypeInfo *typeinfo; 00181 HRESULT hr; 00182 00183 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), 00184 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 00185 00186 hr = get_typeinfo(IXMLDocument_tid, &typeinfo); 00187 if(SUCCEEDED(hr)) 00188 { 00189 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams, 00190 pVarResult, pExcepInfo, puArgErr); 00191 ITypeInfo_Release(typeinfo); 00192 } 00193 00194 return hr; 00195 } 00196 00197 static HRESULT WINAPI xmldoc_get_root(IXMLDocument *iface, IXMLElement **p) 00198 { 00199 xmldoc *This = impl_from_IXMLDocument(iface); 00200 xmlNodePtr root; 00201 00202 TRACE("(%p, %p)\n", iface, p); 00203 00204 if (!p) 00205 return E_INVALIDARG; 00206 00207 *p = NULL; 00208 00209 if (!(root = xmlDocGetRootElement(This->xmldoc))) 00210 return E_FAIL; 00211 00212 return XMLElement_create((IUnknown *)This, root, (LPVOID *)p, FALSE); 00213 } 00214 00215 static HRESULT WINAPI xmldoc_get_fileSize(IXMLDocument *iface, BSTR *p) 00216 { 00217 FIXME("(%p, %p): stub\n", iface, p); 00218 return E_NOTIMPL; 00219 } 00220 00221 static HRESULT WINAPI xmldoc_put_fileModifiedDate(IXMLDocument *iface, BSTR *p) 00222 { 00223 FIXME("(%p, %p): stub\n", iface, p); 00224 return E_NOTIMPL; 00225 } 00226 00227 static HRESULT WINAPI xmldoc_get_fileUpdatedDate(IXMLDocument *iface, BSTR *p) 00228 { 00229 FIXME("(%p, %p): stub\n", iface, p); 00230 return E_NOTIMPL; 00231 } 00232 00233 static HRESULT WINAPI xmldoc_get_URL(IXMLDocument *iface, BSTR *p) 00234 { 00235 FIXME("(%p, %p): stub\n", iface, p); 00236 return E_NOTIMPL; 00237 } 00238 00239 typedef struct { 00240 const struct IBindStatusCallbackVtbl *lpVtbl; 00241 } bsc; 00242 00243 static HRESULT WINAPI bsc_QueryInterface( 00244 IBindStatusCallback *iface, 00245 REFIID riid, 00246 LPVOID *ppobj ) 00247 { 00248 if (IsEqualGUID(riid, &IID_IUnknown) || 00249 IsEqualGUID(riid, &IID_IBindStatusCallback)) 00250 { 00251 IBindStatusCallback_AddRef( iface ); 00252 *ppobj = iface; 00253 return S_OK; 00254 } 00255 00256 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 00257 return E_NOINTERFACE; 00258 } 00259 00260 static ULONG WINAPI bsc_AddRef( 00261 IBindStatusCallback *iface ) 00262 { 00263 return 2; 00264 } 00265 00266 static ULONG WINAPI bsc_Release( 00267 IBindStatusCallback *iface ) 00268 { 00269 return 1; 00270 } 00271 00272 static HRESULT WINAPI bsc_OnStartBinding( 00273 IBindStatusCallback* iface, 00274 DWORD dwReserved, 00275 IBinding* pib) 00276 { 00277 return S_OK; 00278 } 00279 00280 static HRESULT WINAPI bsc_GetPriority( 00281 IBindStatusCallback* iface, 00282 LONG* pnPriority) 00283 { 00284 return S_OK; 00285 } 00286 00287 static HRESULT WINAPI bsc_OnLowResource( 00288 IBindStatusCallback* iface, 00289 DWORD reserved) 00290 { 00291 return S_OK; 00292 } 00293 00294 static HRESULT WINAPI bsc_OnProgress( 00295 IBindStatusCallback* iface, 00296 ULONG ulProgress, 00297 ULONG ulProgressMax, 00298 ULONG ulStatusCode, 00299 LPCWSTR szStatusText) 00300 { 00301 return S_OK; 00302 } 00303 00304 static HRESULT WINAPI bsc_OnStopBinding( 00305 IBindStatusCallback* iface, 00306 HRESULT hresult, 00307 LPCWSTR szError) 00308 { 00309 return S_OK; 00310 } 00311 00312 static HRESULT WINAPI bsc_GetBindInfo( 00313 IBindStatusCallback* iface, 00314 DWORD* grfBINDF, 00315 BINDINFO* pbindinfo) 00316 { 00317 *grfBINDF = BINDF_RESYNCHRONIZE; 00318 00319 return S_OK; 00320 } 00321 00322 static HRESULT WINAPI bsc_OnDataAvailable( 00323 IBindStatusCallback* iface, 00324 DWORD grfBSCF, 00325 DWORD dwSize, 00326 FORMATETC* pformatetc, 00327 STGMEDIUM* pstgmed) 00328 { 00329 return S_OK; 00330 } 00331 00332 static HRESULT WINAPI bsc_OnObjectAvailable( 00333 IBindStatusCallback* iface, 00334 REFIID riid, 00335 IUnknown* punk) 00336 { 00337 return S_OK; 00338 } 00339 00340 static const struct IBindStatusCallbackVtbl bsc_vtbl = 00341 { 00342 bsc_QueryInterface, 00343 bsc_AddRef, 00344 bsc_Release, 00345 bsc_OnStartBinding, 00346 bsc_GetPriority, 00347 bsc_OnLowResource, 00348 bsc_OnProgress, 00349 bsc_OnStopBinding, 00350 bsc_GetBindInfo, 00351 bsc_OnDataAvailable, 00352 bsc_OnObjectAvailable 00353 }; 00354 00355 static bsc xmldoc_bsc = { &bsc_vtbl }; 00356 00357 static HRESULT WINAPI xmldoc_put_URL(IXMLDocument *iface, BSTR p) 00358 { 00359 WCHAR url[INTERNET_MAX_URL_LENGTH]; 00360 IStream *stream; 00361 IBindCtx *bctx; 00362 IMoniker *moniker; 00363 IPersistStreamInit *persist; 00364 HRESULT hr; 00365 00366 TRACE("(%p, %s)\n", iface, debugstr_w(p)); 00367 00368 if (!p) 00369 return E_INVALIDARG; 00370 00371 if (!PathIsURLW(p)) 00372 { 00373 WCHAR fullpath[MAX_PATH]; 00374 DWORD needed = sizeof(url) / sizeof(WCHAR); 00375 00376 if (!PathSearchAndQualifyW(p, fullpath, sizeof(fullpath) / sizeof(WCHAR))) 00377 { 00378 ERR("can't find path\n"); 00379 return E_FAIL; 00380 } 00381 00382 if (FAILED(UrlCreateFromPathW(fullpath, url, &needed, 0))) 00383 { 00384 ERR("can't create url from path\n"); 00385 return E_FAIL; 00386 } 00387 00388 p = url; 00389 } 00390 00391 hr = CreateURLMoniker(NULL, p, &moniker); 00392 if (FAILED(hr)) 00393 return hr; 00394 00395 CreateAsyncBindCtx(0, (IBindStatusCallback *)&xmldoc_bsc, 0, &bctx); 00396 00397 hr = IMoniker_BindToStorage(moniker, bctx, NULL, &IID_IStream, (LPVOID *)&stream); 00398 IBindCtx_Release(bctx); 00399 IMoniker_Release(moniker); 00400 if (FAILED(hr)) 00401 return hr; 00402 00403 hr = IXMLDocument_QueryInterface(iface, &IID_IPersistStreamInit, (LPVOID *)&persist); 00404 if (FAILED(hr)) 00405 { 00406 IStream_Release(stream); 00407 return hr; 00408 } 00409 00410 hr = IPersistStreamInit_Load(persist, stream); 00411 IPersistStreamInit_Release(persist); 00412 IStream_Release(stream); 00413 00414 return hr; 00415 } 00416 00417 static HRESULT WINAPI xmldoc_get_mimeType(IXMLDocument *iface, BSTR *p) 00418 { 00419 FIXME("(%p, %p): stub\n", iface, p); 00420 return E_NOTIMPL; 00421 } 00422 00423 static HRESULT WINAPI xmldoc_get_readyState(IXMLDocument *iface, LONG *p) 00424 { 00425 FIXME("(%p, %p): stub\n", iface, p); 00426 return E_NOTIMPL; 00427 } 00428 00429 static HRESULT WINAPI xmldoc_get_charset(IXMLDocument *iface, BSTR *p) 00430 { 00431 FIXME("(%p, %p): stub\n", iface, p); 00432 return E_NOTIMPL; 00433 } 00434 00435 static HRESULT WINAPI xmldoc_put_charset(IXMLDocument *iface, BSTR p) 00436 { 00437 FIXME("(%p, %p): stub\n", iface, p); 00438 return E_NOTIMPL; 00439 } 00440 00441 static HRESULT WINAPI xmldoc_get_version(IXMLDocument *iface, BSTR *p) 00442 { 00443 xmldoc *This = impl_from_IXMLDocument(iface); 00444 00445 TRACE("(%p, %p)\n", This, p); 00446 00447 if (!p) return E_INVALIDARG; 00448 *p = bstr_from_xmlChar(This->xmldoc->version); 00449 00450 return S_OK; 00451 } 00452 00453 static HRESULT WINAPI xmldoc_get_doctype(IXMLDocument *iface, BSTR *p) 00454 { 00455 xmldoc *This = impl_from_IXMLDocument(iface); 00456 xmlDtd *dtd; 00457 00458 TRACE("(%p, %p)\n", This, p); 00459 00460 if (!p) return E_INVALIDARG; 00461 00462 dtd = xmlGetIntSubset(This->xmldoc); 00463 if (!dtd) return S_FALSE; 00464 00465 *p = bstr_from_xmlChar(dtd->name); 00466 CharUpperBuffW(*p, SysStringLen(*p)); 00467 00468 return S_OK; 00469 } 00470 00471 static HRESULT WINAPI xmldoc_get_dtdURl(IXMLDocument *iface, BSTR *p) 00472 { 00473 FIXME("(%p, %p): stub\n", iface, p); 00474 return E_NOTIMPL; 00475 } 00476 00477 static xmlElementType type_msxml_to_libxml(LONG type) 00478 { 00479 switch (type) 00480 { 00481 case XMLELEMTYPE_ELEMENT: 00482 return XML_ELEMENT_NODE; 00483 case XMLELEMTYPE_TEXT: 00484 return XML_TEXT_NODE; 00485 case XMLELEMTYPE_COMMENT: 00486 return XML_COMMENT_NODE; 00487 case XMLELEMTYPE_DOCUMENT: 00488 return XML_DOCUMENT_NODE; 00489 case XMLELEMTYPE_DTD: 00490 return XML_DTD_NODE; 00491 case XMLELEMTYPE_PI: 00492 return XML_PI_NODE; 00493 default: 00494 break; 00495 } 00496 00497 return -1; /* FIXME: what is OTHER in msxml? */ 00498 } 00499 00500 static HRESULT WINAPI xmldoc_createElement(IXMLDocument *iface, VARIANT vType, 00501 VARIANT var1, IXMLElement **ppElem) 00502 { 00503 xmlNodePtr node; 00504 static const xmlChar empty[] = "\0"; 00505 00506 TRACE("(%p, %p)\n", iface, ppElem); 00507 00508 if (!ppElem) 00509 return E_INVALIDARG; 00510 00511 *ppElem = NULL; 00512 00513 if (V_VT(&vType) != VT_I4) 00514 return E_INVALIDARG; 00515 00516 if(type_msxml_to_libxml(V_I4(&vType)) == -1) 00517 return E_NOTIMPL; 00518 00519 node = xmlNewNode(NULL, empty); 00520 node->type = type_msxml_to_libxml(V_I4(&vType)); 00521 00522 /* FIXME: create xmlNodePtr based on vType and var1 */ 00523 return XMLElement_create((IUnknown *)iface, node, (LPVOID *)ppElem, TRUE); 00524 } 00525 00526 static const struct IXMLDocumentVtbl xmldoc_vtbl = 00527 { 00528 xmldoc_QueryInterface, 00529 xmldoc_AddRef, 00530 xmldoc_Release, 00531 xmldoc_GetTypeInfoCount, 00532 xmldoc_GetTypeInfo, 00533 xmldoc_GetIDsOfNames, 00534 xmldoc_Invoke, 00535 xmldoc_get_root, 00536 xmldoc_get_fileSize, 00537 xmldoc_put_fileModifiedDate, 00538 xmldoc_get_fileUpdatedDate, 00539 xmldoc_get_URL, 00540 xmldoc_put_URL, 00541 xmldoc_get_mimeType, 00542 xmldoc_get_readyState, 00543 xmldoc_get_charset, 00544 xmldoc_put_charset, 00545 xmldoc_get_version, 00546 xmldoc_get_doctype, 00547 xmldoc_get_dtdURl, 00548 xmldoc_createElement 00549 }; 00550 00551 /************************************************************************ 00552 * xmldoc implementation of IPersistStreamInit. 00553 */ 00554 static HRESULT WINAPI xmldoc_IPersistStreamInit_QueryInterface( 00555 IPersistStreamInit *iface, REFIID riid, LPVOID *ppvObj) 00556 { 00557 xmldoc *this = impl_from_IPersistStreamInit(iface); 00558 return IXMLDocument_QueryInterface((IXMLDocument *)this, riid, ppvObj); 00559 } 00560 00561 static ULONG WINAPI xmldoc_IPersistStreamInit_AddRef( 00562 IPersistStreamInit *iface) 00563 { 00564 xmldoc *this = impl_from_IPersistStreamInit(iface); 00565 return IXMLDocument_AddRef((IXMLDocument *)this); 00566 } 00567 00568 static ULONG WINAPI xmldoc_IPersistStreamInit_Release( 00569 IPersistStreamInit *iface) 00570 { 00571 xmldoc *this = impl_from_IPersistStreamInit(iface); 00572 return IXMLDocument_Release((IXMLDocument *)this); 00573 } 00574 00575 static HRESULT WINAPI xmldoc_IPersistStreamInit_GetClassID( 00576 IPersistStreamInit *iface, CLSID *classid) 00577 { 00578 xmldoc *this = impl_from_IPersistStreamInit(iface); 00579 TRACE("(%p,%p)\n", this, classid); 00580 00581 if (!classid) return E_POINTER; 00582 00583 *classid = CLSID_XMLDocument; 00584 return S_OK; 00585 } 00586 00587 static HRESULT WINAPI xmldoc_IPersistStreamInit_IsDirty( 00588 IPersistStreamInit *iface) 00589 { 00590 FIXME("(%p): stub!\n", iface); 00591 return E_NOTIMPL; 00592 } 00593 00594 xmlDocPtr parse_xml(char *ptr, int len) 00595 { 00596 #ifdef HAVE_XMLREADMEMORY 00597 return xmlReadMemory(ptr, len, NULL, NULL, 00598 XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NOBLANKS); 00599 #else 00600 return xmlParseMemory(ptr, len); 00601 #endif 00602 } 00603 00604 static HRESULT WINAPI xmldoc_IPersistStreamInit_Load( 00605 IPersistStreamInit *iface, LPSTREAM pStm) 00606 { 00607 xmldoc *This = impl_from_IPersistStreamInit(iface); 00608 HRESULT hr; 00609 HGLOBAL hglobal; 00610 DWORD read, written, len; 00611 BYTE buf[4096]; 00612 char *ptr; 00613 00614 TRACE("(%p, %p)\n", iface, pStm); 00615 00616 if (!pStm) 00617 return E_INVALIDARG; 00618 00619 /* release previously allocated stream */ 00620 if (This->stream) IStream_Release(This->stream); 00621 hr = CreateStreamOnHGlobal(NULL, TRUE, &This->stream); 00622 if (FAILED(hr)) 00623 return hr; 00624 00625 do 00626 { 00627 IStream_Read(pStm, buf, sizeof(buf), &read); 00628 hr = IStream_Write(This->stream, buf, read, &written); 00629 } while(SUCCEEDED(hr) && written != 0 && read != 0); 00630 00631 if (FAILED(hr)) 00632 { 00633 ERR("Failed to copy stream\n"); 00634 return hr; 00635 } 00636 00637 hr = GetHGlobalFromStream(This->stream, &hglobal); 00638 if (FAILED(hr)) 00639 return hr; 00640 00641 len = GlobalSize(hglobal); 00642 ptr = GlobalLock(hglobal); 00643 if (len != 0) 00644 { 00645 xmlFreeDoc(This->xmldoc); 00646 This->xmldoc = parse_xml(ptr, len); 00647 } 00648 GlobalUnlock(hglobal); 00649 00650 if (!This->xmldoc) 00651 { 00652 ERR("Failed to parse xml\n"); 00653 return E_FAIL; 00654 } 00655 00656 return S_OK; 00657 } 00658 00659 static HRESULT WINAPI xmldoc_IPersistStreamInit_Save( 00660 IPersistStreamInit *iface, LPSTREAM pStm, BOOL fClearDirty) 00661 { 00662 FIXME("(%p, %p, %d): stub!\n", iface, pStm, fClearDirty); 00663 return E_NOTIMPL; 00664 } 00665 00666 static HRESULT WINAPI xmldoc_IPersistStreamInit_GetSizeMax( 00667 IPersistStreamInit *iface, ULARGE_INTEGER *pcbSize) 00668 { 00669 xmldoc *This = impl_from_IPersistStreamInit(iface); 00670 TRACE("(%p, %p)\n", This, pcbSize); 00671 return E_NOTIMPL; 00672 } 00673 00674 static HRESULT WINAPI xmldoc_IPersistStreamInit_InitNew( 00675 IPersistStreamInit *iface) 00676 { 00677 xmldoc *This = impl_from_IPersistStreamInit(iface); 00678 TRACE("(%p)\n", This); 00679 return S_OK; 00680 } 00681 00682 static const IPersistStreamInitVtbl xmldoc_IPersistStreamInit_VTable = 00683 { 00684 xmldoc_IPersistStreamInit_QueryInterface, 00685 xmldoc_IPersistStreamInit_AddRef, 00686 xmldoc_IPersistStreamInit_Release, 00687 xmldoc_IPersistStreamInit_GetClassID, 00688 xmldoc_IPersistStreamInit_IsDirty, 00689 xmldoc_IPersistStreamInit_Load, 00690 xmldoc_IPersistStreamInit_Save, 00691 xmldoc_IPersistStreamInit_GetSizeMax, 00692 xmldoc_IPersistStreamInit_InitNew 00693 }; 00694 00695 HRESULT XMLDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) 00696 { 00697 xmldoc *doc; 00698 00699 TRACE("(%p,%p)\n", pUnkOuter, ppObj); 00700 00701 doc = heap_alloc(sizeof (*doc)); 00702 if(!doc) 00703 return E_OUTOFMEMORY; 00704 00705 doc->lpVtbl = &xmldoc_vtbl; 00706 doc->lpvtblIPersistStreamInit = &xmldoc_IPersistStreamInit_VTable; 00707 doc->ref = 1; 00708 doc->error = S_OK; 00709 doc->xmldoc = NULL; 00710 doc->stream = NULL; 00711 00712 *ppObj = &doc->lpVtbl; 00713 00714 TRACE("returning iface %p\n", *ppObj); 00715 return S_OK; 00716 } 00717 00718 #else 00719 00720 HRESULT XMLDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) 00721 { 00722 MESSAGE("This program tried to use an XMLDocument object, but\n" 00723 "libxml2 support was not present at compile time.\n"); 00724 return E_NOTIMPL; 00725 } 00726 00727 #endif Generated on Sat May 26 2012 04:23:58 for ReactOS by
1.7.6.1
|