Result GetFirstElementByTagName(MSXML::IXMLDOMElementPtr& parent, const string& tagName, MSXML::IXMLDOMElementPtr& pEl) { Result r; try { pEl = 0; MSXML::IXMLDOMNodeListPtr pList = parent->getElementsByTagName(tagName.c_str()); if(pList == NULL) { r.Fail(Format("No '%' nodes found (pList = 0)").s(tagName).Str()); } else { if(!pList->length) { r.Fail(Format("No '%' nodes found (length = 0)").s(tagName).Str()); } else { pEl = pList->nextNode(); r.Succeed(); } } } catch(_com_error& e) { r.Fail(Format("Com error: % %").s(e.ErrorMessage()).s(e.Description()).Str()); } return r; }
Result XMLGetAttribute(_variant_t& out, MSXML::IXMLDOMElementPtr pEl, const string& sAttribute) { Result r; try { out = pEl->getAttribute(sAttribute.c_str()); if(out.vt == VT_NULL) { r.Fail(Format("Attribute '%' not found, or VT_NULL").s(sAttribute).Str()); } else { r.Succeed(); } } catch(_com_error& e) { r.Fail(Format("Error reading the %s attribute from xml. % %").s(sAttribute).s(e.ErrorMessage()).s(e.Description()).Str()); } return r; }
Result FileToXML(MSXML::IXMLDOMDocumentPtr& p, const string& fileName) { Result r; try { HRESULT hr; if(FAILED(hr = p.CreateInstance("msxml.domdocument"))) { r.Fail(Format("Failed to create instance of msxml.domdocument. Error code: %").ul(hr).Str()); } else { VARIANT_BOOL b = p->load(fileName.c_str()); if(b == VARIANT_FALSE) { MSXML::IXMLDOMParseErrorPtr pErr = p->GetparseError(); if(pErr == NULL) { r.Fail(_T("Failed to load XML into msxml.domdocument. Could not get IXMLDOMParseErrorPtr for details.")); } else { r.Fail(Format("Failed to parse xml. %").s(pErr->reason).Str()); } } else { r.Succeed(); } } } catch(_com_error& e) { r.Fail(Format("Error loading XML into msxml.domdocument. % %").s(e.ErrorMessage()).s(e.Description()).Str()); } return r; }
Result XMLSetAttribute(const _variant_t& val, MSXML::IXMLDOMElementPtr pEl, const string& sAttribute) { Result r; try { pEl->setAttribute(sAttribute.c_str(), val); r.Succeed(); } catch(_com_error& e) { r.Fail(Format("Com error: % %").s(e.ErrorMessage()).s(e.Description()).Str()); } return r; }
Result XMLToString(string& s, MSXML::IXMLDOMNodePtr p) { Result r; try { s = (PCTSTR)p->xml; } catch(_com_error& e) { r.Fail(Format("Error extracting XML. % %").s(e.ErrorMessage()).s(e.Description()).Str()); } return r; }
Result XMLGetAttribute(_variant_t& out, VARTYPE destType, MSXML::IXMLDOMElementPtr pEl, const string& sAttribute) { Result r = XMLGetAttribute(out, pEl, sAttribute); if(r.Succeeded()) { try { out.ChangeType(destType); } catch(_com_error& e) { r.Fail(Format("Error converting %s attribute to its destination type. % %").s(sAttribute).s(e.ErrorMessage()).s(e.Description()).Str()); } } return r; }
Result ProcessFixed(Arg& a, Version::VersionResource& res) { cout << "Setting fixed value \"" << a.name << "\"..."; Result r; DWORD value; if(!(r = ParseDWORDString(a.value, value))) { cout << endl; return r; } if(a.name == "dwFileVersionMS") { res.fileVersionMS = value; } else if(a.name == "dwFileVersionLS") { res.fileVersionLS = value; } else if(a.name == "dwProductVersionMS") { res.productVersionMS = value; } else if(a.name == "dwProductVersionLS") { res.productVersionLS = value; } else if(a.name == "dwFileFlagsMask") { res.fileFlagsMask = value; } else if(a.name == "dwFileFlags") { res.fileFlags = value; } else if(a.name == "dwFileOS") { res.fileOS = value; } else if(a.name == "dwFileType") { res.fileType = value; } else if(a.name == "dwFileSubtype") { res.fileSubType = value; } else if(a.name == "dwFileDateMS") { res.fileDateMS = value; } else if(a.name == "dwFileDateLS") { res.fileDateLS = value; } else { cout << endl; return r.Fail(Format("Unrecognized fixed value name: %").qs(a.name).Str()); } cout << "Done (1 value updated)." << endl; return r.Succeed(); }