ReactOS 0.4.17-dev-923-g4c9a150
mscfile.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Management Console
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Helper functions for MSXML3
5 * COPYRIGHT: Copyright 2026 Eric Kohl (eric.kohl@reactos.org)
6 */
7
8#include "precomp.h"
9
10#include <initguid.h>
11
12DEFINE_GUID(CLSID_DOMDocument30, 0xf5078f32, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);
13
14
16{
20}
21
23{
26}
27
28
29// Helper function to create a VT_BSTR variant from a null terminated string.
32{
33 HRESULT hr = S_OK;
34 BSTR bstr = SysAllocString(wszValue);
35 CHK_ALLOC(bstr);
36
37 V_VT(&Variant) = VT_BSTR;
38 V_BSTR(&Variant) = bstr;
39
40CleanUp:
41 return hr;
42}
43
44// Helper function to create a DOM instance.
47{
48 HRESULT hr = CoCreateInstance(CLSID_DOMDocument30,
49 NULL,
50 CLSCTX_INPROC_SERVER,
51 IID_IXMLDOMDocument,
52 (void**)&m_pDocument);
53 if (SUCCEEDED(hr))
54 {
55 m_pDocument->put_async(VARIANT_FALSE);
56 m_pDocument->put_validateOnParse(VARIANT_FALSE);
57 m_pDocument->put_resolveExternals(VARIANT_FALSE);
58 m_pDocument->put_preserveWhiteSpace(VARIANT_TRUE);
59 }
60 return hr;
61}
62
63// Helper that allocates the BSTR param for the caller.
66{
67 HRESULT hr = S_OK;
68 *ppElement = NULL;
69
70 BSTR bstrName = SysAllocString(wszName);
71 CHK_ALLOC(bstrName);
72 CHK_HR(m_pDocument->createElement(bstrName, ppElement));
73
74CleanUp:
75 SysFreeString(bstrName);
76 return hr;
77}
78
79// Helper function to append a child to a parent node.
82{
83 HRESULT hr = S_OK;
84 IXMLDOMNode *pChildOut = NULL;
85 if (pParent == NULL)
86 CHK_HR(m_pDocument->appendChild(pChild, &pChildOut));
87 else
88 CHK_HR(pParent->appendChild(pChild, &pChildOut));
89
90CleanUp:
91 SAFE_RELEASE(pChildOut);
92 return hr;
93}
94
95// Helper function to create and add a processing instruction to a document node.
98{
99 HRESULT hr = S_OK;
101
102 BSTR bstrTarget = SysAllocString(wszTarget);
103 BSTR bstrData = SysAllocString(wszData);
104 CHK_ALLOC(bstrTarget && bstrData);
105
106 CHK_HR(m_pDocument->createProcessingInstruction(bstrTarget, bstrData, &pPI));
108
109CleanUp:
110 SAFE_RELEASE(pPI);
111 SysFreeString(bstrTarget);
112 SysFreeString(bstrData);
113 return hr;
114}
115
116 // Helper function to create and add a comment to a document node.
118 {
119 HRESULT hr = S_OK;
120 IXMLDOMComment *pComment = NULL;
121
122 BSTR bstrComment = SysAllocString(wszComment);
123 CHK_ALLOC(bstrComment);
124
125 CHK_HR(m_pDocument->createComment(bstrComment, &pComment));
127
128 CleanUp:
129 SAFE_RELEASE(pComment);
130 SysFreeString(bstrComment);
131 return hr;
132 }
133
134 // Helper function to create and add an attribute to a parent node.
136 {
137 HRESULT hr = S_OK;
138 IXMLDOMAttribute *pAttribute = NULL;
139 IXMLDOMAttribute *pAttributeOut = NULL; // Out param that is not used
140
141 BSTR bstrName = NULL;
142 VARIANT varValue;
143 VariantInit(&varValue);
144
145 bstrName = SysAllocString(wszName);
146 CHK_ALLOC(bstrName);
147 CHK_HR(VariantFromString(wszValue, varValue));
148
149 CHK_HR(m_pDocument->createAttribute(bstrName, &pAttribute));
150 CHK_HR(pAttribute->put_value(varValue));
151 CHK_HR(pParent->setAttributeNode(pAttribute, &pAttributeOut));
152
153 CleanUp:
154 SAFE_RELEASE(pAttribute);
155 SAFE_RELEASE(pAttributeOut);
156 SysFreeString(bstrName);
157 VariantClear(&varValue);
158 return hr;
159 }
160
161 // Helper function to create and append a text node to a parent node.
163 {
164 HRESULT hr = S_OK;
166
167 BSTR bstrText = SysAllocString(wszText);
168 CHK_ALLOC(bstrText);
169
172
173 CleanUp:
175 SysFreeString(bstrText);
176 return hr;
177 }
178
179 // Helper function to create and append a CDATA node to a parent node.
181 {
182 HRESULT hr = S_OK;
183 IXMLDOMCDATASection *pCDATA = NULL;
184
185 BSTR bstrCDATA = SysAllocString(wszCDATA);
186 CHK_ALLOC(bstrCDATA);
187
188 CHK_HR(m_pDocument->createCDATASection(bstrCDATA, &pCDATA));
190
191 CleanUp:
192 SAFE_RELEASE(pCDATA);
193 SysFreeString(bstrCDATA);
194 return hr;
195 }
196
197 // Helper function to create and append an element node to a parent node, and pass the newly created
198 // element node to caller if it wants.
200 {
201 HRESULT hr = S_OK;
202 IXMLDOMElement* pElement = NULL;
203
204 CHK_HR(CreateElement(wszName, &pElement));
206
207 CleanUp:
208 if (ppElement)
209 *ppElement = pElement; // Caller is repsonsible to release this element.
210 else
211 SAFE_RELEASE(pElement); // Caller is not interested on this element, so release it.
212
213 return hr;
214 }
215
216
217LPWSTR
219 int nShowCmd)
220{
221 switch (nShowCmd)
222 {
223 case SW_HIDE:
224 return (LPWSTR)L"SW_HIDE";
225
226 case SW_SHOWNORMAL:
227 return (LPWSTR)L"SW_SHOWNORMAL";
228
229 case SW_SHOWMINIMIZED:
230 return (LPWSTR)L"SW_SHOWMINIMIZED";
231
232 case SW_SHOWMAXIMIZED:
233 return (LPWSTR)L"SW_SHOWMAXIMIZED";
234
236 return (LPWSTR)L"SW_SHOWNOACTIVATE";
237
238 case SW_SHOW:
239 return (LPWSTR)L"SW_SHOW";
240
241 case SW_MINIMIZE:
242 return (LPWSTR)L"SW_MINIMIZE";
243
245 return (LPWSTR)L"SW_SHOWMINNOACTIVE";
246
247 case SW_SHOWNA:
248 return (LPWSTR)L"SW_SHOWNA";
249
250 case SW_RESTORE:
251 return (LPWSTR)L"SW_RESTORE";
252
253 case SW_SHOWDEFAULT:
254 return (LPWSTR)L"SW_SHOWDEFAULT";
255
256 case SW_FORCEMINIMIZE:
257 return (LPWSTR)L"SW_FORCEMINIMIZE";
258 }
259
260 return (LPWSTR)L"-1";
261}
262
265{
266 IXMLDOMElement *pWindowPlacement = NULL;
267 IXMLDOMElement *pPointElement = NULL;
268 IXMLDOMElement *pRectangleElement = NULL;
269 WINDOWPLACEMENT wndpl;
270 WCHAR szBuffer[32];
271 HRESULT hr = S_OK;
272
273 pWindow->GetWindowPlacement(&wndpl);
274
275 CHK_HR(CreateAndAddElementNode(L"WindowPlacement", pParentNode, &pWindowPlacement));
276 CHK_HR(CreateAndAddAttributeNode(L"ShowCommand", ShowCmdToString(wndpl.showCmd), pWindowPlacement));
277
278 CHK_HR(CreateAndAddElementNode(L"Point", pWindowPlacement, &pPointElement));
279 CHK_HR(CreateAndAddAttributeNode(L"Name", L"MinPosition", pPointElement));
280 _swprintf(szBuffer, L"%ld", wndpl.ptMinPosition.x);
281 CHK_HR(CreateAndAddAttributeNode(L"X", szBuffer, pPointElement));
282 _swprintf(szBuffer, L"%ld", wndpl.ptMinPosition.y);
283 CHK_HR(CreateAndAddAttributeNode(L"Y", szBuffer, pPointElement));
284 SAFE_RELEASE(pPointElement);
285
286 CHK_HR(CreateAndAddElementNode(L"Point", pWindowPlacement, &pPointElement));
287 CHK_HR(CreateAndAddAttributeNode(L"Name", L"MaxPosition", pPointElement));
288 _swprintf(szBuffer, L"%ld", wndpl.ptMaxPosition.x);
289 CHK_HR(CreateAndAddAttributeNode(L"X", szBuffer, pPointElement));
290 _swprintf(szBuffer, L"%ld", wndpl.ptMaxPosition.y);
291 CHK_HR(CreateAndAddAttributeNode(L"Y", szBuffer, pPointElement));
292 SAFE_RELEASE(pPointElement);
293
294 /* <Rectangle Name="NormalPosition" Top="0" Bottom="508" Left="0" Right="1186"/> */
295 CHK_HR(CreateAndAddElementNode(L"Rectangle", pWindowPlacement, &pRectangleElement));
296 CHK_HR(CreateAndAddAttributeNode(L"Name", L"NormalPosition", pRectangleElement));
297 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.top);
298 CHK_HR(CreateAndAddAttributeNode(L"Top", szBuffer, pRectangleElement));
299 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.bottom);
300 CHK_HR(CreateAndAddAttributeNode(L"Bottom", szBuffer, pRectangleElement));
301 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.left);
302 CHK_HR(CreateAndAddAttributeNode(L"Left", szBuffer, pRectangleElement));
303 _swprintf(szBuffer, L"%ld", wndpl.rcNormalPosition.right);
304 CHK_HR(CreateAndAddAttributeNode(L"Right", szBuffer, pRectangleElement));
305 SAFE_RELEASE(pRectangleElement);
306
307CleanUp:
308 SAFE_RELEASE(pWindowPlacement);
309
310 return hr;
311}
312
315{
316 IXMLDOMParseError *pXMLErr = NULL;
317 BSTR bstrErr = NULL;
318 VARIANT_BOOL varStatus;
319 HRESULT hr = S_OK;
320
321 hr = m_pDocument->load(m_varFileName, &varStatus);
322 if (varStatus != VARIANT_TRUE)
323 {
324 // Failed to load xml, get last parsing error
325 CHK_HR(m_pDocument->get_parseError(&pXMLErr));
326 CHK_HR(pXMLErr->get_reason(&bstrErr));
327 }
328
329CleanUp:
330 SAFE_RELEASE(pXMLErr);
331 SysFreeString(bstrErr);
332
333 return hr;
334}
335
338{
340}
BOOL GetWindowPlacement(WINDOWPLACEMENT *lpwndpl) const
Definition: atlwin.h:802
IXMLDOMDocument * m_pDocument
Definition: mscfile.h:21
HRESULT CreateAndInitDOM()
Definition: mscfile.cpp:46
VARIANT m_varFileName
Definition: mscfile.h:20
HRESULT CreateAndAddTextNode(PCWSTR wszText, IXMLDOMNode *pParent)
Definition: mscfile.cpp:162
LPWSTR ShowCmdToString(int nShowCmd)
Definition: mscfile.cpp:218
HRESULT CreateElement(PCWSTR wszName, IXMLDOMElement **ppElement)
Definition: mscfile.cpp:65
~MscFile()
Definition: mscfile.cpp:22
HRESULT VariantFromString(PCWSTR wszValue, VARIANT &Variant)
Definition: mscfile.cpp:31
HRESULT LoadDOM()
Definition: mscfile.cpp:314
HRESULT CreateAndAddCommentNode(PCWSTR wszComment)
Definition: mscfile.cpp:117
HRESULT CreateAndAddCDATANode(PCWSTR wszCDATA, IXMLDOMNode *pParent)
Definition: mscfile.cpp:180
HRESULT SaveWindowPlacement(CWindow *pWindow, IXMLDOMElement *pParentNode)
Definition: mscfile.cpp:264
HRESULT SaveDOM()
Definition: mscfile.cpp:337
HRESULT CreateAndAddAttributeNode(PCWSTR wszName, PCWSTR wszValue, IXMLDOMElement *pParent)
Definition: mscfile.cpp:135
HRESULT AppendChildToParent(IXMLDOMNode *pChild, IXMLDOMNode *pParent=NULL)
Definition: mscfile.cpp:81
HRESULT CreateAndAddPINode(PCWSTR wszTarget, PCWSTR wszData)
Definition: mscfile.cpp:97
MscFile(PCWSTR pszFileName)
Definition: mscfile.cpp:15
HRESULT CreateAndAddElementNode(PCWSTR wszName, IXMLDOMNode *pParent, IXMLDOMElement **ppElement=NULL)
Definition: mscfile.cpp:199
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
OLECHAR * BSTR
Definition: compat.h:2293
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_BSTR
Definition: compat.h:2303
#define L(x)
Definition: resources.c:13
FxObject * pParent
Definition: fxdpcapi.cpp:86
HRESULT createCDATASection([in] BSTR p, [retval, out] IXMLDOMCDATASection **cdata)
HRESULT createComment([in] BSTR p, [retval, out] IXMLDOMComment **comment)
HRESULT save([in] VARIANT var1)
HRESULT load([in] VARIANT var1, [retval, out] VARIANT_BOOL *pbool)
HRESULT createProcessingInstruction([in] BSTR target, [in] BSTR data, [retval, out] IXMLDOMProcessingInstruction **pi)
HRESULT createElement([in] BSTR p, [retval, out] IXMLDOMElement **domElement)
HRESULT createTextNode([in] BSTR p, [retval, out] IXMLDOMText **text)
HRESULT createAttribute([in] BSTR p, [retval, out] IXMLDOMAttribute **attribute)
HRESULT appendChild([in] IXMLDOMNode *newNode, [retval, out] IXMLDOMNode **outNewNode)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
#define SAFE_RELEASE(p)
Definition: mscfile.h:15
#define CHK_ALLOC(p)
Definition: mscfile.h:12
#define CHK_HR(stmt)
Definition: mscfile.h:9
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
short WCHAR
Definition: pedump.c:58
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define SW_SHOWMAXIMIZED
Definition: winuser.h:784
#define SW_HIDE
Definition: winuser.h:779
#define SW_MINIMIZE
Definition: winuser.h:787
#define SW_SHOWNOACTIVATE
Definition: winuser.h:785
#define SW_SHOWDEFAULT
Definition: winuser.h:791
#define SW_SHOWMINIMIZED
Definition: winuser.h:782
#define SW_FORCEMINIMIZE
Definition: winuser.h:792
#define SW_SHOWNA
Definition: winuser.h:789
#define SW_RESTORE
Definition: winuser.h:790
#define SW_SHOW
Definition: winuser.h:786
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:788
long y
Definition: dcommon.idl:24
long x
Definition: dcommon.idl:24
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
POINT ptMaxPosition
Definition: winuser.h:3402
RECT rcNormalPosition
Definition: winuser.h:3403
POINT ptMinPosition
Definition: winuser.h:3401
LPCSTR pText
Definition: txtscale.cpp:79
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44