| 664 | } |
| 665 | |
| 666 | wil::com_ptr<IXMLDOMDocument> FontDatabaseToDocument(const FontDatabase& db) |
| 667 | { |
| 668 | auto document = wil::CoCreateInstance<IXMLDOMDocument>(CLSID_DOMDocument30); |
| 669 | |
| 670 | wil::com_ptr<IXMLDOMElement> rootElement; |
| 671 | THROW_IF_FAILED(document->createElement(wil::make_bstr(L"FontDatabase").get(), rootElement.put())); |
| 672 | |
| 673 | for (auto& font : db.m_fonts) |
| 674 | { |
| 675 | wil::com_ptr<IXMLDOMElement> fontfaceElement; |
| 676 | THROW_IF_FAILED(document->createElement(wil::make_bstr(L"FontFace").get(), fontfaceElement.put())); |
| 677 | |
| 678 | wil::unique_variant value; |
| 679 | |
| 680 | InitVariantFromString(font.m_path.c_str(), value.reset_and_addressof()); |
| 681 | THROW_IF_FAILED(fontfaceElement->setAttribute(wil::make_bstr(L"path").get(), value)); |
| 682 | InitVariantFromString(std::to_wstring(font.m_index).c_str(), value.reset_and_addressof()); |
| 683 | THROW_IF_FAILED(fontfaceElement->setAttribute(wil::make_bstr(L"index").get(), value)); |
| 684 | InitVariantFromString(std::to_wstring(font.m_weight).c_str(), value.reset_and_addressof()); |
| 685 | THROW_IF_FAILED(fontfaceElement->setAttribute(wil::make_bstr(L"weight").get(), value)); |
| 686 | InitVariantFromString(std::to_wstring(font.m_oblique).c_str(), value.reset_and_addressof()); |
| 687 | THROW_IF_FAILED(fontfaceElement->setAttribute(wil::make_bstr(L"oblique").get(), value)); |
| 688 | InitVariantFromString(std::to_wstring(font.m_psOutline).c_str(), value.reset_and_addressof()); |
| 689 | THROW_IF_FAILED(fontfaceElement->setAttribute(wil::make_bstr(L"psOutline").get(), value)); |
| 690 | |
| 691 | for (auto& name : font.m_names) |
| 692 | { |
| 693 | wil::com_ptr<IXMLDOMElement> nameElement; |
| 694 | assert(name.m_type < std::extent_v<decltype(FontDatabase::FontFaceElement::NameElement::TYPEMAP)>); |
| 695 | THROW_IF_FAILED( |
| 696 | document->createElement(wil::make_bstr(FontDatabase::FontFaceElement::NameElement::TYPEMAP[name |
| 697 | .m_type]).get(), nameElement.put())); |
| 698 | THROW_IF_FAILED(nameElement->put_text(wil::make_bstr(name.m_name.c_str()).get())); |
| 699 | THROW_IF_FAILED(fontfaceElement->appendChild(nameElement.get(), nullptr)); |
| 700 | } |
| 701 | THROW_IF_FAILED(rootElement->appendChild(fontfaceElement.get(), nullptr)); |
| 702 | } |
| 703 | THROW_IF_FAILED(document->putref_documentElement(rootElement.get())); |
| 704 | |
| 705 | return document; |
| 706 | } |
| 707 | } |
| 708 | |
| 709 | void sfh::ConfigFile::WriteToFile(const std::wstring& path, const ConfigFile& config) |