ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

xmldoc.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.